當前位置:
首頁 > 新聞 > 揭秘360手機助手未經用戶同意,自動開啟輔助的「黑科技」

揭秘360手機助手未經用戶同意,自動開啟輔助的「黑科技」

*本文原創作者:Venscor,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


0×00 概述

Android為正常使用手機有障礙的用戶提供了輔助功能,即AccessibilityService。通俗的說,也就是為」殘疾人」專門提供的服務。

但近幾年來,這個功能卻被開發者和病毒廠商玩壞了,最典型的兩個示例用途就是搶紅包和靜默安裝,當然還有其他基於AccessibilityService的病毒程序,具體可參見360移動安全的研究報告[1]。

按照Android開發文檔,開發者開發AccessibilityService功能,必須要讓用戶手動在系統設置的」輔助功能」內打開對應的AccessibilityService。

很多工具類軟體也都使用了AccessibilityService,例如百度手機助手,騰訊應用寶,豌豆莢,pp助手,愛奇藝等。但是,這是App都沒有自動開啟輔助功能的能力。

我們發現,只有360手機助手能夠不經過用戶交互,自己啟動AccessibilityService。為什麼360手機助手可以做到?帶著這樣的好奇,我們來探尋其背後的「黑科技」。


0×01 必備知識

1.1 AccessibilityService的使用

這一部分屬於開發的範疇,不想做過多的介紹。不會的可以參考我的個人博客:Android靜默安裝實現方案,仿360手機助手秒裝和智能安裝功能[2].由於AccessibilityService可以實現對手機上發生事件的監控,並且能夠模擬用戶點擊等。

所以還有許多其他用途,可以參考相關開發內容。正是由於AccessibilityService伴隨很多安全行為,Android不允許App為自己開啟這項服務,必須通過用戶交互才能使用,這就給一些想惡意利用AccessibilityService的App帶來了一些麻煩。


1.2 Android獨立運行Java程序

網上關於這部分的資源也不在少數,可以參考我的博客Android上app_process啟動java進程[3]. 這裡還是以demo形式簡單說明下。

1.2.1 編寫一個Java程序並編譯成Dalvik可執行的jar/dex包。


public class Helloworld { public static void main(String[]args){
System.out.println("Hello, I am started by app_process!");
}
}

//編譯,這裡主要是Platform tool上用的是Java 7,所以顯式指定1.7javac -source 1.7 -target 1.7 C:UsersVenscorDesktopapp_processdump.java//生成dex,當然生成jar在Android上也是可執行的dx --dex --output=C:UsersVenscorDesktopapp_processHellworld.dex Helloworld.class

將編譯好的dex文件push到Android設備上,這時,面臨一個問題。我們平時開發Android應用程序都是.apk文件,都運行在獨立的Context下。缺乏Context的支持,我們如何才能啟動獨立的Java程序?

其實,這裡需要普及一個知識點,就是Android apk執行的其實點並不是開發者認為的onCreate函數,其實啟動點在Framework層中的ActivityThread.java的main()函數。更底層一點來說,每個apk都是由app_process間接啟動起來的。

使用app_process執行上述java代碼,app_process命令如下:


app_process -Djava.class.path=Helloworld.dex /data/local/tmp Helloworld

可以看到,Java代碼成功執行了,這裡需要注意:app_process命令啟動的Java程序需要shell許可權才能執行,當使用普通app執行app_process命令時,對應的啟動的Java程序的Uid不再是shell,所以不能修改對應的setting。

1.2.2 被啟動的Java程序的Uid

通過ps命令查看app_process啟動的Java的Uid,以及對應的許可權。

可以看出,app_process啟動的Java程序運行在uid為shell的進程中。這就意味著,被啟動的Java程序擁有很高的許可權。


1.3 不通過用戶交互修改系統設置

Android很多危險的系統設置,比如AccessibilityService,安裝未知來源的app等都是不對第三方App開放的,也就是說修改這些許可權都需要signature級別的許可權。所以,第三方App想修改系統設置是不切實際的。

其實,用戶修改系統設置,對用戶可見的是設置狀態的改變。在系統的背後,其實這些修改都是通過資料庫實現的。

Android於安全設置有關的Uri是:content://settings/secure。通過修改這個資料庫就可以修改對應的系統設置,並且用戶完全覺察不到。那麼問題來了,對這個資料庫的修改也是需要Signature級別許可權的。

結合上面1.2.2知識,就給我們提供了一條路子:在apk中實現一段純Java代碼,然後在shell下用app_process啟動這個Java代碼。

於是Java代碼運行於uid為shell的進程,就可以修改系統設置對應的資料庫,從而在用戶好不察覺的情況下實現系統設置修改。例如:打開AccessibilityService。

簡單實驗一下,更新修改從而自動打開應用寶的輔助功能。


/*shell cmd 1*/
settings put secure enabled_accessibility_services com.tencent.android.qqdownloader/com.tencent.nucleus.manager.accessibility.YYBAccessibilityService /*shell cmd 2*/settings put secure accessibility_enabled 1


0×02 實驗

其實到這裡,360的黑科技的基本原理已經說明完了,沒有代碼怎麼感覺有點不完整。所以,這節主要是實前面過程的代碼。在Android手機上執行以下代碼,輕鬆展現360黑科技。


package com.venscor.helloworld;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Helloworld {
public static void main(String[]args){
System.out.println("Hello, I am started by app_process!");
String cmd1="settings put secure enabled_accessibility_services com.qihoo.appstore/com.qihoo.appstore.accessibility.AppstoreAccessibility";
String cmd2="settings put secure accessibility_enabled 1";
execShell(cmd1);
execShell(cmd2);
} private static void execShell(String cmd){ try {
Process p=Runtime.getRuntime().exec(cmd);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String readLine=br.readLine(); while(readLine!=null){
System.out.println(readLine);
readLine=br.readLine();
} if(br!=null){
br.close();
}
p.destroy();
p=null;
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
}
}


0×03 360手機助手的做法

360這項黑科技的做法和我上面說的基本一致,這裡有一個問題:Java程序是需要shell下來開啟的,對於Android設備上的app,是沒有此許可權的。那麼360上的Java程序是怎麼啟動的?

其實,是你手機對你電腦的信任關係出賣了你。國內絕大多數用戶在Windows PC上都安全了360的殺毒軟體,這些殺毒軟體其實都內置了adb工具。

也就是說,PC上的360殺毒軟體使用adb運行shell的app_process命令來啟動Java程序來自動打開了AccessibilityService。這也解釋了你為什麼一把手機插上電腦,就被自動被安裝app的原因,並且全程都是靜默安裝。

好了,空口無憑。我們看360手機助手的代碼,其通過兩種方式實現,而且方式2粗心的程序員還打錯字了,把accessibility_enabled打成了enabled_accessibility_services.代碼路徑:comqihooappstore
ootcommandaccessibilityAppStoreAccessibilityServiceEnableCommand.class


0×04 參考文獻

[1]Android Accessibility安全性研究報告:

http://blogs.360.cn/360mobile/2016/09/07/research_of_accessibility/

[2]Android靜默安裝實現方案,仿360手機助手秒裝和智能安裝功能:

http://blog.csdn.net/guolin_blog/article/details/47803149#reply

[3]Android上app_process啟動java進程:

http://blog.csdn.net/u010651541/article/details/53163542

*本文原創作者:Venscor,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載



請您繼續閱讀更多來自 FreeBuf 的精彩文章:

內網穿透:Android木馬進入高級攻擊階段
政府與企業在網路安全上該如何「共贏」?聽聽NSA局長怎麼說
SOAPA來臨,SIEM時代終結?

TAG:FreeBuf |

您可能感興趣

【360官方回應】揭秘360手機助手未經用戶同意,自動開啟輔助功能的「黑科技」
特斯拉告誡用戶:自動輔助駕駛並非全自動駕駛技術
李開新:360致力給用戶最好的手機使用體驗
用戶賣自製飛行器 快手:會配合調查 希望用戶守法
90天!用戶可獲取量身定製的3D列印自行車把手
全球首例!黑產利用SS7漏洞接管用戶手機卡偷錢
更貼心的售後 用戶講述金立手機維修服務
傳亞馬遜計劃推出智能眼鏡,讓語音助手 Alexa 隨時協助用戶需求
不為老機型升級,360手機的老用戶們,你們還喜歡360手機?
小米6手機用戶獨享福利:公交開卡費繼續限免
保護用戶隱私,大疆無人機將開啟私人飛行模式
真實華為Mate8用戶求助,手機自燃如何維權?
智能手機廠商繼續博弈,單手操作或受用戶追捧
專場購物送定製打火機,99%用戶都想入手
2017年Q2手機用戶調查報告:三星手機容易壞,蘋果應用常奔潰
谷歌智能手錶語音助手出現問題 部分用戶無法使用
雙卡雙待用戶哭!台灣正式關閉2G網路,10萬用戶得換手機
抽成30%太可恥 蘋果用戶:換手機
荷蘭開發新型車鎖 可防止用戶騎行中使用手機