
CVE-2026-43499に対する、ガードされたソースのみのHumane AI Pin root PoC
Humane AI Pin 向け GhostLock は、特定の小売ファームウェアビルド1つを対象とした、オープンソースのブートスコープ付き root 実証コード(proof of concept)です。通常の認可済み ADB シェルから、Linux の rtmutex use-after-free である CVE-2026-43499 を実行します。
ランナーは意図的に狭く作られています。何かをステージする前に、完全なファームウェアフィンガープリント、カーネルビルド、スロット、シェル UID、SELinux 状態を確認します。不一致があれば実行は停止します。
[!WARNING] これはカーネルエクスプロイトです。Pin がパニック、再起動、またはハードハングする可能性があります。ハードハングした場合は、デバイスを取り外してバッテリーが切れるまで待つ必要があるかもしれません。所有していて復旧できる Pin にのみ使用してください。root は再起動で失われます。
| プロパティ | 許容値 |
|---|---|
| デバイス | Humane AI Pin、小売ユニット |
| ファームウェア | qti/atoll/atoll:12/SKQ1.230401.001/101.000470.45.20:user/release-keys |
| Android | 12 |
| カーネル | 4.14.190-perf、ビルド日時 Mon Nov 4 18:37:23 PST 2024 |
| スロット | _b のみ |
| カーネルアーキテクチャ | aarch64 |
| Android ABI | arm64-v8a |
| プロファイル ID | humane-aipin-45.20-nov4 |
| ビルドプロジェクト | humane-aipin-45.20 |
| カーネル Image SHA-256 | d4f4e0deb20871fce207f1f095ba1934162081c2f10afaccbb2e6a1e938719fb |
| リリース候補リプレイ | 最終クリーンブートリプレイ待ち |
スロット _a、開発者ファームウェア、近接するファームウェアバージョン、その他の Qualcomm atoll 製品は拒否されます。詳細は互換性の詳細を参照してください。Android フィンガープリントが一致するだけではこのチェックを回避できません。A/B スロットは、同じユーザースペースビルド ID の下でも異なるブートイメージやカーネルレイアウトを持つ可能性があります。
互換性は profiles/ 配下のバージョン管理されたマニフェストで定義されます。ホストランチャー、ランナー、生成されるネイティブプリフライト、アロケータジオメトリ、最小シンボル、ビルド済みペイロードは、すべて同じマニフェストに紐付けられています。マニフェストにスロットを追加するには、プロファイルされた正確なカーネル Image のクリーンブート物理リプレイが依然として必要です。
必要なもの:
adb、Python 3.10 以降、make、C コンパイラ;28.2.13676358 (r28c)。このリポジトリには、ADB 秘密鍵、ファームウェアイメージ、ブートイメージ、バグレポート、デバイスログ、ビルド済みペイロードは含まれていません。
Android のコマンドラインツールで固定バージョンの NDK をインストールします:
sdkmanager "ndk;28.2.13676358"
ADB が Pin を device として認識していることを確認します:
$ adb devices
List of devices attached
YOUR_SERIAL device
リポジトリをクローンし、すべてのコマンドで同じ明示的なシリアル番号を使用します:
git clone https://github.com/TheAndersMadsen/humane-aipin-ghostlock.git
cd humane-aipin-ghostlock
./ghostlock check --serial YOUR_SERIAL
./ghostlock run --serial YOUR_SERIAL
./ghostlock verify --serial YOUR_SERIAL
check は読み取り専用です。検出されたファームウェア、カーネル、スロット、シェル境界、SELinux の状態、バッテリー、電源、NDK リビジョン、ビルドツールのステータスを出力します。その診断出力はデフォルトでデバイスのシリアル番号をマスクします。
run はガード付きの試行を 1 回実行します。ROOT YOUR_SERIAL の入力を求め、ソースからビルドし、ペイロードをプッシュした後にそのハッシュを検証し、KASLR を導出するために現在のブートの bugreport を取得し、その生の bugreport をデフォルトで削除し、2 回目の完全なプリフライトの後にのみエクスプロイトを開始します。ランチャーはデフォルトで少なくとも 20% のバッテリー残量と外部電源を要求し、その後ランナーはブートごとの単一の試行を消費する直前に両方を再確認します。--min-battery 0 は両方の電源ゲートを無効化し、安定した電源が独立して確認されている場合にのみ使用することを意図しています。
verify は独立して、ブートスコープの root ブローカーに id と getenforce の実行を要求します。
検証が成功すると次のようになります:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
SELinux: Permissive
Boot epoch: <redacted>; uptime: <redacted>s
正確な SELinux コンテキストはカーネルとファームウェアに固有です。受け入れ条件は、同じブート上で SELinux が permissive の状態で、ブローカー経由で UID/GID 0 になることです。
現在のブートに対して、ペイロードは以下を行います:
init_cred に置き換えます;/data/local/tmp/su に書き込みます;パーティションへの書き込み、ブートローダーのアンロック、モジュールのインストール、検証付きブートの変更、再起動後の永続化の作成、ネットワークサービスへの接続、テレメトリのアップロードは行いません。
別の ADB シェルから root コマンドを実行するには:
adb -s YOUR_SERIAL shell '/data/local/tmp/su -c id'
ランナーはカーネル起動ごとに1回の試行のみを許可します。ミス、タイムアウト、切断、不確定な状態、パニック、または再起動が報告された場合、その起動では再試行しないでください。まず再起動してから、再度 check を実行してください。
ADB がまだ応答する場合:
adb -s YOUR_SERIAL reboot
Pin がハードハング状態で ADB が応答しない場合は、外部電源をすべて切断してください。テスト済みの市販ハードウェアには、ユーザーがアクセスできる信頼性の高い強制再起動手段がないため、復旧にはバッテリーが消耗するまで待ってから電源を再接続する必要がある場合があります。
通常の再起動後、root は失われます。ステージングされたファイルは /data/local/tmp 配下に不活性な状態で残る可能性があります。クリーンなシェルでそれらを削除できます。これにはブート固有のアトミックな試行クレームも含まれます:
adb -s YOUR_SERIAL shell 'rm -f /data/local/tmp/ghostlock-aipin.so /data/local/tmp/su /data/local/tmp/.ghostlock-su.sock /data/local/tmp/.ghostlock-aipin-attempt'
adb -s YOUR_SERIAL shell 'rm -rf /data/local/tmp/.ghostlock-aipin-attempt.*.lock'
PoC を使用する前に SAFETY.md を、失敗した実行を再試行する前に TROUBLESHOOTING.md をお読みください。
実行記録はモード 0700 の一時ディレクトリに書き込まれます。これらにはデバイスのシリアル番号、ブート識別情報、カーネルアドレス、およびエクスプロイトのテレメトリが含まれます。そのディレクトリや生の Android bugreport をイシューに添付しないでください。
代わりに、縮小版のレポートを作成してください:
./ghostlock report /private/tmp/ghostlock-aipin-TIMESTAMP --output ghostlock-report.json
共有する前に JSON を確認してください。リダクターはシリアル番号、ブート ID、ホストパス、生のコマンド出力、カーネルアドレスを省略します。プリフライト、エクスプロイト、検証、および実行全体の固定された単調増加の所要時間を含めるため、デバイスの証拠を共有することなく失敗を比較できます。詳細は PRIVACY.md を参照してください。
Android ペイロードをビルドします:
./ghostlock build
複数の証拠に裏付けられたプロファイルが存在する場合は、明示的に1つを選択します:
./ghostlock build --profile humane-aipin-45.20-nov4
すべてのホストテストと2つの独立したビルドを実行します:
./scripts/verify-release.sh
ペイロードは次に書き込まれます:
source/build/humane-aipin-45.20/bin/preload.so
ビルド成果物は Git では無視されます。リリースアセットは、対応する GitHub リリースに添付されたチェックサムと照合して検証してください。
このエクスプロイトは、CVE のスタック上に残存するダングリングな rt_mutex_waiter を利用して、制御された赤黒木の更新を誘導します。KernelSnitch はまず、futex ハッシュのタイミングを通じて mm_struct のアドレスをリークします。次に、同一 PFN の perf-event ゲートにより、解放された order-3 slab ページが破壊トリガーを進める前に制御されたソケットバッファデータによって再利用されたことを証明します。起動時に束縛された KASLR ベースは、少なくとも 2 つの一致する現在の起動の WARN アンカーから導出されます。その結果得られる読み書き経路は、現在のタスクを解決し、起動スコープの資格情報変更を実行します。
ターゲットプロファイルには、この経路で消費されるオフセットとシンボルのみが含まれています。カーネル Image および完全なシンボルテーブルは配布されません。 TECHNICAL.md では、各ステージとフェイルクローズドゲートについて説明しています。
これは、サポート対象外のコンシューマーデバイス向けの実験的な研究リリースです。汎用的な Android ルート化ツールではなく、Humane、HP、CosmOS とは提携していません。
コードは Apache-2.0 の下でライセンスされています。実装は NebuSec の Apache-2.0 の CyberMeowfia の成果物を出発点としており、AI Pin への移植とリリースツールについては PROVENANCE.md および THIRD_PARTY_NOTICES.md に記載されています。
脆弱性や悪用に関する懸念を報告する前に、SECURITY.md をお読みください。