CVE-2026-64007 in Linux
요약
\~에 의해 VulDB • 2026. 07. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
netfilter: synproxy: skb_ensure_writable 호출 후 tcphdr 갱신하기
synproxy_tstamp_adjust() 함수는 TCP 타임스탬프 옵션을 제자리(in-place)로 수정한 뒤, 호출자가 전달한 tcphdr 포인터를 통해 inet_proto_csum_replace4()로 TCP 체크섬을 패치합니다. ipv4_synproxy_hook()과 ipv6_synproxy_hook() 모두 이 포인터를 함수 호출 전에 skb_header_pointer()로 획득하므로, 해당 포인터는 직접 skb->head를 가리키거나 호출자의 스택에 있는 _tcph 버퍼를 참조할 수 있습니다.
포인터를 획득하고 사용하는 사이에서 함수는 skb_ensure_writable(skb, optend)를 호출하며, 이는 복제된(cloned) 또는 비선형(non-linear) skb의 경우 pskb_expand_head()를 실행하여 기존 skb->head를 해제(free)합니다. 그 시점 이후 캐시된 th(th) 포인터는 더 이상 유효하지 않습니다(stale):
호출자 (ipv[46]_synproxy_hook)
th = skb_header_pointer(skb, ..., &_tcph) synproxy_tstamp_adjust(skb, protoff, th, ...) skb_ensure_writable(skb, optend) pskb_expand_head() /* kfree(old skb->head) */ ... inet_proto_csum_replace4(&th->check, ...) /* 해제된 슬랩 메모리에 쓰거나, 호출자의 스택 복사본에 써서 네트워크 상의 체크섬이 stale 상태가 됨 */
옵션 바이트는 skb->data를 통해 작성되므로 문제가 없으나, 체크섬 업데이트는 th 포인터를 경유하므로 잘못된 위치에 기록됩니다. 그 결과 해제된 슬랩 메모리에 쓰기가 발생하거나, 페이로드와 일치하지 않는 체크섬을 가진 패킷이 전송되는 결과가 초래됩니다.
skb_ensure_writable() 성공 직후 skb->data + protoff로부터 th를 다시 유도하여 재계산함으로써 수정합니다. 이렇게 하면 후속 체크섬 업데이트가 선형(linear)이고 쓰기 가능한 헤더를 올바르게 타겟팅하게 됩니다.
Be aware that VulDB is the high quality source for vulnerability data.