Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-46331 — pedit COW | Kitploit
도구/GitHubGitHub/v0idnetwork/cve-2026-46331
Privilege EscalationVulnerability AnalysisExploitationCTFPapers & ResearchLearning & EducationBinary Exploitation
GitHubv0idnetwork/cve-2026-46331

CVE-2026-46331

pedit COW

저장소 보기
163개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-46331 (pedit COW) – Linux net/sched 패킷 편집기 페이지 캐시 오염 취약점

요약

CVE-2026-46331 (별명 “pedit COW”)은 트래픽 제어 하위 시스템의 로컬 Linux 커널 권한 상승 결함입니다. 권한이 없는 사용자(권한이 없는 네트워크 네임스페이스)는 act_pedit (패킷 편집기) 필터를 구성하여 부분적인 copy-on-write (COW) 쓰기를 페이지 캐시에 트리거할 수 있습니다. 결과적으로 커널은 공격자가 제어하는 데이터를 파일의 메모리 내 이미지에 페이지를 프라이빗으로 표시하지 않고 기록하여 해당 파일의 캐시된 복사본을 손상시킵니다. 결정적으로, 이 익스플로잇은 CAP_NET_ADMIN만 필요하며 (사용자 네임스페이스에서 얻을 수 있음) 디스크 상의 파일을 수정하지 않습니다. 실제로, packet_edit_meme이라는 작업 개념 증명(PoC)이 2026년 6월 17일에 공개되어 setuid 바이너리(예: /bin/su)의 페이지 캐시 이미지를 덮어써서 루트 셸을 생성하는 방법을 보여주었습니다. 이 취약점은 **tcf_pedit_act()**에서 잘못된 COW 범위 계산으로 인해 발생하며, 각 키 루프 내로 쓰기 가능 영역 검사를 이동하여 업스트림에서 수정되었습니다(2026년 6월 4일).

  • 영향: act_pedit가 있는 Linux 커널 (약 v5.18 ~ 7.1-rc6). 패치되지 않은 안정 릴리스 (많은 배포판 커널 포함)는 취약합니다.
  • 영향: 페이지 캐시를 손상시켜 로컬 권한 상승 (페이지 캐시 오염). CVSS v3.1: 6.0 (Medium, AV:L/AC:L/PR:H/UI:N/C:N/I:H/A:H).
  • 익스플로잇: PoC는 권한이 없는 사용자+네트워크 네임스페이스를 활용하여 CAP_NET_ADMIN을 획득하고, tc pedit 필터를 설정한 후 메모리 내 setuid 바이너리의 ELF 진입점을 셸코드로 덮어씁니다.
  • 완화: 커널 업데이트 (업스트림 패치가 skb_ensure_writable()을 키 루프 내부로 이동). 임시 조치로 act_pedit 모듈을 차단하거나 언로드하거나 권한이 없는 사용자 네임스페이스를 비활성화 (예: sysctl user.max_user_namespaces=0). 완화 후 캐시를 삭제하여 (echo 3 > /proc/sys/vm/drop_caches) 오염된 페이지를 제거합니다.

이 보고서는 CVE-2026-46331에 대한 상세한 기술 분석(원인, 익스플로잇, 탐지 및 완화 전략)을 제공하며, 공급업체 권고, CVE 및 공개 익스플로잇에 대한 참조를 포함합니다.

취약점 개요

정의: CVE-2026-46331은 Linux 커널의 트래픽 제어 (net/sched) 하위 시스템, 특히 act_pedit (패킷 편집기) 액션에서의 out-of-bounds 쓰기 버그입니다. 함수 **tcf_pedit_act()**는 정적 힌트 tcfp_off_max_hint를 사용하여 typed 키를 반복하기 전에 패킷 편집 작업을 위한 "copy-on-write" 범위를 계산합니다. 그러나 일부 키(예: TCP/UDP 헤더 편집)는 런타임에만 최종 바이트 오프셋을 결정합니다. 코드는 이러한 동적 오프셋에 대해 쓰기 가능성을 다시 확인하지 않습니다. 결과적으로 사전 COW'd 영역 외부에서 쓰기가 발생할 수 있습니다. 패킷 쓰기의 일부가 프라이빗으로 설정되지 않아 부분적 COW가 발생합니다. 이 잘못된 쓰기는 (패킷 버퍼가 우연히 파일 페이지를 참조하는 경우) 파일의 공유 페이지 캐시 메모리로 전파되어 캐시된 파일 이미지를 손상시킵니다.

배경: Linux 패킷 편집기 (pedit) 액션을 사용하면 관리자가 구성된 tc 필터를 통과하는 패킷의 패킷 헤더(링크, 네트워크 또는 전송 계층) 내에서 임의의 바이트를 다시 쓸 수 있습니다. 이는 오프셋(헤더에 고정될 수 있음)과 32비트 값/마스크를 지정하여 작동합니다. 내부적으로 pedit는 소켓 버퍼(sk_buff)에서 작동하며 수정 전에 대상 패킷 메모리를 쓰기 가능하게 만들어야 합니다(COW 방식으로 skb_ensure_writable()을 통해). 이상적으로 커널은 공유 페이지를 쓰기 전에 복제(프라이빗 복사)하여 다른 곳에서 사용되는 메모리 변경을 방지해야 합니다.

근본 원인: tcf_pedit_act()에서 코드는 tcfp_off_max_hint(최대 정적 오프셋)를 사용하여 쓰기 가능 범위를 한 번만 미리 계산합니다. 이 힌트는 typed 키가 패킷 처리 중에 추가하는 런타임 헤더 오프셋을 포함하지 않습니다. TCP 또는 UDP와 같은 키는 런타임 시 IP 헤더의 위치를 기반으로 오프셋을 계산할 수 있습니다(예: 이전 키가 네트워크 헤더를 이동시키는 경우). 따라서 키별 루프 중에 키의 실제 오프셋이 사전 할당된 쓰기 가능 범위를 초과할 수 있습니다. 그런 다음 코드는 skb_store_bits()를 통해 패킷 메모리에 쓰지만, 사전 COW'd 영역 너머의 페이지가 프라이빗으로 설정되지 않았기 때문에 쓰기는 여전히 페이지 캐시와 공유되는 페이지를 손상시킵니다. 요약하면, "쓰기 가능 패킷 범위를 너무 일찍 계산" 하여 범위를 벗어난 교차 페이지 쓰기가 발생합니다. 음수 오프셋(예: 수신 시 이더넷 헤더 편집)도 잘못 처리되며, 심지어 offset_valid()도 INT_MIN에 대한 보호 장치가 없어 결함을 악화시켰습니다.

발생 이유: 이 버그는 본질적으로 copy-on-write 범위 계산의 논리 오류입니다. 커널은 정적 최대 오프셋(로드 시 알려짐)이 모든 편집에 충분하다고 가정했습니다. 동적 오프셋이 있는 키가 실제로 적용될 때 COW 범위를 업데이트하지 못했습니다. 일련의 대기 중인 편집 후 최종 쓰기는 사전 확인된 영역 밖에 있을 수 있습니다. 패킷 버퍼가 메모리 매핑된 파일 페이지(예: 제로 카피 메커니즘을 통해)를 참조할 수 있기 때문에 이 "부분적 COW" 쓰기는 디스크에 있는 파일의 페이지 캐시에 도달할 수 있습니다. 실제로 패킷 편집기 액션은 sendfile 또는 splice에서 페이지를 수신할 수 있습니다. 따라서 단일 패킷 필터 작업이 간접적으로 공격자가 선택한 데이터를 파일의 메모리 내 이미지에 기록할 수 있으며, 디스크는 변경되지 않습니다.

기술 분석

구성 요소 및 데이터 흐름: 취약한 코드는 Linux net/sched 하위 시스템(act_pedit.c)에 있습니다. 패킷이 구성된 pedit 규칙과 일치하면 tcf_pedit_act()가 호출됩니다. 내부적으로 정확히 한 번 skb_ensure_writable(skb, X)를 호출하며, 여기서 X = tcfp_off_max_hint입니다. 이렇게 하면 패킷의 처음 X 바이트가 프라이빗(COW'd)이 됩니다. 그런 다음 각 키(편집 작업)에 대한 루프에서 키의 런타임 헤더 오프셋을 키의 지정된 오프셋에 추가하여 키의 실제 쓰기 오프셋을 계산하고 32비트 값을 패킷에 씁니다. 의사 코드에서:```c u32 off_max = action->tcfp_off_max_hint; skb_ensure_writable(skb, off_max); for (i = 0; i < num_keys; i++) { u32 hdr_off = compute_header_offset(skb, key[i].hdr_type); u32 write_off = hdr_off + key[i].offset; skb_store_bits(skb, write_off, &key[i].value, 4); }

`hdr_off`가 각 키를 처리할 때만 계산되기 때문에, 초기 `skb_ensure_writable()` 호출은 이를 고려하지 않았습니다. `hdr_off + key[i].offset`이 `off_max`를 초과하면, 코드는 메인 선형 영역 대신 조각(fragments)에 대해 `skb_store_bits()`로 폴백(fallback)하며, 이는 비공개로 설정되지 않은 페이지에 쓰기를 수행함을 의미합니다. 이것이 실패 지점입니다.

**공격 표면(Attack Surface):** 필요한 유일한 인터페이스는 `pedit` 액션이 있는 **tc 필터**이며, 이는 일반적으로 **CAP_NET_ADMIN** 역량이 필요합니다. 그러나 일반 사용자는 실제 권한 없이 개인 네트워크 네임스페이스(사용자 네임스페이스 클로닝) 내에서 CAP_NET_ADMIN을 획득할 수 있습니다. 따라서 권한이 없는 사용자는 user+net 네임스페이스에 진입하여 루프백(loopback)에 `tc pedit` 규칙을 생성할 수 있습니다. 쓰기는 패킷이 처리될 때 발생하며(공격자는 일반적으로 이를 트리거하기 위해 루프백에서 트래픽을 생성합니다). 사용자와 커널 간의 신뢰 경계(trust boundary)는 커널이 자체 COW 설정을 신뢰했지만, 사용자가 제공한 오프셋이 그 가정을 깨뜨렸기 때문에 위반됩니다.

**내부 메커니즘(Internal Mechanism):** 커널 측에서 이 취약점은 **범위를 벗어난 쓰기(out-of-bounds write)**(CWE-787)로 나타납니다. 이는 사용자 공간에 매핑된 커널 메모리(파일 페이지 캐시)를 손상시킵니다. 구체적으로, 소켓 버퍼에 매핑된 모든 파일 페이지의 내용을 덮어쓸 수 있습니다. 개념 증명(proof-of-concept)에서 `/bin/su`는 소켓 버퍼로 전송되어 mmap되므로, 익스플로잇(exploit)은 메모리에서 해당 엔트리 포인트 바이트를 뒤집습니다. 이는 디스크 상의 파일을 수정하지 않지만, 이후 해당 바이너리를 실행할 때마다 캐시에서 감염된 이미지를 읽습니다. 블로그 분석에서는 다음과 같이 언급합니다:

> "skb가 sendfile을 통해 가져온 제로 카피 페이지를 참조할 수 있기 때문에, 그 범위를 벗어난 쓰기는 실제 파일을 뒷받침하는 공유 페이지 캐시 메모리에 도달할 수 있습니다. 커널은 패킷 메모리를 수정해도 안전하게 만들었다고 믿었습니다. 그러나 실제로는 이후의 쓰기가 실제로 비공개화한 영역 밖에 도달합니다."

**신뢰 경계(Trust Boundaries):** 커널은 `skb_ensure_writable()`(고속 경로 COW)이 이후 모든 쓰기에 대해 안전을 보장할 것이라고 잘못 가정했습니다. 각 키에 대해 다시 확인하지 않았습니다. 사용자는 패킷 필터 구성과 패킷 내용만 제어하며, 커널이 (네트워크 네임스페이스를 통해) 이를 허용했습니다. 일단 그 신뢰가 침해되면, 쓰기는 보호되어야 했던 파일 지원 메모리로 탈출했습니다.

## 근본 원인 분석(Root Cause Analysis)

근본 원인은 **pedit 액션에서 잘못된 COW 범위 계산**입니다. 코드 측면에서, `tcfp_off_max_hint`를 기반으로 한 길이로 `skb_ensure_writable()`이 한 번 호출되었고, 루프 내에서 실제 오프셋이 이를 초과할 수 있었습니다. 2026년 5월의 작은 패치는 이를 수정하여, 실제 오프셋이 알려진 후 `skb_ensure_writable()`을 루프 *내부*로 이동하고, 음수 오프셋에 대한 검사와 특수 처리를 추가했습니다. 다시 말해:

- **버그 코드(buggy code):**  ```c
  skb_ensure_writable(skb, action->tcfp_off_max_hint);
  for each key:
      // compute offset (hdr_off + key_offset)
      skb_store_bits(skb, write_off, ...);
  • 수정된 코드: ```c for each key: // compute offset (hdr_off + key_offset) skb_ensure_writable(skb, write_off + 3); skb_store_bits(skb, write_off, ...);

Additionally, the fix ensures that for negative offsets (Ethernet header edits) it uses skb_cow() on headroom, and guards against INT_MIN cases. The commit message (stack.watch summary) states: “Fix by moving skb_ensure_writable() inside the per-key loop where the actual write offset is known, and add overflow checking on the offset arithmetic.”.

Thus, why it exists: during code review or design, the per-key re-calculation was overlooked. The static hint optimization bypassed the need to re-evaluate per key. It appears to be an honest bug rather than a malicious oversight, but its effect is severe because it violates the COW assumption. As TuxCare notes, this bug was merged under the guise of a routine “data corruption” fix, without immediate security context.

발견 과정

이 취약점은 커널 커밋 8b796475fd78(2022년 5월)에 의해 도입되었으며, 2026년 초까지 발견되지 않고 남아 있었습니다. 소스에 따르면, 수정(커밋 899ee91156e5, 2026년 5월 31일)은 일반적인 데이터 손상(data-corruption) 패치로 netdev 메일링 리스트에 제출되었습니다. 커널 관리자들은 2026년 6월 4일 net-7.1-rc7에 해당 수정을 병합했습니다. CVE-2026-46331이 공식적으로 할당된 것은 2026년 6월 16일이었습니다(패치가 나타난 후 약 2주 후). 완전히 무기화된 공개 익스플로잇은 2026년 6월 17일에 등장했습니다(packet_edit_meme PoC).

실제로 순서는 다음과 같았습니다:

  • 수정 제출(메일링 리스트): 2026년 5월 17일 (Zhang Cen 패치)
  • 수정 업스트림 병합: 2026년 6월 4일 (net-7.1-rc7)
  • CVE 할당: 2026년 6월 16일 (CNA가 CVE-2026-46331 등록)
  • 공개 PoC: 2026년 6월 17일 (packet_edit_meme)
  • 패치 배포: 2026년 6월 말, 대부분의 배포판(Red Hat, Debian, Ubuntu 등)

여러 관계자가 공개된 패치를 통해 이 버그를 알아챘습니다. 예를 들어, Massimiliano Oldani(사이버보안 연구원)는 이후 상세한 보고서와 익스플로잇을 게시하며 *“CVE 할당 후 24시간 이내에 packet_edit_meme이라는 공개된 작동하는 개념 증명 익스플로잇이 GitHub에 나타났습니다”*라고 언급했습니다. CloudLinux, TuxCare, SentinelOne은 PoC가 공개되고 CVE가 할당된 후 분석을 발표했습니다. Debian 보안 추적기와 PT DBugs도 문제와 사용 가능한 권고 사항을 요약했습니다(참고 자료 참조).

공격 시나리오

현실적인 공격은 최소한의 사전 조건만 필요합니다:

도구 다운로드