Android 12 已來(lái),你的 App 崩潰了嗎集绰?

Android 12 已來(lái)规辱,你的 App 崩潰了嗎? 我們已經(jīng)開(kāi)始做 Android 12 的適配了栽燕,在 Android 12 中包含了很多的功能和一些行為的變更罕袋,接下來(lái)我們一起來(lái)分析這些行為的變更對(duì)我們的應(yīng)用產(chǎn)生了那些影響。

通過(guò)這篇文章你將學(xué)習(xí)到以下內(nèi)容:

  • 為什么在 Android 12 上需要顯示聲明 android:exported 屬性碍岔?
  • 為什么在 Android 12 上需要顯示指定 PendingIntent 的可變性浴讯?
  • 為什么在 Android 12 上限制 adb 備份的默認(rèn)行為?
  • 如何檢查 App 的安全漏洞付秕?

android:exported 屬性

在 Android 12 中包含 <intent-filter>activity 兰珍、 servicereceiver 必須為這些應(yīng)用組件顯示聲明 android:exported 屬性,如下所示询吴。

<activity
    android:name=".TestActivity"
    android:exported="false">
    <intent-filter>
        ......
    </intent-filter>
</activity>

如果在包含 <intent-filter>activity 掠河、 servicereceiver 組件中,沒(méi)有顯示聲明 android:exported 的值猛计,你的應(yīng)用將無(wú)法安裝唠摹,錯(cuò)誤日志如下所示。

Installation did not succeed.
The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
List of apks:
[0] '.../build/outputs/apk/debug/app-debug.apk'
Installation failed due to: 'null'

如果您的應(yīng)用在需要聲明 android:exported 的值時(shí)未進(jìn)行此聲明奉瘤,錯(cuò)誤日志如下所示勾拉。

Targeting S+ (version 10000 and above) requires that an explicit value for \
android:exported be defined when intent filters are present

如果對(duì)上面的異常產(chǎn)生的條件煮甥,不是很理解,可以點(diǎn)擊下方鏈接查看藕赞,目前已經(jīng)有很多開(kāi)源項(xiàng)目都已經(jīng)開(kāi)始適配這個(gè)行為的變更了成肘,例如 leakcanary 等等,詳情前往查看下列地址:

這個(gè)行為的變更無(wú)論是對(duì)庫(kù)開(kāi)發(fā)者 和 還是應(yīng)用開(kāi)發(fā)者影響都非常大斧蜕。

為什么在 Android 12 上需要顯示聲明 android:exported 屬性

android:exported 屬性的默認(rèn)值取決于是否包含 <intent-filter>双霍,如果包含 <intent-filter> 那么默認(rèn)值為 true,否則 false批销。

  • 當(dāng) android:exported="true" 時(shí)洒闸,如果不做任何處理,可以接受來(lái)自其他 App 的訪問(wèn)
  • 當(dāng) android:exported="false" 時(shí)均芽,限制為只接受來(lái)自同一個(gè) App 或一個(gè)具有相同 user ID 的 App 的訪問(wèn)

正因?yàn)?android:exported 的屬性的默認(rèn)值的問(wèn)題丘逸,Twicca App 發(fā)生過(guò)一次安全性問(wèn)題,因?yàn)榱硪粋€(gè)沒(méi)有訪問(wèn) SD 卡或網(wǎng)絡(luò)權(quán)限的 App掀宋,可以通過(guò) Twicca App 將存儲(chǔ)在 SD 卡上的圖片或電影上傳到 Twicca 用戶的 Twitter 賬戶上的社交網(wǎng)絡(luò)上深纲。

產(chǎn)生問(wèn)題的代碼如下所示:

<activity android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/Vulnerable.Dialog" android:windowSoftInputMode="stateAlwaysHidden">           
    <intent-filter android:icon="@drawable/yfrog_icon" android:label="@string/YFROG">
        <action android:name="jp.co.vulnerable.ACTION_UPLOAD" />                
        <category android:name="android.intent.category.DEFAULT" />                
        <data android:mimeType="image/*" />                
        <data android:mimeType="video/*" />            
    </intent-filter>        
</activity>

因?yàn)樘砑恿?intent-filter 所以 android:exported 的屬性的默認(rèn)值為 true,因此可以接受來(lái)自其他 App 的訪問(wèn)布朦,進(jìn)而造成了上述問(wèn)題(通過(guò) Twicca App 將存儲(chǔ)在 SD 卡上的圖片或電影上傳到 Twicca 用戶的 Twitter 賬戶上的社交網(wǎng)絡(luò)上)囤萤,而解決方案有兩個(gè):

  • 方案一:添加 android:exported="false" 屬性
<activity android:exported="false" android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/ VulnerableTheme.Dialog" android:windowSoftInputMode="stateAlwaysHidden" >    
</activity>
  • 方案二: Twicca App 沒(méi)有使用方式一,而是檢查調(diào)用者的包名是否與自身的包名相同
public void onCreate(Bundle arg5) {
    super.onCreate(arg5);
    ...
    ComponentName v0 = this.getCallingActivity();
    if(v0 == null) {
        this.finish();
    } else if(!jp.r246.twicca.equals(v0.getPackageName())) {
        this.finish();
        } else {
            this.a = this.getIntent().getData();
            if(this.a == null) {
                this.finish();
            }
            ...
        }
    }
}

這種方案也是可行的是趴,因?yàn)樵谝慌_(tái)設(shè)備上涛舍,不可能會(huì)出現(xiàn)兩個(gè)包名相同的應(yīng)用,更多詳細(xì)的信息可以前往查看 Restrict access to sensitive activities唆途。

這僅僅是關(guān)于 activity 的安全漏洞的其中一個(gè)富雅,在不同的場(chǎng)景下利用這些漏洞做的事情也可能不一樣。當(dāng)然還有 servicereceiver 組件也都是一樣肛搬,存在安全性問(wèn)題没佑。

指定 PendingIntent 的可變性

在 Android 12 中創(chuàng)建 PendingIntent 的時(shí)候,需要顯示的聲明是否可變温赔,請(qǐng)分別使用 PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLE 標(biāo)志蛤奢,如果您的應(yīng)用試圖在不設(shè)置任何可變標(biāo)志的情況下創(chuàng)建 PendingIntent 對(duì)象,系統(tǒng)會(huì)拋出 IllegalArgumentException 異常陶贼,錯(cuò)誤日志如下所示啤贩。

PACKAGE_NAME: Targeting S+ (version 10000 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.

為什么在 Android 12 上需要顯示的指定 PendingIntent 的可變性

在 Adnroid 12 之前,默認(rèn)創(chuàng)建一個(gè) PendingIntent 它是可變的拜秧,因此其他惡意應(yīng)用程序可能會(huì)攔截痹屹,重定向或修改此 Intent。(但是是有條件限制的)

一個(gè) PendingIntent 是一個(gè)可以給另一個(gè)應(yīng)用程序使用的 Intent枉氮,PendingIntent 接收待處理意圖的應(yīng)用程序可以使用與產(chǎn)生待處理意圖的應(yīng)用程序相同的權(quán)限和身份執(zhí)行待處理意圖中指定的操作志衍。

因此暖庄,創(chuàng)建待處理意圖時(shí)必須小心,為了安全性 Google 在 Android 12 中需要開(kāi)發(fā)者自己來(lái)指定 PendingIntent 的可變性楼肪。

更多關(guān)于 PendingIntent 安全性介紹培廓,可以前往查看 Always pass explicit intents to a PendingIntent

adb 備份限制

Android 開(kāi)發(fā)者都應(yīng)該知道這個(gè)命令 adb backup , 它可以備份應(yīng)用的數(shù)據(jù)春叫,在 Android 12 中医舆,為了保護(hù)私有應(yīng)用數(shù)據(jù),用戶運(yùn)行 adb backup 命令時(shí)象缀,從設(shè)備導(dǎo)出的任何其他系統(tǒng)數(shù)據(jù)都不包含應(yīng)用數(shù)據(jù)。

如果你在測(cè)試和開(kāi)發(fā)過(guò)程中需要使用 adb backup 來(lái)備份應(yīng)用數(shù)據(jù)爷速,你可以在 AndroidManifest 中將 android:debuggable 設(shè)置為 true 來(lái)導(dǎo)出應(yīng)用數(shù)據(jù)央星。

<application
    android:name=".App"
    android:debuggable="true"
    ....../>

注意:在發(fā)布應(yīng)用前將 android:debuggable 設(shè)置為 false。

為什么在 Android 12 上限制了 adb backup 命令的默認(rèn)行為

因?yàn)檫@個(gè)存在嚴(yán)重的安全問(wèn)題惫东,當(dāng)初 Google 為了提供 App 數(shù)據(jù)備份和恢復(fù)功能莉给,可以在 AndroidManifest 中添加 android:allowBackup 屬性,默認(rèn)值為 true, 當(dāng)你創(chuàng)建一個(gè)應(yīng)用的時(shí)候廉沮,會(huì)默認(rèn)添加這個(gè)屬性颓遏,如下所示。

<application
    android:name=".App"
    android:allowBackup="true"
    ....../>

當(dāng) android:allowBackup="true" 時(shí)滞时,用戶可以通過(guò) adb backupadb restore 命令對(duì)應(yīng)用數(shù)據(jù)進(jìn)行備份和恢復(fù)叁幢,也就是說(shuō)可以在其他的 Android 手機(jī)上安裝同一個(gè)應(yīng)用,通過(guò)如上命令恢復(fù)用戶的數(shù)據(jù)坪稽。

為了安全起見(jiàn)曼玩,我們?cè)诎l(fā)布出去的 Apk 中一定要將 android:allowBackup 屬性設(shè)置為 false 來(lái)關(guān)閉應(yīng)用程序的備份和恢復(fù)功能,以免造成信息泄露窒百。國(guó)民級(jí)應(yīng)用 XX 信, 在曾今發(fā)出的版本中 allowBackup 的屬性值是 true黍判,被其他逆向開(kāi)發(fā)者利用之后,現(xiàn)在的版本中這個(gè)值已經(jīng)修改為 false了篙梢,有興趣的小伙們可以反編譯看看顷帖。

如何檢查 App 的安全漏洞

在這里推薦一個(gè)開(kāi)源項(xiàng)目 linkedin/qark 這是由 LinkedIn 開(kāi)源的項(xiàng)目,這個(gè)工具被設(shè)計(jì)用來(lái)尋找與安全相關(guān)的 Android 應(yīng)用程序漏洞渤滞,無(wú)論是源代碼還是打包的 APK贬墩,具體的用法文檔上寫(xiě)的非常的清楚了,這里不做詳細(xì)的介紹了蔼水。

這個(gè)開(kāi)源項(xiàng)目的檢查結(jié)果震糖,作為參考即可。當(dāng)然也有很多公司花了重金去購(gòu)買第三方的服務(wù)來(lái)檢查 App 的安全漏洞趴腋。

在 Android 12 上這幾個(gè)行為的變更它們都有一個(gè)共性:安全性吊说,可見(jiàn) Google 這幾年在安全上做了很多的努力论咏,當(dāng)然還有其他的一些行為的變更,可以前往查看 行為變更:以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用颁井。

參考文章

如果有幫助 點(diǎn)個(gè)贊 就是對(duì)我最大的鼓勵(lì)


最后推薦長(zhǎng)期更新和維護(hù)的項(xiàng)目:

  • 個(gè)人博客厅贪,將所有文章進(jìn)行分類,歡迎前去查看 https://hi-dhl.com

  • KtKit 小巧而實(shí)用雅宾,用 Kotlin 語(yǔ)言編寫(xiě)的工具庫(kù)养涮,歡迎前去查看 KtKit

  • 計(jì)劃建立一個(gè)最全、最新的 AndroidX Jetpack 相關(guān)組件的實(shí)戰(zhàn)項(xiàng)目 以及 相關(guān)組件原理分析文章眉抬,正在逐漸增加 Jetpack 新成員贯吓,倉(cāng)庫(kù)持續(xù)更新,歡迎前去查看 AndroidX-Jetpack-Practice

  • LeetCode / 劍指 offer / 國(guó)內(nèi)外大廠面試題 / 多線程 題解蜀变,語(yǔ)言 Java 和 kotlin悄谐,包含多種解法、解題思路库北、時(shí)間復(fù)雜度爬舰、空間復(fù)雜度分析

近期必讀熱門文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喂很,隨后出現(xiàn)的幾起案子蜡镶,更是在濱河造成了極大的恐慌,老刑警劉巖恤筛,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件官还,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毒坛,警方通過(guò)查閱死者的電腦和手機(jī)望伦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煎殷,“玉大人屯伞,你說(shuō)我怎么就攤上這事『乐保” “怎么了劣摇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弓乙。 經(jīng)常有香客問(wèn)我末融,道長(zhǎng)钧惧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任勾习,我火速辦了婚禮浓瞪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巧婶。我一直安慰自己乾颁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布艺栈。 她就那樣靜靜地躺著英岭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湿右。 梳的紋絲不亂的頭發(fā)上巴席,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音诅需,去河邊找鬼。 笑死荧库,一個(gè)胖子當(dāng)著我的面吹牛堰塌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播分衫,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼场刑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚪战?” 一聲冷哼從身側(cè)響起牵现,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邀桑,沒(méi)想到半個(gè)月后瞎疼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壁畸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年贼急,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏萍。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡太抓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出令杈,到底是詐尸還是另有隱情走敌,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布逗噩,位于F島的核電站掉丽,受9級(jí)特大地震影響跌榔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机打,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一矫户、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧残邀,春花似錦皆辽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至空免,卻和暖如春空另,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹋砚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工扼菠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坝咐。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓循榆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親墨坚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秧饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354