
CVE-2024-56426 脆弱性のPoCです。
Exynos 990 Galaxy S20、S20 FE、Note20 ファミリー向けの統合 CVE-2024-56426 ツールキットです。このエクスプロイトは全10種類の モデル名を受け付け、それらを6つの検証済みストックブートローダーファミリーにマッピングします。
[!CAUTION] 追跡対象のキーバンドルと生成されたイメージはファジング(焼き込み)可能です。ファジングは 不可逆的です。特定のキーにファジングされた電話機は、そのキーと互換性のあるイメージのみを 起動できます。モデル、ロールバックリビジョン、パッチセット、またはキーバンドルを誤ると、 デバイスがファジングされたブートループに陥る可能性があります。反復作業中は開発キーと UFS ペイロードを使用してください。カスタムキーのファジングを明示的に意図しない限り、すべての 準備/署名コマンドに
--no-fuseを追加してください。
選択したモデルは、BL1 モデル ID と正確なモデルの LK パッチ TSV の両方を制御します。ランタイムアーティファクト は、
プリフライトで使用されるストックファームウェアと暗号化された分割イメージを制御します。ペアの 5G ランタイム
アーティファクトを使用する4つの非5Gフラグは、LK のモデル ID チェックとモデル ID プログラミングパスもパッチします。
| モデルフラグ | ランタイムアーティファクト | ランタイムファームウェア | モデル ID | EVT | ロールバック | テスト済み |
|---|---|---|---|---|---|---|
G780F | G780F | G780FXXSOFYJ1 | 0x154 | 11 | 24 | ❌ |
G980F | G981B | G981BXXSNHYB1 | 0x143 | 11 | 23 | ✅ |
G981B | G981B | G981BXXSNHYB1 | 0x13D | 11 | 23 | ❌ |
G985F | G986B | G986BXXSNHYB1 | 0x142 | 11 | 23 | ✅ |
G986B | G986B | G986BXXSNHYB1 | 0x13C | 11 | 23 | ✅ |
G988B | G988B | G988BXXSNHYB1 | 0x13E | 11 | 23 | ❌ |
N980F | N981B | N981BXXSIHYH3 | 0x153 | 11 |
対応する全10種類の Galaxy S20、S20 FE、Note20 モデルフラグには、オプトインの
CLI 専用 KVM ブートプロファイルがあります。Exynos 990 カーネル の
名前が kvm を含むブランチをビルドし、正確なモデルのコマンドに --kvm を追加します。例:```bash
python3 exploit/exploit.py --build-sboot --model G985F --no-fuse --kvm
このプロファイルはLK H-Arx/UHパスを削除し、EL3にEL2でカーネルへ入るよう要求し、対応する復号済み/再暗号化済みEL3モニターパッチテーブルを適用します。ストック/改変済みブートローダーのフラッシュモードでは引き続き利用できません。Webコントロールセンターには意図的にKVMコントロールがありません。対応するカーネルと[WindowsInQemu](https://github.com/Creeeeger/WindowsInQemu)を使用することで、WindowsはKVM経由でフルスピードのQEMU上でスマートフォン内で実行できます。
## クイックスタート
すべてのモードを番号付きの単一インストール手順として扱わないでください。目標を選択してください:
| 目標 | パス |
|-----------------------------------|--------------------------------------------------------------------------------------------------------------------------|
| 署名付きカスタムROMをインストール | 正確なモデル/セットアップ → EUB → 一時的な`--signed --no-fuse`チェーン → ROMの完全な署名済み出力をフラッシュ → UFS初回起動 |
| エクスプロイトをテストする | オプションの`--prepare --no-fuse` → EUB → `--signed --no-fuse` → 停止 |
| ブートチェーンを開発する(CLIのみ) | 一時的なno-fuseテスト → ビルド → 生成されたSBoot/TZSW/LDFWをフラッシュ → UFS |
| ダンプ / リカバリー | 専用のワークフローとヒューズ状態チェックを使用 |
`--prepare`は推奨されるドライランであり、必須の前提ステップではありません: `--signed`
は事前チェックを繰り返します。生成された3部構成のHeimdallコマンドはブートチェーン開発ツールであり、カスタムROMの
フラッシュではありません。
デバイスに触れる前に[USER_GUIDE.md](https://github.com/creeeeger/cve-2024-56426/blob/exynos990/USER_GUIDE.md)を読み、対応するワークフローを選択してください。そこには
完全なROMの受け渡しに加え、未ヒューズ、ヒューズ済み、および状態不明のリカバリールールが含まれています。
## オプションのローカルUI
ブラウザUIはPythonの標準ライブラリのみを使用し、既存の
`exploit/exploit.py` CLIを呼び出します。ブートチェーン開発とその生成された3部構成のHeimdallコマンドはターミナルのみの
ツールのままです。
リポジトリのルートから起動します:```bash
python3 exynos990_control_center.py
ランチャーは127.0.0.1にバインドし、新しいアクセストークンを生成して、完全なローカルURLを表示し、デフォルトのブラウザで開きます。ブラウザを自動的に開きたくない場合は--no-browserを使用します:```bash
python3 exynos990_control_center.py --no-browser
UIは以下を提供します:
- 依存関係およびリポジトリ資産の赤/緑チェック;
- 1つのグローバルなターゲットモデル選択と、正確に2つのヒューズ決定: 未ヒューズのまま維持またはヒューズ;
- 選択されたワークフローのステップのみを表示して番号付けするワークフロー選択器;
- install-ROM、exploit-test、BootROM-dump、およびstock-recoveryワークフロー;
- UHを検証し、HeimdallでBOOTLOADERスロットにフラッシュしてEUBに入る、正確なモデルの改変ローダーアクション;
- 恒久的なヒューズ警告と、設定されたキー/eFuse SHA-256フィンガープリント;
- Fuseを選択した後は利用できない、未ヒューズ専用のストックブートチェーン復元カード;
- ライブプロセス出力、キャンセル、およびステージごとの検証マーカー。
また、CLI専用のExynos 990 KVM通知も表示しますが、KVMオプションを意図的に公開せず、`--kvm`をいかなるWebアクションにも転送しません。
USBアクセスは、コントロールセンターを起動したプロセスの権限に従います。起動する前に、同梱のudev/ドライバ権限を設定してください。UIは特権資格情報を要求、保持、または転送しません。印刷されたトークンURLを非公開に保ち、使用後すぐにサーバーを停止してください。
ターミナルユーザーは`exynos990_control_center.py`を無視できます。以下に記載されているすべてのCLIコマンドは変更されず、完全にサポートされたままです。
## 要件
Python 3.10以降が必要です。
Windows 10/11 (ネイティブPowerShell):```powershell
.\windows\setup.ps1
. .\windows\activate.ps1
python .\exploit\exploit.py --prepare --model G985F --no-fuse
セットアップでは、固定されたネイティブAArch64ツールチェーン、LZ4、Heimdall、およびリポジトリの仮想環境をインストールし、その後すべてのペイロードをビルドします。BootROM WinUSBドライバは、その上流の自己署名証明書がマシンの信頼ストアを変更するため、明示的な管理者によるオプトインとなっています。完全なセットアップ、ドライバのインストール、Download Modeの区別、検証、およびトラブルシューティングのプロセスについては、WINDOWS.mdを参照してください。
Windowsのアクティベーション後は、残りのクロスプラットフォームの例でpython3と表示されている箇所にpythonを使用してください。
Linux:```bash sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu lz4
macOS:```bash
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu lz4
準備、署名、ペイロードモードはすべて、同じモデル認識型プリフライトを実行します。
exploit/extra/images/<model>/ を、未改変の暗号化分割イメージのクリーンなコピーで置き換えます。--no-fuse を使用する場合は、まず5つのフュージング行を無効にした有効なTSVコピーを生成します。--kvm を使用する場合は、kvm とマークされたLK行も有効にし、対応するEL3モニタTSVを復号してパッチを適用し、その保護領域を再暗号化します。mem.bin、loader.bin、Exynos990_boot_custom_key.bin をビルドします。このプロセスは、ファームウェア、パッチ、メタデータ、または署名の不一致が最初に発生した時点で停止します。イミュータブルなソースディレクトリをその場でパッチすることはありません。
すべてのコマンドで --model が必要です。
--no-fuse は修飾子であり、単独のモードではありません。作業用LKを再ビルドする際に、特定された5つのカスタムキーOTP行を無効にします。未フューズの開発チェーンを準備、送信、またはビルドするすべてのコマンドで使用してください。既存のフューズを元に戻すものではありません。
CLIはUFSおよびダンプモードでもこの修飾子を受け付けます。これらのコマンドもプリフライトを実行しますが、そのUSB操作は再ビルドされたLKを送信しないためです。電話機にすでにフラッシュされているLKがUFSフューズの動作を決定します。そのため、UIはUFSまたはBootROMダンプモード用のno-fuseコントロールを意図的に提供しません。両方のブートローダーフラッシュモードは、LKパッチや署名を実行しないため、--no-fuse を拒否します。
--kvm も修飾子です。プリフライトを実行するすべての実機モデルワークフローで受け付けられます。TSV内のKVM行は、このフラグが存在しない限り無視され、ブラウザUIがこれを提供することはありません。
例:```bash python3 exploit/exploit.py --signed --model N986B --no-fuse
Generate the corresponding signed bootloader without opening USB:```bash
python3 exploit/exploit.py --build-sboot --model N986B --no-fuse
このコマンドは、クリーンなストック入力を基にモデルイメージディレクトリを再構築し、LKパッチを適用し、すべてのコンポーネントに署名して検証し、sboot.binをマージし、埋め込まれたコンポーネントとテールをチェックし、そのサイズ、SHA-256、およびsboot.bin、署名済みtzsw.img、署名済みldfw.imgを送信するHeimdallコマンドを出力します。
アンフューズドであることが判明しているデバイス上でのみ、選択したモデルの元のBL tarから正確なストックブートチェーンを復元します。```bash python3 exploit/exploit.py --flash-stock --model N986B --wait
このコマンドは`sboot.bin.lz4`、`tzsw.img.lz4`、`ldfw.img.lz4`のみを抽出し、一時ディレクトリ内でそれらを解凍して、3つの出力すべてが存在し空でないことを検証し、1回のHeimdallフラッシュ操作を実行します。一時ファイルはその後削除されます。`--no-reboot`と`--verbose`もサポートされています。電話機はすでにHeimdall互換のダウンロードモードにある必要があり、選択したモデルは物理デバイスと完全に一致している必要があります。
これはAndroid、AP、モデム、CSC、ユーザーデータ、または完全な純正ROMを復元するものではありません。カスタムキーでヒューズされたデバイスでは絶対に実行しないでください。そのような電話機には、正確にヒューズされたキーで再署名された純正ベースのソフトウェアが必要です。カスタムトラストルートは永続的に残ります。ヒューズの状態が不明な場合は、停止してください。
## FRP / 永続的ストレージの復旧に関する注意
> [!CAUTION]
> この手順は、あなたが個人的に所有し、サービスを提供する権限があるデバイスにのみ適用されます。他人のデバイスで使用することは固く禁止されています。パーティションのパスを誤ると、永続的なデータ損失やデバイスが起動不能になる可能性があります。書き込む前に、対象パーティションをバックアップし、解決されたブロックデバイスのパスとサイズを検証してください。
このリポジトリは、ファクトリーリセット保護(FRP)を自動的に削除しません。Androidの`PersistentDataBlockService`を使用するデバイスでは、FRP状態は一般に`PERSISTENT`という名前のパーティションに保存されます。[AOSP実装](https://android.googlesource.com/platform/frameworks/base/+/bc56632da95b/services/core/java/com/android/server/PersistentDataBlockService.java)を参照してください。
エクスプロイトチェーンが`adb`と`dd`を提供するカスタムリカバリを起動した後、パーティションを特定してバックアップしてください。推測による数値のブロックデバイスパスを代用しないでください。```bash
adb shell ls -l /dev/block/by-name/PERSISTENT
adb shell dd if=/dev/block/by-name/PERSISTENT of=/tmp/PERSISTENT.backup.img bs=4096
adb pull /tmp/PERSISTENT.backup.img
バックアップが取得された後にのみ、パーティションをゼロ化し、Androidに新しい永続データブロック構造を初期化させます。```bash adb shell dd if=/dev/zero of=/dev/block/by-name/persistent reboot
この方法はテスト済みで動作し、FRPは削除され、デバイスのロックが解除されます。
## LKパッチ
パッチの選択はアーティファクトマッピングに従います:```text
G780F -> lk_g780f_selected_patches.tsv
G980F -> lk_g980f_selected_patches.tsv (applied to G981B LK)
G981B -> lk_g981b_selected_patches.tsv
G985F -> lk_g985f_selected_patches.tsv (applied to G986B LK)
G986B -> lk_g986b_selected_patches.tsv
G988B -> lk_g988b_selected_patches.tsv
N980F -> lk_n980f_selected_patches.tsv (applied to N981B LK)
N981B -> lk_n981b_selected_patches.tsv
N985F -> lk_n985f_selected_patches.tsv (applied to N986B LK)
N986B -> lk_n986b_selected_patches.tsv
TSVを変更せずに、標準のLKに対して検証します。```bash
python3 external/tools/apply_lk_patches.py
bootLoaderFiles/sbootSplitParts_original/G986B/lk.bin
external/ghidra/lk_g986b_selected_patches.tsv
--check
`external/ghidra/ApplyLkPatches.java` は同じ6列のTSV形式を受け入れ、古いバイトの不一致が発生した場合にパッチを盲目的に適用する代わりに失敗するようになりました。最初の列が `kvm` である行には、追加の `--kvm` スクリプト引数が必要です。従来の `check_signature` および `check_ext4_signature` の戻り値ゼロの行はプロファイル `0` を使用します。これらは古いバイパス位置を文書化しますが、意図的に適用されないため、ビルドされたイメージはLKの実際のSamsung署名チェックを満たす必要があります。
## 署名
`external/tools/sign_sboot_images.py` はモデルを必要とし、[model_data.py](https://github.com/creeeeger/cve-2024-56426/blob/exynos990/external/tools/model_data.py) からモデルID、EVT、およびロールバックリビジョンを導出します。```bash
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images/G986B \
--keys-dir external/keys/exynos9830_crecker \
--model G986B
Stage2署名は署名後に検証されます。このツールはldfw.imgまたはtzsw.imgのSamsung AVBメタデータを再生成しません。それらのラッパー内のセキュアブートバイトを変更する場合でも、ターゲットのブートフローで使用される別個のAVBポリシーが必要です。完全な署名済みROMは、正確なAVBモデルと同じキーバンドルを使用し、その完全な生成パッケージでフラッシュする必要があります。詳細は
CreckerROMリポジトリ
およびUSER_GUIDE.mdのインストールワークフローを参照してください。
同梱の改変パッケージは、sboot.bin.lz4を除くすべてのストックBLメンバーを保持します。そのメンバーは削除され、パッケージの解凍されたuh.binがsboot.binとして保存され、EUBトリガー用のレイアウトに一致します。
UIは対応するHeimdallフローを直接実行できます。正確な物理モデルの改変アーカイブを選択し、sboot.binが解凍されたuh.bin.lz4とバイト単位で同一であることを検証し、検証済みのUHペイロードをBOOTLOADERスロットにフラッシュします。```bash
python3 exploit/exploit.py --flash-tampered --model G986B --wait
これは意図的に通常起動を防ぎ、次回の起動をEUBに強制します。BL tarの残りのメンバーはフラッシュしません。
以下のコマンドで1つのパッケージを再生成します:```bash
python3 external/tools/build_tampered_loader.py \
bootLoaderFiles/originalBl/G986B/BL_G986BXXSNHYB1.tar \
bootLoaderFiles/tamperedLoader/G986B/BL_G986BXXSNHYB1_tampered.tar
デバイスを融合した場合、署名済みのuh.binをBOOTLOADERスロットにフラッシュする必要があることに注意してください。現在のストックuhは誤ったキーで署名されているためです。
分割と結合:```bash python3 exploit/split.py sboot.bin -o /tmp/G986B-splits python3 exploit/merge.py /tmp/G986B-splits
スタンドアロンのマージャーは、partsディレクトリ内に`tzsw.img`と`ldfw.img`が必要で、対応する3パートのHeimdallコマンドを出力します。そのコマンドは、選択したモデル用にこれら2つのイメージがすでに署名されている場合にのみ使用してください。`--build-sboot`は、その署名を自動的に実行して検証します。
個々のLDFWレコードを抽出します:```bash
python3 external/tools/extract_ldfw.py ldfw.img -o LDFWs
提供された分割レイアウトは、すべての正規のストック sboot.bin をバイト単位で再構築します。EPBLヘッダーを変更しない場合、EPBLおよびEL3モニターの復号/再暗号化も、すべてのファームウェアファミリーでバイト単位で往復します。
サポートされているすべての電話機は、同じExynos 990 BootROMを共有しています。ペイロードは、モデル固有のLKオフセットではなく、共通のBootROMエントリポイントとIRAMアドレスを使用します。生成されたバイナリは、これらのエントリポイントに解決されます:
モデル固有の動作は、LK TSV、FWBL1モデルID、およびストックのロールバックリビジョンに限定されます。
halal-beef)、
halal-beef/hubble経由: exploit/exploit.pyで使用されるバックエンドコード; exploit/split.pyおよび
exploit/merge.pyで使用されるSoC
レイアウト; およびアドレス/上書き操作を実装するrun_exploit()。VDavid003/exynos-usbdl経由: Exynos990
カスタムキーペイロードの派生元となるペイロードスケルトン。18 |
| ❌ |
N981B | N981B | N981BXXSIHYH3 | 0x14E | 11 | 18 | ❌ |
N985F | N986B | N986BXXSIHYH3 | 0x152 | 11 | 18 | ❌ |
N986B | N986B | N986BXXSIHYH3 | 0x14D | 11 | 18 | ❌ |
| パス | 目的 |
|---|
bootLoaderFiles/originalBl/<model>/ | 全10モデルに対応するクリーンな実機モデル用 BL_<firmware>.tar パッケージ。 |
bootLoaderFiles/sbootSplitParts_original/<model>/ | 未改変の実機モデル用暗号化SBoot分割ファイル(ldfw.img、tzsw.img、マニフェスト、テール)。 |
bootLoaderFiles/exynos9830Decrypted/<model>/ | 実機モデル用の復号済みEPBL、EL3、TZSW、LDFW解析ファイル。 |
bootLoaderFiles/tamperedLoader/<model>/ | 実機モデル用のEUBトリガーBLパッケージ。 |
bootLoaderFiles/MODEL_COMPARISON.md | 実機版と結合版ファームウェアの比較、およびパッチ互換性に関するメモ。 |
bootLoaderFiles/exynos990Bootrom/ | 共有のExynos 990 BootROMダンプ。 |
bootromNotes/ | 共有のBootROMフローおよびUSBコンテキストに関するメモ。 |
drivers/windows/winusb/ | BootROM/EUB 04e8:1234 用に固定されたHouston WinUSBパッケージ。 |
windows/ | ネイティブWindowsセットアップ、環境アクティベーション、ハッシュ検証付きドライバインストーラ。 |
exploit/extra/images/<model>/ | 使い捨てのモデル別プリフライト出力。 |
external/ghidra/ | 実機モデル用のLKおよびKVM EL3 TSVと、Ghidraパッチスクリプト。 |
external/decompiled_G985F/ | G985F専用の逆コンパイル済み参照ファイル。 |
exynos990reverseEng_G985F/ | G985F専用のGhidraプロジェクト。 |
external/keys/exynos9830_crecker/ | 共有のカスタムキーバンドル。 |
exploit/exploit.py | 安定したCLIエントリポイント兼ワークフローコーディネータ。 |
exploit/build_payloads.py | Windows、Linux、macOS上のプリフライトで使用されるクロスプラットフォームのネイティブペイロードビルダ。 |
exploit/preflight.py | 作業イメージの準備、LKパッチ、署名、マージ検証。 |
exploit/usb_transport.py | PyUSBフレーミング、デバイス検出、上書き、ダンプ転送。 |
exploit/tampered_loader.py | 実機モデル用UH抽出、改ざんローダー検証、Heimdall EUBフラッシュ。 |
exploit/stock_restore.py | 実機モデル用ストックアーカイブ抽出とHeimdallコマンド構築。 |
control_center/ | ブラウザバックエンドのアクション、依存関係チェック、ジョブ、HTTP API。 |
external/tools/*_crypto.py | 共有のEPBL/EL3 AESおよびECDSAエンコード/署名プリミティブ。 |
| モード | 目的 |
|---|
--prepare | USBを開かずにプリフライトを実行します。 |
--build-sboot | プリフライトを実行し、モデルイメージディレクトリに検証済み署名付き sboot.bin をビルドします。 |
--signed | EUBからカスタムキーペイロードと署名済みブートチェーンを送信します。 |
--ufs | loader.bin を使用してUFSブートパスを開始します。 |
--dump | mem.bin を実行し、BootROMの 0x20000 バイトをダンプします。 |
--flash-tampered | 実機モデル用UHを検証し、EUBを強制するためにBOOTLOADERにフラッシュします。 |
--flash-stock | 元のBL tarから実機モデル用ストックSBoot、TZSW、LDFWを抽出してフラッシュします。 |
| Image | カスタム署名キー |
|---|
fwbl1.img | BL1秘密鍵+Stage2 TEE/REE公開ブロブ |
epbl.img, el3_mon.img | Stage2 TEE |
bl2.img, lk.bin | Stage2 REE |
ldfw.img, tzsw.img | Stage2 TEE、内側および外側のStage2フッター |
| ペイロード | エクスプロイトジャンプ | リンクされたエントリ |
|---|
mem.bin | 0x02022010 | 0x02022010 |
loader.bin | 0x02022010 | 0x02022010 |
Exynos990_boot_custom_key.bin | 0x02022000 | 位置非依存ステージ1 |
| パーツ | 開始 | 終了 |
|---|
fwbl1.img | 0x000000 | 0x003000 |
epbl.img | 0x003000 | 0x016000 |
bl2.img | 0x016000 | 0x082000 |
lk.bin | 0x0DB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| ステージ | ロードアドレス |
|---|
| BL1 | 0x02022000 |
| EPBL | 0x02026000 |
| BL2 | 0x15600000 |
| LK | 0xE8000000 |
| EL3モニター | 0xBFE80000 |