NOW Briefing
리눅스 커널 IPv6 인증 헤더 처리의 권한상승 취약점 (CVE-2026-80844)
■ 개요
DirtyAH6로 이름 붙은 CVE-2026-80844는 리눅스 커널이 IPv6 인증 헤더(AH6)를 처리하는 과정에서 라우팅 헤더의 값을 검증하지 않아 발생하는, 버퍼 범위를 벗어난 메모리 접근 취약점입니다. 커널 2.6.12부터 존재했으며, 5.10·5.15·6.1·6.6·6.12·6.18·7.1·7.2 등 현재 유지 중인 모든 stable 계열이 영향을 받습니다. 리눅스 커널을 쓰는 서버·컨테이너 호스트라면 배포판을 가리지 않고 점검 대상입니다.
악용에 성공하면 일반 계정 사용자가 root 권한을 획득할 수 있습니다. 연구자 공개 글 기준으로 커널 메모리를 손상시키려면 공격자가 통제하는 네트워크 네임스페이스가 필요하고, 그 네임스페이스를 소유한 사용자 네임스페이스 안에서 CAP_NET_ADMIN·CAP_NET_RAW 권한도 있어야 합니다. 사용자 네임스페이스는 프로세스에 격리된 사용자·권한 공간을 주는 리눅스 기능이므로, 비특권 사용자 네임스페이스가 허용된 배포판에서는 일반 사용자가 이 조건을 스스로 만들 수 있습니다. 해당 권한이 부여된 컨테이너 역시 같은 경로로 호스트 커널 메모리를 손상시킬 수 있습니다. 보도 기준으로 AH를 전송 모드로 추가하는 IPv6 라우터에서는 원격 서비스 거부 가능성도 제기됐습니다.
연구자 Asim Manizada는 2026년 7월 중순 커널 보안팀에 신고한 뒤 배포사 패치 배포를 기다렸고, 2026년 9월 18일에는 기술 분석과 함께 Fedora 43·Ubuntu 24.04 커널 대상 PoC를 공개했습니다. 이 공개에는 TUNderflow(CVE-2026-81000), PPPoEject(CVE-2026-68121), DiagSpill(CVE-2026-74469) 세 건의 로컬 권한상승 취약점과 익스플로잇도 함께 포함됐습니다. CVE 레코드는 2026년 9월 4일 공개됐습니다. KISA 보호나라도 리눅스 커널 보안 업데이트 권고를 발행했습니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-80844 (DirtyAH6, IPv6 라우팅 헤더 필드 미검증) |
| CVSS 점수 | 공식 점수 미산정 |
| 취약점 유형 | 버퍼 범위를 벗어난 메모리 접근, 입력값 검증 누락 |
| 영향/위험 | • 비특권 로컬 사용자의 root 권한 획득 가능 (연구자가 Fedora 43·Ubuntu 24.04 커널에서 재현) • 커널 메모리 손상에 따른 시스템 비정상 종료 가능 • CAP_NET_ADMIN·CAP_NET_RAW를 보유한 컨테이너에서 호스트 커널 메모리 손상 가능• 보도 기준, AH를 전송 모드로 추가하는 IPv6 라우터에서 원격 서비스 거부 가능성 제기됨 |
| 취약 버전 | • 커널 2.6.12 이후 전 계열 • 5.10.269 미만 • 5.15.220 미만 • 6.1.187 미만 • 6.6.156 미만 • 6.12.108 미만 • 6.18.49 미만 • 7.1.13 미만 • 7.2.3 미만 |
| 패치 버전 | • 5.10.269 이상 • 5.15.220 이상 • 6.1.187 이상 • 6.6.156 이상 • 6.12.108 이상 • 6.18.49 이상 • 7.1.13 이상 • 7.2.3 이상 |
■ 기술 분석
커널의 IPsec 처리 계층(XFRM)은 AH6 무결성 검사값을 계산하기 전에 IPv6 라우팅 헤더의 주소 순서를 재배열합니다. 이 작업을 담당하는 net/ipv6/ah6.c의 ipv6_rearrange_rthdr() 함수는 헤더에 들어 있는 남은 경유지 수(segments_left)가 헤더 길이 필드(hdrlen)로 계산한 실제 주소 개수를 넘지 않는다고 가정했습니다. 커널이 직접 만든 패킷이나 수신 경로를 거친 패킷에서는 이 가정이 성립하지만, 애플리케이션이 IP 헤더를 직접 작성하는 raw 소켓 옵션(HDRINCL)으로 만든 패킷은 그대로 AH6 처리에 도달합니다.
커밋 메시지 기준으로 segments_left를 255로, hdrlen을 2(주소 한 개)로 지정한 패킷은 주소 포인터를 4,064바이트 뒤로 이동시키고, 그 길이 그대로 memmove()가 호출되면서 할당된 버퍼 밖의 커널 메모리에 접근합니다.
아래는 이 취약점을 수정한 업스트림 커밋 7bad4bda74dc의 net/ipv6/ah6.c diff 중 ipv6_rearrange_rthdr() 진입부로, 주소 연산 이전에 범위 검사를 추가한 부분입니다.
segments_left = rthdr->segments_left;
if (segments_left == 0)
- return;
- rthdr->segments_left = 0;
+ return 0;
- /* The value of rthdr->hdrlen has been verified either by the system
- * call if it is locally generated, or by ipv6_rthdr_rcv() for incoming
- * packets. So we can assume that it is even and that segments is
- * greater than or equal to segments_left.
- *
- * For the same reason we can assume that this option is of type 0.
+ /* Raw locally generated packets can reach AH6 without the invariant
+ * required by the rt0-style address rearrangement below.
*/
segments = rthdr->hdrlen >> 1;
+ if (segments_left > segments)
+ return -EINVAL;
+
+ rthdr->segments_left = 0;
패치는 세 가지를 바꿨습니다. 기존 주석이 근거로 삼던 "이미 검증된 값"이라는 가정을 삭제하고, segments_left > segments인 패킷을 -EINVAL로 거부하며, 함수 반환형을 void에서 int로 바꿔 호출부인 ipv6_clear_mutable_options()가 오류를 AH6 송수신 경로로 전달하도록 했습니다. rthdr->segments_left = 0 대입도 검증 이후로 옮겨, 거부된 패킷의 헤더가 변형되지 않게 했습니다.
■ PoC
공개된 로컬 권한상승 익스플로잇은 사설 사용자·네트워크 네임스페이스를 만든 뒤 가상 이더넷 쌍(veth)·IOAM6·netem·AH6·ESP-in-UDP 경로를 구성해 커널 메모리를 손상시키고, 최종적으로 /etc/pam.d/su의 pam_rootok.so를 pam_permit.so로 바꿔 su - root로 root 셸을 얻습니다. 저장소 설명 기준으로 성공 조건은 특정 커널 빌드(Fedora 43의 7.1.3-100.fc43.x86_64, Ubuntu 24.04의 6.8.0-134-generic)와 충분한 CPU·메모리 자원이며, 연구자도 이 계열 취약점은 대상별 조정이 필요하다고 밝혔습니다.
아래 코드는 공개 PoC의 AH6 패킷 전송 헬퍼(AH6_SENDER_C) 중 IPv6 라우팅 헤더를 채우는 일부입니다. 코드는 수정하지 않고 그대로 옮겼습니다. 전체 코드는 참고 자료의 원문 링크에서 확인할 수 있습니다. 헤더 길이 필드는 2로 고정한 채 남은 경유지 수만 외부에서 받은 값으로 채우는데, 패치가 막은 조건이 이 조합입니다.
rh[0] = IPPROTO_ICMPV6;
rh[1] = 2;
rh[2] = 0;
rh[3] = (uint8_t)segments_left;
put_addr(rh + 8, 0x40);
주의
공개된 익스플로잇은 롤백 없이 /etc/pam.d/su를 변조하는 파괴적 코드입니다.
검증이 필요하다면 폐기 가능한 격리 가상머신에서만 실행해야 합니다.
실행 후에는 해당 호스트를 재사용하지 말고 폐기해야 합니다.
■ 탐지 및 점검
• uname -r로 실행 중인 커널 버전을 확인하고, 요약 표의 패치 버전 미만이면 취약 자산으로 분류합니다.
• sysctl kernel.unprivileged_userns_clone과 sysctl user.max_user_namespaces 값을 확인해 일반 사용자가 사용자 네임스페이스를 만들 수 있는지 점검합니다. 배포판에 따라 둘 중 하나만 존재합니다.
• lsmod | grep ah6로 AH6 모듈 적재 여부를 확인하고, 적재돼 있지 않더라도 자동 적재가 가능한지 함께 확인합니다.
• 컨테이너 오케스트레이션 설정에서 CAP_NET_ADMIN·CAP_NET_RAW를 부여받은 워크로드와 privileged 컨테이너를 목록화합니다. 이들은 비특권 네임스페이스를 차단해도 같은 코드 경로에 도달할 수 있습니다.
• 메모리 손상 계열 취약점이므로 실패한 시도는 커널 오류로 남을 수 있습니다. dmesg와 저널에서 IPv6·XFRM 관련 oops나 general protection fault가 기록됐는지 점검합니다.
점검
공개 익스플로잇이 대상 커널을 특정한다고 해서 다른 빌드가 안전한 것은 아닙니다.
버전 기준으로만 취약 여부를 판정해야 합니다.
■ 대응 방안
• 5.10.269·5.15.220·6.1.187·6.6.156·6.12.108·6.18.49·7.1.13·7.2.3 이상 커널로 업그레이드하고 재부팅합니다. 배포판 커널을 쓴다면 벤더가 백포트한 패키지 버전을 기준으로 확인합니다.
• 같은 날 공개된 나머지 세 건까지 함께 해소하려면 보도 기준으로 5.10.270·5.15.221·6.1.188·6.6.157·6.12.109·6.18.50·7.2.4 이상으로 정렬합니다.
• 즉시 업그레이드가 어렵다면 비특권 사용자 네임스페이스 생성을 차단합니다. 배포판에 따라 kernel.unprivileged_userns_clone 또는 user.max_user_namespaces 설정을 사용하며, 적용 전에 컨테이너 런타임·브라우저 샌드박스 등 의존 기능의 영향도를 확인해야 합니다.
• AH6·XFRM 기능을 쓰지 않는 서버라면 해당 모듈을 차단 목록에 추가해 공격 표면을 줄입니다.
• 불필요하게 CAP_NET_ADMIN·CAP_NET_RAW를 부여한 컨테이너 권한을 회수합니다. 네임스페이스 차단만으로는 이 경로가 막히지 않습니다.
참고
네임스페이스 차단은 임시 대응책이며, 함께 공개된 DiagSpill은 사용자 네임스페이스 없이 SCTP 모듈만 있으면 접근 가능합니다.
최종 대응은 패치된 커널로 업그레이드하는 것입니다.
[참고 자료]
• 원문: 연구자 Asim Manizada 기술 분석 — Linux LPE Quartet
• CVE-2026-80844 공식 레코드 (Linux 커널 CNA)
• 리눅스 커널 패치 커밋 7bad4bda74dc — net/ipv6/ah6.c
• DirtyAH6 PoC 저장소 (커밋 d4bfae1 고정) — dirtyah6_root_repro.py
• The Hacker News — 리눅스 커널 로컬 루트 익스플로잇 4종 공개



