Skip to content
KitploitKITPLOIT
ツールブログ
Log in
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
f_hid-4.14-backports — 3件の公開済みf_hid修正(CVE-2026-31721、CVE-2026-31606を含む)を、EOL(サポート終了)のLinux 4.14.190 Androidベンダーカーネルにバックポートし、デバイス上での検証記録を添付したもの。 | Kitploit
ツール/GitHubGitHub/jakestone594/f_hid-4.14-backports
Androidセキュリティ組み込みシステムセキュリティ脆弱性分析ハードウェアとIoTセキュリティ
GitHubjakestone594/f_hid-4.14-backports

f_hid-4.14-backports

3件の公開済みf_hid修正(CVE-2026-31721、CVE-2026-31606を含む)を、EOL(サポート終了)のLinux 4.14.190 Androidベンダーカーネルにバックポートし、デバイス上での検証記録を添付したもの。

リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
482ヶ月前未レビュー

Linux 4.14.190 向け f_hid バックポート (SM-A525F)

drivers/usb/gadget/function/f_hid.c に対する3件の修正を、4.14.190 の Android ベンダーカーネルへ手作業で移植し、実際に稼働するデバイス上で検証したものです。

4.14 はサポート終了 (EOL) です。 これらのいずれについても安定版バックポートは存在せず、今後も出ることはありません。このリポジトリが存在する理由はまさにそこにあります。デバイスは私のものであり、これらの不具合のうち1つが実際にそのデバイスをリセットさせていました。

誰が何をメンテナンスしているかを正確に述べておきます。本作業のベースとなっている NetHunter ツリー (AzeAstro/samsung_kernel_sm7125、ブランチ OneUI-6) は確かに活発にメンテナンスされており、その作業をここで疑うものではありません。しかしそれはデバイスおよび NetHunter の有効化に関するものであり、ベースは Samsung の 4.14.190 ベンダードロップに固定されたままです。4.14.y の安定版セキュリティ修正をそこへ持ち込んでいる者はいませんし、Samsung もそれを提供していません。4.14.y 自体が 2024年1月10日に 4.14.336 で終了しており、この系列はもはや kernel.org のサポート対象リリース一覧にも載っていません。これらの3つのパッチが位置するのは、まさにそのギャップの中です。

私が行ったこと、行わなかったこと

私はこれらの脆弱性を発見したわけではありません。3件とも公開されており、アップストリームのパッチは他者が執筆したもので、以下にクレジットを記載しています。私が行ったのは:

  1. このツリーが影響を受ける範囲にあることを確認した。
  2. 各修正を、ベンダーサポートのないコードベースへ移植した。そこではアップストリームのパッチがそのままでは適用できず、周辺のプリミティブも異なる。
  3. 各修正を、ハードウェアが観測できるものについては稼働中のハードウェアへの効果によって検証し、観測できないものについてはその旨をはっきりと述べた。

読者に特に吟味していただきたいのは、3番目の点です。3件のうち2件はベースラインとの比較測定によって確認されています。3件目は確認されておらず、このデバイス上では確認できません。この区別は、曖昧にせず全体を通して維持しています。

3件の修正

#パッチアップストリームの作者ハードウェア上の状態
1f_hidg のライフタイムと cdev (use-after-free)John Keeping, 2022-11-22✅ 有効性を測定済み
2CVE-2026-31721 — hidg_bind でオブジェクトライフタイムの状態が再初期化されるMichael Zimmermann, 2026-03-31✅ 有効性を測定済み
3CVE-2026-31606 — 使用中の cdev に対する cdev_initMichael Zimmermann (81ebd43cc0d6d), 2026-03-27; -ENOMEM のフォローアップは Ethan Tidmore, 2026-04-02⛔ このデバイスでは観測不可

1 — f_hidg のライフタイムと cdev

f_hidg_open は f_hidg * を保存するだけで、参照を取得していませんでした。f_hidg_poll は、kzalloc で確保された f_hidg に埋め込まれた待機キューに poll 待機者を登録していました。hidg_unbind は cdev_del() を呼び出しますが、これは開いている fd を無効化しません。そして hidg_free がオブジェクトを kfree していました。開いているファイルに対してこれを参照カウントするものは何もなく、ファイル全体を refcount|kref|atomic_|open_count で grep しても見つかったのは opts->lock だけでした。

つまり、Android がガジェットを再構成しても生き残った /dev/hidg0 上の select()/poll() ループは、解放済みの slab に対して remove_wait_queue() を呼び出し、ゴミのチケットワードに対して spin_lock_irqsave を取得し、IRQ をマスクしたまま永久にスピンすることになります。ローカルタイマーは停止し、ウォッチドッグの監視スレッドは二度と起床せず、約11秒後に非セキュアウォッチドッグが吠えます。実際には、端末はハードリセットされます。Android の UsbDeviceManager はユーザーの操作なしに自ら再構成を行い (約550 ms で2回測定)、したがってこれには特殊なトリガーは不要でした。

アップストリームの修正: "usb: gadget: f_hid: fix f_hidg lifetime vs cdev"、John Keeping、2022-11-22、Fixes: 71adf1189469。バックポートはクリーンです。すべてのプリミティブが 4.14.190 に存在しますが、このバージョンには存在しないフィールドであるパッチ中の kfree(hidg->set_report_buf) は削除しています。

2 — CVE-2026-31721

CVSS 3.1 5.5、ベクター AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H。hidg_bind は、bind ではなくオブジェクトのライフタイムに属する状態を再初期化していました。すなわち2つのスピンロック、2つの待機キューヘッド、そして1つのリストヘッドであり、いずれも hidg_alloc には現れません。init_waitqueue_head はリストヘッドを自己参照にリセットするため、再バインド前に登録された poll/select 待機者は黙って孤立し、その poll_freewait → remove_wait_queue は prev->next が誤っていることを見出すことになります。

Upstream は 9 つの初期化を hidg_bind の外へ移動しますが、4.14.190 にはそのうち 5 つしか存在しません。

⚠ 複数のベンダーアドバイザリがこれを「権限昇格」と題しています。ベクターは C:N/I:N/A:H — 可用性のみ、つまりローカルなサービス拒否です。 私がこれを指摘するのは、より恐ろしい読み方が ベクターの裏付けない優先度を正当化してしまいかねず、またベンダーのページに自らを証明するよう 誰も求めないからです。

このパッチはさらに upstream を一歩超えています。初期化を hidg_bind の外へ移動すると、ロックで 保護されたフィールドへのロックなしのストアが 2 つ残ります。これらは今日、ロックがその直上で 再初期化されていたためにのみマスクされています。ロックが永続化されると、競合は現実のものとなります。 f_hidg_write の待機ループでブロックされたライターが、unbind を生き延びた fd 上で、ロックを取得し、 チェックを通過し、bind がその外で NULL をストアしている間に hidg->req を読み取ることができます — 再チェックはデリファレンスの後に来ます。そこでパッチは両方のストアを write_spinlock で囲みます。

一般形は述べておく価値があります: 初期化を bind の外へ移動すると、再初期化が隠していた競合を 生み出しうる。 削除された init が偶然何を保護していたのかを問うべきです。

3 — CVE-2026-31606

CVSS 5.5、同じベクター。struct cdev cdev は struct f_hidg に埋め込まれており、hidg_bind は それに対して cdev_init() を呼び出していました — これは memset(cdev, 0, sizeof *cdev) に kobject_init を加えたもので — cdev_device_add の直前にあたります。開かれた fd は chrdev_open → cdev_get → kobject_get_unless_zero を経て、同じ kobject への参照を保持します。fd を開いたままの unbind→rebind で、bind は参照されているオブジェクト上の生きた参照状態を消去します。

修正はガードではなく構造体の変更です: 埋め込まれた struct cdev は、bind ごとの cdev_alloc() を伴う struct cdev * になります。すると cdev_init はファイル内に 0 回しか現れません — 再初期化すべき 使用中のオブジェクトが残らないのです。

⛔ このデバイスは、修正の前後を問わず、この欠陥を検出できません。 verification/03-cve-2026-31606.md を参照してください。これはデバイスの計装に関する積極的な主張であり、 保険的な表現ではありません。

検証

手法と欠陥ごとの記録は verification/ にあります。要約すると: 修正 1 と 2 は、 直前のビルドに対する単一変数の回帰によって、ポジティブコントロールを伴ってクローズされ、修正 2 は 別のログソースから二度目に確認されました。修正 3 はソースの読解のみによって裏付けられています。

適用

パッチは 4.14.190 の Samsung ベンダーツリーに対する git format-patch の出力であり、順序は次のとおりです:

git am patches/0001-*.patch patches/0002-*.patch patches/0003-*.patch

これらは累積的であり、順番に適用されることを前提としています — 3 は 1 が残した構造体を前提としています。

ライセンス

Linux カーネルの派生著作物として GPL-2.0 です。LICENSE を参照してください。元の修正の アップストリームの著作権は上記に記載しています。バックポート、パッチ 2 で追加されたロック、および 検証作業は私によるものです。

ここではコンパイル済みの成果物は配布していません — カーネルイメージ、モジュール、書き込み可能な パッケージもありません。このリポジトリはソースと証拠のみです。

ツールをダウンロード