본문 바로가기

이슈(보안)

BPFDoor 악성코드 점검 가이드 배포

반응형

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) > 침해사고 신고 > 신고하기

 

 

□ 작성 : 위협분석단 종합분석팀

 

728x90

[붙임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 악성코드 상세 점검 도구 배포 안내 (다운로드)

 

반응형