
cve-2026-46331-audit 스크립트
CVE-2026-46331(일명 pedit COW)에 대한 읽기 전용 감사 스크립트입니다. 이 취약점은 Linux 커널의 net/sched act_pedit 액션에 존재하는 부분적 copy-on-write 버그로, 로컬의 비특권 사용자가 페이지 캐시 메모리를 손상시키고 root 권한으로 상승할 수 있게 합니다.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act()는 키 루프 이전에 tcfp_off_max_hint를 사용하여 skb_ensure_writable()에 대한 COW 범위를 한 번 계산합니다. Typed 키는 힌트가 커버하지 않는 런타임 헤더 오프셋을 추가하므로, 최종 쓰기의 일부가 COW된 영역 밖에 위치하게 됩니다. 결과적으로 공유 페이지 캐시 페이지가 훼손되며, 캐시된 setuid 바이너리(고전적 대상: /bin/su)가 메모리에서 오염될 수 있습니다. 디스크 상의 해시는 깨끗하게 유지됩니다. 파일 무결성 모니터는 이를 감지하지 못합니다.
Dirty COW(CVE-2016-5195), Dirty Pipe(CVE-2022-0847), Copy Fail(CVE-2026-31431), Dirty Frag(CVE-2026-46300)와 동일한 버그 계열입니다. 진입점은 다르지만 페이지 소유권 실패는 동일합니다.
| CVE | CVE-2026-46331 |
| 구성 요소 | Linux 커널 net/sched / act_pedit |
| 분류 | 부분 COW → 페이지 캐시 손상 → LPE |
| 공격 벡터 | 로컬 (CAP_NET_ADMIN, 일반적으로 비특권 userns를 통해 획득) |
| 업스트림 영향 범위 | 5.18 .. 7.1-rc6 |
| 업스트림 수정 | 7.1-rc7 |
| 공개 PoC | packet_edit_meme (RHEL 10, Debian 13, Ubuntu 24.04.4에서 검증됨) |
| Red Hat 심각도 | Important |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
엄격히 읽기 전용 트리아지입니다. 모듈을 로드하지 않고, sysctl을 건드리지 않으며, PoC를 실행하지 않습니다. 프로덕션 환경에서 안전하게 실행되도록 설계되었습니다.
act_pedit 도달 가능성을 탐지합니다:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)modprobe.d의 install ... /bin/true 오버라이드로 차단됨, 또는 net-act-pedit 별칭을 통해 act_pedit를 자동 로드하는 커널(6.9+; 이전 커널은 이름으로 요청하므로 blacklist가 막지 못함)에서 blacklist로 차단됨tc action pedit 규칙을 나열합니다 (정보 제공용, 변경 없음).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces, 그리고 Ubuntu AppArmor userns 제한./etc/os-release에 따른 휴리스틱 벤더 패치 매트릭스 (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch 계열 롤링).auditd와 journalctl을 통한 선택적 행위 기반 IoC 탐색 (--since와 --until로 기간 설정 가능).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| 코드 | 의미 |
|---|---|
| 0 | PATCHED 또는 NOT_APPLICABLE (커널이 버그 이전 버전임) |
| 1 | MITIGATED (완화 조치 활성, 커널은 여전히 취약, 그래도 패치 필요) |
| 2 | VULNERABLE (필수 전제 조건 중 하나 이상 충족, 수정된 커널 없음) |
| 3 | UNKNOWN (공유 / CI / Kubernetes 환경에서는 의심 대상으로 취급) |
| 4 | ERROR (스크립트 실행 불가, 도구 누락 또는 잘못된 환경) |
전체 실행 결과는 examples/sample-output.txt를, JSON 형식은 examples/sample-output.json을 참조하세요.
점수는 다음 항목들의 가중치 조합입니다:
| 신호 | 가중치 |
|---|---|
벤더 판정 VULNERABLE | +50 |
벤더 판정 UNKNOWN | +30 |
act_pedit가 커널에 내장됨 | +25 |
act_pedit 로드 가능, 오버라이드 없음 | +20 |
act_pedit 로드 가능, 오버라이드 또는 블랙리스트 활성 | +5 |
act_pedit 현재 로드됨 | +5 |
| 비특권 userns+netns 접근 가능, AppArmor 게이트 없음 | +15 |
| 비특권 userns+netns 접근 가능, AppArmor 게이트 활성 | +8 |
| 헌트 기간 내 IoC 발견 | +10 |
최대 100으로 제한됩니다. 약 70을 초과하는 경우 멀티테넌트 / CI / Kubernetes 노드에서는 긴급으로 취급해야 하며, 약 20 미만은 보통 호스트가 정상임을 확인해 주는 수치입니다.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
그런 다음 jq로 집계합니다:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
선호도 순서대로 나열했습니다. 스크립트는 발견한 내용에 따라 적절한 조치를 권장합니다.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2: restrict unprivileged user namespaces.
# Will break rootless Podman/Docker, browser sandboxes, Flatpak, unprivileged unshare, some CI sandboxes.
sudo sysctl -w user.max_user_namespaces=0 # EL-family
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
# Option 2b: restrict network namespaces (breaks the CAP_NET_ADMIN acquisition path).
# Less disruptive than disabling all user namespaces, but still breaks some container tooling.
sudo sysctl -w user.max_net_namespaces=0
실제 해결책은 벤더 커널 업데이트와 재부팅입니다. 재부팅 후 uname -r만이 이를 입증할 수 있는 유일한 방법입니다.
이는 동일한 아키텍처적 실패의 다섯 번째 반복입니다. 각각은 근접 원인을 수정했지만, 어느 것도 근본 원인은 해결하지 못했습니다. 바로 소유권 경계를 넘나들며 페이지를 공유하는 제로 카피 고속 경로로, 여기서는 수백 개의 호출 지점에서 모든 쓰기 주체가 바이트를 변경하기 전에 프라이버시를 입증해야 합니다.
| CVE | 연도 | 서브시스템 | 프리미티브 |
|---|---|---|---|
| CVE-2016-5195 | 2016 | mm | 읽기 전용 매핑에 대한 COW 경쟁 |
| CVE-2022-0847 | 2022 | pipe / splice | pipe_buffer 플래그가 페이지 캐시로 유출 |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | 읽기 전용 파일 캐시에 대한 인플레이스 암호화 |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | skbuff 공유 프래그 마커 손실 |
| CVE-2026-46331 | 2026 | net/sched act_pedit | 늦게 해석된 타입 키 오프셋으로 인한 부분 COW |
커널 내 Rust는 소유권 타입을 통해 바로 이 부류의 문제를 해결합니다. 내일 net/sched에 나타나지는 않을 것입니다.
MIT. LICENSE를 참조하십시오.