FL-002 Falco RBAC Check Log
공격 행위 요약
FL-002는 NodeFall 캠페인에서 공격자가 장악한 Pod 내부에서 Kubernetes 권한을 확인하는 행위를 설명하는 로그이다. 공격자는 ServiceAccount 토큰을 확보한 뒤, 자신이 kube-system 네임스페이스에 Pod를 생성할 수 있는지 확인하기 위해 SelfSubjectAccessReview 요청을 준비하고 API 서버로 전송했다.
이 로그는 단순한 파일 접근이나 토큰 경로 탐색이 아니라, 공격자가 현재 권한으로 다음 단계 행위가 가능한지 검증하는 지점을 확인하는 데 사용한다. 특히 check-create.json 생성과 selfsubjectaccessreviews API 요청이 이어지면, 이후 특권 Pod 생성이나 컨테이너 탈출 시도로 연결될 가능성이 높다.
로그 발생 위치
| 구분 | 위치 | 설명 |
| K8s Node | Linux Kernel syscall | 컨테이너 내부에서 cat, curl 등의 프로세스 실행과 파일 생성 행위가 syscall로 발생 |
| K8s Node | falco-modern-bpf.service | Falco가 syscall을 관찰하고 RBAC 확인 행위와 매칭되면 탐지 이벤트 생성 |
| 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 22 01:59:51 ip-10-0-133-48 falco[530]: 01:59:51.523409266: Notice nodefall_rbac_manifest_staged [NF2] RBAC Manifest (user=nextjs proc=bash cmd=bash cwd=/tmp/ file=/tmp/check-create.json container=react-app pod=react-app-685875587f-hv72r ns=default) container_id=283cb33c1045 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 22 02:00:05 ip-10-0-133-48 falco[530]: 02:00:05.238379653: Error nodefall_rbac_ssar_submitted [NF2] RBAC Check (user=nextjs proc=curl cmd=curl -k -H Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImdvZlBXTC1kUlpjUHdocmJZZnNmaHNxaUFtTFJuS3JSM1FtQWxfek5BOTgifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODEwOTQ3OTE0LCJpYXQiOjE3Nzk0MTE5MTQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNjMyOTFlNGQtMzllMi00ZjAzLWFiOTYtZGJkMTJlYWFlMWVhIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwibm9kZSI6eyJuYW1lIjoiaXAtMTAtMC0xMzMtNDgiLCJ1aWQiOiIwNGZjMDU0Ny1mYTNkLTRlZGYtOGYxMi04NDU1YWE1MTgzZjkifSwicG9kIjp7Im5hbWUiOiJyZWFjdC1hcHAtNjg1ODc1NTg3Zi1odjcyciIsInVpZCI6IjUyZjMyODI5LWU2YzAtNGJiNS1hNjY0LTM2OTE0MmNlNzdjYSJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiZGVmYXVsdCIsInVpZCI6IjIwNDI1Mjk5LTRjZTQtNGY3ZS05YzBmLTBiZTVhOGE0MDk5ZSJ9LCJ3YXJuYWZ0ZXIiOjE3Nzk0MTU1MjF9LCJuYmYiOjE3Nzk0MTE5MTQsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.MKX4gpO4cG9NW4cey8rMj1QBv4ro4Smv5F6ZLf2E8XcvVhVQHFHdgArYwcv_szaMFM-kJtpDk4Vbzcb5SHR253MNUKY8NSjSYG6pv-dyaZXkw76q3OtolVVQucdnKGUkTNEkn4rbdSgpGnk7tkeseqJbJP5rvndmwpdJ9FPf6gPGTGznFC48LBAhPNStSdXXZG7F-HWx5lDrIEX--ptpnozUGKAsu6GBOki1tiA7yN_wV0TCmgzHD0dqBOx3x4D2JfpNgThqFb6E_BqRDNfy6N6qJL2M5v5RAHwtTZQ7-56UkJGpFydnTIEdfINlEb1x1Vxzd3MNZfQHqEOdWo-fww -H
Content-Type: application/json -X POST https://kubernetes.default.svc/apis/authorization.k8s.io/v1/selfsubjectaccessreviews -d @check-create.json container=react-app pod=react-app-685875587f-hv72r ns=default) container_id=283cb33c1045 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 탐지 이벤트 발생 시간 | 01:59:51.523409266, 02:00:05.238379653 |
priority | Falco 탐지 심각도 | Notice, Error |
rule/message | Falco가 탐지한 행위명 | nodefall_rbac_manifest_staged [NF2] RBAC Manifest, nodefall_rbac_ssar_submitted [NF2] RBAC Check |
user | 행위를 수행한 컨테이너 내부 사용자 | nextjs |
proc | 실행된 프로세스 | bash, curl |
cmd | 실행된 명령어 또는 인자 | bash, curl -k -H Authorization: Bearer <REDACTED> ... selfsubjectaccessreviews -d @check-create.json |
cwd | 명령 실행 위치 | /tmp/ |
file | 생성 또는 참조된 파일 | /tmp/check-create.json, check-create.json |
api_path | Kubernetes 권한 확인 요청 대상 | /apis/authorization.k8s.io/v1/selfsubjectaccessreviews |
container_name | 행위가 발생한 컨테이너 이름 | react-app |
container_id | 컨테이너 식별자 | 283cb33c1045 |
container_image_repository | 컨테이너 이미지 저장소 | docker.io/library/react2shell-vulnlab-hi-react2shell-tribune |
container_image_tag | 컨테이너 이미지 태그 | latest |
k8s_pod_name | 행위가 발생한 Kubernetes Pod | react-app-685875587f-hv72r |
k8s_ns_name | Pod가 속한 namespace | default |
message | journald에 기록된 Falco 원본 로그 | Notice nodefall_rbac_manifest_staged ..., Error nodefall_rbac_ssar_submitted ... |
커버 대상 Techniques Used
| Technique | Mapping Reason |
| T1613 Container and Resource Discovery | 장악한 Pod 내부에서 ServiceAccount 토큰을 이용해 Kubernetes API 서버에 접근하고, SelfSubjectAccessReview 요청을 통해 자신에게 부여된 RBAC 권한을 확인하는 행위를 탐지한다. |
탐지 포인트
| Technique | 관찰 행위 | 주요 필드 |
| T1613 Container and Resource Discovery | 장악한 컨테이너 내부에서 Kubernetes 권한 확인용 SelfSubjectAccessReview 매니페스트가 생성되는지 확인한다. 이후 API 서버 권한 질의로 이어질 수 있는 RBAC 정찰 준비 행위로 본다. | rule/message, user, proc, cmd, cwd, file, container_name, k8s_pod_name, k8s_ns_name |
| T1613 Container and Resource Discovery | curl 또는 kubectl을 통해 Kubernetes API 서버의 selfsubjectaccessreviews 엔드포인트로 요청이 전송되는지 확인한다. 이는 공격자가 현재 토큰으로 어떤 리소스 권한을 가졌는지 검증하는 핵심 행위다. | rule/message, proc, cmd, user, container_id, container_name, k8s_pod_name, k8s_ns_name |
| T1613 Container and Resource Discovery | 요청 대상이 /apis/authorization.k8s.io/v1/selfsubjectaccessreviews 인지 확인한다. 특히 kube-system 네임스페이스의 pods/create 권한 확인과 연결되면 이후 특권 Pod 생성 및 컨테이너 탈출 시도로 이어질 가능성이 높다. | cmd, proc, user, container_name, k8s_pod_name, k8s_ns_name, message |