路径遍历安全漏洞

本文面向的是发布的应用中包含路径遍历安全漏洞的开发者。

问题说明

从 2018 年 1 月 16 日起,Google Play 开始禁止发布任何存在路径遍历漏洞的新应用或应用更新。请参阅 Play 管理中心内的通知。Play 管理中心显示的截止日期过后,系统可能会将所有包含未修复安全漏洞的应用从 Google Play 中移除。

需要采取的行动​

  1. 登录您的 Play 管理中心,然后转到“提醒”部分,了解受影响的应用以及解决这些问题的截止日期。
  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”标签)。有关您需要采取哪些步骤来解决此问题的说明,请与我们的开发者支持团队联系。

该内容对您有帮助吗?

您有什么改进建议?
false
主菜单
11617970884622502800
true
搜索支持中心
true
true
true
true
true
5016068
false
false