분석 정보/리눅스 분석 정보

BPFDoor 변종 발견 및 유형별 BPF 필터 코드 차이점 비교

TACHYON & ISARC 2023. 9. 1. 16:08

1. 개요

올해 5, BPFDoor 악성코드의 새로운 버전이 발견됐다. BPFDoor 악성코드는 커널 필터링 기능인 BPF(Berkley Packet Filter)를 사용해 들어오는 트래픽을 방화벽이 탐지하기 전에 필터링한다. 필터링을 통과한 후에는 감염된 PC에서 공격자가 보낸 데이터나 명령에 따른 행위를 수행한다.

 

BPFDoor 변종의 주요 특징은 공격자의 C&C 서버와 통신하는 방식을 변경했다는 점이다. 이전 버전은 바인드 셸 방식과 iptables의 규칙을 변경해 네트워크를 연결했었다. 그러나 변종 악성코드에서는 리버스 셸 방식으로 네트워크를 연결한 후 공격자가 전송한 명령을 실행한다. 추가로 프로그램 내부에서 매직 패킷(Magic Packet)을 확인해 필터를 통과한 경우에만 네트워크를 연결한다는 특징이 있다.

BPFDoor와 관련한 정보는 자사 블로그에 소개한 바가 있으며, 아래의 링크에서 확인할 수 있다.

2022.08.09 - 리눅스 환경에서 패킷 필터를 악용하는 BPFDoor 악성코드 발견

 

이외에도 BPF 필터 코드의 차이에 따라 A에서 E까지 총 5개의 유형으로 분류된다. 이중, A 유형과 B 유형은 약 30개의 BPF 명령을 사용하는데 B 유형에는 TCP 헤더에서 매직 패킷을 확인하는 코드가 추가됐다. C 유형과 D 유형은 약 200개의 명령을 사용하며 감염된 PC MAC 주소를 확인한다는 특징이 있고, D 유형에서는 ICMP 헤더에서 ICMP_ECHO를 추가로 확인한다. 마지막으로 E 유형은 다른 유형들과 달리 IPv6 패킷을 필터링하는 코드가 추가됐다.

 

현재, 해외 보안 업체에서는 해당 악성코드가 중국에서 활동하는 Red Menshen APT 조직과 관련이 있다고 보고있다. 2021년부터 활동을 시작한 Red Menshen은 아시아와 중동 지역의 기관과 업체들을 주로 공격한다고 알려졌다. 또한, 이 조직이 사용하는 BPFDoor의 변종 유형들이 계속 발견되고 있어 주의가 필요하다.

 

 

2. 분석

2.1. 중복 실행 여부 확인

먼저, BPFDoor는 잠금 대상 파일을 생성한 후 락을 설정해 추가 접근을 막고 자기자신이 중복으로 실행되지 않도록 만든다.

- 잠금 대상 파일 : /var/run/initd.lock

 

[그림 1] 잠금 대상 파일 확인

 

2.2. 패킷 필터링

그후, RAW 소켓을 생성하고 공격자가 미리 만들어둔 BPF 필터를 리눅스 커널에 로드한다. [그림 2]와 같이 SO_ATTACH_FILTER 옵션을 사용하면 생성한 소켓에 클래식 BPF 필터를 적용할 수 있다.

- BPFDoor가 등록하는 BPF 필터 코드 요약

n Ethernet Type : IPv4, IPv6

n Protocol : TCP, UDP, SCTP

n Port : SSH, HTTP, HTTPS

 

[그림 2] 소켓 생성 및 BPF 필터 설정

 

[그림 2]의 과정에서 등록한 BPF 코드는 SSH, HTTP HTTPS 포트로 유입되는 패킷 중 TCP, UDP SCTP 트래픽만 필터링을 통과하도록 설정하며, 이 필터링은 IPv4IPv6 모두에 적용한다. [그림 3] IPv6와 관련된 BPF 코드와 그에 따른 설명이다.

 

[그림 3] BPF 필터 코드

 

프로세스에서 등록한 BPF 필터 코드는 네트워크 소켓 정보를 보여주는 ss(Socket Statistics) 명령어를 사용해 확인할 수 있다.

 

[그림 4] BPF 필터 코드 확인 명령

 

[그림 2]에서 등록한 BPF 필터를 통과한 패킷은 추가 필터링을 진행한다. 이 과정에서는 [그림 5]와 같이 TCP 헤더의 Sequence NumberAcknowledgment Number에 설정된 값을 확인한다.

- 패킷 필터링 정보

n TCP Header. Sequence Number : 0x4430cd97

n TCP Header. Acknowledgement Number : 0x5e142766

 

[그림 5] 추가 패킷 필터링

 

2.3. 네트워크 명령

이전 단계에서의 필터링을 모두 통과하면 리버스 셸 방식으로 공격자와 연결한 후, 명령이 포함된 데이터를 수신한다. BPFDoor에서 사용하는 명령은 cd, exit popen이며 만약, 개행 문자를 \r\n으로 잘못 사용했을 경우에는 명령 루틴을 진행하지 않고 다시 한 번 데이터 수신을 시도한다.

 

A. cd 명령

공격자가 운영하는 C&C 서버로부터 수신한 데이터에 cd 문자열이 있으면 chdir 함수를 사용해 현재 작업 디렉토리를 지정한 경로로 변경한다.

- ex) [cd] [변경할 경로]

 

 

B. exit 명령

공격자가 운영하는 C&C 서버로부터 수신한 데이터에 exit 명령이 있으면 프로세스를 종료한다.

 

C. etc popen 명령

공격자가 보낸 데이터에 cdexit 명령이 없으면 수신한 데이터를 명령으로 보고 실행한다. 이 과정에서 데이터에 2>&1 문자열을 추가해 표준 에러를 표준 출력으로 리다이렉션 하도록 지정한 후 popen 함수로 실행한다.

- ex) [popen] [command] [ 2>&1]

- popen 성공 : C&C 서버로 실행한 명령의 결과를 보낸다.

- Popen 실패 : C&C 서버로 실패 문자열([-] Execute command failed\n) 을 보낸다.


[그림 6] popen 함수를 사용한 명령 실행

 

 

3. 유형별 BPF 필터 코드 비교

BPF 필터 코드는 특징에 따라 총 5개의 유형으로 분류하며 이 중 E 유형에 대한 내용은 [2.2. 패킷 필터링]에서 설명했다.

 

3.1. A 유형

A 유형의 BPF 필터는 총 30개의 BPF 명령어를 사용해 TCP, UDP ICMP 트래픽만 필터링을 통과시킨다. 이 중 UDP TCP 헤더에서 각각 0x7255 0x5293값을 확인하며, ICMP 헤더에서는 0x7255 값을 확인한 후 추가로 ICMP_ECHO 메시지도 확인한다.

 

[표 1] A 유형 필터

 

3.2. B 유형

B 유형은 총 39개의 BPF 명령을 사용하며, TCP 헤더에서 데이터의 위치를 파악한 후 그 위치에서 0x39393939라는 매직 넘버를 비교한다.

- 매직 넘버 필터 : tcp[((tcp[12] & 0xf0) >> 2):2] = 0x39393939

 

 

[그림 7] B 유형 매직 패킷 확인

 

3.3. C 유형

C 유형에서 사용하는 BPF 명령어는 총 205개로 A B 유형에 비해 증가했다. 가장 먼저 목적지의 MAC 주소가 0x4 또는 0x6으로 시작하는지 확인하는데 이 중, 0x4로 시작하는 경우에만 필터링을 정상적으로 진행한다. 이와 관련해 공격자 측의 의도가 특정 MAC 주소를 사용하는 업체를 대상으로 공격할 목적이었을 거라고 추정되지만 아직 명확하게 확인되지 않았다.

 

[그림 8] C 유형 MAC 주소 확인

 

3.4. D 유형

D 유형은 총 229개의 BPF 명령을 사용하며, ICMP 헤더에서 ICMP echo request 메시지를 확인하는 코드가 추가됐다.

 

[그림 9] D 유형 – ICMP_ECHO

 

4. 결론

이번 보고서에서 언급한 "BPFDoor" 악성코드는 리눅스의 패킷 필터링 기능을 활용해 탐지를 회피한다. 더욱이 필터 조건과 동작이 일부 변경된 변종 샘플이 발견되고 있어 지속적인 모니터링과 주의가 필요하다. 따라서, 백신 프로그램의 실시간 감시를 활성화하고 항상 최신 버전으로 유지해야 한다. 또한, 리눅스 서버 관리자는 패킷 필터링 규칙과 로그를 주기적으로 확인할 것을 권고한다.