開發人員請注意,如果您的應用程式含有路徑周遊安全性漏洞,請詳閱本文資訊。
問題說明
自 2018 年 1 月 16 日起,只要新的應用程式或更新內容含有 Path Traversal 安全漏洞,一律禁止在 Google Play 發布。請參閱 Play Console 的通知內容。在 Play Console 顯示的修正期限過後,Google Play 會將尚未修復安全漏洞的應用程式下架。
需採取行動
- 登入 Play Console,然後前往「快訊」專區查看受影響的應用程式以及解決這些問題的期限。
- 更新受影響的應用程式並修復安全漏洞。
- 提交受影響應用程式的更新版本。
我們將再次審查您重新提交的應用程式,過程可能需要數小時。如果應用程式可以通過審查並成功發布,您就不必採取進一步行動。如果應用程式未能通過審查,就無法發布新的版本,而且您將收到電子郵件通知。
其他詳細資訊
在匯出的 ContentProviders 中實作 openFile 時,如未確實驗證傳入的 URI 參數,就可能產生安全漏洞。惡意應用程式可能提供精心設計的 URI (例如含有「/../」的 URI),誘騙您的應用程式針對目標目錄之外的檔案傳回 ParcelFileDescriptor,藉此讓惡意應用程式得以存取您的應用程式已可存取的任何檔案。
建議您根據自己的情況,採取以下兩種策略來消除 ContentProvider 中的路徑周遊安全性漏洞。
1. 如果您的 ContentProvider 無需向其他應用程式提供資料:
- 您可以針對資訊清單中受影響的 ContentProvider 修改 <provider> 標籤,以便設定 android:exported=”false”。這樣可以避免其他應用程式傳送調用請求給受影響的 ContentProvider。
- 您也可以設定 android:permission 屬性,將 permission 設為 android:protectionLevel=“signature”,防止其他開發人員撰寫的應用程式傳送調用請求給受影響的 ContentProvider。
2. 如果您的 ContentProvider 需要向其他應用程式提供資料:
您必須確保對 openFile (含有路徑周遊字元) 的輸入,不會造成您的應用程式傳回非預期的檔案,做法是檢查檔案的正式路徑。範例如下:
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
注意事項:使用 URI 參數呼叫 getLastPathSegment 並不安全,因為惡意應用程式可能提供編碼的 URI 路徑,例如 %2F..%2F..path%2Fto%2Fsecret.txt,讓 getLastPathSegment 的結果變成 /../../path/to/secret.txt。舉例來說,實作以下程式碼仍會使您的應用程式容易受到攻擊。
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
我們很樂意提供協助
如有關於安全漏洞的技術問題,請前往 Stack Overflow 張貼問題並加上「android-security」標記。如需進一步瞭解這個問題的解決步驟,歡迎與開發人員支援小組聯絡。