热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Soot检测Android应用Zip目录遍历漏洞

Soot简介Soot是一个Java静态分析框架,它提供了四种中间(representation)表现用于分析与转换Java字节码.Soot既可以作为优化和检查cla

Soot简介

Soot是一个Java静态分析框架,它提供了四种中间(representation)表现用于分析与转换Java字节码.Soot既可以作为优化和检查class文件的工具也可以作为一个开发与优化Java字节码的框架。

使用Soot可以对Android应用进行静态分析,Android静态分析指APK不在运行的情况下,根据某些代码特征来分析应用具有哪些行为。

什么是Zip文件遍历攻击以及修复方案

请看这篇博客《Android静态安全检查(二):Zip文件目录遍历攻击》

代码实现

工程依赖的jar包,依赖包下载地址:https://github.com/secure-software-engineering/FlowDroid/releases

gradle依赖

dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'testCompile group: 'junit', name: 'junit', version: '4.11'
}

定义检查接口ICheck

/*** 应用检查接口* @author wzj* @create 2018-07-01 16:52**/
public interface IChecker
{void checker();
}

定义基础抽象类,封装公共方法,注意以下两点

  • initSootConfig方法是初始化Soot配置,主要有apk路径和Android SDK的platform文件夹路径
  • 因为有很多Android源码影响分析,定义了excludePackagesList列表,分析的时候,把这些包名过滤掉

import soot.PackManager;
import soot.Scene;
import soot.SootClass;
import soot.options.Options;import java.util.ArrayList;
import java.util.List;/*** 应用检查的基础类* @author wzj* @create 2018-07-01 16:35**/
public abstract class BasicChecker implements IChecker
{/*** 检查的时候,要排除的包名*/protected static List excludePackagesList = new ArrayList();/*** apk路径*/protected String apkPath = "H:\\JAVA\\Soot\\apk\\app-debug.apk";/*** android jar路径*/protected String jarsPath = "D:\\AndroidSDK\\platforms";static{excludePackagesList.add("java.");excludePackagesList.add("android.");excludePackagesList.add("javax.");excludePackagesList.add("android.support.");excludePackagesList.add("sun.");excludePackagesList.add("com.google.");}/*** 初始化soot配置*/private void initSootConfig(){Options.v().set_src_prec(Options.src_prec_apk);Options.v().set_output_format(Options.output_format_jimple);String androidJarPath = Scene.v().getAndroidJarPath(jarsPath, apkPath);List pathList = new ArrayList();pathList.add(apkPath);pathList.add(androidJarPath);Options.v().set_process_dir(pathList);Options.v().set_force_android_jar(androidJarPath);Options.v().set_keep_line_number(true);Options.v().set_process_multiple_dex(true);Options.v().set_wrong_staticness(Options.wrong_staticness_ignore);Options.v().set_exclude(excludePackagesList);Scene.v().loadNecessaryClasses();PackManager.v().runPacks();}/*** 是否是例外的包名* @param sootClass 当前的类* @return 检查结果*/protected boolean isExcludeClass(SootClass sootClass){if (sootClass.isPhantom()){return true;}String packageName = sootClass.getPackageName();for (String exclude : excludePackagesList){if (packageName.startsWith(exclude)){return true;}}return false;}/*** 分析*/public void analyze(){initSootConfig();checker();}
}

具体的检测类,遍历每一个类的每一个方法,看是否有ZipEntry的getName()方法调用,如果有方法调用,再判断是否有下面两种调用

  • File类的String getCanonicalPath()方法调用
  • String类的boolean contains(CharSequence s)调用

如果有其中一个,则认为该应用有对路径做处理,则不存在zip目录遍历漏洞;如果没有,则认为有该漏洞。

import com.nii.soot.core.BasicChecker;
import soot.*;
import soot.jimple.InvokeExpr;
import soot.jimple.Stmt;
import soot.jimple.StringConstant;import java.util.ArrayList;
import java.util.List;/*** zip目录遍历攻击检测** @author wzj* @create 2018-07-04 21:54**/
public class ZipVulnChecker extends BasicChecker
{/*** ZipEntry 的getName()方法签名*/private static final String ENTRY_GET_NAME_SIGNATURE = "";/*** ZipEntry类*/private static final String ENTRY_CLASS = "java.util.zip.ZipEntry";/*** getCanonicalPath()方法签名*/private static final String GET_CANONICAL_FILE_SIGNATURE = "";/*** contains方法签名*/private static final String CONTAINS_SIGNATURE = "";/*** 具体的检测方法*/public void checker(){for (SootClass sootClass : Scene.v().getApplicationClasses()){//判断是否是虚方法,是否是否是接口if (sootClass.isPhantom() || sootClass.isInterface() || isExcludeClass(sootClass)){continue;}for (SootMethod sootMethod : sootClass.getMethods()){if (!sootMethod.hasActiveBody()){continue;}//判断是否含有ZipEntry类if (!isContainZipEntryClass(sootMethod.getActiveBody())){continue;}checkZipVuln(sootClass,sootMethod);}}}private boolean isContainZipEntryClass(Body body){List localList = new ArrayList();localList.addAll(body.getLocals());localList.addAll(body.getParameterLocals());for (Local local : localList){if (ENTRY_CLASS.equals(local.getType().toString())){return true;}}return false;}/*** 检测是否有zip遍历漏洞,判断规则为:* 如果调用了getName()方法获取解压文件路径,如果接下来有如下一种判断则认为没有漏洞* 1、调用了File的getCanonicalFile()方法获取绝对路径* 2、判断该路径是否包含 .. 字符串** @param sootClass sootClass* @param sootMethod sootMethod*/private void checkZipVuln(SootClass sootClass, SootMethod sootMethod){Body body = sootMethod.getActiveBody();Stmt targetStmt = null;//是否找到了getName() apiboolean isFindGetNameApi = false;//是否有漏洞boolean isZipVul = true;for (Unit unit : body.getUnits()){Stmt stmt = (Stmt) unit;//判断是否是一条调用语句if (!stmt.containsInvokeExpr()){continue;}//获取调用语句的方法签名String methodSignature = stmt.getInvokeExpr().getMethod().getSignature();if (ENTRY_GET_NAME_SIGNATURE.equals(methodSignature)){isFindGetNameApi = true;targetStmt = stmt;}if (isFindGetNameApi){//判断是否调用File的getCanonicalFile()方法if (GET_CANONICAL_FILE_SIGNATURE.equals(methodSignature)){isZipVul = false;break;}//判断是否调用了contains方法,并且第一个参数值为 ..if (CONTAINS_SIGNATURE.equals(methodSignature)){InvokeExpr invokeExpr = stmt.getInvokeExpr();Value value = invokeExpr.getArg(0);if (value instanceof StringConstant && ((StringConstant) value).value.startsWith("..")){isZipVul = false;break;}}}}if (isFindGetNameApi && isZipVul){System.out.println("***************************************");System.out.println("This apk has zip vulnerability");System.out.println(sootClass.getName());System.out.println(sootMethod.getSubSignature());System.out.println(targetStmt.getJavaSourceStartLineNumber());}}public static void main(String[] args){new ZipVulnChecker().analyze();}
}

源码地址

https://github.com/HelloKittyNII/soot-android-static-analysis


推荐阅读
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
author-avatar
1257523034_627418
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有