frawlaboy/CVE-2026-39973-PoC
GitHub: frawlaboy/CVE-2026-39973-PoC
一个用 C# 编写的 CVE-2026-39973 概念验证工具,通过手工构造包含路径遍历 payload 的 resources.arsc 文件来利用 Apktool 3.0.1 中的安全回归漏洞,实现任意文件写入。
Stars: 1 | Forks: 0
# CVE-2026-39973-PoC
这是一个用于 [CVE-2026-39973](https://github.com/advisories/GHSA-m8mh-x359-vm8m) 的小型 C# apk 文件构建器。
## 免责声明
- 这是一个**概念验证**,仅供教育目的使用!
- 在编写此代码或文档时,**没有**使用 AI(除了关于序列化的小问题)。
- 我的学识**有限**。这是我的第一个 CVE PoC。文档可能存在错误或不完整之处。
- 代码可能难以阅读,因为我当时很匆忙且睡眠不足(抱歉)。
# CVE-2026-39973
[CVE-2026-39973](https://github.com/iBotPeaches/Apktool/security/advisories/GHSA-m8mh-x359-vm8m) 是 github 仓库 [iBotPeaches/Apktool](https://github.com/iBotPeaches) 中的一个路径遍历漏洞,影响版本 3.0.1。
它允许攻击者创建自己的资源,并在条目的类型中注入 `..\` 序列,从而允许威胁行为者将任意文件写入 `~/.bashrc` 或 Windows 启动路径。
## 安全回归
此漏洞源于提交 [e10a045](https://github.com/iBotPeaches/Apktool/commit/e10a0450c7afcd9462c0b76bcbff0e7428b92bdd)(PR [#4041](https://github.com/iBotPeaches/Apktool/pull/4041))中的安全回归,该提交从 `ResFileDecoder.java` 中移除了 `BrutIO.detectPossibleDirectoryTraversal()`
**ResFileDecoder.java#L103-L109 修改前:**
```
String outResPath = entry.getTypeName() + entry.getConfig().getQualifiers() + "/" + entry.getName();
if (BrutIO.detectPossibleDirectoryTraversal(outResPath)) {
LOGGER.warning("Potentially malicious file path: " + outResPath + ", using instead: " + inResPath);
outResPath = inResPath;
} else if (!ext.isEmpty()) {
outResPath += "." + ext;
}
```
**ResFileDecoder.java#L103-L104 修改后:**
```
String outResPath = entry.getTypeName() + entry.getConfig().getQualifiers() + "/" + entry.getName()
+ (ext.isEmpty() ? "" : "." + ext);
```
此提交移除了一个被认为是“无用”的对整个输出路径的检查,因为 `entry.name` 已经被[事先检查过](https://github.com/iBotPeaches/Apktool/blob/main/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/table/ResEntrySpec.java#L36)(`ResEntrySpec` 构造函数)。
作者忘记了,通过精心构造恶意的 `resources.arsc`,条目的 Type 名称可能会成为路径遍历攻击的目标。
## Resources.arsc
`resources.arsc` 是一个包含资源数据、路径、类型名称等内容的文件。
它存储了我们需要的一切信息,使我们能够修改类型名称或精心构造 `resource.arsc` 文件来利用 Apktool。
尽管它经常出现,但我只找到了关于其序列化的[简陋但差强人意的文档](https://apktool.org/wiki/advanced/resources-arsc/)。
**此时,强烈建议阅读 Apktool 的[文档]((https://apktool.org/wiki/advanced/resources-arsc/))。**
我开始以 Apktool 本身为基础,因为我需要专门为此应用程序构建一个 `resources.arsc` 文件。
我从互联网上下载了一个随机的 APK 文件并用 7zip 打开。然后我提取了 `resources.arsc` 文件,并开始结合 Apktool 的解析器代码研究其数据结构。
接着我用 C# 制作了一个小型的 `resources.arsc` 文件构建器,编写了一个 `ResTable` 和一个包含单个 `ResType` 的 `ResPackage`,该 `ResType` 带有 `..\` 序列和 Windows 启动文件夹的路径,它还包含一个作为 payload 文件的条目。
标签:AMSI绕过, Apktool, APK文件构建器, .bashrc, CISA项目, CVE-2026-39973, DNS 解析, OPA, PoC, Windows启动目录, 任意文件写入, 威胁检测, 安全 regression, 安全漏洞, 安卓逆向, 恶意文件生成, 教育用途, 数据展示, 文件包含, 暴力破解, 红队, 资源文件解析, 路径穿越, 靶场