요약

  • RFC 793는 동기화 상태에서 수신 윈도우 안에 시퀀스 번호가 들어오는 리셋을 받아들였다. RFC 5961은 즉각적인 수락을RCV.NXT와 정확히 일치하는 경우로 좁혔다.
  • 윈도우 안에 있으나 정확히 일치하지 않는 RST는 챌린지 ACK로 응답한 뒤 폐기된다. 실제 피어는 이를 확인하는 상태를 만들어낼 수 있지만, 맹목적(blind) 발신자는 보통 그렇지 못하다.

위조된 패킷은 많은 정보를 담지 않고도 심각한 피해를 일으킬 수 있다. 오래 유지되는 TCP 연결과, 그 패킷을 볼 수 없는 경로 외부(off-path) 발신자를 상상해 보라. 이 발신자가 수신자의 현재 윈도우 안에 드는 시퀀스 번호를 추측해 RST 비트를 설정하면, 원래 RFC 793 규칙은 이 추측에 연결을 지워버릴 권한을 부여했다. 수신 윈도우는 본래 바이트가 스트림에 속할 수 있는지 판단하기 위해 설계된 것이었다. 그것이 뜻하지 않게 파괴적인 상태 전이를 위한 자격 증명이 되어버린 것이다.

2010년에 발표된 RFC 5961은 암호화나 새로운 핸드셰이크를 추가하지 않았다. 이 수복(repair)은 더 작지만 더 시사하는 바가 컸다. 수신 윈도우 밖의 RST는 여전히 조용히 폐기된다. 시퀀스 번호가 다음 기대 바이트, 즉RCV.NXT와 정확히 같은 RST는 연결을 리셋할 수 있다. 그러나 윈도우 안에 있으면서 정확히 일치하지 않는 RST는 더 이상 이기지 못한다. 수신자는<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>를 보내고, 의심 세그먼트는 폐기하며, 이후 트래픽은 정상적으로 계속 처리한다.

이 패킷은 주장을 근거로 바꾸도록 네트워크에 요구한다는 점에서 챌린지 ACK(challenge ACK)라 불린다. 원격 엔드포인트가 실제로 종료되거나 재시작하여 더 이상 기존 전송 제어 블록을 갖고 있지 않다면, 이 ACK에 대한 응답으로 새로운 RST를 보낼 수 있고, 그 시퀀스 번호는 확인 응답(acknowledgment)에서 유도된다. 이 응답은 살아남은 엔드포인트가 기대하는 정확한 값으로 도착할 수 있다. 반면 맹목적 주입자는 챌린지를 관찰하지 못하므로, 대략적인 윈도우 내 추측을 정확한 답으로 바꾸는 것은 보통 불가능하다.

역사적 중요성은 수용 가능성과 권한의 구분에 있다. 윈도우 안의 시퀀스 번호는 응답을 받을 만큼은 수용 가능하지만, 되돌릴 수 없는 전이를 일으킬 만큼은 권위 있지 않다. TCP는 "무시"와 "파괴" 사이에 중간 동작을 얻었다. 챌린지를 보내고, 프로토콜과 일치하는 근거를 기다리는 것이다.

RFC 5961은 동기화 상태에서 예상치 못한 SYN에도 같은 아이디어를 적용한다. RFC 793의 처리 방식은 수용 가능한 SYN을 리셋 교환으로 바꿔버릴 수 있었다. 완화 기법 아래에서 엔드포인트는 SYN의 시퀀스 번호와 무관하게 챌린지 ACK를 보내고, 세그먼트를 폐기하며 그 처리를 중단한다. 스푸핑된 SYN은 대체로 추가 ACK를 낳고, 연결이 수립된 피어는 이를 중복으로 처리한다. 실제로 재시작한 피어는 상태가 다르므로, 결국 기존 연결을 닫아야 한다는 것을 확인시키는 방식으로 답할 수 있다.

이 수복에는 한계가 있다. 발신자를 인증하지 않으며, 현재 시퀀스 및 확인 상태를 볼 수 있는 경로 상의 관찰자를 막지도 못한다. RFC 5961은 같은 주소, 포트, 특정 초기 시퀀스 번호의 재사용과 관련된 드문 재시작 코너 케이스도 기술한다. 이 메커니즘은 맹목적 공격의 비용을 올릴 뿐, TCP를 암호학적 프로토콜로 바꾸지는 않는다.

이 문서는 권고 수준도 구분한다. RST와 SYN 완화 기법은 권고(recommended)이지만, 맹목적 데이터 주입에 대한 더 엄격한 ACK 범위 검사는 선택 사항(optional)이다. RFC 9293은 현재의 기본 TCP 명세로 남아 있으며, 일반적인 리셋 처리 기준선을 유지하면서 RFC 5961을 견고성 강화로 지목한다. 여기서 프로토콜 역사는 층을 이룬다. 나중의 수복은 이전 명세가 존재하지 않았던 것처럼 가장하지 않는다.

1차 출처