八位元的信任鏈:
eMudhra CA 的金鑰在毫秒內被破解
為什麼現在很紅:一家憑證機構的私鑰只有 256 種可能。任何人看到證書就能破解,而且已經看了 17 個月。
- 一句話結論
- 2026 年 10 月 17 日,資安研究員向五方(Apple、Google、Microsoft、Mozilla、eMudhra)通報:eMudhra 的八張中繼 CA 私鑰只有 8 bit。不是被偷,是任何人拿到公開的證書,用筆電就能在毫秒內暴力破解還原私鑰。Chrome 與 Firefox 當晚即封鎖這些中繼憑證,Mozilla 20 日公開並從根憑證移除 eMudhra。
- 他要的是什麼
- 八張中繼 CA 的私鑰,最難的那一把需要試 256 次。對攻擊者來說,這不是入侵,是公開資料處理。
- 你今天做一件事
- 今天列出你的專案相依的所有 CA bundle:作業系統、Python certifi、Node.js、容器、IoT 裝置韌體。能更新的立刻更新,不能更新的列出來,這就是你的風險清冊。 直接去做 →
- 哪些能信
- 6 可證明4 推論2 缺口 每個主張都標了等級,缺口是誠實寫出來的。
- 破口速查
- 受害端一律去識別化;寫「未公開」代表公開資料查不到。
- 伺服器服務商
- eMudhra(憑證機構);受影響裝置涵蓋任何信任該 CA 根憑證的系統
- 網路服務商
- 全球網際網路
- 漏洞出現的地方
- 密碼學層:P-384 橢圓曲線私鑰應為 384 bit,實際只有 8 bit(1 byte);金鑰產生儀式的腳本錯誤產生弱金鑰,人為疏失選用錯誤的金鑰對提交 CSR
- 馬上自我檢測
列出你的專案相依的所有憑證:作業系統、語言執行環境、容器基礎映像檔、IoT 裝置韌體 確認它們各自的 CA bundle 更新機制與頻率 檢查不會自動更新的裝置清單(路由器、印表機、攝影機、工業控制器)- 漏洞修補方式
- 作業系統與套件:更新 ca-certificates 套件、certifi(Python)、Node.js、Go、Java 執行環境、容器基礎映像檔。無法更新的裝置:eMudhra 中繼憑證有效期至 2039 年 7 月,這些裝置在到期前持續暴露;IoT 廠商需推送韌體更新,或建議網路隔離
有 15 分鐘再看:其餘 2 點
- 這八張中繼憑證於 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。
一家憑證機構的私鑰只有 8 bit,等於從 256 種可能裡選一個。這不是金鑰被偷,而是從第一天起任何人只要看到證書,用筆電就能在不到一秒內還原私鑰。這個漏洞存在了 17 個月,波及 TLS 與程式碼簽章兩類憑證,影響範圍從瀏覽器到 IoT 裝置、從 CI/CD 到套件管理器。這篇拆解資安研究員 Scott Helme 的分析,談「無法圍堵」是什麼意思。
本篇目錄
發生了什麼
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 - G3B | TLS | 156 |
| EM DV TLS CA - G3C | TLS | 230 |
| EM EV TLS CA - G3B | TLS | 115 |
| EM EV TLS CA - G3C | TLS | 56 |
| EM OV TLS CA - G3B | TLS | 155 |
| EM OV TLS CA - G3C | TLS | 4 |
| 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 的私鑰,也就是「簽發憑證的能力」。
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| 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 本身多數是免費的;成本在人力盤點與無法更新的裝置的替代方案。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| 盤點專案相依的所有 CA bundle 估:涵蓋作業系統、語言執行環境、容器、IoT 裝置韌體的清冊 | 約 0.5 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 429.69 | 13,750 | 本站假設值 |
| 更新能自動更新的系統(作業系統套件、Python certifi、Node.js、容器映像檔重建與重新部署) 估:取中間值 NT$27,500;多數套件更新指令免費,成本在測試與部署 | 約 1 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 859.38 | 27,500 | 本站假設值 |
| 評估無法更新的裝置(IoT、路由器、印表機、工控設備)的風險與替代方案 估:包含網路隔離、韌體更新推送、汰換評估 | 約 1 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 859.38 | 27,500 | 本站假設值 |
| 無法更新裝置的持續風險 中繼憑證有效期至 2039 年 7 月;無法更新的裝置在此之前持續暴露 | — | — | 至 2039-07 中繼憑證到期 | — | — | 憑證有效期 |
| 合計(僅可證明列) | 0.00 | 0 | ||||
最貴的不是更新能更新的,是發現並承認那些更新不了的。
證據等級
本文主要依據 Scott Helme 的公開分析與 Mozilla 官方討論串;技術驗證由研究員完成並公開方法。
你可以學到什麼
站在防守者的角度:信任鏈只要有一環斷了,所有依賴它的連線都暴露。而多數連線不在你看得到的地方。
- 01CA 私鑰過弱不是「被駭」,是從第一天起私鑰就等於公開;這種缺陷無從圍堵、無從得知誰看過。
- 02Certificate Transparency 可以偵測偽造的 TLS 憑證,但只有瀏覽器強制執行;多數非瀏覽器客戶端(curl、Python、CI/CD、IoT)預設不檢查 CT。
- 03撤銷只對會檢查撤銷的客戶端有用。預設情況下,curl、Python、套件管理器、嵌入式裝置都不檢查;它們只信任磁碟上的 CA bundle。
- 04IoT 與嵌入式裝置的 CA bundle 通常凍結到產品生命週期結束;中繼憑證有效期到 2039 年,這些裝置會暴露到那時。
- 05程式碼簽章的威脅模型和 TLS 一樣:CA 私鑰外洩等於攻擊者可以簽發看起來合法的惡意軟體,而撤銷檢查在 Windows 上預設關閉。
- 06信任鏈的風險在你看不到的地方:不是瀏覽器、不是你手動執行的 curl,是 CI 容器裡的套件管理器、是十年沒更新的路由器、是你不知道存在的醫療設備。
- 07能更新的立刻更新;更新不了的列出來,這就是你的風險清冊。網路隔離、停用、汰換,是這份清冊的三個選項。
- 01P-384 橢圓曲線這次弱金鑰使用的曲線;私鑰應為 384 bit(48 bytes),實際只有 8 bit(1 byte)。
- 02中繼 CA(Intermediate CA)外洩的不是終端憑證,是有簽發能力的中繼 CA 私鑰;可以簽任何網域。
- 03Certificate Transparency(CT)瀏覽器強制要求的偽造憑證偵測機制;但非瀏覽器客戶端多數不檢查。
- 04CA bundle作業系統與語言執行環境信任的根憑證清單;存在磁碟上,需手動或套件更新。
- 05交叉簽章(cross-signed)同一把中繼 CA 私鑰由兩個根憑證簽發,擴大信任範圍也擴大攻擊面。
- 06CRLSet 與 OneCRLChrome 與 Firefox 用來快速封鎖特定憑證的機制,不需等作業系統更新。
- 07HSM(硬體安全模組)CA 應在 HSM 內產生並保護私鑰;但產生階段的腳本錯誤可能產生弱金鑰。
- 08程式碼簽章(code signing)除了 TLS,這次也波及程式碼簽章 CA;Windows 預設不檢查撤銷,惡意軟體可偽造合法簽章。
- 09撤銷檢查(revocation checking)OCSP 與 CRL 可告知憑證已撤銷,但多數非瀏覽器客戶端與 Windows 預設不檢查。
- 10無法圍堵(cannot be contained)這次事件的核心特徵:沒有竊取時間點、沒有竊取者名單,從公開證書就能還原私鑰的 17 個月內任何人都可能做到。
下面的步驟全部唯讀,做完你會有一張「我們信任的 CA bundle 在哪裡、多久更新一次、哪些更新不了」的清冊。
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 列出你的專案實際使用的所有 CA bundle 來源看到什麼代表什麼:至少包含:作業系統(/etc/ssl/certs/、macOS Keychain)、Python certifi、Node.js、Go、Java、容器基礎映像檔、CI 環境、任何 IoT 或嵌入式裝置的韌體。
- 確認各個 bundle 的更新機制與最後更新時間
apt list --installed | grep ca-certificates # Debian/Ubuntu brew info ca-certificates # macOS python -m pip show certifi node -p process.versions看到什麼代表什麼:能自動更新的會顯示最近更新日期;從未更新或不知道怎麼更新的,就是風險。 - 檢查容器映像檔基礎層的 CA bundle 是否已更新
docker pull <你的基礎映像> docker run <映像> cat /etc/os-release看到什麼代表什麼:舊的基礎映像檔(例如半年前建置的)仍帶著當時的 CA bundle。 - 列出無法更新或不知道怎麼更新的裝置清單看到什麼代表什麼:路由器、印表機、攝影機、NAS、工業控制器、醫療設備、汽車⋯⋯這些多數沒有自動更新,韌體也可能已停止維護。這就是你的長期風險清冊。
- 查詢你用的 CI/CD 環境的基礎映像檔或 runner 版本看到什麼代表什麼:GitHub Actions 的 runner 映像檔、GitLab shared runner、Jenkins agent 容器;這些環境會拉取套件,它們的 CA bundle 過時就會接受偽造憑證。
這張清冊會一直有用。不只這次,每次 CA 出事時都要拿出來核對。
環境背景、時間線、攻擊鏈對照 ATT&CK、關鍵證據、根因、處置與檢討都在完整版,約 12 分鐘。
來源
- Scott Helme:Eight Bits of Trust; eMudhra's CA keys cracked in milliseconds(2026-10-20)
- Mozilla Dev Security Policy 討論串(2026-10-17 通報)
- Mozilla Bugzilla #2083449:eMudhra incident ticket
- eMudhra 官方說明(於 Mozilla ticket 公開)
- 研究者公開頁面:emudhra.we-have-a-problem.com
本文為公開報導與官方公告的整理與拆解,非第一手鑑識;證據等級依來源可信度標註。
本文由 AI 團隊協助研究與撰寫,經隱私與事實檢查後發布;證據等級依來源可信度標註。
複製下面這段,貼給你在用的 AI 工具(Claude Code、Cursor、Copilot、ChatGPT 都可以)。它會用本篇的破口位置、自我檢測與學習重點,對你的專案或環境做一次資安掃描,列出潛在問題與建議的調整或加強方式。
預設是唯讀:只發現問題、提出建議,不會改你任何檔案或設定。
M3 密碼學基礎 · M7 事件應變 · 想在自己的環境做一次同樣的盤點,從 自我盤點 開始。
每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。或先 加入會員 記錄你完成的任務。