详细漏洞分析 个人博客:Android漏洞分析-解压缩目录穿越导致文件覆盖漏洞
zip 类型的压缩包文件中允许存在 ../ 类型的字符串,用于表示上一层级的目录。攻击者可以利用这一特性,通过精心构造 zip 文件,利用多个 ../ 从而改变 zip 包中某个文件的存放位置,达到替换掉原有文件的目的。
那么,如果被替换掉的文件是是 .so、.dex 或 .odex 类型文件,那么攻击者就可以轻易更改原有的代码逻辑,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害应用用户的设备安全和信息安全。比如寄生兽漏洞、海豚浏览器远程命令执行漏洞和三星默认输入法远程代码执行等著名的安全事件。
因为Linux系统中../代表向上级目录跳转,攻击者可以通过构造相应的Zip文件,利用多个'../'从而改变zip包中某个文件的存放位置,费用该替换掉应用原有的文件,完成目录穿越。这样严重可能会导致任意代码执行漏洞,危害应用用户的设备安全和信息安全。Java 代码在解压 zip 文件时,会使用到 ZipEntry 类的 getName() 方法,如果 zip 文件中包含 ../ 的字符串,该方法返回值会原样返回。如果没有过滤掉 getName() 返回值中的 ../ 字符串,继续解压缩操作,就会在其他目录中创建解压的文件。
对重要的 zip 压缩包文件进行数字签名校验,校验通过才进行解压。
检查 zip 压缩包中使用 ZipEntry.getName() 获取的文件名中是否包含 ../ 或者 .. 字符。
更换 zip 解压方式,不使用 ZipEntry.getName() 的方式,使用 ZipInputStream 替代。