CVE-2018-18820漏洞分析
研究人員發現xiph.org基金會支持的開源流媒體伺服器Icecast的漏洞。攻擊者可以偽造HTTP header來覆寫伺服器的棧內容,導致遠程代碼執行漏洞。因為Icecast常用於網路電台,所以攻擊者利用該漏洞可以完全控制網路電台。該漏洞的CVE編號為CVE-2018-18820。
版本號為2.4.0到2.4.3的Icecast伺服器和使用URL認證的Icecast伺服器受該漏洞的影響。研究人員建議儘快升級到v 2.4.4。
Snprintf
我們都知道sprintf是不安全的,因為不提供對緩衝區溢出的保護。許多文檔中都說Snprintf是更安全版本的sprintf,但如果緩衝區太小,輸出就會變短。但我們不清楚的是如果輸出縮短,snprintf就不會返回寫的位元組。事實上,如果輸出緩存足夠大,那麼返回的是已經寫入的位元組數。如果提供一個大於緩衝區大小的size參數,根本無法應對緩衝區溢出。
下面是來自Icecast的有漏洞的代碼:
在來自用戶請求的HTTP header之上循環,並複製到緩衝區,構建一個發送到認證伺服器的POST請求主體:
post_offset += snprintf(post + post_offset,
sizeof(post) - post_offset,
"&%s%s=%s",
url->prefix_headers ? url->prefix_headers : "",
cur_header, header_valesc);
下面是代碼的簡化版:
post_offset += snprintf(post + post_offset,
sizeof(post) - post_offset,
"%s",
cur_header);
如果sizeof(post)的大小是10,那麼就寫入了8位元組。那麼如果下一個複製的header是baz會怎麼樣呢?
輸出會變短,但post_offset在緩存的尾部會遞增:
下面設想另一個複製的header內容為「AAAAA...」。 到snprintf的size參數是sizeof(post) - post_offset,這會下溢變成一個非常大的數。結果就是之後對snprintf的調用會有效地寫入儘可能多的數據。數據會被寫入post + post_offset,可能會超出post緩存的範圍,那麼就會覆蓋棧中的其他內容。
也就是說我們可以發送一個隨後會被縮短的長HTTP header,但是長度可以讓我們定位棧中的任何位置post_offset。然後,可以發送第二個HTTP header,其內容會被寫入定位的位置。
對攻擊者來說,比較難的一點是header在複製到snprintf之前會進行處理,所以限制在可以寫入到棧中的數據。研究人員的POC漏洞利用可以引發伺服器進程段錯誤(segfault),類似DoS攻擊。但研究人員認為攻擊者可以對該攻擊進行升級來獲得完全遠程代碼執行。
修復
Xiph很快對漏洞進行了回應,並發布了補丁。補丁非常簡單,檢查了snprintf的返回值,如果使post_offset指向緩衝區的尾部,就記錄錯誤並退出循環。
※三種身份訪問管理部署模式:哪種最適合您的組織?
※利用Windows庫文件進行持久化攻擊
TAG:嘶吼RoarTalk |