grpc-js 的 getAuthContext 把未授權憑證當成已授權
GitHub Advisory Database(grpc/grpc-node)· 2026-09-30
@grpc/grpc-js 的 getAuthContext() 原本只要連線是 TLS 就回傳對端憑證,不檢查這張憑證有沒有通過驗證;修補後,未通過驗證的連線一律回傳空的 auth context。這是 CVE-2026-101916(GHSA-m9gg-hp2v-232j),嚴重度 high,CVSS 3.1 為 7.4,弱點類型是 CWE-295(Improper Certificate Validation)。
漏洞機制
gRPC server 可以用 requireClientCertificate 選項決定是否強制 client 出示憑證。當它設為 false 時,TLS 握手允許 client 送來一張沒有通過信任鏈驗證的憑證,Node.js 的 TLSSocket.authorized 會是 false,但連線並不會被中斷。
問題在於 getAuthContext() 沒有看 authorized。依 修補 commit 的 diff,舊程式只判斷 socket 是不是 TLSSocket,是的話就回傳 transportSecurityType: 'ssl' 加上 sslPeerCertificate。呼叫端拿到的結果,和一張合法憑證的結果沒有差別。
// 修補前
if (socket instanceof TLSSocket) {
return { transportSecurityType: 'ssl',
sslPeerCertificate: peerCertificate };
}
// 修補後
if (!(socket instanceof TLSSocket)) return {};
if (!socket.authorized) return {};
return { transportSecurityType: 'ssl',
sslPeerCertificate: peerCertificate };同一個 commit 也改了 transport.ts:client 端建立 authContext 的條件從「socket 是 TLSSocket」變成「是 TLSSocket 且 authorized」,兩端的行為因此一致。
受影響版本
advisory 列出兩段受影響範圍,npm 套件 @grpc/grpc-js:
| 受影響範圍 | 修補版本 |
|---|---|
< 1.13.6 | 1.13.6 |
>= 1.14.0, < 1.14.5 | 1.14.5 |
是否會中招取決於你怎麼用它。只有把 getAuthContext() 的結果拿來做身分驗證或授權判斷、而且 server credentials 以 requireClientCertificate: false 建立的服務,才會被攻擊者用一張自簽或不受信任的憑證冒充身分。若你只用它做記錄,或 requireClientCertificate 本來就是 true,則不受這個路徑影響。
advisory 特別點名 @grpc/grpc-js-xds:它在某些設定下同時把 requireClientCertificate 設成 false,又用 getAuthContext() 的回傳值做 RBAC 驗證,因此是實際可觸發的組合。用 xDS 做 service mesh 授權的團隊應優先檢查。
修補與緩解
- 升級:1.13.x 線升到
1.13.6,1.14.x 線升到1.14.5,見 1.14.5 release。 - 暫時緩解:把
requireClientCertificate設為true,讓沒有有效憑證的連線在握手階段就被拒絕。 - xDS 使用者:在 xDS 設定的
DownstreamTlsContext裡,把require_client_certificate欄位設為true。
升級後要注意行為變化:過去靠「有憑證就當成功」的程式,現在對未授權連線會拿到 {},sslPeerCertificate 會是 undefined。如果你的授權邏輯預設「拿不到憑證就拒絕」,行為正確;如果某處把空結果當成「匿名但放行」,要確認那是你要的語意。
CVSS 向量是 AV:N/AC:H/PR:N/UI:N,代表網路可達、不需權限,但攻擊複雜度為 high,因為必須剛好遇到 requireClientCertificate: false 加上呼叫端信任 auth context 的組合。advisory 未說明已有公開利用的案例。
原始來源:GHSA-m9gg-hp2v-232j、修補 commit 2a84ec8、@grpc/grpc-js 1.14.5