所按非所得——聊一聊StandHogg漏洞

OPPO安全發表於2020-09-07

關於StandHogg漏洞

最近,一家挪威安全公司Promon爆料了一種Android點選劫持型漏洞,並取了一個有趣的名字StandHogg,聲稱這個漏洞影響所有Android系統版本,500個流行App已在風險之中,36個利用該漏洞的惡意App已被發現,且漏洞利用無需獲取手機Root許可權。



所按非所得——聊一聊StandHogg漏洞



StandHogg,一種維京海盜所使用的偷襲戰術,此詞後來也在北歐文化中描述商業活動中的惡意接管。



怎麼回事


根據Promon的描述,這個漏洞要求受害者的手機安裝惡意App。在受害者在點選正常App的時候,卻彈出惡意App的介面,這個介面可能要求使用者授予許可權,或者展現與正常App介面一樣的輸入框,要求使用者輸入使用者名稱和密碼,然後再回到正常App。這樣,不知不覺中,惡意App就悄悄地被授予許可權,或者竊取了使用者的敏感資訊。


所按非所得——聊一聊StandHogg漏洞


Promon介紹的漏洞利用流程


從描述上看,這個漏洞屬於UI欺騙,要了解漏洞原理,我們需要先了解Android Activity的任務棧和啟動模式。



Activity任務棧與啟動模式


任務棧(TaskRecord)是一種放置Activity的“後進先出”棧結構,我們每啟動一個Activity,就會放在一個任務棧的頂端。例如,以一臺配備Android 9.0的Pixel3手機為例,我們開啟手機中的“設定”,開啟“網路和網際網路”,點選“WLAN”。然後,我們可以檢視手機中的任務棧


Plain Text1
$ adb shell dumpsys activity | grep -A6 "Running activities"


所按非所得——聊一聊StandHogg漏洞


此時,顯示在最前面的SubSettings,位於棧頂。往棧底方向依次為Settings$NetworkDashboardActivity和Settings。

如果點選後退,回到“網路和網際網路”,則任務棧顯示如下。之前最後入棧的SubSetings就已經出棧了。


所按非所得——聊一聊StandHogg漏洞


這樣,每按一下後退,就會有一個Activity出棧,直到棧空為止,當棧中沒有任何Activity時,系統就會回收這個任務棧。


作為系統的預設行為,每次啟動一個Activity,都會建立這個Activity的例項,這樣就會重複建立。因此,Android提供了啟動模式(launchMode)來改變系統的預設行為,主要包括以下四種:


standard: 標準模式,也是系統預設模式。每啟動一個Activity都會重新建立這個Activity的例項,不管其是否已經存在。這個Activity的生命週期中的onCreate、onStart、onResume都會被呼叫;


singleTop: 棧頂複用模式。如果Activity已經位於任務棧的棧頂,再啟動時就不會重新建立,但它的onNewIntent方法被回撥。注意,如果Activity已存在,但不是位於棧頂,在啟動時仍然會重新建立一個例項。


singleTask: 棧內複用模式。只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新建立這個Activity的新的例項,此時,onNewIntent方法也會被回撥。具體而言,當一個具有singleTask模式的Activity被啟動,如果沒有此Activity的任務棧,系統就會重新建立一個任務棧,然後建立這個Activity的例項放到其中。如果已存在這個Activity的任務棧,則把它調到任務棧的棧頂。


singleInstance:單例項模式。這是一種加強的singleTask模式,除了具有singleTask的所有特性外,還必須單獨地位於一個任務棧中,具有獨佔任務棧的特性。



關於TaskAffinity 和TastReparenting


上面談到了任務棧,那麼不同的任務棧如何區分?答案就是透過TaskAffinity(任務相關性)這個引數,這個引數標識了一個Activity進入的任務棧的名字。在不指定這個引數的預設情況下,Activity進入任務棧的名字就是應用的包名。例如,開啟Gmail應用,其Activity的TaskAffinity就為com.google.android.gm


所按非所得——聊一聊StandHogg漏洞


開發者也可以為Activity單獨指定TaskAffinity,此時需要與singleTask或者allowTaskReparenting結合使用,這裡我們只討論後一種情況。allowTaskReparenting屬性的作用是Activity的遷移,從一個任務棧遷移到另一個任務棧。回到文章的主題,StandHogg漏洞主要就是利用了TaskAffinity和allowTaskReparenting結合使用的特性。



POC


讓我們來做個實驗,編寫一個惡意App,設定其allowTaskReparenting=true,同時把其taskAffinity設為Gmail的包名,也就是說把Gmail作為StandHogg劫持的物件。


所按非所得——聊一聊StandHogg漏洞



然後我們開啟這個Activity:


所按非所得——聊一聊StandHogg漏洞


接著點選Home按鍵,回到桌面,此時我們檢視一下任務棧,發現其TaskAffinity屬性已經設定成功。


所按非所得——聊一聊StandHogg漏洞


此時,我們開啟Gmail,卻發現開啟的仍然是前面顯示”Hacked”的那個我們所編寫惡意應用的Main2Activity。再次檢視任務棧,會發現惡意的Main2Activity位於Gmail Activity的上面。


所按非所得——聊一聊StandHogg漏洞


因此,這樣就劫持成功了。這個Main2Activity可以做得跟真的目標應用一樣,可以偽造假的登入框、彈出許可權授權框……,各種利用方式可以自由發揮,然後再使用者操作後回到目標應用,這樣,悄無聲息地竊取使用者資訊。Promon也聲稱,已經掌握了惡意App利用此漏洞的證據。


POC程式碼見https://github.com/Ivan-Markovic/Android-Task-Injection



評價 


Standhogg漏洞利用了Android Activity啟動模式的一個細微特性,對於普通使用者而言,還是有較大的欺騙性和危害。截止目前,也沒有任何補丁可打。好在惡意App的特徵比較明顯,極易被識別,Google Play已經採取了行動,下架了採用這種攻擊技術的惡意App。作為使用者而言,除了睜大眼睛仔細辨別以外,還可以在啟動敏感應用前,清除一次後臺應用進行防禦。


這種Activity的UI欺騙也早就在學術界提出,還有其他利用方法,詳見參考。不過此次Promon取名StandHogg,透過各大科技媒體將其影響廣而告之,並找到了惡意應用利用此漏洞的確鑿證據,對Android安全生態的提升具有正面意義。


參考:

[Towards Discovering and Understanding Task Hijacking in Android](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-ren-chuangang.pdf)

[Android Task Hijacking](https://www.slideshare.net/phdays/android-task-hijacking)

[The StrandHogg vulnerability](https://promon.co/security-news/strandhogg/)

[一種新的基於APP啟動模式的劫持攻擊方案](http://www.cnki.com.cn/Article/CJFDTotal-WHDY201802007.htm)

 任玉剛,《Android開發藝術探索》

https://arstechnica.com/information-technology/2019/12/vulnerability-in-fully-patched-android-phones-under-active-attack-by-bank-thieves/



所按非所得——聊一聊StandHogg漏洞

相關文章