SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

리눅스 커널 IPv6 인증 헤더 처리의 권한상승 취약점 (CVE-2026-80844)

EQST Now | 2026.09.22

NOW Briefing

Brief 1 리눅스 커널의 IPv6 인증 헤더(AH6) 처리에서 커널 2.6.12 이후 남아 있던 버퍼 범위를 벗어난 메모리 접근 취약점(CVE-2026-80844)이 공개됐습니다.
Brief 2 관리자 권한이 없는 일반 사용자가 사용자 네임스페이스를 만들 수 있는 환경에서 root 권한을 얻는 PoC를 연구자가 공개했습니다.
Brief 3 패치된 커널로 업그레이드하고, 즉시 어렵다면 일반 사용자 네임스페이스 생성을 차단해야 합니다.

리눅스 커널 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.cipv6_rearrange_rthdr() 함수는 헤더에 들어 있는 남은 경유지 수(segments_left)가 헤더 길이 필드(hdrlen)로 계산한 실제 주소 개수를 넘지 않는다고 가정했습니다. 커널이 직접 만든 패킷이나 수신 경로를 거친 패킷에서는 이 가정이 성립하지만, 애플리케이션이 IP 헤더를 직접 작성하는 raw 소켓 옵션(HDRINCL)으로 만든 패킷은 그대로 AH6 처리에 도달합니다.

커밋 메시지 기준으로 segments_left를 255로, hdrlen을 2(주소 한 개)로 지정한 패킷은 주소 포인터를 4,064바이트 뒤로 이동시키고, 그 길이 그대로 memmove()가 호출되면서 할당된 버퍼 밖의 커널 메모리에 접근합니다.

아래는 이 취약점을 수정한 업스트림 커밋 7bad4bda74dcnet/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/supam_rootok.sopam_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_clonesysctl 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종 공개

Security Online — Linux Kernel LPE Quartet 분석

KISA 보호나라 — Linux Kernel 보안 업데이트 권고

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.