
CVE-2026-31431 분석 및 완화 가이드: Linux 커널 crypto algif_aead 하위 시스템의 로컬 권한 상승 취약점으로, RHEL 및 OpenShift에 대한 영향 평가와 seccomp 및 SCC 강화를 포함합니다.
Linux 커널 crypto algif_aead 서브시스템의 로컬 권한 상승 취약점.
CVE-2026-31431, 일명 "Copy Fail"은 Linux 커널의 authencesn 암호화 템플릿(algif_aead)에 존재하는 로직 버그입니다. 이 취약점으로 인해 권한이 없는 로컬 사용자가 읽기 가능한 모든 파일의 페이지 캐시에 통제된 4바이트 쓰기를 수행할 수 있으며, 이를 활용하여 setuid 바이너리를 변조하고 루트 권한을 획득할 수 있습니다.
a664bf3d603d| 날짜 | 이벤트 |
|---|---|
| 2026-03-23 | Linux 커널 보안 팀에 보고 |
| 2026-04-01 | 메인라인에 패치 커밋 |
| 2026-04-22 | CVE 지정 |
| 2026-04-29 | 공개 공개 |
이 익스플로잇은 두 가지를 요구합니다: AF_ALG 소켓(모든 seccomp 프로필에서 기본적으로 허용됨)과 setuid 바이너리(예: /usr/bin/su). 핵심 완화 조치는 allowPrivilegeEscalation: false입니다 — 이는 Linux 커널의 no_new_privs 플래그를 prctl(PR_SET_NO_NEW_PRIVS, 1)을 통해 설정하며, 이로 인해 커널은 execve() 시 setuid/setgid 비트를 무시합니다. 익스플로잇이 변조된 setuid 바이너리 실행에 의존하므로, 이는 최종 권한 상승 단계를 차단합니다.
이는 OpenShift 전용 기능이 아닙니다 — 바닐라 Kubernetes(Pod Security Standards Restricted), Docker(--security-opt no-new-privileges), Podman에서도 동일하게 작동합니다. OpenShift는 단순히 restricted-v2 SCC를 통해 기본적으로 이를 강제하는 반면, 다른 플랫폼은 명시적 구성이 필요합니다.
RHEL 8 및 RHEL 9는 취약한 코드가 포함된 커널을 제공합니다. 셸 접근 권한이 있는 권한 없는 로컬 사용자는 이를 악용하여 루트 권한을 획득할 수 있습니다. 즉시 패치하십시오.
yum updateinfo list cves CVE-2026-31431
yum update kernel
OpenShift는 취약한 커널을 제공하는 RHCOS에서 실행됩니다. 실제 영향은 워크로드의 SCC(Security Context Constraints)에 따라 달라집니다.
기본 restricted-v2 SCC를 사용하는 표준 워크로드는 allowPrivilegeEscalation: false가 강제되므로 악용할 수 없습니다.
상승된 SCC(anyuid, privileged, 또는 allowPrivilegeEscalation: true를 허용하는 사용자 정의 SCC)로 실행되는 Pod는 취약합니다. 여기에는 일반적으로 다음이 포함됩니다:
anyuid가 필요한 레거시 애플리케이션직접 노드 접근(예: oc debug node/ 사용)은 항상 취약합니다 — 표준 로컬 권한 상승이며, 컨테이너 격리가 관련되지 않습니다.
클러스터에서 익스플로잇 전제 조건이 충족되는지 확인하기 위한 테스트 Pod가 제공됩니다. 이는 취약점을 악용하려고 시도하지 않습니다 — 다음만 확인합니다:
AF_ALG 소켓을 생성할 수 있습니까? (커널 공격 표면 도달 가능)no_new_privs가 설정되어 있습니까? (setuid 권한 상승 차단)oc apply -f test-pod.yaml
oc logs cve-2026-31431-check
oc delete -f test-pod.yaml
Deployment 변형을 사용하여 복제본 확장 또는 Pod 안티-어피니티를 통해 여러 노드에서 테스트할 수 있습니다:
oc apply -f test-deployment.yaml
oc logs -l app=cve-2026-31431-check
oc delete -f test-deployment.yaml
| 코드 | 의미 |
|---|---|
0 | 악용 불가 — AF_ALG 소켓이 seccomp에 의해 차단됨 |
1 | 부분 노출 — AF_ALG 도달 가능하지만 setuid가 no_new_privs에 의해 차단됨 |
2 | 취약 — 모든 익스플로잇 전제 조건 충족 |
restricted-v2 SCC를 사용하는 표준 OpenShift 클러스터에서는 종료 코드 1(부분 노출)이 표시되어야 합니다: AF_ALG 소켓을 생성할 수 있지만(RuntimeDefault seccomp는 이를 차단하지 않음), no_new_privs가 setuid 권한 상승 단계를 방지합니다. 공개된 PoC는 작동하지 않지만, 커널 수준 취약점은 여전히 도달 가능합니다 — 패치가 권장됩니다.
이것이 유일한 완전한 수정입니다. 모든 노드의 커널을 업데이트하고 재부팅하십시오.
OpenShift의 경우, 수정 사항이 포함된 RHCOS 버전으로 업데이트하고 롤링 노드 재부팅을 수행하십시오.
algif_aead가 로드 가능한 모듈(CONFIG_CRYPTO_USER_API_AEAD=m)로 컴파일된 경우:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true
algif_aead가 내장(=y)된 경우에는 작동하지 않습니다, 이는 RHCOS의 경우입니다. 다음으로 확인하십시오:
modinfo algif_aead 2>&1 | grep builtin
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
커널 모듈이 내장된 경우, 패치 전 컨테이너를 위한 유일한 완화 조치는 사용자 정의 seccomp 프로필을 통해 socket(AF_ALG, ...) syscall을 차단하는 것입니다.
모든 노드에 프로필을 배치하기 위한 MachineConfig를 생성합니다(컨트롤 플레인 노드의 경우 role: master로 반복):
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: 99-worker-seccomp-deny-af-alg
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /var/lib/kubelet/seccomp/deny-af-alg.json
mode: 0644
contents:
source: data:application/json;charset=utf-8;base64,ewogICJkZWZhdWx0QWN0aW9uIjogIlNDTVBfQUNUX0FMTE9XIiwKICAic3lzY2FsbHMiOiBbCiAgICB7CiAgICAgICJuYW1lcyI6IFsic29ja2V0Il0sCiAgICAgICJhY3Rpb24iOiAiU0NNUF9BQ1RfRVJSTk8iLAogICAgICAiYXJncyI6IFsKICAgICAgICB7CiAgICAgICAgICAiaW5kZXgiOiAwLAogICAgICAgICAgInZhbHVlIjogMzgsCiAgICAgICAgICAib3AiOiAiU0NNUF9DTVBfRVEiCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXQp9
base64 콘텐츠는 다음으로 디코딩됩니다:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{
"index": 0,
"value": 38,
"op": "SCMP_CMP_EQ"
}
]
}
]
}
참고: MachineConfig 적용 시 롤링 노드 재부팅이 트리거됩니다.
securityContext:
seccompProfile:
type: Localhost
localhostProfile: deny-af-alg.json
Pod 사양을 수정하지 않고 모든 컨테이너를 보호하려면, 기존 프로필에 AF_ALG 필터 규칙을 추가하여 MachineConfig를 통해 CRI-O 기본 seccomp 프로필(/etc/crio/seccomp.json)을 재정의하십시오.
상승된 권한으로 실행되는 Pod 식별:
# restricted-v2를 사용하지 않는 Pod 찾기
oc get pods -A -o json | jq -r '
.items[] |
select(.metadata.annotations["openshift.io/scc"] != "restricted-v2") |
"\(.metadata.namespace)/\(.metadata.name) → \(.metadata.annotations["openshift.io/scc"])"
'
이것들이 전체 익스플로잇 체인이 작동하는 Pod입니다. 이러한 워크로드를 실행하는 노드에 대해 패치 또는 seccomp 완화를 우선적으로 적용하십시오.
AF_ALG 소켓 차단은 대부분의 워크로드에 무시할 수 있는 영향을 미칩니다. 다음은 영향을 받지 않습니다:
OpenSSL afalg 엔진을 사용하도록 명시적으로 구성된 애플리케이션만 영향을 받습니다.
| 환경 | allowPrivilegeEscalation | 컨테이너 루트 | 호스트 루트 | 위험도 |
|---|
| RHEL 8 / RHEL 9 (로컬 사용자) | n/a | n/a | 예 | 치명적 |
OpenShift 노드 (셸 접근, 예: oc debug node/) | n/a | n/a | 예 | 치명적 |
OpenShift Pod — restricted-v2 SCC (기본값) | false | 아니요 | 아니요 | 낮음 |
OpenShift Pod — anyuid SCC | true | 예 | 아니요 (네임스페이스 격리) | 높음 |
OpenShift Pod — privileged SCC | true | 예 | 예 (격리 없음) | 치명적 |
| OpenShift Pod — 사용자 정의 SCC | 상황에 따라 다름 | 상황에 따라 다름 | 상황에 따라 다름 | 감사 필요 |
| Kubernetes Pod — PSS Restricted | false | 아니요 | 아니요 | 낮음 |
| Kubernetes Pod — PSS Baseline / 정책 없음 | true (기본값) | 예 | 아니요 | 높음 |
Docker / Podman — --security-opt no-new-privileges | false | 아니요 | 아니요 | 낮음 |
| Docker / Podman — 기본값 | true | 예 | 아니요 | 높음 |