Linux用の無料かつオープンソースのルートキット
91日前原文(lwn.net)
概要
- SingularityはLinux向けのオープンソースrootkitとして開発
- セキュリティ研究用途での利用を強調、悪用は犯罪行為
- Ftraceを活用し、システムコールやファイル、プロセス、通信を隠蔽
- x86/x86_64アーキテクチャ対応、主要ディストリで動作確認
- 検知・対策研究のためのテストベッド提供
Singularity: Linux向けオープンソースrootkitの概要
- Linux用rootkitの多くはクローズドソース、Singularityはオープンソースとして公開
- Matheus Alves氏が開発、研究目的を明確化
- MITライセンスでソースコード公開、悪用は著作権侵害ではなく犯罪行為
- 明示的な許可があるシステムでのみテストを推奨
- セキュリティ研究者向けの新たな検知・回避技術の検証環境
カーネルフックとFtraceの活用
- root権限取得やモジュール導入方法は対象外、既に侵害されたシステムが前提
- Ftraceを利用し、カーネルのシステムコール処理をフック
- CPUトラップや関数本体の書き換えを不要化、検知リスク低減
- Ftrace無効化を自動的に防止、rootkitの隠蔽性向上
- 自身・攻撃者プロセス・通信・ファイルの4種を隠蔽対象
自身の存在隠蔽
- カーネルモジュール一覧やtaintマーカーから自身を削除
- アンロード不可化、通常のモジュール管理ツールから不可視
- 後続モジュールのロードも妨害(表面上は成功、実際は失敗)
- 仮想マシン上での検証を推奨
プロセス隠蔽の仕組み
- 32個のPID配列で隠蔽対象プロセスを管理
- kill()システムコールをフックし、未使用シグナル(デフォルト59)でプロセス追加
- グローバル名前空間でroot権限付与、コンテナ外への権限エスカレーション
- execve()フックによる環境変数経由の追加もサポート
- /procのファイル隠蔽、sysinfo()でプロセス数調整
- 各種プロセス関連システムコール(getpgid, sched_getaffinity等)もフック
ファイル・ディレクトリ隠蔽
- getdents()フックによるディレクトリエントリ削除
- stat()フックで親ディレクトリのリンク数調整
- openat()等の直接アクセス失敗を誘発
- readlink()は個別に対応
- ユーザー指定パターンのディレクトリ名を隠蔽(デフォルトは"singularity"、設定変更推奨)
- RAM上の一時ファイルシステム利用で再起動後の痕跡回避
ログ・証拠隠滅機能
- /proc/kallsymsやenabled_functions等のFtrace痕跡をread()フックで隠蔽
- 既知文字列によるフィルタ、ビルド時のカスタマイズ推奨
- ファイル完全削除が不自然な場合は内容のみ隠蔽
ネットワーク通信の隠蔽
- **特定TCPポート(デフォルト8081)**の通信を不可視化
- IPv4/IPv6両対応
- netstat等からの隠蔽はファイル隠蔽コードを流用
- パケットキャプチャ対策としてカーネルの受信処理フック
- 外部ネットワークタップからの観測は不可避
アーキテクチャ・互換性
- x86/x86_64のみ対応
- 32bit/64bitシステムコール両対応、呼び出し規約変換ラッパー実装
- Ubuntu, CentOS Stream, Debian, Fedora等6.xカーネルで動作確認
- Ftrace依存のため、カーネルアップデートで動作不安定の可能性
痕跡消去用ユーティリティ
- 証拠隠滅スクリプトを同梱
- ログローテーション模倣・ログ短縮
- ローカルビルド時のソースコード完全削除
- 自動起動設定
- 主な検知ポイントはFtrace無効化の不可(/proc/sys/kernel/ftrace_enabledが"1"固定)
セキュリティ研究への意義
- コードはシンプルかつモジュール化、カスタマイズ容易
- 新たな検知・防御技術開発のための実例・教材
- バグ修正・新機能・検知手法の提案を歓迎
- rootkitの実力と限界を体感できる研究用プラットフォーム