4.3.2 建立/使用内容供應器 規則書
原書: Android Application Secure Design/Secure Coding Guidebook 譯者: 飛龍 協定: CC BY-NC-SA 4.0
實作或使用内容供應器時,確定遵循以下規則。
4.3.2.1 僅僅在應用中使用的内容供應器必須設為私有(必需)
僅供單個應用使用的内容供應器不需要被其他應用通路,并且開發人員通常不會考慮攻擊内容供應器的通路。 内容供應器基本上是共享資料的系統,是以它預設處理成公共的。 僅在單個應用中使用的内容供應器應該被顯式設定為私有,并且它應該是私有内容供應器。 在 Android 2.3.1(API Level 9)或更高版本中,通過在
provider
元素中指定
android:exported="false"
,可以将内容供應器設定為私有。
AndroidManifest.xml
<!-- *** POINT 1 *** Set false for the exported attribute explicitly. -->
<provider
android:name=".PrivateProvider"
android:authorities="org.jssec.android.provider.privateprovider"
android:exported="false" />
4.3.2.2 小心并安全地處理收到的請求參數(必需)
風險因内容供應器的類型而異,但在處理請求參數時,你應該做的第一件事是輸入驗證。
雖然内容供應器的每個方法,都有一個接口,應該接收 SQL 語句的成分參數,但實際上它隻是交給系統中的任意字元串,是以需要注意内容供應器方需要假設,可能會提供意外的參數的情況。
由于公共内容提供應器可以接收來自不受信任來源的請求,是以可能會受到惡意軟體的攻擊。 另一方面,私有内容供應器永遠不會直接收到來自其他應用的任何請求,但是目标應用中的公共活動,可能會将惡意意圖轉發給私有内容供應器,是以你不應該認為,私有内容供應器不能 接收任何惡意輸入。 由于其他内容供應器也有将惡意意圖轉發給他們的風險,是以有必要對這些請求執行輸入驗證。
請參閱“3.2 小心和安全地處理輸入資料”。
4.3.2.3 驗證簽名權限由内部定義之後,使用内部定義的簽名權限(必需)
確定在建立内容供應器時,通過定義内部簽名權限,來保護你的内部内容供應器。 由于在
AndroidManifest.xml
檔案中定義權限或聲明權限請求,沒有提供足夠的安全性,請務必參考“5.2.1.2 如何使用内部定義的簽名權限在内部應用之間進行通信”。
4.3.2.4 傳回結果時,請注意來自目标應用的結果的資訊洩露的可能性(必須)
在
query()
或插入
insert()
的情況下,
Cursor
或
Uri
作為結果資訊傳回到發送請求的應用。 當敏感資訊包含在結果資訊中時,資訊可能會從目标應用洩露。 在
update()
delete()
的情況下,更新/删除記錄的數量作為結果資訊傳回給發送請求的應用。 在極少數情況下,取決于某些應用的規範,更新/删除記錄的數量具有敏感含義,請注意這一點。
4.3.2.5 提供二手素材時,素材應該以相同級别的保護提供(必需)
當受到權限保護的資訊或功能素材,被另一個應用提供時,你需要確定它具有通路素材所需的相同權限。 在 Android OS 權限安全模型中,隻有已被授予适當權限的應用,才能直接通路受保護的素材。 但是,存在一個漏洞,因為具有素材權限的應用可以充當代理,并允許非特權應用的通路。 基本上這與重授權限相同,是以它被稱為“重新授權”問題。 請參閱“5.2.3.4 重新授權問題”。
4.3.2.6 小心并安全地處理來自内容供應器的傳回的結果資料(必需)
如果目标内容供應器是公共内容供應器,僞裝成公共内容供應器的惡意軟體可能會傳回攻擊性結果資料。 另一方面,如果目标内容供應器是私有内容供應器,則其風險較小,因為它從同一應用接收結果資料,但不應該認為,私有内容供應器不能接收任何惡意輸入。 由于其他内容供應器也有将惡意資料傳回給他們的風險,是以有必要對該結果資料執行輸入驗證。