資安雷達 2026 年 9 月 18 日

2026-09-18 — CoreDNS 自訂傳輸層繞過驗證,恐當機或遭竄改記錄

primary=https://github.com/advisories/GHSA-mrg3-qvqr-jw29 primary=https://github.com/advisories/GHSA-9gm5-9rfh-m6vx

CoreDNS 自訂傳輸層繞過驗證,恐當機或遭竄改記錄

GitHub Security Advisory · 2026-09-17

CoreDNS 的 DoHDoH3DoQgRPC 這四種自訂傳輸層,長期繞過了標準 UDPTCP 監聽器原本套用的封包驗證函式,讓未經任何身分驗證的請求就能觸發記憶體耗盡,或是把偽造的 UPDATE 指令轉發給上游 DNS 伺服器竄改紀錄。CoreDNS 專案於 2026 年 9 月 17 日同時發布兩份公告 GHSA-mrg3-qvqr-jw29CVE-2026-82399)與 GHSA-9gm5-9rfh-m6vxCVE-2026-86003),CVSS 皆為 7.5,修補版本統一為 v1.14.7

漏洞機制

問題出在解析順序。標準 UDPTCP 伺服器(底層用 miekg/dns)在真正解析封包前,會先用 dns.DefaultMsgAcceptFunc 檢查固定 12 位元組表頭:只允許 QDCOUNT 剛好為一,其餘區段數也有上限,不合規就直接拒絕。但 CoreDNS 自己實作的 DoH/DoH3 解碼器、DoQ 串流處理與 gRPC 查詢處理,全部直接呼叫 dns.Msg.Unpack,略過了這一層檢查。

第一個漏洞(CVE-2026-82399)的攻擊者利用 DNS 名稱壓縮技巧,讓一個 65,533 位元組的請求在展開後配置超過 10 MiB 記憶體;由於解析發生在 plugin chain 之前,外掛層級的流量限制完全攔不住這波配置,同時送出多筆這類請求就能把 CoreDNS 記憶體耗盡到程序被系統終止。

第二個漏洞(CVE-2026-86003)則是同一個缺口的另一種利用方式:CoreDNS 只看訊息裡的 Zone 問題來路由,並未檢查 opcode,於是 RFC 2136UPDATE 訊息(opcode 5)也能通過這四種傳輸層,被 forward/proxy 外掛原封不動轉發給上游伺服器。只要上游只信任 CoreDNS 的來源位址或連線本身、而非要求端對端 TSIG 簽章,攻擊者就能借道 CoreDNS 新增、替換或刪除上游的 DNS 紀錄,完全不需要通過任何驗證。

兩份公告都附上可重現的概念性驗證程式:CVE-2026-82399 的 PoC 針對 CoreDNS v1.14.6 起的 DoH 伺服器,在設有記憶體限制的 Docker 容器內重現配置暴增到程序被砍掉的過程;CVE-2026-86003 的 PoC 則另外啟動一個標準函式庫寫成的模擬上游 DNS 服務,驗證一筆未經 TSIG 簽章的 UPDATE 訊息,經由 DoH 送進 CoreDNS 後,會被 forward 外掛原封不動轉送到那個模擬上游並寫入紀錄。這代表兩個漏洞都不是理論推導,而是有實測可重現的攻擊路徑。

項目CVE-2026-82399CVE-2026-86003
CVSS 3.17.5(C:N/I:N/A:H7.5(C:N/I:H/A:N
影響記憶體耗盡、程序終止上游 DNS 紀錄遭新增/竄改/刪除
受影響傳輸層DoH、DoH3、DoQ、gRPCDoH、DoH3、DoQ、gRPC
是否需要驗證否(另需上游不驗 TSIG)

兩者的根因寫法幾乎一致,可以用下面的簡化流程對照:

// 修補前:自訂傳輸層直接解封包
msg := new(dns.Msg)
msg.Unpack(rawBytes)              // 沒有表頭檢查,任何 opcode/區段數都放行

// 修補後:套用與 UDP/TCP 相同的請求政策
if _, err := dnsutil.UnpackRequest(rawBytes); err != nil {
    return errReject                // 先跑 dns.DefaultMsgAcceptFunc 同等檢查
}
msg := new(dns.Msg)
msg.Unpack(rawBytes)

受影響版本

兩份公告的受影響範圍與修補版本完全相同:github.com/coredns/coredns(Go module)<= 1.14.6 皆受影響,修補版本為 1.14.7。修補提交為 530b0a5ff2ad68cc0421f10dd93568945cc671c9,對應 release 為 v1.14.7

值得注意的是攻擊面的前提:這兩個漏洞只打得到有開啟 DoH、DoH3、DoQ 或 gRPC 這些非傳統傳輸層的部署。多數 Kubernetes 叢集透過 kubeadm 或 CNI 安裝的預設 Corefile,通常只在 53 埠監聽標準 UDPTCP,不會自動開啟這幾種擴充協定;但只要維運者為了服務網格、內部 DoH 閘道或 gRPC DNS API 而額外加了對應的 server block,就落在受影響範圍內,而且攻擊者不需要任何認證即可觸發。

修補與緩解

最直接的做法是把 CoreDNS 升級到 1.14.7 或更新版本。自架 CoreDNS 的維運者(包含許多自建 Kubernetes 叢集直接管理 coredns deployment 映像檔的團隊)可以直接替換映像檔版本;使用受管 Kubernetes 服務、CoreDNS 由雲端供應商代管的使用者,則需要等供應商推送更新後的映像檔,短期內無法自行修補二進位檔。

在等待升級的期間,若叢集確實開啟了 DoH/DoH3/DoQ/gRPC 監聽器,可以先評估是否能暫時關閉這些非必要的傳輸層 server block,回退到標準 UDPTCP;若上游支援 RFC 2136UPDATE,也應該確認上游有要求端對端 TSIG 簽章,而不是只靠信任 CoreDNS 的來源位址或連線本身。

原始來源:GHSA-mrg3-qvqr-jw29GHSA-9gm5-9rfh-m6vx


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