基于https://support.google.com/faqs/answer/9294009,我们在代码中实现了"Zip路径遍历漏洞“检测。
当我们遇到throw new SecurityException("https://support.google.com/faqs/answer/9294009");“Zip路径遍历漏洞”时,我们将从Google控制台获得崩溃日志,同时显式地运行。
目前,有时我有"Zip路径遍历漏洞“只发生在Android11中。
public static boolean extractZipFile(InputStream inputStream, String destDirectory, boolean overwrite) {
ZipInputStream zipInputStream = null;
boolean status = true;
try {
zipInputStream = new ZipInputStream(inputStream);
final byte[] data = new byte[1024];
while (true) {
ZipEntry zipEntry = null;
FileOutputStream outputStream = null;
try {
zipEntry = zipInputStream.getNextEntry();
if (zipEntry == null) {
break;
}
final File destination = new File(destDirectory, zipEntry.getName());
final String canonicalPath = destination.getCanonicalPath();
if (!canonicalPath.startsWith(destDirectory)) {
throw new SecurityException("https://support.google.com/faqs/answer/9294009");
}在调用destDirectory之前,我总是确保extractZipFile是非空的
public static boolean extractZipFile(InputStream inputStream, boolean overwrite) {
String destDirectory = Utils.getUserDataDirectory();
if (destDirectory == null) {
return false;
}
return extractZipFile(inputStream, destDirectory, overwrite);
}
public static String getUserDataDirectory() {
if (externalFilesDir == null) {
File _externalFilesDir = JStockApplication.instance().getExternalFilesDir(null);
externalFilesDir = _externalFilesDir;
if (externalFilesDir == null) {
return null;
}
}
return toEndWithFileSeperator(externalFilesDir.toString()) + getApplicationVersionString() + File.separator;
}
private static String toEndWithFileSeperator(String string) {
if (string.endsWith(File.separator)) {
return string;
}
return string + File.separator;
}
public static String getApplicationVersionString() {
return "1.0.7";
}根据提供的源代码,您有任何猜测的原因,为什么"Zip路径遍历漏洞“只发生在Android 11中?我使用仿真器Android 11,但无法重现问题。
压缩文件从哪里来?
压缩文件来自两个地方
如下图所示,与APK捆绑在一起

我们使用以下代码在运行时提取它。
private void initPreloadDatabase(boolean overWrite) {
AssetManager assetManager = getResources().getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("database" + File.separator + "database.zip");
} catch (IOException e) {
Log.e(TAG, "", e);
}
if (inputStream != null) {
org.yccheok.jstock.gui.Utils.extractZipFile(inputStream, overWrite);
}
}另一个zip文件是从
发布于 2021-12-05 16:30:26
在Utils.getUserDataDirectory()函数中使用:
getFilesDir().getCanonicalFile() 而不是
getExternalFilesDir()https://stackoverflow.com/questions/69559718
复制相似问题