資安雷達 2026 年 10 月 15 日

2026-10-15 — 多個 TLS 函式庫對 X.509 Name Constraints 判斷不一致

primary=https://www.openwall.com/lists/oss-security/2026/10/14/11 primary=https://kb.cert.org/vuls/id/573195 primary=https://github.com/pyca/cryptography/security/advisories/GHSA-m959-cc7f-wv43

多個 TLS 函式庫對 X.509 Name Constraints 的實作各說各話

oss-security · 2026-10-14

RFC 5280 的 Name Constraints 本該讓上層 CA 限定下層憑證只能簽哪些名稱,但多個主流 TLS 函式庫對大小寫、IP、URI、萬用字元的判斷並不一致,同一張憑證在 A 函式庫通過、在 B 函式庫被拒。

研究者 Oleh Konko(1seal)於 2026-10-14 在 oss-security 彙整各家修補狀態,CERT/CC 同時發布 VU#573195 等弱點說明。該貼文自述不公布新的 CVE,內容是整理已公開的修補與尚在處理的回報。

原本的問題

Name Constraints 是私有 PKI、service mesh 與企業內部 CA 常用的限縮手段:根或中繼 CA 宣告 permittedSubtrees 或 excludedSubtrees,驗證端必須拒絕超出範圍的葉憑證。問題在於 RFC 對不少情境沒有明文規定,各實作只好自行解讀,結果出現落差。

依 CERT/CC 的說明,落差主要有四類:

  • DNS 大小寫:RFC 5280 要求不分大小寫比對,GnuTLS 在回報時對部分名稱做了區分大小寫的比較(CVE-2026-3833,3.8.13 修正)。
  • IP 位址:RFC 定義了 IPv4 與 IPv6 各自的編碼,卻沒說 IPv4-mapped IPv6 是否等同 IPv4,部分函式庫視為不同,限制其中一種形式時另一種可能不受約束。
  • URI authority:RFC 3986 允許 host 前有 userinfo,遇到 @、冒號、query 或 fragment 時,各家抽出的 host 不同。OpenSSL 已合併 PR #30319 處理 @ 出現在 path、query 或 fragment 的情況,但另一則 userinfo 冒號的回報不在該修補範圍內。
  • 萬用字元:RFC 5280 沒有定義萬用字元 SAN 的語意,LibreSSL 與 wolfSSL(PR #9991)都有相關回報。

代表案例:pyca/cryptography

GHSA-m959-cc7f-wv43(CVE-2026-34073)說明得最清楚。該函式庫只拿 DNS 限制去檢查子憑證裡的 SAN,沒有檢查正在驗證的對端名稱。

葉憑證 SAN:      *.example.com
上層 CA 限制:    excluded = bar.example.com
對端名稱:        bar.example.com
舊行為:          通過(限制只比對 SAN,不比對對端名稱)
修補後 46.0.6:   拒絕(對端名稱若當作 SAN 會違反限制,就拒絕)

受影響版本為 46.0.5 以前,修補版為 46.0.6。該 advisory 標為 Low,並指出要利用必須有 Web PKI 通常避開的少見拓撲。

各函式庫修補狀態

函式庫識別碼修補版本
pyca/cryptographyCVE-2026-3407346.0.6
rustls/webpkiCVE-2026-93601、CVE-2026-936000.103.12(excludedSubtrees 情況於 0.103.13)
GnuTLSCVE-2026-38333.8.13
wolfSSLCVE-2026-52635.9.1
Go crypto/x509CVE-2026-33810Go 1.26.2
AWS-LCGHSA-3jrg-j22w-mpmc 等1.71.0

貼文另列出仍在分流、遭爭議或被拒的項目:Go 有兩則在分流,OpenSSL 的 userinfo 冒號回報在分流,NSS 與 LibreSSL 仍在協調,Mbed TLS 認為屬功能需求而非弱點。貼文自己也提醒,其中一個 wolfSSL 的 CVE 編號與該 CVE 實際描述的內容(ALPN 解析)對不上,引用前應回頭核對 CERT/CC 與廠商公告。

影響範圍

CERT/CC 明確寫出利用條件:攻擊者必須取得對所選憑證欄位的有效簽章、驗證路徑必須可達、應用程式還要拿被接受的身分去做授權。它同時指出「驗證器之間的不一致本身不構成被利用」,目前也沒有已知的實際利用。

真正需要檢查的是這幾類環境:

  • 用 Name Constraints 限縮內部 CA 或外部合作 CA 的私有 PKI,而且信任它簽出的憑證。
  • service mesh、CDN、企業 PKI 中混用多種 TLS 函式庫,同一張憑證在不同元件得到不同結果,而憑證本身簽章有效,很難偵測。
  • 把驗證通過的名稱直接拿去做存取授權的服務。

修補與緩解

貼文唯一提出的緩解是升級到上表版本,也沒有公布未修補問題的測試向量。CERT/CC 另建議:用實際部署需求測試所用驗證器、葉憑證只使用明確列出的 SAN、搭配簽發政策與應用層白名單。多放一個驗證器只有在輸入相同且失敗即拒絕時才有幫助。

CERT/CC 的廠商欄位顯示,Go、Apple、OpenSSL、LibreSSL、pyca、wolfSSL 的狀態都還是 Unknown,且尚無廠商聲明。盤點時請以各家自己的 advisory 為準。

原始來源:oss-security 貼文、CERT/CC VU#573195、pyca GHSA-m959-cc7f-wv43


End of article
0
Would love your thoughts, please comment.x
()
x