跳至主要內容

10 篇標記為「安全性」的文章

與安全性相關的部落格文章

檢視所有標籤

關於「runAsNode」CVE 的聲明

·4 分鐘閱讀

今天稍早,Electron 團隊接獲通知,得知針對幾個知名 Electron 應用程式提出的多個公開 CVE。這些 CVE 與 Electron 的兩個熔絲runAsNodeenableNodeCliInspectArguments)有關,且錯誤地宣稱,如果沒有主動停用這些元件,遠端攻擊者便能透過這些元件執行任意程式碼。

我們認為這些 CVE 並非出於善意而提出。首先,此聲明不正確 - 該組態*並未*啟用遠端程式碼執行。其次,這些 CVE 中點名的公司並未收到通知,儘管他們有錯誤賞金計畫。最後,雖然我們認為停用相關元件可以提高應用程式的安全性,但我們不認為這些 CVE 已以正確的嚴重性提出。「嚴重」是保留給最高危險的問題,而這裡的情況絕非如此。

任何人都能要求 CVE。雖然這對軟體產業的整體健全狀況有益,「農場式 CVE」來提升單一安全研究人員的聲譽並無幫助。

也就是說,我們了解僅僅存在嚴重性為可怕的「嚴重」的 CVE 就可能導致最終使用者混淆,因此,作為一個專案,我們希望針對處理此問題提供指導和協助。

這可能會對我造成什麼影響?

在檢閱這些 CVE 後,Electron 團隊認為這些 CVE 並不嚴重。

攻擊者需要已經能夠在機器上執行任意指令,無論是透過實際存取硬體或透過實現完全遠端程式碼執行。這值得重複:所描述的漏洞*要求攻擊者必須已經可以存取被攻擊的系統*。

例如,Chrome 並未在其威脅模型中考慮到實際本地攻擊

我們認為這些攻擊超出 Chrome 的威脅模型,因為 Chrome(或任何應用程式)都無法防禦設法以您的身分登入您裝置或以您作業系統使用者帳戶權限執行軟體的惡意使用者。此類攻擊者可以修改可執行檔和 DLL、變更環境變數(如 PATH)、變更組態檔、讀取您使用者帳戶擁有的任何資料、將其透過電子郵件寄給自己等等。此類攻擊者完全控制您的裝置,且 Chrome 無法採取任何措施來提供認真的防禦保證。這個問題並非 Chrome 所獨有 — 所有應用程式都必須信任實際本地使用者。

CVE 中描述的漏洞允許攻擊者接著將受影響的應用程式用作具有繼承的 TCC 權限的通用 Node.js 程序。因此,舉例來說,如果該應用程式已被授予存取通訊錄的權限,則攻擊者可以將該應用程式作為 Node.js 執行,並執行將繼承該通訊錄存取權限的任意程式碼。這通常稱為「借力使力」攻擊。攻擊者通常會使用 PowerShell、Bash 或類似工具來執行任意程式碼。

我是否受到影響?

根據預設,所有發佈的 Electron 版本都啟用了 runAsNodeenableNodeCliInspectArguments 功能。如果您尚未按照Electron 熔絲文件中的描述將其關閉,您的應用程式同樣容易被用作「借力使力」攻擊。同樣地,我們需要強調攻擊者必須*已經*能夠在受害者的機器上執行程式碼和程式。

緩解

緩解此問題的最簡單方法是在您的 Electron 應用程式中停用 runAsNode 熔絲。runAsNode 熔絲會切換是否尊重 ELECTRON_RUN_AS_NODE 環境變數。請參閱Electron 熔絲文件,以了解如何切換這些熔絲。

請注意,如果停用了此熔絲,則主要程序中的 process.fork 將無法如預期般運作,因為它取決於此環境變數才能運作。相反地,我們建議您使用公用程式程序,這適用於許多您需要獨立 Node.js 程序的情況(例如 Sqlite 伺服器程序或類似情況)。

您可以在我們的安全性檢查清單中找到更多關於我們建議用於 Electron 應用程式的安全性最佳做法的資訊。

突破障礙:使用沙箱強化應用程式

·4 分鐘閱讀

自從 CVE-2023-4863:WebP 中的堆積緩衝區溢位 公開以來,已經過了一個多星期,這導致了大量軟體發布以渲染 webp 影像:macOS、iOS、Chrome、Firefox 和各種 Linux 發行版都收到了更新。此前,公民實驗室(Citizen Lab)調查發現,一個位於「華盛頓特區的公民社會組織」所使用的 iPhone,在使用 iMessage 中的零點擊漏洞時遭受攻擊。

Electron 也迅速採取行動,在同一天發布了新版本:如果您的應用程式渲染任何使用者提供的內容,您應該更新您的 Electron 版本 - v27.0.0-beta.2、v26.2.1、v25.8.1、v24.8.3 和 v22.3.24 都包含修復過後的 libwebp 版本,該函式庫負責渲染 webp 影像。

現在我們都清楚地意識到,像「渲染影像」這樣看似無害的互動,實際上是一種潛在的危險行為,我們想藉此機會提醒大家,Electron 具有一個程序沙箱,可以限制下一次重大攻擊的影響範圍 — 無論它會是什麼。

沙箱從 Electron v1 就開始提供,並在 v20 中預設啟用,但我們知道許多應用程式(尤其是那些存在已久的應用程式)可能在其程式碼的某處有 sandbox: false,或者有 nodeIntegration: true,這會在沒有明確的 sandbox 設定時同樣會停用沙箱。這是可以理解的:如果您長期以來一直使用我們,您可能已經習慣將 require("child_process")require("fs") 丟入執行 HTML/CSS 的相同程式碼中。

在我們討論如何遷移到沙箱之前,我們先來討論為什麼您需要它。

沙箱在所有渲染器程序周圍設置了一個堅固的保護罩,確保無論內部發生什麼,程式碼都會在受限的環境中執行。作為一個概念,它比 Chromium 早得多,並且是所有主要作業系統提供的一項功能。Electron 和 Chromium 的沙箱建立在這些系統功能的基礎之上。即使您從不顯示使用者產生的內容,您也應該考慮到您的渲染器可能會被入侵的可能性:複雜的供應鏈攻擊和簡單的小錯誤都可能導致您的渲染器執行您不完全希望它執行的操作。

沙箱使這種情況變得不那麼可怕:內部程序可以自由使用 CPU 週期和記憶體 — 僅此而已。程序無法寫入磁碟或顯示自己的視窗。在我們的 libwep 錯誤的情況下,沙箱可確保攻擊者無法安裝或執行惡意軟體。事實上,在最初針對該員工 iPhone 的 Pegasus 攻擊中,該攻擊專門針對未沙箱化的影像程序,以取得手機的存取權限,首先突破了通常沙箱化的 iMessage 的邊界。當宣布像此範例中的 CVE 時,您仍然必須將您的 Electron 應用程式升級到安全版本 — 但與此同時,攻擊者可以造成的損害程度會大幅降低。

將原生的 Electron 應用程式從 sandbox: false 遷移到 sandbox: true 是一項艱鉅的任務。我知道,因為即使我個人撰寫了第一版的 Electron 安全指南,我也未能將我自己的其中一個應用程式遷移到使用它。這個週末情況有所改變,我建議您也進行更改。

Don’t be scared by the number of line changes, most of it is in package-lock.json

您需要解決兩件事

  1. 如果您在 preload 腳本或實際的 WebContents 中使用 Node.js 程式碼,您需要將所有 Node.js 互動移至主程序(或者,如果您比較進階,則移至工具程序)。鑑於渲染器已經變得如此強大,您的絕大多數程式碼很可能並不需要重構。

    請參閱我們關於 跨程序通訊 的文件。就我而言,我移動了許多程式碼並將其包裝在 ipcRenderer.invoke()ipcMain.handle() 中,但過程很簡單且很快就完成了。請在這裡注意您的 API - 如果您建立一個名為 executeCodeAsRoot(code) 的 API,沙箱就無法為您的使用者提供太多保護。

  2. 由於啟用沙箱會停用預載腳本中的 Node.js 整合,因此您不能再使用 require("../my-script")。換句話說,您的預載腳本需要是單一檔案。

    有多種方法可以做到這一點:Webpack、esbuild、parcel 和 rollup 都可以完成這項工作。我使用了 Electron Forge 出色的 Webpack 外掛程式,同樣受歡迎的 electron-builder 使用者可以使用 electron-webpack

總而言之,整個過程花了我大約四天的時間 — 其中包括大量思考如何駕馭 Webpack 的強大功能,因為我決定藉此機會以許多其他方式重構我的程式碼。

Chromium WebAudio 漏洞修復 (CVE-2019-13720)

·一分鐘閱讀

在 Chrome 中發現了一個高度嚴重的漏洞,該漏洞會影響所有基於 Chromium 的軟體,包括 Electron。

此漏洞已分配 CVE-2019-13720。您可以在 Chrome 部落格文章 中閱讀更多相關資訊。

請注意,Chrome 有報告指出此漏洞正在被實際利用,因此強烈建議您盡快升級 Electron。


範圍

這會影響任何可能執行第三方或不受信任的 JavaScript 的 Electron 應用程式。

緩解

受影響的應用程式應升級至 Electron 的修補版本。

我們已發布包含此漏洞修復程式的 Electron 新版本

Electron 7.0.1 在發布公告之前,就自動包含了上游的修復程式。Electron 8 也同樣不受影響。該漏洞不存在於 Electron 5 中,因此該版本也不受影響。

更多資訊

此漏洞由卡巴斯基實驗室的 Anton Ivanov 和 Alexey Kulaev 發現,並回報給 Chrome 團隊。Chrome 部落格文章可在此處找到:此處

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

Chromium FileReader 漏洞修復

·一分鐘閱讀

在 Chrome 中發現了一個高度嚴重的漏洞,該漏洞會影響所有基於 Chromium 的軟體,包括 Electron。

此漏洞已分配 CVE-2019-5786。您可以在 Chrome 部落格文章 中閱讀更多相關資訊。

請注意,Chrome 有報告指出此漏洞正在被實際利用,因此強烈建議您盡快升級 Electron。


範圍

這會影響任何可能執行第三方或不受信任的 JavaScript 的 Electron 應用程式。

緩解

受影響的應用程式應升級至 Electron 的修補版本。

我們已發布包含此漏洞修復程式的 Electron 新版本

Electron 5 的最新 Beta 版本追蹤的是 Chromium 73,因此已修補

更多資訊

此漏洞由 Google 威脅分析小組的 Clement Lecigne 發現,並回報給 Chrome 團隊。Chrome 部落格文章可在此處找到:此處

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

BrowserView window.open() 漏洞修復

·一分鐘閱讀

發現了一個程式碼漏洞,該漏洞允許在子視窗中重新啟用 Node。


sandbox: truenativeWindowOpen: truenodeIntegration: false 開啟 BrowserView 會產生一個 webContents,可在其中呼叫 window.open,而新開啟的子視窗將啟用 nodeIntegration。此漏洞會影響所有受支援的 Electron 版本。

緩解

我們已發布包含此漏洞修復程式的 Electron 新版本:2.0.173.0.153.1.34.0.45.0.0-beta.2。我們鼓勵所有 Electron 開發人員立即將其應用程式更新至最新的穩定版本。

如果因故無法升級您的 Electron 版本,您可以透過停用所有子 Web 內容來緩解此問題

view.webContents.on('-add-new-contents', (e) => e.preventDefault());

更多資訊

此漏洞由 PalmerAL 發現,並負責任地回報給 Electron 專案。

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

SQLite 漏洞修復

·一分鐘閱讀

已發現一個遠端程式碼執行漏洞「Magellan」,該漏洞會影響基於 SQLite 或 Chromium 的軟體,包括所有版本的 Electron。


範圍

使用 Web SQL 的 Electron 應用程式會受到影響。

緩解

受影響的應用程式應停止使用 Web SQL 或升級至 Electron 的修補版本。

我們已發布包含此漏洞修復程式的 Electron 新版本

沒有關於此漏洞被實際利用的報告;但是,強烈建議受影響的應用程式進行緩解。

更多資訊

此漏洞由騰訊 Blade 團隊發現,他們發布了一篇 討論該漏洞的部落格文章

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

WebPreferences 漏洞修復

·2 分鐘閱讀

已發現一個遠端程式碼執行漏洞,該漏洞會影響在 Electron 版本(3.0.0-beta.6、2.0.7、1.8.7 和 1.7.15)上具有開啟巢狀子視窗能力的應用程式。此漏洞已分配 CVE 識別碼 CVE-2018-15685


受影響的平台

如果您符合以下條件,則會受到影響

  1. 您嵌入任何遠端使用者內容,即使是在沙箱中
  2. 您接受任何存在 XSS 漏洞的使用者輸入

詳細資訊

如果任何使用者程式碼在 iframe 內執行/可以建立 iframe,則您會受到影響。考慮到 XSS 漏洞的可能性,可以假定大多數應用程式都容易受到此案例的攻擊。

如果您以 nativeWindowOpen: truesandbox: true 選項開啟任何視窗,您也會受到影響。儘管此漏洞也需要在您的應用程式中存在 XSS 漏洞,但如果您使用其中任何一個選項,您仍然應該套用以下其中一種緩解措施。

緩解

我們已發布包含此漏洞修復程式的 Electron 新版本:3.0.0-beta.72.0.81.8.81.7.16。我們敦促所有 Electron 開發人員立即將其應用程式更新至最新的穩定版本。

如果因故無法升級您的 Electron 版本,您可以透過對所有 webContentsnew-window 事件進行全域呼叫 event.preventDefault() 來保護您的應用程式。如果您完全不使用 window.open 或任何子視窗,這也是您應用程式的有效緩解措施。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

如果您依賴子視窗建立孫子視窗的能力,則第三種緩解策略是在您的頂層視窗上使用以下程式碼

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

此程式碼將手動強制將頂層視窗的 webPreferences 設定,無限深度地套用至所有子視窗。

更多資訊

此漏洞由 Matt Austin(來自 Contrast Security)發現並負責地回報給 Electron 專案。

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

Webview 漏洞修復

·2 分鐘閱讀

發現了一個漏洞,允許在某些已停用 Node.js 整合的 Electron 應用程式中重新啟用它。此漏洞已指定 CVE 識別碼 CVE-2018-1000136


受影響的應用程式

如果符合所有以下條件,則應用程式會受到影響

  1. 在 Electron 1.7、1.8 或 2.0.0-beta 上執行
  2. 允許執行任意遠端程式碼
  3. 停用 Node.js 整合
  4. 未在其 webPreferences 中明確宣告 webviewTag: false
  5. 未啟用 nativeWindowOption 選項
  6. 未攔截 new-window 事件,且未使用提供的選項標籤手動覆寫 event.newGuest

雖然這似乎是少數 Electron 應用程式,但我們鼓勵所有應用程式都升級以作為預防措施。

緩解

此漏洞已在今日發布的 1.7.131.8.42.0.0-beta.5 版本中修復。

無法升級其應用程式 Electron 版本的開發人員可以使用以下程式碼來緩解此漏洞

app.on('web-contents-created', (event, win) => {
win.on(
'new-window',
(event, newURL, frameName, disposition, options, additionalFeatures) => {
if (!options.webPreferences) options.webPreferences = {};
options.webPreferences.nodeIntegration = false;
options.webPreferences.nodeIntegrationInWorker = false;
options.webPreferences.webviewTag = false;
delete options.webPreferences.preload;
},
);
});

// and *IF* you don't use WebViews at all,
// you might also want
app.on('web-contents-created', (event, win) => {
win.on('will-attach-webview', (event, webPreferences, params) => {
event.preventDefault();
});
});

更多資訊

此漏洞由 Brendan Scarvell(來自 Trustwave SpiderLabs)發現並負責地回報給 Electron 專案。

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

若要回報 Electron 中的漏洞,請傳送電子郵件至 security@electronjs.org

請加入我們的 電子郵件列表,以接收有關版本和安全更新的通知。

協定處理常式漏洞修復

·2 分鐘閱讀

發現了一個遠端程式碼執行漏洞,會影響使用自訂協定處理常式的 Electron 應用程式。此漏洞已指定 CVE 識別碼 CVE-2018-1000006


受影響的平台

設計在 Windows 上執行並將自己註冊為協定預設處理常式的 Electron 應用程式(例如 myapp://)會受到影響。

無論協定如何註冊(例如使用原生程式碼、Windows 登錄或 Electron 的 app.setAsDefaultProtocolClient API),此類應用程式都可能會受到影響。

macOS 和 Linux 不受此問題影響

緩解

我們已發布新版本的 Electron,其中包含此漏洞的修復程式:1.8.2-beta.51.7.121.6.17。我們強烈建議所有 Electron 開發人員立即將其應用程式更新至最新的穩定版本。

如果因為某些原因而無法升級 Electron 版本,您可以在呼叫 app.setAsDefaultProtocolClient 時,將 -- 附加為最後一個引數,這可防止 Chromium 剖析其他選項。雙破折號 -- 表示命令選項的結尾,之後只接受位置參數。

app.setAsDefaultProtocolClient(protocol, process.execPath, [
'--your-switches-here',
'--',
]);

請參閱 app.setAsDefaultProtocolClient API 以取得更多詳細資訊。

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請發送電子郵件至 security@electronjs.org

Chromium RCE 漏洞修復

·一分鐘閱讀

在 Google Chromium 中發現了一個遠端程式碼執行漏洞,該漏洞會影響所有最新版本的 Electron。任何存取遠端內容的 Electron 應用程式都容易受到此漏洞利用的影響,無論是否啟用 沙箱選項

我們已發布兩個新版本的 Electron 1.7.81.6.14,這兩個版本都包含此漏洞的修復程式。我們強烈建議所有 Electron 開發人員立即將其應用程式更新至最新的穩定版本

npm i electron@latest --save-dev

若要深入了解如何讓您的 Electron 應用程式保持安全的最佳實務,請參閱我們的 安全教學

如果您想回報 Electron 中的漏洞,請聯絡 security@electronjs.org