本文原創(chuàng)作者:歐陽洋蔥
來源:FreeBuf.COM
Wordfence最近披露了某個(gè)影響范圍很大的安全問題,大量WordPress網(wǎng)站都受到影響。這個(gè)漏洞利用的是WordPress的自動(dòng)更新功能,此功能默認(rèn)是開啟的,又因?yàn)檎麄€(gè)互聯(lián)網(wǎng)上大約有27%的站點(diǎn)都采用WordPress,所以Wordfence宣稱,整個(gè)web世界有27%的網(wǎng)站都可能因此被黑。
簡單說就是利用WordPress更新服務(wù)器的弱點(diǎn),控制該服務(wù)器,自然也就能夠同時(shí)對所有采用WordPress的網(wǎng)站完成入侵了。
一擊黑入全球1/4的網(wǎng)站
在WordPress生態(tài)中,api.wordpress.org服務(wù)器的重要功能在于,為WordPress站點(diǎn)發(fā)布自動(dòng)更新。各WordPress站點(diǎn),每隔1個(gè)小時(shí)就會(huì)向該服務(wù)器發(fā)起請求,檢查插件、主題和WordPress核心更新。
api.wordpress.org服務(wù)器的響應(yīng)就包括了WordPress各部分是否需要自動(dòng)更新,響應(yīng)中也包含下載和安裝更新軟件的URL地址。
于是,只要搞定了這臺(tái)服務(wù)器,黑客也就能夠讓所有的WordPress站點(diǎn)自動(dòng)從他們自己的URL下載和安全惡意程序了。也就是說,攻擊者通過api.wordpress.org的自動(dòng)更新機(jī)制,就能大規(guī)模黑入大量WordPress站點(diǎn)。
整個(gè)過程實(shí)際上是完全可行的,因?yàn)?b>WordPress本身并不提供軟件的簽名驗(yàn)證。它信任api.wordpress.org提供的任意URL地址和包。WordPress文檔中有提到:默認(rèn)情況下,每個(gè)站點(diǎn)都會(huì)開啟自動(dòng)更新功能,接收核心文件更新。
按照Wordfence的說法,黑客只需要針對api.wordpress.org一擊,就能讓全球超過1/4的網(wǎng)站感染惡意程序。
api.wordpress.org漏洞技術(shù)細(xì)節(jié)
這個(gè)更新服務(wù)器有個(gè)GitHub webhook,它能夠讓W(xué)ordPress核心開發(fā)者將代碼同步到wordpress.org SVN庫,也就能夠?qū)itHub作為其源代碼庫了。這樣一來,核心開發(fā)者只要在GitHub提交更改,就會(huì)觸發(fā)api.wordpress.org的一個(gè)進(jìn)程,也就能方便得從GitHub獲得最新代碼。
這里api.wordpress.org聯(lián)系GitHub的URL也就是所謂的“webhook”,這東西是用PHP寫的。此webhook的PHP是開源的,點(diǎn)擊這里就能獲取。
Wordfence對其中的代碼進(jìn)行了分析,發(fā)現(xiàn)了其中的一個(gè)漏洞。攻擊者利用該漏洞就能夠在api.wordpress.org上執(zhí)行任意代碼,并且獲得api.wordpress.org的訪問權(quán)。實(shí)際上也就是遠(yuǎn)程代碼執(zhí)行漏洞了。
來自GitHub的請求抵達(dá)api.wordpress.org,那么webhook會(huì)通過共享的hashing算法來確認(rèn),的確是GitHub發(fā)出的請求。整個(gè)過程是GitHub發(fā)出JSON數(shù)據(jù),它會(huì)將數(shù)據(jù)和共享秘值進(jìn)行混合,哈希后將哈希值與JSON數(shù)據(jù)一同發(fā)給api.wordpress.org。
api.wordpress.org收到請求之后,也將JSON數(shù)據(jù)和共享秘值進(jìn)行混合,然后算哈希。最終結(jié)果如果和GitHub發(fā)來的匹配,也就證明了來源是沒問題的,是GitHub發(fā)來的請求。
GitHub采用SHA1來生成哈希,并且在header: X-Hub-Signature: sha1={hash}的位置給出簽名。webhook提取算法和哈希來確認(rèn)簽名。漏洞也就在于:代碼會(huì)使用客戶端提供的哈希函數(shù),這里的客戶端通常情況下當(dāng)然就是GitHub了。在這個(gè)過程中,如果能夠繞過webhook認(rèn)證機(jī)制,攻擊者將能夠向shell_exec直接傳送POST參數(shù),從而執(zhí)行遠(yuǎn)程代碼并順利入侵api.wordpress.org更新服務(wù)器。
當(dāng)然整個(gè)過程需要讓webhook認(rèn)為,攻擊者是知道共享秘值的。不過webhook能夠讓攻擊者選擇哈希算法,PHP提供了各種算法。找個(gè)足夠弱的哈希算法,暴力攻破webhook,發(fā)出一系列哈希,猜出共享秘值和發(fā)送數(shù)據(jù)的哈希值,直到猜對為止,api.wordpress.org就會(huì)響應(yīng)請求。
整個(gè)過程的詳情可以參見文末Wordfence的原文鏈接。
問題根源沒有解決?
Wordfence是在今年9月份將該漏洞上報(bào)給Automattic(WordPress母公司)的,Automattic與9月7日向代碼庫推了fix(有關(guān)補(bǔ)丁詳情,可以點(diǎn)擊這里)。不過Wordfence表示api.wordpress.org仍然是部署WordPress核心、插件和主題升級(jí)的單點(diǎn)故障根源所在。
Wordfence表示曾經(jīng)試圖與Automattic安全團(tuán)隊(duì)就有關(guān)自動(dòng)升級(jí)系統(tǒng)的安全問題展開對話,但沒有得到任何回應(yīng)。大約在3年前,就有相關(guān)WordPress服務(wù)器部署認(rèn)證機(jī)制的探討,目前都還沒有任何進(jìn)展。
原文地址:http://www.freebuf.com/vuls/121018.html