Curl 存在一個(gè)長達(dá) 23.9 年的 DOS 漏洞
curl 的作者 Danie 在博客中分享了 curl 持續(xù)了 23.9 年的 DOS 漏洞。
1998 年 10 月, curl 4.9 發(fā)布了,curl 4.9 是第一個(gè)帶有 “cookie 引擎” 的版本,可以接收 HTTP cookie、解析、理解并在后續(xù)請(qǐng)求中正確返回 cookie。
當(dāng)然,當(dāng)時(shí) curl 的受眾很小,幾個(gè)月后 curl 網(wǎng)站才宣布 curl l 4.9 版本的下載量達(dá)到了 300 次。而且當(dāng)時(shí) cookie 也沒有明確的規(guī)范,唯一描述 cookie 如何工作的規(guī)范是 Netscape 網(wǎng)景公司一個(gè)非常簡短的文檔,名為 cookie_spec。
在隨后的日子里,IETF(互聯(lián)網(wǎng)工程任務(wù)組) 一直在努力創(chuàng)建 cookie 規(guī)范,但大多失敗了。因?yàn)?Cookie 有點(diǎn)特別,它們由許多不同的作者、代碼庫和網(wǎng)站實(shí)現(xiàn),從根本上改變 “從上而下的規(guī)范” 的工作方式。
直到 2011 年發(fā)布的 Cookie RFC 6265,這是真正意義上的 Cookie 規(guī)范,解釋了 cookie 是什么,以及應(yīng)該遵守什么。但這也引來了一些問題,RFC 6265 為服務(wù)器如何發(fā)送 cookie 提供了一種字段語法,而為客戶端提供了一種截然不同的語法用來接受 cookie。雙重語法導(dǎo)致了兩個(gè)問題:
- 很難閱讀規(guī)范,因?yàn)楹苋菀紫萑肫渲幸环N語法,并假設(shè)語法對(duì)所有用例有效。
- 定義發(fā)送 cookie 的語法沒什么用,因?yàn)榭蛻舳瞬攀钦嬲龥Q定如何接收和處理 cookie ?,F(xiàn)有的大型 cookie 解析器(如瀏覽器)在接受的內(nèi)容格式上相當(dāng)自由,沒有人注意服務(wù)器是否遵循 RFC 規(guī)范中的語法。
隨著時(shí)間的推移, cookie 的發(fā)展依然緩慢,但 HTTP 規(guī)范在過去的幾十年中已經(jīng)更新了很多次。更重要的是 HTTP 服務(wù)器實(shí)現(xiàn)已經(jīng)實(shí)施了更嚴(yán)格的解析策略:如果傳入的 HTTP 請(qǐng)求看起來 “非法” 或格式不正確,HTTP 服務(wù)器開始提前拒絕它們。現(xiàn)在嘗試向一個(gè)新的 HTTP 服務(wù)器發(fā)送一個(gè)包含控制代碼的請(qǐng)求,那么服務(wù)器只會(huì)拒絕該請(qǐng)求并返回一個(gè) 400 響應(yīng)代碼。
一個(gè) 23 年的 Bug
2022 年 6 月末,curl 收到了一份關(guān)于 curl 可疑安全問題的報(bào)告,這導(dǎo)致 curl 隨后發(fā)布了 CVE-2022-35252。
事實(shí)證明,1998 年的 curl cookie 代碼接受包含控制代碼的 cookie??刂拼a可以是名稱或內(nèi)容的一部分,如果用戶啟用 “cookie 引擎”,curl 將存儲(chǔ)這些 cookie ,并在后續(xù)請(qǐng)求中將它們返回。比如:
Set-Cookie: name^a=content^b; domain=.example.com
^a 和 ^b 代表控制碼,字節(jié)碼一和二。由于域可以將 cookie 標(biāo)記為另一個(gè)主機(jī)。因此,該 cookie 將包含在對(duì)該域內(nèi)所有主機(jī)的請(qǐng)求中。當(dāng) curl 將這樣的 cookie 發(fā)送到 HTTP 服務(wù)器時(shí),它會(huì)在傳出請(qǐng)求中包含這樣的標(biāo)頭字段:
Cookie: name^a=content^b
而默認(rèn)配置的服務(wù)器將響應(yīng) 400。對(duì)于接收這些 cookie 的腳本或應(yīng)用程序,只要 cookie 繼續(xù)發(fā)送,進(jìn)一步的請(qǐng)求將被拒絕,形成拒絕服務(wù) DOS 攻擊。
自 4.9 版本以來(curl 項(xiàng)目開發(fā)的第 201),這些易受攻擊的 cookie 代碼就一直存在于 curl 里面,直到 7.85.0 版本(curl 項(xiàng)目開發(fā)的第 8930 天)才得到修復(fù),中間經(jīng)歷了 8729 天(23.9 年)。
當(dāng)然,據(jù) Daniel 解釋:這些 cookie 代碼當(dāng)初發(fā)布時(shí)沒有問題,并且在用戶使用的大部分時(shí)間里也沒有問題。且最新版本的 curl 已經(jīng)完全符合最新的 RFC 6265bis 草案版本的規(guī)定。