
시스템이 cve-2026-23111에 취약한지 확인하는 스크립트
CVE-2026-23111은 nf_tables에서 발생하는 리눅스 커널 취약점으로, 사용자 네임스페이스(user namespaces)와 nftables가 활성화된 시스템에서 권한이 없는 사용자가 로컬 권한 상승에 악용할 수 있습니다.[1][2] 공공 벤더 및 정부 권고에서는 이를 리눅스 배포판에 영향을 미치는 로컬 문제로 설명하며, 패치 적용을 주요 해결 방안으로 강조합니다.[3][4]
이 리포지토리는 방어적 검증 스크립트를 포함하고 있으며, 이는 권한 상승 익스플로잇을 제공하지 않고 호스트가 해당 CVE와 관련된 기술적 조건을 노출하는지 평가하는 데 도움을 주도록 설계되었습니다. 실행 중인 커널 및 런타임 조건을 확인하고, 선택적으로 nf_tables 모듈을 전체 기능 테스트를 위해 로드하며, unshare 및 nft를 사용하여 제한된 비권한 검증 경로를 시도하고, 로컬 진단 트레이스를 수집하며, 호스트를 'likely safe', 'blocked by local policy', 'exposed path available'과 같은 운영적 판정으로 분류합니다.[1][5]
NVD에 따르면, CVE-2026-23111은 netfilter에서 로직 버그 수정으로 해결된 리눅스 커널 nf_tables 취약점이며, 영향을 받는 구성에서 권한 없는 사용자가 사용자 네임스페이스와 nftables를 통해 로컬 권한 상승에 악용될 수 있습니다.[1] 우분투의 보안 공지에서는 동일한 상위 수준의 악용 경로를 설명하고, 각 릴리스별로 영향을 받는 패키지와 수정된 패키지 상태를 추적합니다.[2]
Red Hat은 로컬의 낮은 권한 사용자가 해당 문제를 악용하여 서비스 거부를 일으키거나 잠재적으로 권한 상승을 달성할 수 있다고 밝히며, nf_tables 모듈이 운영적으로 허용 가능할 때 해당 모듈의 로드를 차단하는 완화 경로를 문서화하고 있습니다.[3] 캐나다 사이버 보안 센터(Canadian Centre for Cyber Security)의 국가 차원 지침도 영향을 받는 조직에 벤더 업데이트를 참조하도록 하고, 모듈 차단 완화 조치를 사용할 때 initramfs 재생성을 언급합니다.[4]
이 스크립트는 방어적 노출 평가를 위한 것이며, 악용(exploitation)을 위한 것이 아닙니다. 다음과 같은 목적으로 설계되었습니다:
CONFIG_USER_NS 및 CONFIG_NF_TABLES가 존재하는지 확인합니다.[1]kernel.unprivileged_userns_clone 및 user.max_user_namespaces를 검사하여 권한 없는 사용자 네임스페이스가 사용 가능한지 추정합니다.nf_tables 모듈에 대해 하드 modprobe 거부(install nf_tables /bin/false) 또는 약한 블랙리스트가 설정되어 있는지 탐지합니다.nft_map_catchall_activate)과 패치 후 심볼(nft_catchall_set_activate)을 /proc/kallsyms에서 식별합니다.--allow-load-module이 지정된 경우(아래 참조) modprobe를 통해 nf_tables를 선택적으로 로드하고, 종료 시 자동으로 언로드합니다.스크립트는 스크립트 디렉터리의 하위 디렉터리에 로그를 저장하며, --keep-logs가 사용되지 않으면 기본적으로 제거합니다.
기본적으로 스크립트는 절대로 nf_tables를 로드하지 않습니다. 스크립트가 시작될 때 모듈이 이미 로드되어 있지 않으면, 모든 기능적 nft 테스트는 건너뛰어지고 판정은 커널 버전, kallsyms 지문, modprobe 구성, RPM 체인지로그, sysctl/LSM 정책 증거만을 기반으로 도출됩니다.
이러한 보수적인 기본값은 프로덕션 호스트에서 의도치 않게 공격 표면을 확장하는 것을 피합니다. 제어된 또는 계측된 시스템에서 전체 기능 테스트를 활성화하려면 root로 --allow-load-module을 사용하십시오(아래 참조).
# 기본 — 모듈 로딩 없음, 정책 증거 기반 판정만 수행
./check_cve_2026_23111.sh
./check_cve_2026_23111.sh --color
./check_cve_2026_23111.sh --keep-logs
./check_cve_2026_23111.sh --color --keep-logs
# 전체 기능 테스트 — nf_tables 로드(및 언로드), root 권한 필요
sudo ./check_cve_2026_23111.sh --allow-load-module
sudo ./check_cve_2026_23111.sh --allow-load-module --color --keep-logs
--allow-load-module을 사용해야 하는 경우격리된 비프로덕션 또는 목적에 맞게 구축된 테스트 VM에서 최고 신뢰도의 판정이 필요할 때 --allow-load-module을 사용하십시오. 일반적인 시나리오:
프로덕션 호스트에서 nf_tables가 의도적으로 차단되어 있거나 로드 시 강화 정책을 위반할 수 있는 경우 --allow-load-module을 사용하지 마십시오.
--allow-load-module의 안전 게이트모듈 로드를 시도하기 전에 스크립트는 다음 검사를 시행하며, 하나라도 실패하면 오류와 함께 종료됩니다:
/etc/modprobe.d/에 하드 modprobe 거부(install nf_tables /bin/false)가 존재하지 않아야 합니다.modprobe가 사용 가능해야 합니다.root(uid 0)로 실행 중이어야 합니다.스크립트가 모듈을 성공적으로 로드한 경우, 스크립트 종료 방식(성공, 오류, 또는 CTRL+C)에 관계없이 cleanup() 트랩을 통해 modprobe -r nf_tables가 호출됩니다.
스크립트는 익스플로잇 결과가 아닌 운영적 판정을 사용합니다:
이러한 판정은 패치 우선순위 지정 및 방어적 분류를 지원하기 위한 것이며, 벤더 패키지 상태 검증을 대체하지 않습니다.
스크립트는 실행 중인 커널을 문서화된 업스트림 수정 지점에 매핑합니다:
주요 권장 조치는 벤더가 수정한 커널 업데이트를 설치하고 수정된 커널로 재부팅하는 것입니다.[2][3][4] 악용은 로컬 커널 공격 표면에 의존하므로, 패치 일정을 계획하거나 검증하는 동안 추가 강화를 통해 노출을 줄일 수 있습니다.[5][6]
nf_tables 로딩 비활성화 또는 차단: 시스템이 nftables 기능을 필요로 하지 않고 변경 사항이 운영 영향에 대해 검증된 경우 수행합니다.[3][4]CAP_NET_ADMIN과 같은 접근 경로를 제한하고 방화벽 상태를 조작할 수 있는 계정 수를 줄입니다.[5]권한 없는 사용자 네임스페이스 제한:
echo 'kernel.unprivileged_userns_clone=0' > /etc/sysctl.d/99-cve-2026-23111.conf
echo 'user.max_user_namespaces=0' >> /etc/sysctl.d/99-cve-2026-23111.conf
sysctl --load /etc/sysctl.d/99-cve-2026-23111.conf
운영상 안전할 때 nf_tables 모듈 로딩 차단:
echo 'install nf_tables /bin/false' > /etc/modprobe.d/disable-nf_tables.conf
rmmod nf_tables 2>/dev/null || true
모듈 로딩 완화 조치를 사용하는 경우, 일부 가이드는 초기 부팅 시 차단된 모듈이 로드되지 않도록 initramfs를 재생성할 것을 권장합니다.[4]
우분투는 권한 없는 사용자 네임스페이스에 대한 AppArmor 기반 제한을 커널 수정 사항의 완전한 대체재가 아닌 공격 표면을 줄이는 방법으로 문서화하고 있습니다.[6] 런타임 테스트에서 공격 경로가 로컬에서 차단되어 호스트가 덜 노출된 것으로 보일 수 있지만, 장기적인 해결을 위해서는 여전히 벤더가 수정한 커널 패키지를 설치해야 합니다.[2][6] 스크립트는 실제 unshare --user 호출을 시도하고 사용자+네트워크 네임스페이스 내에서 CAP_NET_ADMIN이 기능하는지 확인하여 AppArmor 제한 효과를 검증합니다.
Red Hat은 CVE-2026-23111에 대한 완화 조치로 nf_tables 모듈이 로드되지 않도록 방지하는 것을 명시적으로 나열하며, 이는 해당 변경이 환경에 적합한 경우에 해당합니다.[3] 스크립트는 check_modprobe_deny()를 통해 이 구성을 감지하고, 하드 거부(install nf_tables /bin/false, 주문형 로딩 차단)와 약한 블랙리스트(차단하지 않음)를 구분합니다. RHEL 계열 시스템에서는 실행 중인 커널의 RPM 체인지로그에서 CVE-2026-23111 백포트 항목을 검사하여 업스트림 버전 번호와 관계없이 벤더 확인 판정을 가능하게 합니다.
이 README와 동봉된 스크립트는 방어적 검증, 인벤토리 작성 및 완화 계획 수립을 위한 것입니다. 이는 벤더 지침, 패키지 수준 확인 또는 표준 패치 관리 프로세스를 대체하지 않으며, 연결된 권고에 설명된 공식 수정 사항을 적용하는 대체 수단으로 사용되어서는 안 됩니다.[2][3][4]
통제된 환경에서 사이버 보안 개념을 학습, 테스트 및 연구하기 위한 리포지토리입니다.
이 리포지토리는 교육 목적 및 승인된 보안 연구 전용입니다.
사용자가 다음에 대해 배울 수 있도록 설계되었습니다:
다음과 같이 허가를 받은 환경에서만 이 리포지토리를 사용하십시오:
승인되지 않았거나 불법적인 사용은 엄격히 금지됩니다.
저자 및 기여자는 이 프로젝트로 인한 손해, 오용, 법적 문제 또는 손실에 대해 책임을 지지 않습니다.
이 리포지토리를 사용함으로써 다음에 동의하는 것으로 간주됩니다:
이 프로젝트는 다음을 위해 사용됩니다:
책임 있는 공개 관행을 따르고 모든 관련 법률을 준수하십시오.
책임 있는 공개 또는 협업을 위해서는 GitHub를 통해 리포지토리 관리자에게 연락하십시오.
unshare -U -n --map-root-usernftunshare --user가 실제로 네임스페이스를 생성하고 내부에서 CAP_NET_ADMIN이 기능하는지 확인하여 AppArmor 또는 SELinux 제한이 실제로 효과적인지 검증합니다.| 옵션 | 설명 |
|---|
--allow-load-module | 모듈이 이미 로드되지 않은 경우 modprobe를 통해 nf_tables를 로드하도록 스크립트에 권한을 부여합니다. 전체 nft catchall 경로 실행기와 CAP_NET_ADMIN 효과 테스트를 활성화합니다. 모듈은 종료 시 자동으로 언로드됩니다. root 권한이 필요합니다. 이미 하드 modprobe 거부가 설정되어 있으면 거부됩니다. 프로덕션 시스템이 아닌 계측된 시스템에서만 사용하십시오. |
--color | 터미널이 지원하는 경우 색상화된 stdout 출력을 활성화합니다. |
--keep-logs | 로그와 트레이스를 종료 시 삭제하지 않고 스크립트 디렉터리 아래에 유지합니다. |
--help | 사용법 정보를 출력하고 종료합니다. |
| 판정 | 의미 |
|---|
not-affected | 커널 버전이 5.13 미만입니다. catchall 요소 기능이 아직 도입되지 않아 취약한 코드 경로가 존재하지 않습니다. |
likely-patched-vendor-confirmed | 벤더 커널 RPM 체인지로그에서 CVE-2026-23111이 발견되어, 업스트림 버전과 관계없이 백포트된 수정 사항이 확인되었습니다. |
likely-patched-upstream-confirmed | 커널 버전이 패치된 업스트림 범위에 속하며 그리고 기능적 nft 테스트가 커널 신호 없이 0이 아닌 값을 반환했습니다 — 가장 강력한 정적 + 동적 안전 상태 증거입니다. |
likely-patched-upstream | 커널 버전이 패치된 업스트림 범위에 속하지만 기능 테스트가 실행되지 않았습니다(모듈 부재 또는 불확실). 벤더 권고 상태는 여전히 확인해야 합니다. |
likely-safe-or-patched | 스크립트에 의해 악용 가능한 경로가 확인되지 않았습니다. 원인은 패치된 커널, 취약한 코드 부재, 또는 암시적 로컬 차단 사이에서 모호합니다. |
blocked-by-local-policy | 테스트된 경로가 AppArmor, SELinux, 사용자 네임스페이스 제한 또는 modprobe 거부에 의해 차단된 것으로 보입니다.[6] 정책 차단은 벤더 수정 사항을 대체하지 않습니다. |
exposed-path-available | 호스트가 문서화된 악용 전제 조건과 일치하는 userns + nftables 경로를 노출합니다.[1][5] |
strong-signal-lab-confirmation | nf_tables 관련 메모리 손상과 일치하는 커널 로그 신호가 관찰되었습니다. 폐기 가능한 계측된 실험실에서만 확인하십시오. |
prerequisites-missing | 필요한 진단 도구(unshare, nft)가 없습니다. 의미 있는 런타임 검증이 완료되지 않았습니다. |
| 브랜치 | 수정 버전 | 업스트림 커밋 |
|---|
| 6.13.x+ | ≥ 6.13.1 | f41c5d1 |
| 6.12.x | ≥ 6.12.12 | 8c760ba |
| 6.6.x | ≥ 6.6.75 | b9b6573 |
| 6.1.x | ≥ 6.1.128 | 8b68a45 |
| 6.2–6.5, 6.7–6.11 | 업스트림 EOL | 배포판 백포트만 가능 |
| 5.15.x | 배포판 종속 | Amazon Linux: ALAS2KERNEL-5.15-2026-098 |
| 5.10.x | 배포판 종속 | Amazon Linux 2: 2026-03 기준 보류 중 |
| 5.4.x | 배포판 종속 | Amazon Linux 2: 2026-03 기준 보류 중 |
| 5.13–5.14 | 업스트림 EOL | 배포판 백포트만 가능 |
| < 5.13 | 영향을 받지 않음 | catchall 기능 없음 |