[개념정리] TCP SACK 패닉 취약점(CVE-2019-11477)
SACK
SACK(Selective Acknowledgement)는 순서에 맞지 않게 수신되었더라도 성공적으로 수신된 특정 데이터 세그먼트에 대해 수신자가 발신자에게 알릴 수 있도록 하는 TCP 옵션이다. 이 기능을 사용하면 보낸 사람은 손실된 세그먼트 다음에 오는 모든 세그먼트를 재전송하는 대신 손실되거나 누락된 세그먼트만 재전송할 수 있다. 이는 특히 대기 시간이 길거나 손실이 큰 네트워크에서 네트워크 리소스를 보다 효율적으로 사용하고 성능을 향상시킨다.
CVE-2019-11477
CVE-2019-11477은 넷플릭스 연구원인 Jonathan Looney 가 발표한 취약점으로 Linux 커널 TCP 스택의 취약점이다. 특히 문제는 Linux 커널이 TCP 세션 중에 SACK(선택적 승인) 패킷을 처리하는 방식에 있다.
이 취약점은 Linux 커널 내의 'tcp_sack.c' 코드 결함으로 인해 존재한다. 이 결함으로 인해 공격자는 특별히 제작된 SACK 패킷을 전송하여 대상 시스템에서 커널 패닉을 유발할 수 있다. 이 문제는 SACK과 함께 MSS(최대 세그먼트 크기)를 잘못 처리하는 것과 관련이 있습니다. 작동 방식은 다음과 같다.
MSS 및 TCP 세그먼트: TCP 연결에서 MSS는 단일 TCP 세그먼트에서 수신할 수 있는 최대 데이터 양을 지정한다. 공격자가 일련의 SACK 패킷과 결합하여 예상 크기보다 작은 MSS 값을 보낼 때 취약점을 악용할 수 있게 된다.
조각화 및 재조립: Linux 커널이 이러한 잘못된 패킷을 재조립할 때 세그먼트를 저장하는 데 필요한 공간을 잘못 계산하여 메모리 손상을 초래하는 시나리오에 직면한다.
커널 패닉: 이러한 잘못된 계산 및 손상으로 인해 커널이 NULL 포인터를 역참조 하거나 유효하지 않은 메모리에 액세스 하여 커널 패닉이 발생할 수 있다. 이는 추가 손상을 방지하기 위해 운영 체제를 강제 종료하는 심각한 오류다.