路徑周遊安全性漏洞

開發人員請注意,如果您的應用程式含有路徑周遊安全性漏洞,請詳閱本文資訊。

問題說明

自 2018 年 1 月 16 日起,只要新的應用程式或更新內容含有 Path Traversal 安全漏洞,一律禁止在 Google Play 發布。請參閱 Play Console 的通知內容。Play Console 顯示的修正期限過後,Google Play 會將尚未修復安全漏洞的應用程式下架。

需採取行動​

  1. 登入 Play Console,然後前往「快訊」專區查看受影響的應用程式以及解決這些問題的期限。
  2. 更新受影響的應用程式並修復安全漏洞。
  3. 提交受影響應用程式的更新版本。

我們將再次審查您重新提交的應用程式,過程可能需要數小時。如果應用程式可以通過審查並成功發布,您就不必採取進一步行動。如果應用程式未能通過審查,就無法發布新的版本,而且您將收到電子郵件通知。

其他詳細資訊

在匯出的 ContentProviders 中實作 openFile 時,如未確實驗證傳入的 URI 參數,就可能產生安全漏洞。惡意應用程式可能提供精心設計的 URI (例如含有「/../」的 URI),誘騙您的應用程式針對目標目錄之外的檔案傳回 ParcelFileDescriptor,藉此讓惡意應用程式得以存取您的應用程式已可存取的任何檔案。

建議您根據自己的情況,採取以下兩種策略來消除 ContentProvider 中的路徑周遊安全性漏洞。

1. 如果您的 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」標記。如需進一步瞭解這個問題的解決步驟,歡迎與開發人員支援小組聯絡。

這篇文章實用嗎?
我們應如何改進呢?