第0039期•2016.12.20 發行
ISSN 2077-8813

首頁 >專題報導

CVE-2015-1805 Android上潛藏已久的漏洞介紹

作者:林子南 / 臺灣大學計算機及資訊網路中心網路組研究助理

CVE-2015-1805是Android中源自於Linux Kernel 3.16 以前的pipe.c,此漏洞由於pipe嘗試重複執行已執行失敗的I/O vector (a.k.a. iov)寫入,進而導致寫入iov buffer時的溢位,使系統崩潰並讓攻擊者能夠利用此漏洞操作權限,此漏洞的修補可以藉由( 1 )升級Linux Kernel 到3.18以上的版本,或( 2 ) 針對Linux Kernel 版本使用修補程式。

介紹
CVE-2015-1805是源自於在Linux Kernel 3.16以前,fs/pipe.c中兩個函數pipe_read和pipe_write內所引起的,而這個漏洞從Android採用Linux Kernel 3.4為基礎並上市以來就一直存在,直到此漏洞在Linux Kernel上於2015年6月16日完成修補,但在Android上完成修補程式並發行則是直到2016年3月[2],之後則是需要使用者自行使用修補程式,或是等待使用者所使用的Android系統有更新到Linux Kernel更新到3.16以上,前者需要使用者具有這方面的知識,了解相關漏洞的發生與嚴重性,並知道需要去修補,後者則是需要看使用者的Android裝置的發行商是否有持續更新。

原因
在fs/pipe.c中兩個函數pipe_read和pipe_write內部所呼叫到的pipe_iov_copy_to_user與pipe_iov_copy_from_user,當要對pipe buffer讀寫進iov buffer時,不會對發生讀寫錯誤之後的iov buffer位置進行重置。
以pipe_read函數為例,當正常執行時,如圖一會從pipe buffer依序寫入iov buffer:


圖一 pipe_read 函數正常寫入 iov buffer時

當 pipe_read所呼叫的pipe_iov_copy_to_user函數發生錯誤時,如圖二會導致從錯誤發生的iov buffer位置嘗試重新寫入,此時如果執行pipe_write則會從超出範圍的地方讀取資料,甚至可以作為有心人士提升權限的手法。


圖二 pipe_read 寫入 iov buffer 發生異常時

因應措施
對於此漏洞的修補,Google已針對目前採用Linux Kernel在3.16以前的Android,在ASOP中發佈修補程式,對於Linux Kernel版本在3.18以後的則已在核心內修補完成。
為了避免此漏洞對使用者造成資料外洩等高危險性的損害,可以根據Android安全性公告所提出來的建議來維護或使用 Android系統[2]:
1. 「驗證應用程式」已完成更新,針對我們已知企圖惡意運用此漏洞的應用程式封鎖安裝作業(無論是不是透過Google Play進行安裝)。
2. Google Play不允許Root權限獲取應用程式(例如會惡意運用這個問題的應用程式)上架。
3. 使用 Linux 核心3.18以上版本的Android裝置不會受到影響。

參考
1. CVE-2015-1805,
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1805
2. Android 安全性公告—2016 年 3 月 18 日,
https://source.android.com/security/advisory/2016-03-18.html#suggested_actions
3. Fix memory corruption when retrying atomic copy as non-atomic,
https://android.googlesource.com/kernel/common/+/f7ebfe91b806501808413c8473a300dff58ddbb5/fs/pipe.c
4. idl3r, https://github.com/idl3r/testcode