作者分析

八位元的信任鏈:eMudhra CA 的金鑰在毫秒內被破解

一家憑證機構的私鑰只有 8 bit,等於從 256 種可能裡選一個。這不是金鑰被偷,而是從第一天起任何人只要看到證書,用筆電就能在不到一秒內還原私鑰。這個漏洞存在了 17 個月,波及 TLS 與程式碼簽章兩類憑證,影響範圍從瀏覽器到 IoT 裝置、從 CI/CD 到套件管理器。這篇拆解資安研究員 Scott Helme 的分析,談「無法圍堵」是什麼意思。

30 秒看懂
  • 2026 年 10 月 17 日,資安研究員向五方(Apple、Google、Microsoft、Mozilla、eMudhra)通報:eMudhra 的八張中繼 CA 私鑰只有 8 bit。不是被偷,是任何人拿到公開的證書,用筆電就能在毫秒內暴力破解還原私鑰。Chrome 與 Firefox 當晚即封鎖這些中繼憑證,Mozilla 20 日公開並從根憑證移除 eMudhra。
  • 這八張中繼憑證於 2025 年 4 月建立,包含六張 TLS 簽發 CA(DV、OV、EV 各兩代)與兩張程式碼簽章 CA,全部也被 Sectigo 的 AAA Certificate Services 根憑證交叉簽章。私鑰值從 4 到 237,研究員實測全部在不到一秒內破解成功。
  • 「無法圍堵」的意思是:沒人需要偷,從證書存在的第一天起任何人都能破解。17 個月的窗口期,無從得知是否有人已經這麼做。瀏覽器有 Certificate Transparency 可擋偽造憑證,但多數非瀏覽器 TLS 客戶端(curl、Python、Node、IoT 裝置、CI/CD、套件管理器)不檢查 CT、不檢查撤銷,只信任磁碟上的 CA bundle。

發生了什麼

2026 年 10 月 17 日,一位資安研究員同時向 Apple、Google、Microsoft、Mozilla 與 eMudhra 通報:eMudhra 的八張中繼 CA 憑證的私鑰「本質上就是弱金鑰,任何人都能因式分解,而且問題無法圍堵」。

當晚,Chrome 推送 CRLSet 更新封鎖這些中繼憑證;幾小時後 Firefox 透過 OneCRL 跟進。10 月 20 日,Mozilla 公開這起事件,並發布 NSS 更新移除 eMudhra 根憑證;Chrome 確認該根憑證將在 Chrome Root Store v43 移除。

這不是一起金鑰外洩或被竊事件。研究員在 Mozilla 的討論串裡用一句話總結:「它們是本質上就弱的單位元組金鑰,任何人都能因式分解,而且問題無法圍堵。」資安研究員 Scott Helme 在他的部落格文章標題直接寫:「八位元的信任;eMudhra 的 CA 金鑰在毫秒內被破解」。本文整理他的分析。

256 種可能的私鑰

這些是 P-384 橢圓曲線上的金鑰。私鑰是一個數字 d,公鑰是 d × G(G 是曲線上固定的基點,× 是橢圓曲線的點乘法)。正向計算很快,反向從公鑰推回 d 在正常情況下被認為不可行,這是整個 PKI 安全模型的基礎。前提是 d 必須夠大。

P-384 私鑰應該是一個隨機的 384 bit 數字,有 2³⁸⁴ 種可能(大約 10¹¹⁵),沒人能搜完。

eMudhra 的金鑰長這樣:

d = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004

47 個位元組的零,加上最後一個位元組。正常的 P-384 私鑰應該長這樣:

d = 0x48ac06790886c80c48d31691fd4c0fe9ce3207f9807f2fe571d6e4ec426d78644298fc53df2b92566970e757ac998c34

一個位元組有 256 種可能值(0x00 到 0xFF)。所以「搜尋」的意思是:計算 1 × G、2 × G、3 × G⋯⋯直到跟證書裡的公鑰吻合,最多 255 次就找到了。

整個信任鏈,每一張用這些 CA 簽發的憑證,每個信任它們的客戶端,全部只靠八個位元。

研究員親自驗證了

Mozilla 的公告附上了受影響的憑證,Scott Helme 拿這十六張憑證(八把金鑰,每把被 eMudhra 與 Sectigo 各簽一次)跑暴力破解,全部瞬間成功。他在文章裡附上了完整的表:

中繼憑證類型d
EM DV TLS CA - G3BTLS156
EM DV TLS CA - G3CTLS230
EM EV TLS CA - G3BTLS115
EM EV TLS CA - G3CTLS56
EM OV TLS CA - G3BTLS155
EM OV TLS CA - G3CTLS4
EM OV CS CA - G3B程式碼簽章66
EM OV CS CA - G3C程式碼簽章237

這些憑證的結構完全正常。從 d = 4 推導出來的公鑰是曲線上的有效點,編碼正確、曲線正確、所有結構檢查都通過。唯一能發現的方法,就是試著破解它。

為什麼「無法圍堵」

通常 CA 金鑰外洩時,會有一個竊取者、一個發生時間點,可以推論誰現在擁有這把金鑰。

這次沒有。金鑰從證書存在的第一天起就等於公開。任何人在 2025 年 4 月到 2026 年 10 月的 17 個月內,只要看過這些證書之一,就能用一般筆電在毫秒內還原私鑰。這 17 個月的窗口期,無從得知是否有人已經這麼做。

Chrome 的說明指出:因為 Chrome 強制執行 Certificate Transparency(CT),沒有用這些 CA 簽發的 TLS 憑證出現在 CT 日誌裡,所以偽造的憑證無法在 Chrome 預設被信任。這對瀏覽器來說是真的,而且值得安慰。但 CT 是「偵測」錯誤簽發,不是「阻止」;而且大多數軟體根本不檢查 CT。

誰現在還暴露

主流且更新的瀏覽器應該沒事。Chrome 與 Firefox 直接封鎖這些中繼憑證且都要求 CT,Safari 也要求 CT。

但其他所有東西就不一樣了。多數非瀏覽器的 TLS 客戶端(也就是除了瀏覽器之外的幾乎一切,用預設設定時)做三件會影響結果的事:它們信任磁碟上的 CA bundle、預設不檢查撤銷、不檢查 CT。所以 eMudhra 與 Sectigo 撤銷這些中繼憑證,對它們完全沒幫助。

Scott Helme 在文章中特別點出需要更新根憑證儲存庫的範圍(這只是冰山一角):

  • curl | sh 安裝器與自動更新器:許多工具透過 HTTPS 下載腳本或二進位檔來安裝或更新,沒有簽章驗證(rustup、nvm、Homebrew 安裝器、無數的 install.sh 頁面、IoT 韌體更新器)。偽造憑證等於執行攻擊者的程式碼,通常還是 root 權限。

  • CI/CD 流水線:GitHub/GitLab runners、Jenkins、建置容器會拉取相依套件與推送產出物,同時持有雲端金鑰、registry token 與簽章金鑰。它們跑在過時的基礎映像檔、共享網路,底層全是 curl、Python、Go、Node。

  • 伺服器對伺服器 API 呼叫:支付服務、webhook、OAuth token 交換、雲端 SDK(AWS CLI 與 boto 用自己的 certifi bundle;Terraform 與 kubectl 用 Go)。這些請求的 header 帶著 API 密鑰與客戶資料。

  • IoT、嵌入式與 OT 裝置:攝影機、路由器、汽車、醫療器材、智慧家電、支付終端機、工業控制器,向母機回報指令與更新。它們的 bundle 凍結到 2039 年——這就是「無法圍堵」的現實意義。

  • Windows 程式碼簽章:這不是 TLS,但缺陷一樣:Windows 直接信任 eMudhra CS 根憑證。用 EM OV CS CA - G3B/G3C 簽章的惡意軟體,在任何不檢查撤銷的系統上看起來就像來自真實發行者的已簽章軟體。

Scott Helme 實測了:用本機伺服器與一張 api.stripe.com 的憑證(他說這是個大家都會同意很高價值的名稱),curl 說 SSL certificate verify ok,Python 完成握手,Node 說 authorized: true。他在 Linux 與 macOS 上測試的每一台機器都這樣。Windows 上,CryptoAPI 會接受這條鏈,除非開啟撤銷檢查,而且即使開啟,兩條路徑(eMudhra 與 Sectigo)只有一條回報已撤銷。

eMudhra 的說明

eMudhra 在 Mozilla 的 incident ticket 中給出了官方說明:

金鑰產生儀式中使用的腳本有 bug,在 HSM(硬體安全模組)上產生了第二組弱金鑰對。因為名稱相似,人為疏失導致選用錯誤的金鑰對來產生憑證簽章請求(CSR)。

Scott Helme 在他的文章更新中補充:「上面文字中的任何內容都不改變。」他也確認,只用一個簡單的 AI 提示詞,就讓 Claude 成功還原了這些 CA 的私鑰。

我們看到的事

這不是第一起 CA 出問題,也不會是最後一起。但這次的形狀特殊:不是被駭,不是管理疏失,是密碼學實作在產生階段就錯了,而且錯得如此基本——單一位元組——以至於任何人都能驗證。

信任鏈的最大問題一直都是:它要求鏈上的每一環都不能出錯。一家 CA 犯錯,影響的是所有信任它的系統;而這次的錯誤窗口長達 17 個月、影響範圍涵蓋 TLS 與程式碼簽章、無從得知誰看過、沒辦法收回已經「公開」的私鑰。

瀏覽器能快速反應,是因為它們有集中更新機制、有 CT 可以防偽造憑證出現、有使用者會抱怨網站打不開。但世界上多數的 TLS 連線不在瀏覽器裡:它們在容器裡、在 CI 流水線裡、在你車上、在醫院的設備裡、在從沒想過自己需要「更新」的裝置裡。

Scott Helme 在文章結尾寫:「八個位元。整整 17 個月,這是大量非瀏覽器軟體與偽造任何網站憑證之間的全部距離,只要你能進到網路路徑上。」

外洩的不是憑證,是整個簽發能力

這起事件裡,沒有任何一把終端實體憑證(leaf certificate)外洩。外洩的是中繼 CA 的私鑰,也就是「簽發憑證的能力」。

leaked credentials這次外洩了什麼:服務、用途、存在形式
服務憑證類型用途存在形式放在哪權限範圍狀態
eMudhra 中繼 CA(六張 TLS 簽發 CA)P-384 橢圓曲線私鑰簽發 DV / OV / EV 等級的 TLS 憑證8 bit 弱私鑰(數值 4、56、115、155、156、230),可從公開憑證瞬間還原HSM(但弱金鑰使任何人都能從公開憑證還原)可簽發任何網域的 TLS 憑證(瀏覽器有 CT 防護;非瀏覽器客戶端無)2026-10-17 通報後被撤銷與封鎖;有效期原至 2039-07
eMudhra 中繼 CA(兩張程式碼簽章 CA)P-384 橢圓曲線私鑰簽發程式碼簽章憑證8 bit 弱私鑰(數值 66、237),可從公開憑證瞬間還原HSM(但弱金鑰使任何人都能從公開憑證還原)可簽發 Windows 程式碼簽章憑證;Windows 直接信任 eMudhra CS 根憑證2026-10-17 通報後被撤銷;有效期原至 2039-07
Sectigo 的交叉簽章版本(同八張中繼 CA)同上私鑰,但證書由 Sectigo AAA Certificate Services 簽發透過 Sectigo 根憑證擴大信任範圍同上同上同上2025-05 交叉簽章;2026-10-17 後被撤銷
憑證本身已遮蔽或失效;這裡只說明它是哪個服務、拿來做什麼、以什麼形式存放,讓你能對照自己的環境。

三列本質上是同一組金鑰,但因為有兩條信任路徑(eMudhra 自己的根+ Sectigo 交叉簽章),所以有兩倍的攻擊面。

這篇提到的項目要花多少錢

更新 CA bundle 本身多數是免費的;成本在人力盤點與無法更新的裝置的替代方案。

cost更新與盤點 CA bundle 的成本
項目用量單價期間US$NT$舉證
盤點專案相依的所有 CA bundle
估:涵蓋作業系統、語言執行環境、容器、IoT 裝置韌體的清冊
約 0.5 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性429.6913,750本站假設值
更新能自動更新的系統(作業系統套件、Python certifi、Node.js、容器映像檔重建與重新部署)
估:取中間值 NT$27,500;多數套件更新指令免費,成本在測試與部署
約 1 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性859.3827,500本站假設值
評估無法更新的裝置(IoT、路由器、印表機、工控設備)的風險與替代方案
估:包含網路隔離、韌體更新推送、汰換評估
約 1 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性859.3827,500本站假設值
無法更新裝置的持續風險
中繼憑證有效期至 2039 年 7 月;無法更新的裝置在此之前持續暴露
——至 2039-07 中繼憑證到期——憑證有效期
合計(僅可證明列)0.000
匯率假設 1 USD ≈ NT$32。單價為公開牌價或帳單實付,來源:本站人力工時假設;AWS Secrets Manager 公開定價(2026-10 查)。「舉證」欄標明每筆損失的證據來源與等級( 可證明 推論 缺口)。

最貴的不是更新能更新的,是發現並承認那些更新不了的。

證據等級

本文主要依據 Scott Helme 的公開分析與 Mozilla 官方討論串;技術驗證由研究員完成並公開方法。

你可以學到什麼

站在防守者的角度:信任鏈只要有一環斷了,所有依賴它的連線都暴露。而多數連線不在你看得到的地方。

lessons本案的 7 個教訓
  1. 01
    CA 私鑰過弱不是「被駭」,是從第一天起私鑰就等於公開;這種缺陷無從圍堵、無從得知誰看過。
  2. 02
    Certificate Transparency 可以偵測偽造的 TLS 憑證,但只有瀏覽器強制執行;多數非瀏覽器客戶端(curl、Python、CI/CD、IoT)預設不檢查 CT。
  3. 03
    撤銷只對會檢查撤銷的客戶端有用。預設情況下,curl、Python、套件管理器、嵌入式裝置都不檢查;它們只信任磁碟上的 CA bundle。
  4. 04
    IoT 與嵌入式裝置的 CA bundle 通常凍結到產品生命週期結束;中繼憑證有效期到 2039 年,這些裝置會暴露到那時。
  5. 05
    程式碼簽章的威脅模型和 TLS 一樣:CA 私鑰外洩等於攻擊者可以簽發看起來合法的惡意軟體,而撤銷檢查在 Windows 上預設關閉。
  6. 06
    信任鏈的風險在你看不到的地方:不是瀏覽器、不是你手動執行的 curl,是 CI 容器裡的套件管理器、是十年沒更新的路由器、是你不知道存在的醫療設備。
  7. 07
    能更新的立刻更新;更新不了的列出來,這就是你的風險清冊。網路隔離、停用、汰換,是這份清冊的三個選項。
keywords重點學習:最需要學習的 10 個關鍵字10 個
  1. 01
    P-384 橢圓曲線
    這次弱金鑰使用的曲線;私鑰應為 384 bit(48 bytes),實際只有 8 bit(1 byte)。
  2. 02
    中繼 CA(Intermediate CA)
    外洩的不是終端憑證,是有簽發能力的中繼 CA 私鑰;可以簽任何網域。
  3. 03
    Certificate Transparency(CT)
    瀏覽器強制要求的偽造憑證偵測機制;但非瀏覽器客戶端多數不檢查。
  4. 04
    CA bundle
    作業系統與語言執行環境信任的根憑證清單;存在磁碟上,需手動或套件更新。
  5. 05
    交叉簽章(cross-signed)
    同一把中繼 CA 私鑰由兩個根憑證簽發,擴大信任範圍也擴大攻擊面。
  6. 06
    CRLSet 與 OneCRL
    Chrome 與 Firefox 用來快速封鎖特定憑證的機制,不需等作業系統更新。
  7. 07
    HSM(硬體安全模組)
    CA 應在 HSM 內產生並保護私鑰;但產生階段的腳本錯誤可能產生弱金鑰。
  8. 08
    程式碼簽章(code signing)
    除了 TLS,這次也波及程式碼簽章 CA;Windows 預設不檢查撤銷,惡意軟體可偽造合法簽章。
  9. 09
    撤銷檢查(revocation checking)
    OCSP 與 CRL 可告知憑證已撤銷,但多數非瀏覽器客戶端與 Windows 預設不檢查。
  10. 10
    無法圍堵(cannot be contained)
    這次事件的核心特徵:沒有竊取時間點、沒有竊取者名單,從公開證書就能還原私鑰的 17 個月內任何人都可能做到。

下面的步驟全部唯讀,做完你會有一張「我們信任的 CA bundle 在哪裡、多久更新一次、哪些更新不了」的清冊。

try today今天就可以來試試約 15 分鐘

全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。

  1. 列出你的專案實際使用的所有 CA bundle 來源
    看到什麼代表什麼:至少包含:作業系統(/etc/ssl/certs/、macOS Keychain)、Python certifi、Node.js、Go、Java、容器基礎映像檔、CI 環境、任何 IoT 或嵌入式裝置的韌體。
  2. 確認各個 bundle 的更新機制與最後更新時間
    apt list --installed | grep ca-certificates  # Debian/Ubuntu
    brew info ca-certificates  # macOS
    python -m pip show certifi
    node -p process.versions
    看到什麼代表什麼:能自動更新的會顯示最近更新日期;從未更新或不知道怎麼更新的,就是風險。
  3. 檢查容器映像檔基礎層的 CA bundle 是否已更新
    docker pull <你的基礎映像>
    docker run <映像> cat /etc/os-release
    看到什麼代表什麼:舊的基礎映像檔(例如半年前建置的)仍帶著當時的 CA bundle。
  4. 列出無法更新或不知道怎麼更新的裝置清單
    看到什麼代表什麼:路由器、印表機、攝影機、NAS、工業控制器、醫療設備、汽車⋯⋯這些多數沒有自動更新,韌體也可能已停止維護。這就是你的長期風險清冊。
  5. 查詢你用的 CI/CD 環境的基礎映像檔或 runner 版本
    看到什麼代表什麼:GitHub Actions 的 runner 映像檔、GitLab shared runner、Jenkins agent 容器;這些環境會拉取套件,它們的 CA bundle 過時就會接受偽造憑證。

這張清冊會一直有用。不只這次,每次 CA 出事時都要拿出來核對。

來源

分享
精選拆解直送信箱

每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。

延伸閱讀

作者分析

台灣網路認證 TWCA:24 張 CA 憑證序號只有 24 bit 隨機

外部研究者向 Mozilla 通報:TWCA 簽發的 24 張 CA 憑證(含 6 張 TLS 簽發 CA、2 張根憑證交叉簽章)的 16 位元組序號結構中,最多只有 3 個位元組(24 bit)為隨機值,其餘為固定前綴、日期與計數器。CA/Browser Forum 自 2016 年 9 月起要求至少 64 bit 的 CSPRNG 輸出;研究者確認這個結構從 2011 年沿用至 2024 年。TWCA 已確認事件並承諾於 2026 年 11 月 12 日前提交完整事件報告,Mozilla 社群討論持續進行中。

  • 2026/11/02
  • 每日拆解