跳到主要內容

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 將無法如預期般運作,因為它依賴此環境變數才能運作。相反地,我們建議您使用Utility Processes,它適用於許多需要獨立 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 應用程式升級到安全版本 — 但在此期間,攻擊者可以造成的損害量已大幅降低。

將 vanilla 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 中不存在該漏洞,因此該版本也未受影響。

更多資訊

此漏洞由 Kaspersky Labs 的 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 版本,您可以透過停用所有子網頁內容來緩解此問題

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,其中包含此漏洞的修復程式

目前沒有野外利用此漏洞的報告;但是,強烈建議受影響的應用程式採取緩解措施。

更多資訊

此漏洞由 Tencent 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 of Contrast Security 發現並負責任地報告給 Electron 專案。

若要深入瞭解保持 Electron 應用程式安全的最佳實務,請參閱我們的安全性教學課程

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

Webview 漏洞修復

·2 分鐘閱讀

已發現一個漏洞,允許在某些停用 Node.js 整合的 Electron 應用程式中重新啟用 Node.js 整合。此漏洞已分配 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();
});
});

更多資訊

此漏洞由 Trustwave SpiderLabs 的 Brendan Scarvell 發現並負責任地報告給 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