Android读取asset压缩文件未复制被报Zip路径遍历漏洞如何处理
关于Play商店Zip路径遍历漏洞的申诉与修复方案
注意:谷歌Play的漏洞扫描为静态代码检测,不会判断你的zip实际来源,只要你用到的zip解压逻辑未做路径防护,就会触发预警。如果不想走申诉流程,直接修复解压逻辑后重新上传即可自动消除预警。
申诉操作步骤
- 准备完整的佐证材料,明确包含以下核心信息:
- 说明所有待解压的压缩包均为应用预制、内置在assets目录的官方文件,不存在任何用户可控、外部下载、第三方传入的压缩包来源
- 清晰描述解压后的操作逻辑:解压过程仅读取压缩包内指定文件的文本内容,直接转为字符串供内部逻辑调用,不会将任何解压内容写入本地存储、不会传递给其他应用/组件、不存在任何路径拼接写入操作
- 附上你的解压逻辑完整代码片段,标注所有路径校验、文件操作相关的代码行,证明不存在路径遍历的可利用条件
- 进入Play Console对应应用的安全预警页面,点击「上诉」入口,将上述材料全部提交,表述需严谨确定,避免使用模糊的不确定描述
- 若第一次申诉被驳回,可补充上传解压流程的单元测试结果,证明当传入携带恶意路径的zip条目时,你的逻辑会直接拦截拒绝处理,不会触发风险操作
漏洞修复方案
如果你的解压逻辑本身未做路径校验,哪怕当前使用场景无风险,也建议优先修复问题,避免后续迭代引入外部压缩包时触发真实漏洞,修复步骤如下:
- 每次读取zip条目时首先做路径合法性校验,禁止携带
../遍历字符、根路径开头的条目被处理 - 核心校验逻辑参考(Android Kotlin示例):
val assetInputStream = assets.open("your_script_pack.zip") val zipInputStream = ZipInputStream(assetInputStream) var entry: ZipEntry? = zipInputStream.nextEntry while (entry != null) { val entryName = entry.name // 核心路径遍历防护 if (entryName.contains("..") || entryName.startsWith("/")) { throw SecurityException("Invalid zip entry path: $entryName") } // 仅读取内容转为字符串内部使用 val content = zipInputStream.bufferedReader().use { it.readText() } // 此处添加你的内部业务逻辑 entry = zipInputStream.nextEntry } zipInputStream.close()
- 若你使用第三方解压库实现解压操作,直接升级到官方已修复路径遍历漏洞的最新版本即可,避免使用长期未维护的第三方解压组件
内容的提问来源于stack exchange,提问作者user1699512
相关产品推荐
相关产品推荐

