ContentProvider路径遍历漏洞

slo*_*car 5 android android-contentprovider

Google 就 ContentProvider 中的路径遍历漏洞发出警告\n https://support.google.com/faqs/answer/7496913

\n
\n

openFile如果导出的和openAssetFile导出的实现ContentProviders没有正确验证传入Uri参数,则它们可能容易受到攻击。恶意应用程序可以提供精心设计的文件Uri(例如,包含 \xe2\x80\x9c/../\xe2\x80\x9d)来欺骗您的应用程序返回ParcelFileDescriptor目标目录之外的文件,从而允许恶意应用程序访问您的应用程序可访问的任何文件。

\n
\n

他们的例子(来自上面的链接):

\n
public ParcelFileDescriptor openFile (Uri uri, String mode)\n throws FileNotFoundException {\n File f = new File(DIR, uri.getLastPathSegment());\n  if (!f.getCanonicalPath().startsWith(DIR)) {\n    throw new IllegalArgumentException();\n  }\n return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

DIR指的是什么?我如何实施正确的修复?

\n

Mat*_* Ke 3

DIR指的是应用程序内部存储中您要共享文件的目录。

\n

这可能是:

\n
File fd = getContext().getFilesDir();\nString DIR = fd.getAbsolutePath() + "/public";\n
Run Code Online (Sandbox Code Playgroud)\n

(结果:/data/user/0/[APPLICATION_ID]/files/public

\n

使固定:

\n

要解决此问题,您必须确保攻击者无法使用包含路径遍历字符(例如“../”)的恶意 URI 访问内部存储中的意外文件。

\n

(例如,您的数据库文件位于/data/user/0/[APPLICATION_ID]/databases是“意外文件”。)

\n

正如 Google 建议的那样,您可以通过检查 file\xe2\x80\x99s 规范路径来完成此操作。规范路径是绝对路径,不包含“.”。或“..”了。(如果文件的规范路径以您的目录路径开头,则一切都很好。)

\n

例子:

\n
    \n
  • 恶意 URI:content://[APPLICATION_ID]/public/../../databases/database.db
  • \n
  • 恶意路径:/data/user/0/[APPLICATION_ID]/files/public/../../databases/database.db
  • \n
  • 规范路径:/data/user/0/[APPLICATION_ID]/databases/database.db
  • \n
\n

所以,这是完整的修复:

\n
private String DIR; \n\n@Override\npublic boolean onCreate() {\n    File fd = getContext().getFilesDir();\n    DIR = fd.getAbsolutePath() + "/public";\n    return true;\n}\n\n@Override\npublic ParcelFileDescriptor openFile(Uri uri, String mode)\n        throws FileNotFoundException {\n    File f = new File(DIR, uri.getLastPathSegment());\n    if (!f.getCanonicalPath().startsWith(DIR)) {\n        throw new IllegalArgumentException();\n    }\n    return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(旁注:DIR应该是dir,因为它不是一个常数。)

\n