概要
- 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の実力と限界 を体感できる研究用プラットフォーム