Zip路径遍历漏洞仅在Android 11系统触发的可能原因有哪些?
仅Android 11触发该异常的可能原因如下:
- 外部存储路径软链接解析差异
Android 11对外部存储的路径别名处理做了调整,getExternalFilesDir返回的File对象调用toString()得到的可能是软链接形式的路径,而destination.getCanonicalPath()会解析成真实物理路径,两者前缀不一致就会触发startsWith判断失败。Android 10及更早版本中getExternalFilesDir返回的路径字符串本身就是真实路径,不会出现该问题。 - Zip文件名编码解析逻辑变更
Android 11(API 30)修改了ZipInputStream的默认文件名编码为UTF-8,不再兼容旧的GBK等编码格式。如果你的内置Zip或者下载的Zip文件是用非UTF-8编码打包的,Android 11解析出来的ZipEntry#getName()会出现乱码,乱码内容可能包含../等路径跳转字符,拼接后得到的目标文件路径不在目标目录范围内,触发异常。 - 多用户/工作Profile路径规则变更
Android 11对多用户、工作Profile的存储路径做了调整,这类场景下getExternalFilesDir返回的路径前缀和getCanonicalPath解析后的路径前缀规则不同,导致前缀匹配失败。普通单用户场景下不会触发该问题,所以你用常规模拟器无法复现。 - 静态缓存路径失效
你代码中把externalFilesDir设为静态变量做缓存,如果应用运行过程中用户手动修改了存储权限、切换了工作 profile,Android 11会返回新的存储路径,但你的缓存中还是旧的路径,导致路径匹配失败。 - 定制ROM路径规则差异
部分厂商定制的Android 11系统对存储路径的格式化规则做了修改,getCanonicalPath返回的路径格式和原生系统不一致,导致前缀匹配逻辑失效。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

