BPFDoor Linux Malware

BPFDoor리눅스 시스템을 노리는 고급 백도어 악성코드로, 주로 중국과 관련된 APT 그룹(Advanced Persistent Threat)인 Red Menshen (또는 Red Dev 18)에 의해 사용된 것으로 알려져 있습니다. 이 백도어는 BPF (Berkeley Packet Filter) 기술을 활용해 일반적인 탐지를 우회하는 것이 특징입니다.


🔍 BPFDoor 개요

항목내용
🧠 이름BPFDoor (Berkeley Packet Filter Door)
🎯 대상 시스템Linux
🧬 공격 주체Red Menshen (중국계 APT 그룹으로 추정)
📅 발견 시점2021~2022년에 본격적으로 분석됨
🔐 주요 기능패킷 필터링 기반의 통신 우회, 루트킷 수준의 은폐, 원격 쉘 실행
🛠️ 사용 기술Raw Socket, BPF, 포트리스닝 우회, 역방향 셸 등
🚫 방화벽 우회가능 (패킷을 직접 감지하고 응답함으로써 포트 열림 없이 통신 가능)

⚙️ 주요 동작 방식

  1. BPF로 네트워크 패킷 감시
    • Berkeley Packet Filter를 이용해 시스템의 네트워크 트래픽을 직접 감시
    • 운영 체제 수준의 패킷 필터링을 통해 일반적인 방화벽이나 IDS를 우회함
  2. 포트리스닝 없이 명령 수신
    • 특정 시그니처를 가진 패킷만 감지
    • 열려 있지 않은 포트로도 패킷을 수신 → 흔적이 적어 탐지 어려움
  3. 역방향 셸(reverse shell) 제공
    • 공격자가 시스템 내부로 명령을 보낼 수 있도록 함
    • 파일 업로드/다운로드, 명령 실행 가능
  4. 지속성 확보
    • 일정 경로에 자기 복사 및 실행 파일 등록
    • 시스템 재시작 후에도 자동 실행

🛡️ 보안 권고 사항

항목설명
✅ 침해지표(IOC) 탐지파일 경로, 프로세스 이름, 네트워크 동작 기반 로그 확인
✅ 패킷 필터링 점검BPF 관련 소켓이나 커널 후킹 여부 점검
✅ EDR/IDS 업그레이드사용자 공간 패킷 감시도 가능한 도구 사용 필요
✅ 취약 서버 점검공개 서비스 포트 점검 및 불필요한 서비스 종료
✅ 최신 패치 적용커널, 네트워크 도구 등 최신 보안 패치 적용

📂 IOC(Indicator of Compromise) 예시

  • 프로세스 이름: /dev/shm/kdmtmpflush, /usr/lib/libxselinux
  • 숨김 프로세스 사용
  • 의심스러운 BPF 소켓 존재
  • 비정상적 ICMP/UDP 패킷 송수신 기록

🧩 결론

BPFDoor는 비전통적인 방법으로 백도어 통신을 수행하여 탐지가 어려운 고급형 리눅스 악성코드입니다. 특히 포트를 열지 않고도 명령을 주고받을 수 있어 기존 보안 장비의 탐지를 우회합니다. 클라우드 서버, 공개 웹서버 등 리눅스를 사용하는 조직은 정기적인 포렌식 분석과 로그 모니터링이 중요합니다.


📌 탐지방법

다음은 BPFDoor 악성코드 탐지를 위한 IOC(Indicators of Compromise) 탐지 스크립트 예시입니다. 이 스크립트는 Linux 시스템에서 다음과 같은 항목을 탐지합니다:

  • 이상한 프로세스 이름 또는 경로
  • 숨겨진 BPF 소켓 및 raw socket 사용 여부
  • 비정상적인 네트워크 연결
  • /dev/shm, /tmp 등 임시 디렉터리에 존재하는 실행 파일

🛠 IOC 탐지 Bash 스크립트 예시

#!/bin/bash
echo "=== BPFDoor IOC 탐지 시작 ==="

# 1. 의심스러운 경로에서 실행 중인 프로세스 탐지
echo "[1] 의심 경로의 프로세스 확인"
ps aux | grep -E "/dev/shm|/tmp|/var/tmp" | grep -v grep

# 2. BPF 또는 raw socket 사용 여부 확인 (root 권한 필요)
echo "[2] BPF 및 raw socket 사용 프로세스 탐지"
lsof -nP | grep -E "raw|bpf"

# 3. 의심 프로세스명/경로 검색
echo "[3] 의심 프로세스 경로 확인"
find / -type f \( -name "kdmtmpflush" -o -name "libxselinux*" \) 2>/dev/null

# 4. 비정상 네트워크 포트/연결 확인
echo "[4] 열려 있는 포트 및 LISTEN 상태 확인"
ss -tunlp

# 5. 시스템 내 BPF 사용 흔적 확인
echo "[5] BPF 관련 소켓 존재 여부 확인"
ls /proc/*/fd/* 2>/dev/null | xargs -I{} ls -l {} 2>/dev/null | grep -i "socket:\[" | grep -i "bpf"

# 6. 최근 수정된 실행파일 탐지 (1일 이내)
echo "[6] 최근 생성/수정된 실행파일 탐지 (/tmp, /dev/shm)"
find /tmp /dev/shm -type f -executable -mtime -1 2>/dev/null

echo "=== BPFDoor IOC 탐지 완료 ==="

🧪 사용법

chmod +x check_bpfd_ioc.sh
sudo ./check_bpfd_ioc.sh

📌 참고: 탐지 시 조치

  • 발견된 의심 파일은 격리 후 strings, md5sum, sha256sum 등으로 분석
  • 시스템 전체 포렌식 필요 (로그, bash history, cron, 서비스 등록 여부 등)
  • 감염이 의심되면 즉시 네트워크에서 격리

리눅스 시스템에서 BPFDoor와 같은 악성코드가 사용하는 **BPF 소켓(Berkeley Packet Filter socket)**은 일반적인 netstat, ss, lsof 명령어로 잘 보이지 않습니다. 하지만 다음과 같은 방법으로 의심스러운 BPF 소켓을 탐지할 수 있습니다.


✅ 1. /proc/*/fd로 열린 소켓 확인

echo "[*] BPF 소켓 확인 중..."
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  for fd in /proc/$pid/fd/*; do
    if [ -L "$fd" ]; then
      target=$(readlink -f "$fd")
      if echo "$target" | grep -qi "bpf"; then
        echo "[!] PID $pid (프로세스: $(cat /proc/$pid/comm)) → $target"
      fi
    fi
  done
done

🔎 결과 예시:

[!] PID 2156 (프로세스: bpfd) → socket:[123456] (bpf)

✅ 2. /proc/net/bpf 확인 (있는 경우)

일부 시스템에서는 /proc/net/bpf 또는 /sys/fs/bpf/ 아래에 BPF 관련 핸들이 존재할 수 있습니다:

ls -alh /proc/net/bpf 2>/dev/null
ls -alh /sys/fs/bpf 2>/dev/null

대부분의 경우 일반 사용자에겐 비어 있음. 하지만 공격자가 BPF 핸들을 직접 생성했다면 흔적이 남을 수 있습니다.


✅ 3. BPF 필터를 사용 중인 소켓 탐지 (고급)

이 방법은 bpftool 명령어 사용이 가능합니다 (Linux Kernel 4.9+ 및 bpftool 설치 필요):

sudo bpftool prog show
sudo bpftool map show

확인 포인트:

  • prog type: socket_filter 로 등록된 항목
  • BPF 프로그램 이름이 이상하거나 정체불명일 경우

✅ 4. 의심되는 BPF 사용 프로세스 정보 확인

ps aux | grep -E "bpfd|bpf|raw|sniff" | grep -v grep

또는

sudo lsof -nP | grep raw

📌 참고: 탐지 후 조치

  • PID 확인 → cat /proc/<pid>/cmdline, ls -l /proc/<pid>/exe 로 상세 정보 확인
  • 필요시 해당 프로세스를 strace, gcore, strings 등으로 분석
  • 감염 확정 시 시스템 재부팅 전 전체 포렌식 백업

통합 자동 스캔 스크립트

다음은 의심스러운 BPF 소켓 및 BPFDoor 활동을 자동 탐지하는 통합 스크립트입니다.
이 스크립트는 다음을 수행합니다:

  1. 의심스러운 BPF 소켓 확인
  2. socket_filter BPF 프로그램 탐지 (bpftool 사용 가능 시)
  3. /dev/shm, /tmp 경로 실행 파일 점검
  4. 의심 프로세스 확인
  5. 결과를 파일(bpfd_ioc_scan.log)로 저장

🛠 BPFDoor 자동 탐지 스크립트 (bash)

#!/bin/bash

LOGFILE="bpfd_ioc_scan.log"
echo "=== [BPFDoor IOC 자동 스캔 시작] ===" | tee $LOGFILE
echo "스캔 시간: $(date)" | tee -a $LOGFILE

# 1. BPF 소켓 탐지
echo -e "\n[1] /proc/*/fd/* 내 BPF 소켓 확인:" | tee -a $LOGFILE
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  for fd in /proc/$pid/fd/*; do
    if [ -L "$fd" ]; then
      target=$(readlink "$fd" 2>/dev/null)
      if echo "$target" | grep -qi "socket"; then
        if grep -qi "bpf" <<< "$(ls -l $fd 2>/dev/null)"; then
          pname=$(cat /proc/$pid/comm 2>/dev/null)
          echo "[BPF 소켓] PID $pid ($pname) → $target" | tee -a $LOGFILE
        fi
      fi
    fi
  done
done

# 2. bpftool 사용 가능 여부 확인
if command -v bpftool >/dev/null; then
  echo -e "\n[2] bpftool 사용 가능 - BPF 프로그램 확인:" | tee -a $LOGFILE
  sudo bpftool prog show | tee -a $LOGFILE
else
  echo -e "\n[2] bpftool 명령어가 없습니다. (설치 시 추가 확인 가능)" | tee -a $LOGFILE
fi

# 3. /tmp, /dev/shm 내 실행파일 탐지
echo -e "\n[3] /tmp, /dev/shm 내 최근 실행파일 탐지:" | tee -a $LOGFILE
find /tmp /dev/shm -type f -executable -mtime -3 2>/dev/null | tee -a $LOGFILE

# 4. 의심 프로세스명 및 소켓 유형 확인
echo -e "\n[4] 의심 프로세스 탐지 (raw, bpf 포함):" | tee -a $LOGFILE
ps aux | grep -Ei "bpfd|bpf|raw|sniff" | grep -v grep | tee -a $LOGFILE

echo -e "\n[5] Raw 소켓 사용 프로세스 탐지:" | tee -a $LOGFILE
sudo lsof -nP | grep raw | tee -a $LOGFILE

# 6. 비정상 네트워크 리스닝 포트 확인
echo -e "\n[6] 열려 있는 포트 및 LISTEN 상태 확인:" | tee -a $LOGFILE
ss -tunlp | tee -a $LOGFILE

echo -e "\n=== [BPFDoor IOC 자동 스캔 종료] ===" | tee -a $LOGFILE
echo "결과 파일: $LOGFILE"

🧪 사용법

chmod +x bpfd_ioc_scan.sh
sudo ./bpfd_ioc_scan.sh

결과는 bpfd_ioc_scan.log 파일로 저장됩니다.


📌 권장 후속 조치

  • 이상 항목 발견 시 sha256sum, strings, gdb, chkrootkit 등으로 분석
  • 해당 프로세스 메모리 덤프: gcore <pid>
  • 즉시 네트워크 차단 및 격리 후 대응

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!