Singularity - モダンなLinuxルートキットの手口と検出が困難な理由
このようなシナリオを想像してみてください:サーバーにログインし、ps auxを実行すると、すべてが完璧に見えます。ネットワーク接続をssで確認 — クリーン。ログをdmesgでレビュー — 疑わしいエントリなし。しかし、まさにその瞬間、カーネルメモリ内であなたのアクションを傍受し、データをフィルタリングしている非表示のルートレベルプロセスがシステム内で実行されています。
ハッカーの映画のような話ですか?現実には、これがモダンなLKMルートキット(Linuxカーネルモジュール)の現実です。本日は、開発者MatheuZSecurityによるSingularityプロジェクトを取り上げます — Linux 6.xカーネルにおけるステルス機能の研究ための高度なツールです。
Singularityとは?なぜ研究者にとって必要なのか?
Singularityは、ユーザーのUIDを変更するための単なる玩具ではありません。モダンなセキュリティシステムの限界をテストするために作成された本格的な研究プロジェクトです。著者は вопрос を投げかけました:「カーネルにインジェクションに成功したルートキットは、どこまでやれるのか?」
このプロジェクトはモダンなカーネル(6.xブランチ)を対象とし、システムコール傍受にftraceインフラストラクチャを使用します。これにより、システムプログラマーや情報セキュリティスペシャリスト(DFIR)にとって非常に興味深いものとなっています。FalcoやTraceeなどのeBPFやLKRG(Linux Kernel Runtime Guard)などのセキュリティ巨人をバイパスする方法を実演しているからです。
主な機能:非表示であり続ける技術
Singularityは、秘密作戦のための真のスイスアーミーナイフです。最も印象的な機能を見てみましょう。
1. ゴーストレベルのカモフラージュ
ルートキットは単にファイルやプロセスを隠すだけでなく、体系的にそれを行います:
- プロセス:任意のPIDを、
ps、top、さらには/procからも見えないようにできます。さらに、Singularityは自動的にすべての子プロセスを追跡して隠します。 - ファイル:パターンベースで非表示になります。「secret」という名前でディレクトリを作成した場合、
lsやfindの出力から消えますが、パスをすればファイルにはアクセスできます。 - ネットワーク:特定のポート(例えば、リバースシェル)での接続は、
netstatでもtcpdumpでも見えません。
2. eBPFとモダンなEDRのバイパス
これはおそらく技術的に最も複雑な部分です。ほとんどのモダンな監視システム(Falcoなど)は、リアルタイムイベント追跡にeBPFに依存しています。SingularityはeBPFをブロックしません(それは目立ちすぎます)が、ユーザースペースでeBPFプログラムが送信するデータを注意深くフィルタリングします。バッファ内の結果を置換し、監視の「目」から隠されたリソースを見えなくします。
3. シグナルによる権限操作
複雑なエクスプロイトは忘れてください。Singularityは洗練されたメカニズムを実装しています:
kill -59 $$
特定のシグナル(この場合は59)を現在のプロセスに送信すると、瞬時に権限がrootに昇格します。シンプル効果的、そして悪意のある手に渡れば非常に危険です。
4. フォレンジクスとの戦い(フォレンジクス回避)
このプロジェクトは、debugfsなどの低レベルディスク分析ツールさえ欺くことができます。読み取り/書き込みシステムコールを傍受し、出力バッファから自身への言及を「その場で」スクラブし、スペースに置き換えます。これにより、ファイルシステムの整合性(チェックサムは壊れない)を維持しながら、悪意のあるコードの存在を隠すことができます。
内部ではどのように動作するのか?
Singularityのアーキテクチャはモジュラーシステム上に構築されています。リポジトリには、各タスク用の別ファイルがあります:ネットワーク用のhiding_tcp.c、eBPF対策用のbpf_hook.c、カーネル保護バイパス用のlkrg_bypass.c。
ログ実装は興味深いです。ルートキットはdo_syslog関数をフックし、カーネルリングバッファをフィルタリングできます。システムが第三方製モジュールのロードに関するカーネル汚染メッセージを出力しようとした場合、Singularityは単にその文字列を切り取ります。
開発者にとっての実用的な価値
なぜ開発者はルートキットコードを勉強すべきですか?
- Linux内部の理解:プロジェクトコードは、システムコール、
task_struct構造、ネットワークスタック、ftraceサブシステムでの作業に関する優れた教科書です。 - セキュリティシステムの設計:強力な城塞を構築するには、攻城兵器がどのように機能するか知る必要があります。SingularityのeBPFバイパス手法を学ぶことで、FalcoやTraceeでのルールをより適切に構成できます。
- カーネル開発:これは、モダンなカーネルバージョン向けのLKM(Linuxカーネルモジュール)の書き方の実践的な例であり、APIの変更を考慮しています。
安全上の注意事項
重要:Singularityは強力なツールであり、ロード後に自身を隠します(lsmod将它表示しません)。アンロード機能はありません。なぜなら、それは追加の検出ベクトルを作成するからです。それを削除するには、再起動が必要です。
著者は、プロジェクトを仮想マシンでのみテストすることを強く推奨します。そして、もちろん、教育および研究目的でのみ使用してください。
Singularityは、Linuxのステルス手法がいかに高度になったかを示す印象的な例です。このプロジェクトは、攻撃者がカーネルレベルで足場を獲得した場合、最もモダンなセキュリティツールすら銀の弾丸ではないことを示しています。
さらに深く知りたい方のために、include/core.hをチェックして、フックの実装方法をみることをお勧めします。この読み物は任何のミステリー小説よりも魅力的かもしれません。
試してみる(VMで!): GitHub MatheuZSecurity/Singularity
ところで、你怎么看 — セキュリティにeBPFを使用することは、ルートキットがそれをバイパスする方法を学んだら袋小路ですか?コメントであなたの考えを共有してください!
関連プロジェクト