Post

BPF Door: 리눅스 커널 백도어 분석

BPF Door: 리눅스 커널 백도어 분석

BPF Door: 리눅스 커널 백도어, 서버 개발자를 위한 심층 분석

BPF(Berkeley Packet Filter)는 리눅스 커널 내부의 강력한 기술로, 원래 네트워크 패킷 필터링을 위해 설계되었습니다. 하지만 eBPF(extended BPF)로 진화하면서 그 기능이 폭발적으로 확장되었고, 이로 인해 커널 레벨에서 다양한 작업을 수행할 수 있게 되었습니다. BPF Door는 바로 이 eBPF의 강력한 기능을 악용하여 커널 내부에 은밀한 백도어를 구축하는 신종 공격 기법입니다. 이 글은 BPF Door의 기술적 원리와 공격 방어 및 탐지 방법에 대해 서버 개발자 관점에서 깊이 있게 다룹니다.

BPF Door의 역사적 배경과 등장 원인

BPF는 1992년 TCPDUMP를 위해 도입된 기술로, 커널에 패킷 필터링 규칙을 올리는 역할을 했습니다. 그러나 정적인 기능에 그쳤던 BPF는 2014년 eBPF로 재탄생하며 커널 내에서 동적으로 사용자 정의 프로그램을 실행할 수 있는 가상 머신(Virtual Machine)으로 발전했습니다. eBPF는 프로그램 실행 전 Verifier라는 컴포넌트를 통해 안전성을 검증받고, JIT(Just-In-Time) 컴파일러를 통해 네이티브 코드로 변환되어 커널에서 초고속으로 실행됩니다. 이로 인해 eBPF는 네트워크, 보안, 성능 분석 등 다양한 분야에서 혁신을 이끌었습니다.

하지만 eBPF의 유연성과 커널 레벨에서의 실행 권한은 새로운 보안 위협의 가능성을 열었습니다. BPF Door 공격은 이와 같은 eBPF의 특성을 악용하여, 시스템 콜을 가로채거나 네트워크 트래픽을 조작하는 등 일반적인 방법으로는 탐지하기 어려운 백도어를 생성합니다.


BPF Door의 동작 원리: 커널 내부 후킹

BPF Door 공격의 핵심은 eBPF의 커널 훅(Hook) 메커니즘을 이용하는 것입니다. eBPF 프로그램은 특정 이벤트가 발생할 때 실행되도록 커널에 연결(Attach)될 수 있습니다. 공격자는 이 메커니즘을 악용하여, 특정 시스템 콜이나 네트워크 이벤트에 악성 BPF 프로그램을 연결합니다.

1. 악성 BPF 프로그램 작성 및 로드

공격자는 먼저 bpf() 시스템 콜을 통해 악성 BPF 프로그램을 커널에 로드합니다. 이 프로그램은 특정한 조건을 만족했을 때(예: 특정 포트로 비밀번호를 포함한 패킷이 도착했을 때) 특정 악성 행위를 수행하도록 설계됩니다. 예를 들어, accept() 시스템 콜의 인자를 조작하여 특정 IP 주소의 연결만 허용하거나, execve() 시스템 콜을 호출하여 셸을 실행할 수 있습니다.

2. 커널 훅(Attach)

로드된 BPF 프로그램은 다음과 같은 훅을 통해 커널 이벤트에 연결됩니다.

  • Socket 훅 (XDP, cBPF): 네트워크 인터페이스의 드라이버 레벨 또는 소켓 레벨에서 패킷을 가로채고 조작합니다. BPF Door 공격자는 이 훅을 사용하여 특정 매직 패킷(Magic Packet)이 도착하면 백도어를 활성화합니다.
  • Tracepoint/kprobe: 특정 커널 함수(connect, accept, bind 등)의 실행 전후에 BPF 프로그램을 실행시킬 수 있습니다. 이를 통해 공격자는 특정 시스템 콜을 모니터링하거나, 심지어 함수의 인자를 조작하여 시스템의 동작을 왜곡할 수 있습니다.

3. 은밀한 백도어 실행

공격자가 외부에서 특정 시그니처를 포함한 네트워크 패킷을 보내면, 커널에 연결된 악성 BPF 프로그램이 이를 감지하고 백도어 로직을 실행합니다. 이 모든 과정은 커널 레벨에서 발생하기 때문에, ps, netstat, ss와 같은 사용자 공간의 도구로는 해당 연결이나 프로세스를 전혀 확인할 수 없습니다.


BPF Door 확인 및 방어 방법

BPF Door는 매우 은밀하게 동작하지만, 전용 도구와 체계적인 접근을 통해 충분히 탐지하고 방어할 수 있습니다.

1. bpftool을 이용한 BPF 프로그램 확인

bpftool은 eBPF와 관련된 모든 정보를 관리하는 공식 도구입니다. 이 도구를 사용하면 현재 시스템에 로드된 모든 BPF 프로그램과 맵(Map)을 확인할 수 있습니다.

1
2
3
4
5
# 로드된 모든 BPF 프로그램 목록 확인
bpftool prog show

# 특정 BPF 프로그램의 상세 정보와 연결(Attach) 정보 확인
bpftool prog show id <program_id>

의심스러운 BPF 프로그램이 socket이나 tracepoint에 연결되어 있다면 주의 깊게 분석해야 합니다. 특히, 알 수 없는 프로그램이 시스템에 로드되어 있다면, 해당 프로그램의 출처와 목적을 확인해야 합니다.

2. 감사 로그(Audit Log) 모니터링

auditd와 같은 시스템 감사 도구를 활용하여 bpf() 시스템 콜 호출을 모니터링할 수 있습니다. BPF 프로그램 로드에는 높은 권한이 필요하며, 일반적인 애플리케이션에서는 이 시스템 콜을 거의 사용하지 않습니다. 따라서 bpf() 시스템 콜이 비정상적으로 호출될 경우, 이는 공격의 징후일 수 있습니다.

1
2
# `bpf()` 시스템 콜 로깅 규칙 추가
auditctl -a always,exit -F arch=b64 -S bpf -k bpf_syscall

이 규칙을 추가하면, bpf() 시스템 콜이 호출될 때마다 /var/log/audit/audit.log에 기록됩니다. 이 로그를 정기적으로 분석하면 잠재적인 위협을 조기에 발견할 수 있습니다.

3. 최소 권한 원칙(Principle of Least Privilege) 적용

BPF 프로그램을 로드하고 훅을 설정하려면 CAP_SYS_ADMIN 또는 CAP_BPF 권한이 필요합니다. 컨테이너 환경에서는 securityContext를 통해 컨테이너의 권한을 엄격하게 제한하여, 공격자가 악성 BPF 프로그램을 로드할 수 없도록 해야 합니다. 특히, CAP_SYS_ADMIN 권한은 커널의 거의 모든 기능을 사용할 수 있는 강력한 권한이므로, 꼭 필요한 경우에만 최소한으로 부여해야 합니다.

4. BPF 기반 보안 도구 활용

BPF 기반 보안 도구는 아이러니하게도 BPF Door 공격을 탐지하는 가장 효과적인 방법 중 하나입니다. FalcoTracee와 같은 도구는 BPF를 사용하여 시스템 콜 및 커널 이벤트를 실시간으로 모니터링하고, 사전 정의된 규칙에 위배되는 행위를 탐지합니다. 예를 들어, Falcobpf() 시스템 콜이 예상치 않은 프로세스에서 호출될 경우 경고를 발생시킬 수 있습니다.


결론

BPF Door는 기존의 보안 솔루션으로는 탐지하기 어려운 새로운 형태의 위협입니다. 이 공격은 커널 레벨에서 은밀하게 동작하며 시스템의 기본 동작을 왜곡합니다. BPF Door에 효과적으로 대응하기 위해서는 eBPF의 동작 원리에 대한 깊은 이해를 바탕으로, bpftool을 이용한 정기적인 시스템 점검, auditd를 활용한 시스템 콜 모니터링, 그리고 최소 권한 원칙의 철저한 적용이 필수적입니다. 강력한 BPF 기반 보안 도구를 활용하는 것도 좋은 방어 전략이 될 수 있습니다.

This post is licensed under CC BY 4.0 by the author.