本文面向的是发布的应用中包含路径遍历安全漏洞的开发者。
问题说明
从 2018 年 1 月 16 日起,Google Play 开始禁止发布任何存在路径遍历漏洞的新应用或应用更新。请参阅 Play 管理中心内的通知。在 Play 管理中心显示的截止日期过后,系统可能会将所有包含未修复安全漏洞的应用从 Google Play 中移除。
需要采取的行动
- 登录您的 Play 管理中心,然后转到“提醒”部分,了解受影响的应用以及解决这些问题的截止日期。
- 更新受影响的应用并修复该漏洞。
- 提交受影响应用的更新版本。
重新提交后,我们会重新审核您的应用。审核过程可能需要几个小时才能完成。如果应用通过审核并成功发布,便无需进一步操作。如果应用未通过审核,则新版应用将无法发布,您会收到电子邮件通知。
更多详细信息
在导出的 ContentProviders 中实现 openFile 时,如果不能正确验证传入的 URI 参数,就可能存在安全漏洞。恶意应用可能会提供精心伪装的 URI(例如,包含“/../”的 URI),诱使您的应用为既定目录之外的文件返回 ParcelFileDescriptor,从而允许恶意应用访问您的应用可访问的任何文件。
建议您采取以下两种策略来消除 ContentProvider 中的路径遍历安全漏洞。
1.如果您的 ContentProvider 无需向其他应用提供资料,请执行以下操作:
- 您可以在清单中修改受影响的 ContentProvider 的 <provider> 标记,以便设置 android:exported=”false”。此操作将阻止其他应用将 Intent 发送到受影响的 ContentProvider。
- 您还可以设置 android:permission 属性,将 permission 设为 android:protectionLevel=“signature”,以防止其他开发者编写的应用将 Intent 发送到受影响的 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”标签)。有关您需要采取哪些步骤来解决此问题的说明,请与我们的开发者支持团队联系。