曲速未來 披露|snprintf的問題:Icecast中的漏洞區塊鏈
曲速未來:Icecast流媒體服務器發現了一個遠程代碼執行漏洞。
區塊鏈安全咨詢公司 曲速未來 消息:有安全人員發現了由Xiph.org基金會維護的開源流媒體服務器Icecast中的一個漏洞。攻擊者可以制作HTTP標頭,覆蓋服務器的堆棧內容,從而導致遠程代碼執行。由于Icecast通常用于托管互聯網廣播電臺,因此有動力的攻擊者可能會將電臺停播。已為此漏洞分配標識符CVE-2018-18820。
snprintf:一個更安全的sprintf版本
在這一點上,眾所周知,它sprintf是不安全的,因為它不提供緩沖區溢出保護。這是不尋常地看到,用戶指向的文件snprintf作為一個更安全的版本,因為如果緩沖區太小,它將截斷輸出。但人們通常沒有意識到的是,當它截斷時,snprintf不會返回它寫入的字節數。實際上,如果輸出緩沖區足夠大,它將返回它將寫入的字節數。更糟糕的是,如果提供的大小參數大于緩沖區的實際大小,它無法阻止緩沖區溢出。
這是來自Icecast的易受攻擊的代碼,它從用戶請求循環HTTP頭并將它們復制到緩沖區,構建POST請求的主體以發送到身份驗證服務器:
這段代碼的略微簡化版本:
如果考慮一個sizeof(post)10的情況,并且已經寫入了8個字節(即,post_offset是8)。當要復制的下一個標題是什么時會發生什么"baz"?
輸出被截斷,但post_offset增加超出緩沖區的末尾:
現在如果假設有另一個要復制的標題,包含內容"AAAAA..."。就會處于一個有趣的位置:大小參數snprintf是sizeof(post) - post_offset,它將下溢成為一個非常大的數字。結果是后續調用snprintf可以有效地寫入他們想要的數據。該數據將被寫入緩沖區post post_offset末尾的某個地方post,并將覆蓋堆棧的其他內容。
這意味著是可以發送一個將被截斷的長HTTP標頭,但其長度將允許post_offset在選擇的堆棧中的任何位置。然后就可以發送第二個HTTP標頭,其內容將被寫入該位置。
攻擊者的一個難點是在復制之前執行標題的一些清理snprintf,因此它們在可以寫入堆棧的數據方面受到一定限制。這個概念驗證漏洞只會導致服務器進程中的段錯誤 - 實際上是拒絕服務攻擊 - 但是有懷疑一個充滿動力和聰明的攻擊者能夠升級此攻擊以實現全面的遠程代碼執行。
修復
區塊鏈安全咨詢公司 曲速未來 表示:Xiph的安全人員很快修補了這個bug,雖然修復非常簡單。它只是檢查來自的返回值snprintf,如果它導致post_offset超出緩沖區的末尾,它會記錄一個錯誤并退出循環。
本文內容由 曲速未來 (WarpFuture.com) 安全咨詢公司整理編譯,轉載請注明。 曲速未來提供包括主鏈安全、交易所安全、交易所錢包安全、DAPP開發安全、智能合約開發安全等相關區塊鏈安全咨詢服務。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。