BPFDoor 악성코드 점검 가이드 배포
□ 개요
o 최근 국내외 리눅스 시스템을 대상으로 BPFDoor 악성코드 위협이 확대됨에 따라, 다양한 BPFDoor 악성코드 유형을 확인할 수 있는 점검 가이드를 공개
□ 주요내용
o BPFDoor 악성코드 감염여부 점검 방법
- 악성코드 뮤텍스/락(Mutex/Lock) 파일 점검
- 악성코드 자동 실행 파일 점검
- BPF(Berkeley Packet Filter) 점검 (가이드 內 ‘[붙임1] BPF 점검 스크립트’ 활용)
- RAW 소켓 사용 점검
- 프로세스 환경변수 점검 (가이드 內 ‘[붙임2] 환경변수 점검 스크립트’ 활용)
- 특정 포트 확인 및 네트워크 장비를 이용한 패킷 점검
o BPFDoor 컨트롤러 감염여부 점검 방법
- 실행 중인 프로세스 명 점검
o 악성 의심 파일에 대한 추가 점검 방법
- 문자열 기반 초동 점검
- YARA* Rule 기반 점검 (가이드 內 ‘[붙임3] BPFDoor YARA Rule’ 활용)
* 악성 파일을 시그니처 기반으로 판별 및 분류 할 수 있게 하는 툴
□ 대응방안
o 첨부된 점검 가이드를 참고하여 자체적으로 보안점검 후, 침입흔적 및 침해사고가 확인되면 보호나라를 통해 침해사고 즉시 신고
□ 기타 문의
o 한국인터넷진흥원 사이버민원센터 : 국번없이 118
o 침해사고 발생 시 아래 절차를 통해 침해사고 신고
- 보호나라(boho.or.kr) > 침해사고 신고 > 신고하기
□ 작성 : 위협분석단 종합분석팀
[붙임1] BPF 점검 스크립트 : bpfdoor_bpf.sh
vim bpfdoor_bpf.sh
#!/bin/bash
echo "[*] Detecting processes with active BPF usage..."
# 1. Extract PIDs directly from ss output
sudo ss -0pb | grep -oP 'pid=\K[0-9]+' | sort -u | while read pid; do
# 2. For each PID, find the executable path
if [[ -e "/proc/$pid" ]]; then
exe_path=$(readlink -f /proc/$pid/exe 2>/dev/null)
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
[붙임2] 환경변수 점검 스크립트 : bpfdoor_env.sh
vim bpfdoor_env.sh
#!/bin/bash
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
for pid in $(ls /proc/ | grep -E '^[0-9]+$'); do
if [ -r /proc/$pid/environ ]; then
env_data=$(tr '\0' '\n' < /proc/$pid/environ)
match_all=true
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)"
echo " → $(ps -p $pid -o user=,pid=,ppid=,cmd=)"
echo ""
fi
fi
done
[붙임3] BPFDoor YARA Rule : bpfdoor.yar
vim bpfdoor.yar
rule ELF_BPFDoor
{
meta:
description = "BPFDoor Malware(ELF) Detection rule"
author = "KrCERT/CC Threat Hunting Analysis Team"
date = "2025-05-06"
hash = "c7f693f7f85b01a8c0e561bd369845f40bff423b0743c7aa0f4c323d9133b5d4"
hash = "3f6f108db37d18519f47c5e4182e5e33cc795564f286ae770aa03372133d15c4"
hash = "95fd8a70c4b18a9a669fec6eb82dac0ba6a9236ac42a5ecde270330b66f51595"
hash = "aa779e83ff5271d3f2d270eaed16751a109eb722fca61465d86317e03bbf49e4"
ver = "1.1"
strings:
$pty_1 = "/dev/ptm"
$pty_2 = "ptem"
$pty_3 = "ldterm"
$pty_4 = "ttcompat"
// for ( i = 0xA597; i <= 0xA97E; ++i )
$bind_port_1 = { C7 45 ?? 97 A5 00 00 EB }
$bind_port_2_1 = { 83 45 ?? 01 81 7D ?? 7E A9 00 00 7E }
$bind_port_2_2 = { 81 7D ?? 7E A9 00 00 7E }
// v1.1 : added new pattern "PS1=[\\u@\\h : "
$ps1 = {C6 85 ?? ?? FF FF 50 C6 85 ?? ?? FF FF 53 C6 85 ?? ?? FF FF 31 C6 85 ?? ?? FF FF 3D C6 85 ?? ?? FF FF 5B C6 85 ?? ?? FF FF 5C C6 85 ?? ?? FF FF 75 C6 85 ?? ?? FF FF 40 C6 85 ?? ?? FF FF 5C C6 85 ?? ?? FF FF 68}
// v1.1 : bpf filter modify (dbus, hald, trend-B, Trend-E)
$bpf_filter_1 = {B1 00 00 00 0E 00 00 00 48 00 00 00 16 00 00 00 15 00 ?? ?? ?? ?? 00 00 15 00 00 07 01 00 00 00 28 00 00 00 14 00 00 00 45 00 (11|1A) 00 FF 1F 00 00}
$bpf_filter_2 = {07 00 00 00 00 00 00 00 (40|48) 00 00 00 00 00 00 00 02 00 00 00 (00|01|03) 01 00 00 00 00 00 00 00 ?? ?? ?? ?? 02 00 00 00 (01|02|04) 00 00 00 61 00 00 00 (01|02|04) 00 00 00}
$bpf_filter_3 = { 07 00 00 00 00 00 00 00 40 00 00 00 0E 00 00 00 15 00 00 01 39 39 39 39 06 00 00 00 FF FF 00 00 06 00 00 00 00 00 00 00}
$bpf_filter_4 = { 48 00 00 00 10 00 00 00 15 00 01 00 BB 01 00 00 15 00 00 01 16 00 00 00 06 00 00 00 00 00 04 00 06 00 00 00 00 00 00 00}
// I5*AYbs@LdaWbsO
$md5_salt = {C6 45 ?? 49 C6 45 ?? 35 C6 45 ?? 2A C6 45 ?? 41 C6 45 ?? 59 C6 45 ?? 62 C6 45 ?? 73 C6 45 ?? 40 C6 45 ?? 4C C6 45 ?? 64 C6 45 ?? 61 C6 45 ?? 57 C6 45 ?? 62 C6 45 ?? 73 C6 45 ?? 4F}
// qmgr -l -t fifo
$pname = {C6 ?? ?? ?? FF FF 71 C6 ?? ?? ?? FF FF 6D C6 ?? ?? ?? FF FF 67 C6 ?? ?? ?? FF FF 72 C6 ?? ?? ?? FF FF 20 C6 ?? ?? ?? FF FF 2D C6 ?? ?? ?? FF FF 6C C6 ?? ?? ?? FF FF 20 C6 ?? ?? ?? FF FF 2D C6 ?? ?? ?? FF FF 74 C6 ?? ?? ?? FF FF 20 C6 ?? ?? ?? FF FF 66 C6 ?? ?? ?? FF FF 69 C6 ?? ?? ?? FF FF 66 C6 ?? ?? ?? FF FF 6F}
$solaris_1 = "(udp[8:2]=0x7255) or (icmp[8:2]=0x7255)"
$solaris_2 = "HISTFILE=/dev/null"
$solaris_3 = "MYSQL_HISTFILE=/dev/null"
condition:
uint32(0) == 0x464C457F and
(
(all of ($pty*) and (2 of ($bind_port*) or $ps1)) or //v1.1
((all of ($pty*) or $ps1) and 2 of ($bind_port*)) or //v1.1
(1 of ($bpf_filter*)) or
($md5_salt or $pname) or
(all of ($solaris*))
)
}
rule ELF_BPFDoor_Controller
{
meta:
description = "BPFDoor Malware(ELF) Controller Detection rule"
author = "KrCERT/CC Threat Hunting Analysis Team"
date = "2025-05-06"
hash = "93f4262fce8c6b4f8e239c35a0679fbbbb722141b95a5f2af53a2bcafe4edd1c"
hash = "1925e3cd8a1b0bba0d297830636cdb9ebf002698c8fa71e0063581204f4e8345"
hash = "591198c234416c6ccbcea6967963ca2ca0f17050be7eed1602198308d9127c78"
ver = "1.1"
strings:
// v1.1 : added new pattern
$pname = /\/usr\/sbin\/[a-z]{2,8}/
$str_1 = "[-] option requires an argument -- d"
$str_2 = ":h:d:l:s:b:t:"
// mov cs:magic_flag, 5571h
$magic = {C7 05 ?? ?? ?? 00 71 55 00 00}
$env_1 = "export TERM=vt100"
$env_2 = "export MYSQL_HISTFILE=/dev/null"
$env_3 = "export HISTFILE=/dev/null"
$env_4 = "unset PROMPT_COMMAND"
$env_5 = "export HISTSIZE=100"
condition:
uint32(0) == 0x464C457F and
($pname or 1 of ($str*)) and $magic and (all of ($env*))
}
참고URL
- KISA 보호나라 & KrCERT/CC : 보안공지
- KISA 보호나라 & KrCERT/CC 첨부파일 : 250512_KISA_BPFDoor_악성코드_점검_가이드.pdf
- PIOLINK 보안 위협 분석 : BPFDoor 악성코드 상세 점검 도구 배포 안내 (다운로드)
'이슈(보안)' 카테고리의 다른 글
BPFDoor 악성코드 점검 스크립트 (0) | 2025.05.21 |
---|---|
Elasticsearch, 오픈 소스로의 귀환! (0) | 2024.11.19 |
[isms-p] 정보보호 및 개인정보보호 관리체계 인증제도 안내서 (0) | 2024.09.09 |
[보안] 2024 클라우드 보안 가이드 (AWS, AZURE, GCP) (0) | 2024.04.04 |
금융권 망분리 규제 개선(완화) (0) | 2023.10.27 |