首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Zip路径遍历漏洞“仅在Android 11中发生的原因是什么?

"Zip路径遍历漏洞“仅在Android 11中发生的原因是什么?
EN

Stack Overflow用户
提问于 2021-10-13 17:18:03
回答 1查看 1.3K关注 0票数 2

基于https://support.google.com/faqs/answer/9294009,我们在代码中实现了"Zip路径遍历漏洞“检测。

当我们遇到throw new SecurityException("https://support.google.com/faqs/answer/9294009");“Zip路径遍历漏洞”时,我们将从Google控制台获得崩溃日志,同时显式地运行。

目前,有时我有"Zip路径遍历漏洞“只发生在Android11中。

代码语言:javascript
复制
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是非空的

代码语言:javascript
复制
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捆绑在一起

我们使用以下代码在运行时提取它。

代码语言:javascript
复制
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文件是从

https://raw.githubusercontent.com/yccheok/jstock/master/appengine/jstock-android-static/war/stocks_information/unitedstate/stocks.zip

EN

回答 1

Stack Overflow用户

发布于 2021-12-05 16:30:26

Utils.getUserDataDirectory()函数中使用:

代码语言:javascript
复制
getFilesDir().getCanonicalFile() 

而不是

代码语言:javascript
复制
getExternalFilesDir()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69559718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档