
fragnesia(CVE-2026-46300)의 Go 구현
SA 1개. 한 번에 1바이트. 경쟁 조건 없음.
fragnesia(CVE-2026-46300)의 Go 포트입니다. Dirty Frag 취약점 클래스에 속합니다 - 별개의 버그, 동일한 공격 표면, 자체 패치.
이 버그는 Linux XFRM ESP-in-TCP 서브시스템에 있습니다. 파일에서 splice()된 데이터가 이미 TCP 수신 큐에 들어간 후 소켓에 TCP_ULP espintcp가 설치되면, 커널은 큐에 쌓인 데이터를 ESP 암호문 레코드로 취급하여 제자리(in-place)에서 복호화합니다. 해당 데이터의 출처는 페이지 캐시(page cache) 페이지입니다. 복호화 과정에서 AES-GCM 키스트림이 그 페이지에 직접 XOR됩니다.
그 결과, 읽기 가능한 모든 파일의 페이지 캐시에 통제된 1바이트 쓰기가 발생합니다.
키스트림 테이블
AES-GCM(RFC 4106) 카운터 블록의 위치 2는 [salt(4) || IV(8) || 0x00000002]입니다. 이를 세션 키로 암호화하면 16바이트 키스트림 블록이 생성됩니다. 이 블록의 0번째 바이트가 대상 바이트에 XOR됩니다. IV 논스의 하위 32비트를 변경하면 처음 65536개 논스 안에서 가능한 256가지 키스트림 바이트 값을 모두 얻을 수 있습니다. 익스플로잇은 시작 시 AF_ALG AES-ECB를 통해 이 룩업 테이블을 한 번 구축합니다.
바이트 플립 루프
페이로드의 각 바이트에 대해:
needed_keystream = current XOR desired를 계산합니다.TCP_ULP 설치를 지연시킵니다).current XOR keystream = current XOR (current XOR desired) = desired.SA 1개. 최대 192회 트리거. 결정적.
go build -o fragnesia-go .
./fragnesia-go
성공 시 새 PTY를 통해 루트 셸로 진입합니다. 디스크상의 바이너리는 손대지 않습니다 - 페이지 캐시만 사용합니다.
echo 1 | tee /proc/sys/vm/drop_caches
esp6(전송 모드, IPv6 루프백)패치 이전의 모든 커널: https://lists.openwall.net/netdev/2026/05/13/79
dirtyfrag와 동일한 범위입니다.
dirtyfrag와 동일:
rmmod esp4 esp6
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\n' \
> /etc/modprobe.d/fragnesia.conf
| dirtyfrag-go | fragnesia-go |
|---|
| CVEs | CVE-2026-43284 / CVE-2026-43500 | CVE-2026-46300 |
| 전송 방식 | ESP-in-UDP + RxRPC | ESP-in-TCP (ULP) |
| 쓰기 단위 | 트리거당 4바이트 | 트리거당 1바이트 |
| XFRM SA | 48 | 1 |
| 암호화 | HMAC-SHA256 + CBC-AES | AES-128-GCM |
| IP 패밀리 | IPv4 | IPv6 |