
Linux IPv4 체크섬 오프로드 버그 PwnEscape를 준비된 TAP에서 재현하는 Go 프로브로, 조작된 virtio 헤더를 주입하고 범위를 벗어난 프래그먼트 헤더 복사를 검증합니다.
PwnEscape로 알려진 Linux IPv4 체크섬 오프로드 버그를 위한 Go 프로브입니다. 이미 준비해 둔 TAP에 연결하여 호스트 프래그멘터가 skb_checksum_help에 의해 재작성된 IPv4 헤더를 신뢰하는지 확인합니다.
이 프로브는 패킷 주입과 캡처를 처리합니다. scripts/setup.sh는 pwnesc 네트워크 네임스페이스 내부에 랩 인터페이스, sysctl 설정, nftables 규칙을 준비합니다. scripts/teardown.sh는 랩을 제거합니다.
ihl을 읽기 전에 부분 체크섬을 완료하는 커널에서(여기서는 6.18.54에서 재현됨; 6.18.57에서 수정됨):
csum_start=22인 virtio 체크섬 헤더가 허용됩니다. 그런 다음 두 개의 VID-0 태그가 제거되어(14+4+4) 체크섬 쓰기가 IPv4 버전/IHL 바이트에 적용됩니다.0x45에서 0x4f로 변경됩니다. 프래그멘터는 60바이트 헤더를 사용합니다.-head 8을 사용하면 선형 헤드는 28바이트이므로, 60바이트 헤더 복사는 skb_headlen을 32바이트 초과하여 출력 프래그먼트의 IPv4 옵션으로 읽어들입니다.이는 PWN.AI의 PwnEscape 분석 글에 설명된 정보 노출 프리미티브를 실행합니다. CONFIG_INIT_ON_ALLOC_DEFAULT_ON이 설정된 경우, 새 slab tailroom이 복사된 바이트에서 0으로 나타날 수 있습니다.
ihl을 읽기 전에 부분 체크섬을 완료하는 커널을 갖춘 Linux 테스트 호스트 또는 VMip, nft, sysctlnf_conntrack 및 nf_defrag_ipv4/dev/net/tun호스트의 저장소 디렉터리에서:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
프로브는 IFF_TAP|IFF_NO_PI|IFF_VNET_HDR로 pwntap을 열고 pwnv1에서 출력을 캡처합니다. pwntap은 프로브 전용으로 예약하십시오. nftables ct 규칙이 conntrack 디프래그멘테이션을 활성화하며, pwnv0는 MTU 200을 사용하여 재조립된 데이터그램을 출력 시 다시 프래그먼트화합니다.
헤더 검사가 성공하면 verify: first byte 0x4f ihl=15가 출력됩니다. 그런 다음 프로브는 출력 프래그먼트, 해당 IPv4 옵션, 그리고 선형 헤드를 초과하여 복사된 바이트를 보고합니다.
-head (기본값 8): 오프셋-0 프래그먼트 페이로드(바이트 단위); 8부터 40까지의 8의 배수. 선형 헤드를 초과하여 예상되는 복사량은 40 - head바이트입니다.-rest (기본값 400): 완료 프래그먼트 페이로드(바이트 단위); 최소 16.-spray (기본값 0): 오프셋-0 프래그먼트 직전에 할당되는 동일 크기 프레임의 수.-spray-fill (기본값 0xee): 해당 프레임을 채우는 데 사용되는 바이트.-page: tail에 skb 메타데이터가 포함될 수 있는 page_frag 헤드를 사용합니다. 기본값은 slab 헤드입니다.-skip-verify: 프래그먼트화된 데이터그램 검사로 바로 이동합니다.PWN_TAP은 TAP 인터페이스를 선택합니다(기본값 pwntap). PWN_CAP은 캡처 인터페이스를 선택합니다(기본값 pwnv1). 설정 스크립트는 이 기본 이름들을 사용합니다.
프로브가 끝난 후 pwnesc 내의 모든 셸에서 빠져나와 호스트에서 다음을 실행하십시오:
sudo ./scripts/teardown.sh
이 명령은 pwnesc와 그 인터페이스, ip pwn nftables 테이블, 네임스페이스 로컬 sysctl 설정을 삭제합니다.