資深開發人員關係工程師
這場簡報將探討策略轉變,從將 AI 視為一般程式碼編寫助理,轉變為將 AI 做為情境感知、自動化的安全同儕審查工具,直接整合至 Android 開發生命週期。我們將探討如何透過技能,將專門的 AI 代理連結至 Android 工具鍊,進而提升應用程式安全性。這種做法可彌補原始 LLM 功能與深層專案背景資訊之間的落差,讓開發團隊能維持高速的功能推送,同時兼顧嚴格的安全性和政策標準。
轉錄稿
大家好,我是 Kristen。
大家好,我是 Sabs。
今天我們將討論 AI 代理時代的資安。
過去一年,我們為 Android Bug Hunters 計畫發放了超過 $200 萬美元的獎勵,並為行動裝置發放了超過 $20 萬美元。
在現今的 AI 代理時代,應用程式安全防護機制不斷演進。
接下來,我們來談談如何快速有效地解決這些問題。
如要提升代理在 Android 安全性方面的表現,光是改善提示是不夠的。
這項功能提供工具和工作流程,協助代理瞭解我們的工具鍊和 API,確保應用程式安全。
現在是下午 4:30。
星期四。
您正在發布版本,但 CI 顯示紅色,只有一個錯誤:註冊的廣播接收器沒有匯出標記。
因此,無論您是身兼多職的小型團隊,還是大型團隊,在發布版本時都會遇到安全性檢查,實際情況都是一樣的。
我們是產品工程師,負責快速推出高品質功能,不一定是資安研究人員。
那麼,自然本能是什麼?
因此,我們將警告交給代理工具,並要求代理修正。
不過,代理工具在不瞭解專案背景資訊的情況下,會有三個盲點。
可能不知道您的應用程式是由動態功能模組或多 APK 套件建構而成。
它看到的是檔案,而不是已推送的構件。
它可能無法追蹤資料流程,從 Kotlin UI 到 KMP 共用邏輯,再到原生 C++ JNI 呼叫。
只會看到一個層。
最後,它可能不知道您的 SDK 最低版本或 Gradle 建構變種版本。
因此,我們將代理指向應用程式,並要求進行安全性稽核。
系統傳回六項發現項目。
重點來了。
每個端點都存在著
這些說法都站得住腳,但只有其中一個是我們一開始遇到的錯誤。
其餘部分則包含最佳做法、需要進一步調查的事項、推測,以及可能不適用的事項。
現在,您將這個方法擴充到實際的程式碼集,並加入更多警告,在每個提取要求中,您都會想使用 suppress lint。
您必須變更才能合併該變更,甚至可能完全錯過安全漏洞。
真正的安全漏洞就是這樣溜進來的。
這項工具並非不謹慎,而是謹慎,但謹慎不等於實用。
我們來具體說明。
舉例來說,您可以要求代理「稽核這個應用程式中每個匯出的元件,檢查是否有應用程式意圖重新導向」。
這是一項真正的安全性工作,在多模組應用程式中,這是一項大型工作。
這類要求才會產生費用。
如果沒有 Android 專屬指南,代理就無法回答這個問題。
因此會採用暴力破解法。
可能讀取未匯出任何內容的模組。
它可能會從第一原則重新推導出意圖重新導向可被利用的原因。
它可能會遵循從未到達的路徑。
您支付的是探索費用,而非分析費用。
技能則能補足缺少的策略。
舉例來說,Android 安全防護技能會根據現行指南,為代理提供與安全研究人員實際採取的相同步驟序列,代理就不必再猜測。
由於規則是由技能提供,因此不會重新探索規則。
目前我們已推出兩項安全性技能:意圖安全性和權限。
意圖安全性是指其他應用程式可讓您的應用程式執行哪些操作。
您的應用程式擁有權限和登入工作階段,但他們沒有。
因此,您提供的每個匯出元件和待處理意圖,都可能成為他人透過您採取行動的途徑。
這項技能有助於防範這種情況。
權限技能可協助縮小宣告權限與實際強制執行權限之間的差距。
這有助於您編寫適當的權限檢查。
這項檢查可協助您判斷,具有萬用字元路徑的供應器是否授予整個資料庫的存取權,而非單一目錄。
也會偵測是否過度索取權限。
例如,在相片挑選工具即可滿足需求的情況下,要求廣泛存取權。
請搭配 Android CLI 使用,然後詢問「稽核意圖安全性」。
未設定。
不調整規則。
因此,輸出結果不會是一大堆警告。
這是一則評論。
這裡有錯誤,這裡說明錯誤對應用程式的影響,這裡提供修正方法。
專家級提示:
使用 Android CLI 即可輕鬆找到並安裝。
android skills list
android skills add android-intent-security
android skills add android-permissions-security由於這項技能確切知道要在專案中尋找什麼,因此能看到應用程式實際發布時的樣貌。
這項功能會遵循 SDK 最低版本,因此修正程式會編譯、實際檔案路徑、實際行號。
以下是您收到的評論。
它會指出確切的檔案和行數,說明實際威脅和變更原因,而不只是 Lint 說的。
並註明使用的技能。
它讀取建構設定,發現 SDK 最低版本為 26,並選擇 ContextCompat,因此修正程式可以運作,並提供差異,以便您套用。
這是我們一開始看到的警告,但現在多了建議修正方式和原因。
因此,先前的技能可以找出安全性錯誤。
接著來談談另一個領域:應用程式政策法規遵循。
舉例來說,假設您是新的應用程式開發人員,想在 Play 商店上架應用程式。
填寫資料安全性表單是推出應用程式的重要步驟,因此請善用所有工具,確保在提交應用程式前正確填寫表單。
Play 政策技能會對程式碼集執行靜態分析。
如果您要發布現有的 Play 商店應用程式,也可以交叉比對靜態程式碼分析和 Play 商店聲明。
執行這項技能,就能在提交應用程式前找出潛在的 Play 政策問題,加快提交程序。
工作流程與我們討論過的其他技能類似:匯入應用程式,然後要求「在提交前,稽核這個應用程式是否符合 Google Play 政策」。
右側是報表範例的螢幕截圖,下方則是安裝報表的 Android CLI 指令。
android skills list
android skills add play-policy-insights到目前為止,我們討論的所有內容都是在發布前進行:稽核意圖、檢查權限、驗證法規遵循。
這就是建構階段的安全性,非常重要。
不過,一旦 APK 發布並在您可能無法控制的裝置上執行,就會出現一整類威脅。
Play Integrity API 會在執行階段回答三個問題,這些問題是您自己的程式碼無法回答的:這是您應用程式的正版、未經修改版本嗎?
這是否在 Android 正版裝置上執行?
這是 Play 使用者帳戶嗎?
因此,您可以使用 Play Integrity API 傳回應用程式完整性、裝置完整性等項目的判定結果。
除了讓您更快速輕鬆地安全發布應用程式,我們也致力於協助您保障應用程式的收益和聲譽。
因此,請保護您的商家免受詐欺和濫用行為侵擾。
全新的「由 Google Play 保護」資訊主頁 (如圖所示) 可讓您集中監控及設定完整性、發布和營利防護措施。
我們也縮短了 Play Integrity API 的預熱延遲時間,因此您可以在速度至關重要的使用者歷程中進行這些檢查,更快封鎖威脅和高風險裝置。
我們剛才討論了 Android 的功能和工具,可協助確保應用程式安全,但使用者呢?
首先,我們來看看簡訊動態密碼保護功能。
假設您想在應用程式中導入簡訊使用者驗證機制,並傳送驗證碼。
簡訊權限可讓應用程式存取訊息資料,包括動態密碼等機密資料。
因此,我們在應用程式中導入了一些 API,讓您能夠實作這項功能,這樣您就不需要要求廣泛的簡訊權限,但仍能擷取簡訊動態密碼進行驗證。
SMS Retriever API 可讓應用程式自動驗證動態密碼,不必取得廣泛的簡訊權限。
您在訊息中附加 11 個字元的雜湊值來識別應用程式,系統只會將該訊息傳送給您。
如果無法控制訊息格式,請使用 SMS User Consent API。
系統會顯示單一的一次性提示。
使用者輕觸「允許」或「拒絕」,如果允許,您就會收到該單一訊息。
仍不需要廣泛的簡訊權限。
某些應用程式可能只需要精確位置一次,即可完成工作。
現有的單次授權會造成使用者不便,因此開發人員有時會要求更廣泛的精確權限。
因此,位置資訊按鈕這項工具可讓使用者輕鬆授予應用程式一次性精確位置存取權。
這是一種 Android UI 元素,應用程式開發人員可以自訂及嵌入。
我們在 6 月推出了第一個 Alpha 版位置資訊按鈕 Jetpack 程式庫。
您可以在這裡查看在 Android 資訊清單中啟用位置資訊按鈕所需的權限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:usesPermissionFlags="onlyForLocationButton"/>
<uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />
<application
android:icon="@mipmap/ic_launcher"
android:label="LocationButtonSample"
android:theme="@style/Theme.PinPoint">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>您必須宣告標準位置存取權,也就是新增 onlyForLocationButton 權限旗標,以及系統遠端算繪服務所需的專屬 USE_LOCATION_BUTTON 權限。
右側是實作該功能的 Jetpack 程式碼。
...
import androidx.core.locationbutton.compose.LocationButton
@Composable
fun LocationPermissionScreen(onPermissionGranted: () -> Unit, onPermissionDenied: () -> Unit) {
// Renders the secure system-trusted Location Button composable
LocationButton(
// Callback triggered when the user taps the secure button and makes a decision on the permission dialog
onPermissionResult = { isGranted ->
if (isGranted) {
onPermissionGranted()
} else {
onPermissionDenied()
}
},
...如您所見,我們正在建立位置資訊按鈕,並初始化回呼。
使用者輕觸位置資訊按鈕,決定是否授予權限時,系統會觸發這個回呼。
進階保護模式是專為高風險或注重安全性的使用者設計的功能,但任何人都可以選擇加入。
舉例來說,假設您是銀行應用程式,您不會在每次轉帳時強制要求額外的多重驗證,因為一般使用者不喜歡這種額外的摩擦。
不過,如果開啟進階保護模式,應用程式就會知道這位使用者需要最高層級的保護,因此可以自動要求每次轉帳都必須進行生物辨識驗證。
進階保護模式會實施一組預先定義的設定,強化裝置保護。
以下說明如何將這項功能整合至應用程式。
您需要要求權限、查詢進階保護模式,並使用裝置端呼叫進階保護模式管理員系統服務,檢查使用者是否已開啟進階保護模式。
class AdvancedProtectionManager() {
// Check the current status
fun isAdvancedProtectionEnabled(): Boolean
// Be alerted when status changes
fun registerAdvancedProtectionCallback(executor: Executor,
callback: Callback)
fun unregisterAdvancedProtectionCallback(callback: Callback)
}
interface Callback() {
// Called when advanced protection state changes
fun onAdvancedProtectionChanged(enabled: Boolean)
}接著,您可以註冊回呼,監聽執行階段變更。
android skills list
android skills add android-intent-security
android skills add android-permissions-securityandroid skills list
android skills add play-policy-insights<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:usesPermissionFlags="onlyForLocationButton"/>
<uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />
<application
android:icon="@mipmap/ic_launcher"
android:label="LocationButtonSample"
android:theme="@style/Theme.PinPoint">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>...
import androidx.core.locationbutton.compose.LocationButton
@Composable
fun LocationPermissionScreen(onPermissionGranted: () -> Unit, onPermissionDenied: () -> Unit) {
// Renders the secure system-trusted Location Button composable
LocationButton(
// Callback triggered when the user taps the secure button and makes a decision on the permission dialog
onPermissionResult = { isGranted ->
if (isGranted) {
onPermissionGranted()
} else {
onPermissionDenied()
}
},
...class AdvancedProtectionManager() {
// Check the current status
fun isAdvancedProtectionEnabled(): Boolean
// Be alerted when status changes
fun registerAdvancedProtectionCallback(executor: Executor,
callback: Callback)
fun unregisterAdvancedProtectionCallback(callback: Callback)
}
interface Callback() {
// Called when advanced protection state changes
fun onAdvancedProtectionChanged(enabled: Boolean)
}