カーネルのゴーストハンター:klintでステルスルートキットを暴露する

Image

klint

Linuxカーネル整合性スキャナーで、ルートキットやカーネルレベルの侵害を検出します。複数のシステム情報源(procfs、sysfs、netlink、MSR、IDT、カーネルシンボル)を相互参照し、改ざんを示す矛盾にフラグを立てることで動作します。

機能

  • 隠されたカーネルモジュール検出 — /proc/modules/proc/kallsyms/sys/moduleを比較して、1つ以上のビューから隠されたモジュールを見つけます。
  • 隠されたプロセス検出 — kill(0)でPID空間をプローブし、/procのreaddirとcgroupツリーに対して相互チェックを実行して、ディレクトリリスティングから隠されたプロセスを特定します。
  • 隠されたネットワークソケット検出 — /proc/netss(netlink)、/proc/*/fdを相互参照して、任意の単一ビューから欠落しているソケットを見つけます。
  • システムコール表の整合性 — /proc/kcoreからシステムコール表を読み取り、すべてのエントリがカーネルテキストを指していることを検証し、インラインフックと表の上書きをキャッチします。
  • カーネルエントリーポイント整合性 (x86_64)— MSR(IA32_LSTARIA32_CSTARIA32_SYSENTER_EIP)とIDTベクトルを読み取り、エントリーポイントがモジュールコードまたはトランポリンにリダイレクトされていないことを検証します。
  • Ftraceリダイレクション検出 — ftraceフィルタリストをスキャンして、セキュリティクリティカルなカーネル関数のフック(syscallディスパッチ、VFS、認証情報、ネットワーキングパスをカバーする35個の組み込みパターン)を検出します。
  • 未知のkprobe検出 — 登録されたkprobeとkretprobeイベントを検査して、機密カーネルシンボルを対象とするプローブを検出します。
  • BPFルートキット検出 — bpftoolを介してロードされたBPFプログラム、マップ、リンクをインベントリ化し、機密フックに接続された所有者のないまたは高リスクのプログラムにフラグを立てます。

各スキャナーは、設定可能なタイムアウト(デフォルト30秒)を伴う分離された子プロセスで実行され、結果をパイプを介してJSONで返します。デュアルスナップショット調整戦略は、一時的な異常と永続的な異常を区別します。

動作方法

klintは、ルートキットが効果的であるためにはシステムの少なくとも1つのビューから隠れなければならないが、すべてのビューから同時に隠れることはめったにないという原則に依存しています。独立したカーネルインターフェース(procfs、sysfs、netlinkソケット、MSR、IDT、/proc/kcore、直接システムコール)から情報を比較することで、klintは改ざんを明らかにする矛盾を特定します。

各スキャナーは個別の子プロセスグループで実行されます。スキャナーがハング(侵害されたカーネルと相互作用するときに発生する可能性があります)した場合、タイムアウト期限後に強制終了されます。結果はパイプを介してJSONとして親に送り返され、最終レポートを組み立てます。

シンボル解決は、アンカーシンボルによる自動KASLRスライド検出を伴う/proc/kallsymsを使用し、必要に応じてSystem.mapにフォールバックします。

インストール & 使用

翻訳元: https://meterpreter.org/klint-linux-kernel-integrity-integrity-scanner-rootkit-detection/

ソース: meterpreter.org