[정보 보안] BPFDoor : 대응 전략 및 점검 가이드

Cookie·2025년 7월 15일
0

정보보안

목록 보기
36/40
post-thumbnail

들어가기 앞서 ⚠️

이번글의 목적은 앞서 정리한 BPFDoor의 핵심 개념 정리와 주요기능 다음으로 변종BPFDoor(2025.04)를 기반으로한 대응 전략 및 점검 가이드에 대해 다뤄보고자 함.

BPFDoor 점검을 위한 쉘 스크립트는 [KISA의 보안 점검 가이드]를 인용하였음


➡️ BPFDoor 개념 정리 📕






BPFDoor 대응 전략 및 점검 가이드 🛡️

점검 명령어는 관리자(root) 계정 또는 권한(sudo)으로 실행해야함



✅BPFDoor 감염 여부 점검 방법


1️⃣ 뮤텍스 / 락 파일 점검

특정 경로에 생성되는 뮤텍스/락 파일을 점검하여 악성코드 실행 여부를 점검

  • /var/run/*.pid 또는 /var/run/*.lock 경로에 0바이트 크기의 파일이 존재하는지 확인

  • 의심 파일 권한 : 644 (-rw-r--r--)

    sudo ls -l /var/run*.pid | awk '$5 == 0 { print $9 }'
    sudo ls -l /var/run*.lock | awk '$5 == 0 { print $9 }'
    sudo stat -c "%a %s %n" /var/run/*.pid /var/run/*.lock 2>/dev/null | awk '$1=="644" && $2==0 { print $3 }'

    락 파일의 크기(0 byte)와 권한(644)을 함께 확인하면 오탐을 줄일 수 있음



2️⃣ 자동 실행 파일 점검

악성코드가 부팅 시 자동 실행되도록 스크립트에 등록되었는지 확인

오진 가능성 존재 : 파일 대상 초동 점검(8️⃣) 및 YARA 기반 점검 필요(9️⃣)


$ sudo grep -Er '\[\s*-f\s+/[^]]+\]\s*&&\s*/' /etc/sysconfig/

  • 🔁 대체 명령어 (호환성 이슈 발생 시) :
    $ sudo find /etc/sysconfig/ -type f -exec egrep '\[\s*-f\s+/[^]]+\]\s*&&\s*/' {} +
    • [ -f 경로 ] && 경로 형태는 감염 후 악성파일 존재 여부 확인 후 실행하는 조건문



3️⃣ BPF 필터 설정 점검

BPFDoor가 설정한 BPF 필터 내에 매직 시퀀스 존재 여부 확인

  • 점검 가능 버전 : Linux Kernel 3.2 이상 + iproute2 4.0 이상
    • CentOS 6.x 이하 버전에서는 RAW 소켓 사용 확인
# 명령어 1 : 서버에 등록된 BPF 필터 확인(비정상 필터 유무 점검)
# (-p : 프로세스 포함, -b : BPF 사용 포함, -0 : 아무 플래그 없는 기본 소켓)
$ sudo ss -0pb

# BPF 필터 내 매직넘버(Magic Sequences) 확인 → 악성코드 감염 의심
# 명령어 2
# "-E" : 매직넘버(시그니처)값이 포함된 필터를 식별
$ sudo ss -0pb | grep -E "21139|29269|960051513|36204|40783"

# 명령어 3 : 명령어 2로 확인 불가 시 사용
# "-B1" : 매치된 라인 이전의 라인 1줄도 함께 출력(검색 결과 앞의 1줄)
$ sudo ss -0pb | grep -EB1 "$((0x5293))|$((0x7255))|$((0x39393939))|$((0x8D6
C))|$((0x9F4F))"

악성코드 감염 시 출력되는 BPF 값 : 붉은색 숫자 확인



KISA 점검 가이드의 Shell Script ( : bpfdoor_bpf.sh)

#!/bin/bash

echo "[*] Detecting processes with active BPF usage..."

# 1. ss -0pb : 소켓 정보를 출력
# 	 grep -oP 'pid=\k[0-9]+' : 숫자(PID)만 추출
# 	 sort -u : 중복 제거 후 정렬
sudo ss -0pb | grep -oP 'pid=\k[0-9]+' | sort -u | while read pid; do
	# 2. 해당 PID의 /proc 디렉토리가 존재하는지 확인
    #    (존재하지 않으면 종료된 프로세스일 수 있음)
	if [[ -e "/proc/$pid" ]]; then
    	#readlink -f /proc/$pid/exe : 실행 파일의 실제 경로 추출
    	exe_path=$(readlink -f /proc/$pid/exe 2>dev/null)
    
    	# /proc/$pid/comm : 프로세스의 이름 추출
    	proc_name=$(cat /proc/$pid/comm 2>/dev/null)
    
    	echo ""
    	echo "Process Name : ${proc_name:-Unknown}, PID: $pid"
    	echo " → Executable : ${exe_path:-Not found}"
    fi
done
  • 결과



4️⃣ RAW 소켓 사용 점검

BPFDoor는 SOCK_RAW, SOCK_DGRAM을 사용하는 은닉 통신 활용

  • reverse shell 등의 통신을 위해 비정상적인 RAW/UDP 소켓이 열여 있는지 확인

오진 가능성 존재 : 파일 대상 초동 점검(8️⃣) 및 YARA 기반 점검 필요(9️⃣)


명령어 1

$ sudo lsof 2>/dev/null | grep -E "IP type=SOCK_RAW | IP type=SOCK_DGRAW" | awk '{ print $2 }' | sort -u | xargs -r ps -fp

명령어 2

  • 명령어 2의 경우 시스템 내 inode 전체를 탐색함 → 성능 부하 가능성有
  • 아래 세가지를 만족하는 경우 권장
    1. 뮤텍스/락 파일 존재
    2. BPF 점검 결과 없음
    3. RAW 소켓 명령어 1 결과 없음
    $ sudo awk '$4=="0800" && $5=="0" { print $9 }' /proc/net/packet | while read inode;
    do sudo grep -r "ino:\s$inode" /proc*/fdinfo/ 2>/dev/null | awk -F/ '{ print $3 }' | sort -u | xargs -r sudo ps -fp;
    done

명령어 3

  • ss 명령어 기반 로우소켓 점검
    $ sudo ss -apn | grep -E ":1 |:6 |:17 "



5️⃣ 환경 변수 조작 점검

악성코드가 셸(Shell) 연결 시 사용하는 환경변수를 점검
조작된 환경변수 사용 여부 확인

오진 가능성 존재 : 파일 대상 초동 점검(8️⃣) 및 YARA 기반 점검 필요(9️⃣)


KISA 점검 가이드의 Shell Script( : bpfdoor_env.sh)

  • 점검 대상 환경변수
    1. HOME=/tmp
    2. HISTFILE=/dev/null
    3. MYSQL_HISTFILE=/dev/null
      : 해당 스크립트는 /proc/<PID>/environ 파일에서 환경변수를 추출하여 검증
#!/bin/bash

echo "echo [*] Detecting processes with BPFDoor environment variable manipulation..."
echo "Target : HOME=/tmp, HISTFILE=/dev/null,MYSQL_HISTFILE=/dev/null"

# 점검할 의심 환경변수 목록 배열
CHECK_ENV=("HOME=/tmp" "HISTFILE=/dev/null" "MYSQL_HISTFILE=/dev/null")

# Process scanning (/proc 내 존재하는 모든 PID 대상으로 스캔)
for pid in $(ls /proc/ | grep -E '^[0-9]+$'); do
	# 해당 PID의 환경변수 파일이 읽기 가능한지 확인
	if [ -r /proc/$pid/environ ]; then
    	# null 문자(\0)를 줄바꿈(\n)으로 바꿔 환경변수 내용을 라인 단위로 추출
		env_data=$(tr '\0' '\n' < /proc/$pid/environ)
        
		match_all=true
        # CHECK_ENV 배열의 각 항목이 모두 존재하는지 확인
		for check_item in "${CHECK_ENV[@]}"; do
			if ! echo "$env_data" | grep -q "$check_item"; then
				match_all=false
				break
			fi
		done
    
    # 모든 의심 환경변수가 포함된 경우 경고 출력
	if [ "$match_all" = true ]; then
	echo "Warning: Process with all suspicious environment variables detected
(PID: $pid)"
			# ps 명령으로 프로세스 상세 정보 출력
			echo " → $(ps -p $pid -o user=,pid=,ppid=,cmd=)"
			echo ""
		fi
	fi
done
  • 결과

  • 의심 프로세스의 파일 경로 확인

    $ sudo ls -l /proc/<PID>/exe
    
    # 결과
    lrwxrwxrwx. 1 root root 0 428 12:31 /proc/4076/exe -> /dev/shm/smartadm



6️⃣ 포트 사용 및 네트워크 패킷 점검

BPFDoor가 사용하는 특정 포트 또는 트래픽 시그니처 존재 여부 점검

오진 가능성 존재 : 파일 대상 초동 점검(8️⃣) 및 YARA 기반 점검 필요(9️⃣)


(1) 특정 네트워크 포트(port) 사용 점검

  • port : 42391~43390, 8000
# 명령어 1
$ sudo netstat -tulpn

$ sudo netstat -tulpn 2>/dev/null | awk '
{
	match($0, /:([0-9]+)/, a);
    if ((a[1] >= 42391 && a[1] <= 43390) || $0 ~ /:8000([^0-9]|$)/)
    	print $0
}'
     
$ sudo netstat -tulpn 2>/dev/null | awk '
$1=="tcp"&&($6=="LISTEN"||$6=="ESTABLISHED") {
	lp=substr($4,index($4,":")+1);
    rp=substr($5,index($5,":")+1);
    if((lp>=42391&&lp<=43390)||lp==8000||
       (rp>=42391&&rp<=43390)||rp==8000)
       print
}'

# 명령어 2
$ sudo ls -l /proc/<PID>/exe

(2) 네트워크 장비를 이용한 패킷 점검

BPFDoor는 특정한 포맷의 매직 패킷을 이용해 통신을 수행함

  • 패킷 크기 및 페이로드, 시퀀스, 문자열 패턴 등으로 탐지 가능

ℹ️ 주요 특징

  • 전송 패킷의 크기 (전체가 아닌 Payload 기준)
    : UDP/TCP(24byte), ICMP(44byte), TCP:HTTP POST(100byte 이하)

  • 페이로드 내 문자열

    • 비밀번호 예시 → justforfun

    • 매직 시퀀스 값

      프로토콜시퀀스 값
      UDP/ICMP0x7255, 0x9F4F
      TCP0x5293, 0x39393939, 0x8D6C
  • HTTP 요청 위장 (TCP)
    : HTTP POST 요청의 URI에 특정 마커 존재

    • URI 내 마커 → 9999 문자열 포함
    • User-Agent 및 Base16로 인코딩된 Payload 사용

📄 예시 패턴

  • HTTP POST URI 값
    /admin/login.aspx?id=99990
    /admin_login.aspx?id=99990
    /Admin/Default.aspx?=99990
    /UploadFile.aspx?id=099990
    /user/admin.php?id=0099991
    /uploadfiles.php?id=099991
    /uploadfilm.php?id=0099991
    /uploadphoto.php?id=099991
    /uploadPic.php?id=00099991
  • User-Agent
    Mozilla/5.0 (Windows NT 6.1; Win64; x64)
    AppleWebKit/537.36 (KHTML, like Gecko)
    Chrome/90.0.5389.90 Safari/537.36

⚠️ 주의

  • 매직 시퀀스 및 트래픽 구조는 공격자가 쉽게 변경 가능
  • 룰 적용시 내부 검토 및 커스터마이징 필요
  • 분석 → 검증 → 차단 적용



✅BPFDoor 컨트롤러 점검 방법


7️⃣ 위장된 프로세스 이름 점검

악성코드의 위장 프로세스명을 확인

오진 가능성 존재 : 파일 대상 초동 점검(8️⃣) 및 YARA 기반 점검 필요(9️⃣)


  • 비정상 프로세스 판단 기준
    1. 의심 프로세스명
      : /usr/sbin/abrtd, /sbin/udevd, cmathreshd, /sbin/sgaSolAgent, /usr/sbin/atd, pickup
    2. 명령어 2를 실행하여 파일 경로와 프로세스명의 동일여부 확인
      (동일한 경우 정상, 동일하지 않은 경우 비정상 의심)
# 명령어 1
$ sudo ps -ef | grep -E '/usr/sbin/abrtd|/sbin/udevd|cmathreshd|/sbin/sgaSolAgen
t|/usr/sbin/atd|pickup'

# 명령어 2
$ sudo ls -l /proc/<PID>/exe



✅악성 의심 파일 점검 방법

부가 점검 방법(선택)


8️⃣ 문자열 기반 초동 점검

시스템 내 파일에서 악성 문자열 패턴이 포함된 이진 실행파일 식별

  • YARA 도구가 설치되지 않은 환경에서 초동으로 악성 의심 판단
  • 악성 의심파일 1차 선별 → 점검(임시) 디렉토리로 복사 → strings 명령 실행

초동 점검은 오진 가능성이 있으며, 반드시 2차 YARA 검증이 필요

# 명령어 1 : 단일 파일(strings) - 권장사항
$ sudo strings -a -n 5 <의심파일 경로> | grep -E '
	MYSQL_HISTFILE=/dev/null|
    :h:d:l:s:b:t:|
    :f:wiunomc|
    :f:x:wiuoc|
    ttcompat'

# 명령어 2 : 특정 경로(find), filesize(15K~4M), 검색 깊이 1 - 권장하지 않음
# 출력 결과 [파일명]: 매칭 문자열
$ sudo find <의심경로> -maxdepth 1 -type f -size +15k -size -4M -exec sh -c '
	strings -a -n5 "$1"|
    sed "s|^|$1: |"|
    grep -E "MYSQL_HISTFILE=/dev/null|
    		:h:d:l:s:b:t:|
            :f:wiunomc|
            :f:x:wiuoc|
            ttcompat"
  ' _ {} \;



9️⃣ YARA 기반 정밀 점검

  • 악성코드 의심 파일을 선별하여 YARA 도구와 룰로 점검
    • 적용룰 KISA 배포 bpfdoor.yar 룰셋
  • 특정 디렉토리 내부의 바이너리 파일을 외부 또는 다른 경로에 복사하여 점검 필요
$ yara -r bpfdoor.yar <디렉토리 또는 파일 경로>



✅사후 조치 및 신고

  • 감염 흔적 발견시 국가 사이버 보안 기관에 신고
    : 한국 기준 KISA
  • 보안 정책에 따라 해당 서버 격리 및 재설치 권고

이외에소 EDR 솔루션 로그 및 방화역 로그 등 다중 로그 기반 분석 병행 필요






참고 자료 📰

[KISA 보호나라&KrCERT/CC] BPFDoor 악성코드 점검 가이드
[AhnLab] BPFDoor 악성코드 분석 및 안랩 대응 현황
[AhnLab] BPFDoor 악성코드, 해킹 위협 대응을 위한 2차 보안 가이드

profile
나만의 공부 일지... [임시 休]

0개의 댓글