由于3年前的一個漏洞,今天仍然有610萬臺設備可被遠程代碼執行,包括智能手機、路由器、智能電視等,而且這個漏洞早在3年前就已經修復。
該漏洞存在于UPnP設備的便攜式SDK中,也叫做libupnp。這個庫是用來實現媒體播放(DLAN)或者NAT地址轉換(UPnP IGD)。智能手機上的應用程序可用這些功能播放媒體文件或者利用用戶的家庭網絡連接到其他的設備。
事實上,這些漏洞早在2012年12月份就已經修復了,然而仍然有很多app在使用存在漏洞的老版本SDK。統計發現有547個應用還在使用老版本的libupnp,其中326個可從谷歌Play store中下載到,包括Netflix和騰訊QQ音樂。這些都是非常流行的應用,用戶達百萬,也就是說有數百萬的用戶還存在被攻擊的可能性。另外,除了移動設備,路由器和智能電視也在之列。
漏洞利用
該漏洞存在于libupnp庫處理簡單服務發現協議(SSDP)包過程中。該協議是Universal Plug N’ Play (UPnP)標準的部分。在處理進程中會出現堆棧溢出,并且需要UDP1900端口打開。
一個精心制作的包可造成緩沖區溢出,如下圖中的代碼,TempBuf緩沖可溢出,并造成死機。
進一步的研究發現,它不僅能造成死機,還可以在受害者設備上運行任意代碼。如此以來,攻擊者便可能會完全掌控受害者設備。我們已經確認至少有20個應用,linupnp庫還可被激活:
舉兩個例子,主要是上圖中兩個比較引人注意的兩個app。一個是QQ音樂,在中國有1億用戶,僅在谷歌商店中就下載超過100-500萬次。打開它時,會自動激活linupnp用于DLNA播放。然而它使用的SDK是1.6.17版本,是2012年4月份更新的。
Netflix是安卓機上非常流行的一個應用,它使用的linupnp版本也是非常老的——6.1.13。
SDK可以依賴其他SDK來運行。Linphone SDK可向眾多應用提供網絡電話(VoIP),libupnpSDK是Linphone SDK提供NAT地址轉換服務眾多選項中其中的一個,如果該選項被選中了,存在漏洞的服務器也就被激活了。
解決方案
我們已經將這個問題通知給了Linphone和騰訊,雙方都承諾會發布補丁,并且也都在11月下旬給予了修復。