
Exynos 9830 bootROM向けエクスプロイトキット。Samsung SM-G985Fデバイス向けに、署名付きブートバイパス、カスタムキー注入、メモリダンプペイロードを提供します。
[!CAUTION] 現在のキーバンドルと生成されたファイルはヒュージング対応です。デバイスが一度ヒューズされると、eFuseの変更は不可逆であり、デバイスはヒューズされたキーに一致するブートイメージとキーマテリアルを引き続き使用する必要があります。ヒュージング動作により、これらのファイルまたはフローを使用する場合は自己責任となります。実行するユーザーがすべての結果に対する責任を負います。ヒュージングフローを実行する前に、eFuseファイル、秘密鍵、署名済みFWBL1、LK /
sboot.binイメージ、および対象デバイスを確認してください。
| Path | Purpose |
|---|---|
bootLoaderFiles/ | ブートローダーバイナリ、分割されたブートローダーパーツ、オリジナルイメージ、復号化されたイメージ、およびダンプ成果物。 |
bootromNotes/ | ブートROMのノート、フローチャート、USBコンテキストオフセット。 |
exploit/ | Pythonツール、エクスプロイトランナー、分割/結合スクリプト、ペイロードビルドヘルパー、SoCデータ。 |
exploit/extra/images/ | エクスプロイトフローで使用される動作するブートローダーイメージ。 |
exploit/extra/payloads/ | external/payloads/ からコピーされたビルド済みペイロードバイナリ。 |
external/ | ペイロードソース、ビルドMakefile、逆コンパイルノート、共有キーマテリアル、ヘルパーツール。 |
external/keys/exynos9830_crecker/ | 署名付きローダーフローで使用される共有Exynos9830 / Exynos990カスタムキーバンドル。 |
exynos990reverseEng/ | Exynos 990リバースエンジニアリングプロジェクトファイル。 |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu
python3 -m pip install -r requirements.txt
requirements.txt には、coloredlogs、cryptography、hexdump、libusb、pyusb、pycryptodome が含まれます。
Windowsでは、PyUSBがBootROM USBデバイス 04e8:1234 を開く前に、WinUSB/libusb互換ドライバーを使用する必要があります。exploit/windows/README.md を参照してください。
リポジトリには、exploit/windows/Exynos_USB_Device.inf にWinUSBドライバーパッケージが含まれており、対応するカタログと証明書インポートファイルも同じディレクトリにあります。
sboot.bin の分割python3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
分割スクリプトは、イメージパーツと split_manifest.json ファイルを出力ディレクトリに書き込みます。
LKイメージは、カスタムキーフロー用にROMセキュアブートキー2のコマンドIDを使用する必要があります:
Ghidraプロジェクト内でLKパッチTSVを適用する際、ヘルパーは次のようにGhidraヘッドレス経由で呼び出されました:
GHIDRA=/path/to/ghidra_12.0.4_PUBLIC
REPO=$(pwd)
"$GHIDRA/support/analyzeHeadless" "$REPO/exynos990reverseEng" exynos990 \
-process lk.bin \
-noanalysis \
-scriptPath "$REPO/external/ghidra" \
-postScript ApplyLkPatches.java "$REPO/external/ghidra/lk_985_selected_patches.tsv"
ストックキーを置き換えて、32バイトのeFuseキーをオフセット 0x205008 の lk.bin に埋め込みます:
dd if=external/keys/exynos9830_crecker/crecker.efuse of=exploit/extra/images/lk.bin bs=1 seek=$((0x205008)) count=32 conv=notrunc
xxd -g1 -s $((0x205008)) -l 32 exploit/extra/images/lk.bin
python3 exploit/merge.py exploit/extra/images Exynos9830
結合スクリプトは、現在の作業ディレクトリに sboot.bin を書き込みます。
external/payloads/ 配下のペイロードプロジェクトをビルドし、生成されたバイナリを exploit/extra/payloads/ にコピーします:
./exploit/build_payloads.sh
UFSローダーとカスタムキーペイロードは、ビルド時に32バイトのefuseファイルを埋め込みます。デフォルトでは、Makefileは external/keys/exynos9830_crecker/crecker.efuse を読み取ります。必要な場合は、CUSTOM_KEY_EFUSE=/path/to/crecker.efuse でこれを上書きします。
exploit/exploit.py によって実行されるプリフライトステップは、各署名付き実行の前に exploit/extra/images/ 内のSBootイメージセットをその場で再署名します。別個の署名済み出力は保持されません。署名ステップでは、external/keys/exynos9830_crecker/ の下にある意図的に追跡された共有キーバンドルを使用します。
完全なイメージセットに対するリポジトリルート相当のコマンド:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
これは次のイメージに署名します:
バッチ署名ツールは、すべてのイメージに10進数の 23 を渡し、既存のフッターにすでに存在する古いロールバック値を再利用しません。
epbl.img は、必要に応じて最初に再暗号化され、その後、最終バイトに対して署名されます。ldfw.img と tzsw.img のAVBコンテンツを更新する場合は、外部AVBフローが依然として必要です。
FWBL1のみのコマンド:
python3 external/tools/sign_tool.py \
-i exploit/extra/images/fwbl1.img \
-o exploit/extra/images/fwbl1.img \
-k external/keys/exynos9830_crecker/crecker_private.pem \
-H external/keys/exynos9830_crecker/crecker.hmac \
-s 0x3000 \
-r 23 \
-ma 0x9830 \
-m 0x142 \
-e 11 \
-t external/keys/exynos9830_crecker/crecker_stage2_tee_pubkey.bin \
-re external/keys/exynos9830_crecker/crecker_stage2_ree_pubkey.bin
sign_tool.py、fwbl1.img、および crecker_* ファイルが現在のディレクトリにある場合の短縮形:
python3 sign_tool.py -i fwbl1.img -o fwbl1.img -k crecker_private.pem -H crecker.hmac -s 0x3000 -r 23 -ma 0x9830 -m 0x142 -e 11 -t crecker_stage2_tee_pubkey.bin -re crecker_stage2_ree_pubkey.bin
特に記載がない限り、リポジトリルートからコマンドを実行します。
観測されたExynos 9830のブート手順は次のとおりです:
注:mem.bin ダンプペイロードは、動作する sboot がインストールされていない場合にのみ使用できます。
Heimdallを介して uh.bin をブートローダーに送信します:
heimdall flash --BOOTLOADER uh.bin
ダンプフローを実行します:
python3 exploit/exploit.py --dump
生成された exynos990.bootrom.bin ダンプを確認します。
このリポジトリのPythonリカバリツールの一部は、halal-beef/hubble から改作されました。
そのアップストリームプロジェクトはGNU GPL v2.0のもとで公開されており、このリポジトリは互換性のためにGPL-2.0ライセンスを維持しています。LICENSE と NOTICE.md を参照してください。
external/payloads/exynos990_boot_custom_key/ 配下のExynos990カスタムキーペイロードは、frederic/exynos-usbdl のフォークである VDavid003/exynos-usbdl のブートカスタムキーペイロードスケルトンと制御フローのアイデアに基づいています。これはExynos9830 / Exynos990 GET_CONFIGURATIONチェーン用に大幅に書き直され、適合されており、アップストリームのペイロードの逐語的なコピーではありません。参照されているアップストリームプロジェクトはGNU GPL v3.0でライセンスされているため、このペイロードはGPL-3.0-onlyで維持されています。external/payloads/exynos990_boot_custom_key/LICENSE を参照してください。
| キー1コマンド | 値 | キー2コマンド | 値 |
|---|
CMD_W_ROM_SEC_BOOT_KEY1 | 0x001 | CMD_W_ROM_SEC_BOOT_KEY2 | 0x016 |
CMD_W_USE_ROM_SEC_BOOT_KEY1 | 0x002 | CMD_W_USE_ROM_SEC_BOOT_KEY2 | 0x017 |
CMD_C_ROM_SEC_BOOT_KEY1 | 0x100 | CMD_C_ROM_SEC_BOOT_KEY2 | 0x114 |
CMD_R_USE_ROM_SEC_BOOT_KEY1 | 0x101 | CMD_R_USE_ROM_SEC_BOOT_KEY2 | 0x115 |
| ペイロード | 出力パス | 目的 |
|---|
mem.bin | exploit/extra/payloads/mem.bin | ブートROMメモリダンプペイロード。 |
loader.bin | exploit/extra/payloads/loader.bin | --ufs で使用されるUFSパスペイロード。 |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | --signed で使用されるカスタムキー署名付きローダーペイロード。 |
| イメージ | 使用されるキーマテリアル | ロールバックリビジョン |
|---|
fwbl1.img | BL1秘密鍵 + Stage2 TEE/REE公開鍵 | 23 |
epbl.img | Stage2 TEE秘密鍵 | 23 |
bl2.img | Stage2 REE秘密鍵 | 23 |
lk.bin | Stage2 REE秘密鍵 | 23 |
el3_mon.img | Stage2 TEE秘密鍵 | 23 |
ldfw.img | Stage2 TEE秘密鍵、内側+外側 | 23 |
tzsw.img | Stage2 TEE秘密鍵、内側+外側 | 23 |
| コマンド | モード | デフォルトペイロード | 備考 |
|---|
python3 exploit/exploit.py --ufs | UFSパス | loader.bin | UFSペイロードフローを開始します。 |
python3 exploit/exploit.py --signed | 署名付きブートチェーン | Exynos990_boot_custom_key.bin | SBootイメージセットを再署名し、イメージを送信します。 |
python3 exploit/exploit.py --dump | ブートROMダンプ | mem.bin | 0x20000 バイトを exynos990.bootrom.bin に受信します。 |
| ステップ | 備考 |
|---|
| 1 | ダウンロードモードに入ります。 |
| 2 | 必要に応じて exploit/merge.py で sboot.bin を作成または更新します。 |
| 3 | 署名付きカスタムキーフローを使用して、対象イメージフローを受け入れるODINスタイルのモードであるCreckerモードに到達します。 |
| 4 | ODIN、Heimdall、または別の互換性のある送信プログラムで新しい sboot.bin を送信します。 |
| 5 | UFSペイロードを実行します。 |
| 6 | 任意:One UI 7およびStrong Integrityワークフロー用にCreckerRomをインストールします。 |
| 7 | 任意:ターゲットセットアップの完了後にブートローダーをロックします。 |
| ステップ | ステージ | 備考 |
|---|
| 1 | BootROM | 初期ROM実行。 |
| 2 | BL1 | BootROMからの完全なハンドオフ。 |
| 3 | EPBL | BL1からの完全なハンドオフ。 |
| 4 | EPBL | 最小限のSMCハンドラーをセットアップします。 |
| 5 | BL2 | EPBLがBL2をロードします。 |
| 6 | BL2 | BL2への部分的なハンドオフ。 |
| 7 | LK | BL2はEPBLを使用してLKをロードしますが、LKはすぐには実行されません。 |
| 8 | EL3 Monitor | BL2はEPBLを使用してEL3 Monitorをロードします。 |
| 9 | EL3 Monitor | EPBLがEL3 Monitorを復号化します。 |
| 10 | EL3 Monitor | EL3 Monitorへの完全なハンドオフ。 |
| 11 | EL3 Monitor | 拡張SMCハンドラーを初期化およびセットアップします。 |
| 12 | LK | 実行がLKにジャンプします。 |
| 13 | LK / EL3 Monitor | LKはEL3 MonitorのSMCハンドラーを呼び出してTrustZoneパーツをロードします。 |
| 14 | ODIN / カスタムターゲット | ブートはODINまたは設定されたターゲットに続行します。 |
| パーツ | 開始 | 終了 |
|---|
fwbl1.img | 0x0 | 0x3000 |
epbl.img | 0x3000 | 0x16000 |
bl2.img | 0x16000 | 0x82000 |
lk.bin | 0xDB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| ステージ | ロードアドレス |
|---|
BL1 | 0x02022000 |
EPBL | 0x02026000 |
BL2 | 0x15600000 |
LK | 0xE8000000 |
EL3_MONITOR | 0xBFE80000 |
_boot_device ソースID | ブートソースパス |
|---|
1 | UFSパス、共有UFSロードフロー。 |
2 | eMMC/SDMMC初期化パス、mmc_card_detect_and_init フロー。 |
3 | SDMMC/MMCデバイス0、mmc_read_blocks(0, ...)。 |
4 | USBロードパス。 |
5 | SDMMC/MMCデバイス1、mmc_read_blocks(1, ...)。 |
6 | UFS代替モード、異なるモードフラグを持つ 1 と同じコアUFSフロー。 |
7 | 非MMC/UFS/USB生コントローラー読み取りパス。 |
0xB / 11 | USBフォールバックパス、その後は 4 と同じUSBハンドラー。 |
| ソースID | 値 | 意味 |
|---|
1 | 0x20 | UFS |
2 | 0x14 | eMMC |
3 | 0x00 | SDMMC_CH2 |
4 / 0xB | 0x40 | USB |
| クレジット | 貢献 |
|---|
| Chimera Tool | 2021-2022年頃のエクスプロイトの最初の発見。Chimeraは、このエクスプロイトに基づく機能を含む、多くのデバイスにわたる高度なExynosサービス機能を提供します。 |
| CVE-2024-56426 | このプロジェクトの基盤となるCVE。 |
| Christopher Wade | CVE-2024-56426をSamsungに報告しました。 |
| kethily-daniel | USBパケットトレースとサンプル抽出に使用されるツールへのアクセスを提供しました。 |
| BotchedRPR | carte2の初期研究と作成を支援しました。 |
| VDavid003 | パケットダンプによるPoCのリバースエンジニアリングを支援し、デバイスで個人的にテストしました。 |
| halal-beef / hubble | 研究ライフサイクル中のPoCの初期USBパケットダンプと分析、エクスプロイトスクリプトが使用するバックエンドコード、分割/結合スクリプトが使用するSoCレイアウトを提供しました。 |
| VDavid003 / exynos-usbdl | Exynos990カスタムキーペイロードの基礎として使用されるGPLv3カスタムキーペイロードスケルトンとExynos USBダウンロード参照フローを提供しました。 |
| R0rt1z2 | ペイロード作成を支援しました。一部の作業は彼のプロジェクトkaeruに基づいています。 |
| AntiEngineer | ARM知識、ヒント、研究サポートを共有しました。 |
| AA | 脆弱性の着想とChimera外部での最初の使用。 |