关于AppShark
AppShark是一款针对Android应用程序的安全测试框架,该工具本质上是一个静态污点分析平台,可以用于扫描Android应用程序中的漏洞。
AppShark除了实现行业普遍应用的数据流分析,还将指针分析与数据流分析融合,因而漏洞建模上更精准,规则更灵活,在误报率和漏报率方面有了比较大的改进。Appshark可以作为公司内部的Android App的自动化检测工具,辅助企业发现App的安全漏洞及隐私合规风险,也可以作为白帽子日常App漏洞挖掘的助手,提高漏洞挖掘的效率及产出。
工具要求
AppShark需要使用指定版本的JDK,即JDK11。经过测试后,我们发现该工具不支持其他的LTS版本,比如说JDK 8和JDK 16。
工具下载
广大研究人员可以使用下列命令将该项目源码克隆至本地:
git clone https://github.com/bytedance/appshark.git
项目构建与编译
打开命令行终端,然后切换到项目目录下,并使用gradle工具完成项目代码的构建和编译:
$ ./gradlew build -x test
执行上述命令之后,我们将会在项目目录的build/libs中查看到生成的jar文件:AppShark-0.1.1-all.jar。
AppShark运行
在命令行终端中切换到项目根目录下,然后运行下列命令并使用配置文件来执行AppShark:
$ java -jar build/libs/AppShark-0.1.1-all.jar config/config.json5
config.json5文件的配置内容如下所示:
{ "apkPath": "/Users/apks/app1.apk", "out": "out", "rules": "unZipSlip.json", "maxPointerAnalyzeTime": 600 }
其中的每一个JSON字段解释如下:
apkPath:需要分析的apk文件路径;
out:输出目录路径;
rules:规则文件的路径地址,可以指定多条;
maxPointerAnalyzeTime:从每一个入口点执行分析的超时时间间隔;
debugRule:指定调试过程中启用日志记录的规则名称;
结果解析
下面给出的是一个results.json文件示例:
{ "AppInfo": { "AppName": "test", "PackageName": "net.bytedance.security.app", "min_sdk": 17, "target_sdk": 28, "versionCode": 1000, "versionName": "1.0.0" }, "SecurityInfo": { "FileRisk": { "unZipSlip": { "category": "FileRisk", "detail": "", "model": "2", "name": "unZipSlip", "possibility": "4", "vulners": [ { "details": { "position": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>", "Sink": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>->$r31", "entryMethod": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void f()>", "Source": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>->$r3", "url": "/Volumes/dev/zijie/appshark-opensource/out/vuln/1-unZipSlip.html", "target": [ "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>->$r3", "pf{obj{<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>:35=>java.lang.StringBuilder}(unknown)->@data}", "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>->$r11", "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolderFix1(java.lang.String,java.lang.String)>->$r31" ] }, "hash": "ec57a2a3190677ffe78a0c8aaf58ba5aee4d2247", "possibility": "4" }, { "details": { "position": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>", "Sink": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>->$r34", "entryMethod": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void f()>", "Source": "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>->$r3", "url": "/Volumes/dev/zijie/appshark-opensource/out/vuln/2-unZipSlip.html", "target": [ "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>->$r3", "pf{obj{<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>:33=>java.lang.StringBuilder}(unknown)->@data}", "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>->$r14", "<net.bytedance.security.app.pathfinder.testdata.ZipSlip: void UnZipFolder(java.lang.String,java.lang.String)>->$r34" ] }, "hash": "26c6d6ee704c59949cfef78350a1d9aef04c29ad", "possibility": "4" } ], "wiki": "", "deobfApk": "/Volumes/dev/zijie/appshark-opensource/app.apk" } } }, "DeepLinkInfo": { }, "HTTP_API": [ ], "JsBridgeInfo": [ ], "BasicInfo": { "ComponentsInfo": { }, "JSNativeInterface": [ ] }, "UsePermissions": [ ], "DefinePermissions": { }, "Profile": "/Volumes/dev/zijie/appshark-opensource/out/vuln/3-profiler.json" }
许可证协议
本项目的开发与发布遵循Apache-2.0开源许可证协议。
项目地址
AppShark:【GitHub传送门】
参考资料
https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html
https://github.com/bytedance/appshark/blob/main/doc/zh/how_to_write_rules.md