これは、CVE-2026-39973 用の小さな C# APK ファイルビルダーです。
CVE-2026-39973 は、GitHub リポジトリ iBotPeaches/Apktool 内のパストラバーサル(ディレクトリトラバーサル)の脆弱性であり、バージョン 3.0.1 に影響します。
攻撃者は独自のリソースを作成し、エントリのタイプ内に ..\ シーケンスを注入することで、~/.bashrc または Windows のスタートアップパスに任意のファイルを書き込むことができます。
この脆弱性は、コミット e10a045(PR #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 が事前にチェックされている(ResEntrySpec コンストラクタ)ため、出力パス全体に対する「無駄な」チェックを削除しました。
しかし、作者は、悪意のある resources.arsc を作成することで、エントリのタイプ名がパストラバーサルの対象になり得ることを見落としていました。
resources.arsc は、リソースデータ、パス、タイプ名などを含むファイルです。
Apktool を悪用するためにタイプ名を変更したり、resource.arsc ファイルを作成したりするために必要なものがすべて格納されています。
その頻度にもかかわらず、シリアライゼーションに関する貧弱だが満足できるドキュメントしか見つけられませんでした。
この時点で、apktool のドキュメントを読むことを強くお勧めします。
このアプリケーション専用に resources.arsc ファイルを構築する必要があるため、私は直接 Apktool をベースにし始めました。
インターネットからランダムな APK ファイルをダウンロードし、7zip で開きました。次に resources.arsc ファイルを抽出し、Apktool のパーサーコードとともにデータ構造の調査を開始しました。
その後、..\ シーケンスと Windows スタートアップフォルダのパスを持つ 1 つの ResType を持つ ResTable と ResPackage を書き込む、小さな C# ビルダーを作成しました。また、ペイロードファイルである 1 つのエントリも含まれています。