요약

  • RFC 3128은 미니 프래그먼트 기법과 겹치는 프래그먼트 기법을 결합하여, 필터가 합법적인 첫 번째 TCP 헤더를 통과시키는 동안 엔드포인트 재조립이 다른 목적지 포트로 바꿔치기할 수 있음을 보였습니다.
  • 그 대응 규칙은 좁지만 중요했습니다. 오프셋 0인 TCP 프래그먼트는 정책이 의존하는 최소 전송 헤더 전체를 담아야 하며, 오프셋 1인 프래그먼트는 계속 거부됩니다.
  • 이 공격은 필터링 규칙과 재조립 동작에 조건부였습니다. 프래그먼트 집합이 통과되었다는 사실은 연결 완료, 서비스 침해, 또는 보편적인 구현 결함의 증거가 아니었습니다.

RFC 3128에서 위험한 패킷은 어느 하나의 프래그먼트가 아니었습니다. 그것은 두 관찰자 사이의 불일치였습니다.

경계 지점에서 패킷 필터는 최초의 IPv4 프래그먼트를 보았습니다. 프래그먼트 오프셋은 0이었고, 정책이 인바운드 트래픽 수신을 허용한 포트로의 겉보기에 평범한 연결을 기술하기에 충분한 TCP 헤더를 담고 있었습니다. 필터는 목적지 포트와 관련 제어 정보를 검사해 금지된 내용을 찾지 못하고 통과시킬 수 있었습니다.

목적지에서 IP 스택은 결국 프래그먼트 집합을 보게 됩니다. 재조립 규칙이 나중에 도착하는 겹치는 바이트가 이전 바이트를 대체하도록 허용한다면, 상위로 전달되는 TCP 세그먼트는 필터가 승인했다고 믿었던 세그먼트와 달라질 수 있었습니다. 겨우 여덟 전송 바이트 길이인 두 번째 오프셋 0 프래그먼트는, 뒤따르는 TCP 플래그를 담지 않은 채 출발지 포트, 목적지 포트, 시퀀스 번호를 대체할 수 있었습니다. 완성된 데이터그램은 그리하여 아웃바운드 연결만 받도록 되어 있던 포트를 겨냥할 수 있었습니다.

필터가 반드시 무심했던 것은 아닙니다. 그것은 이전의 방어 모델을 따르고 있었을 뿐입니다.

RFC 1858은 두 가지 중요한 회피 계열을 기술했습니다. 미니 프래그먼트 공격은 TCP 헤더를 쪼개어 첫 번째 프래그먼트가 필터가 필요로 하는 모든 필드를 노출하지 않게 만들었습니다. 겹치는 프래그먼트 공격은 재조립 시 반복된 바이트의 어느 복사본이 살아남아야 하는지에 대한 불일치를 이용했습니다. 제안된 대응책 중 하나인 간접 방법(Indirect Method)은 프래그먼트 오프셋이 1인 TCP 프래그먼트를 거부했습니다. IPv4 오프셋은 8바이트 단위로 계산되므로, 오프셋 1은 최초 8바이트 조각이 끝나는 지점과 정확히 일치합니다. 이 위치를 차단하면 TCP 플래그를 다음 프래그먼트에 숨기려는 익숙한 시도를 막을 수 있었습니다.

이 규칙은 그것이 볼 수 있는 공격은 해결했습니다. RFC 3128은 공격자가 겹침을 다시 오프셋 0으로 옮기면 무슨 일이 생기는지 보여주었습니다.

그 예는 세 개의 프래그먼트를 사용했습니다. 첫 번째는 오프셋 0에서 시작해 TCP 헤더의 최소 16바이트를 담았습니다. 필터 입장에서는 충분히 완전해 보였고 허용된 인바운드 서비스를 지명했습니다. 두 번째 역시 오프셋 0에서 시작했지만 TCP 바이트 여덟 개 뒤에서 멈췄습니다. 그것이 바꾼 것은 목적지 포트였습니다. 헤더 뒤쪽에 나오는 플래그를 감안하지 않고 보면, 그 바이트들은 또 다른 규칙을 만족할 수 있었습니다. 세 번째 프래그먼트가 데이터그램을 완성했습니다. 겹침 정책이 짧은 대체 바이트에 결정적 가치를 부여하는 호스트에서는, 재조립이 새로운 TCP 헤더를 낳았습니다. 즉 합법적인 첫 번째 뷰에서 물려받은 플래그에, 겹치는 두 번째 뷰에서 물려받은 목적지 포트를 얹은 헤더였습니다.

그것이 바로 이 사례의 역사적 통찰이었습니다. 정책은 임시 표상에 적용되었을 뿐, 엔드포인트가 최종적으로 소비하는 전송 헤더에는 적용되지 않았습니다.

RFC 3128은 범위에 신중했습니다. 그 결과는 목적지의 정확한 재조립 구현에 의존했습니다. IPv4는 프래그먼트가 순서를 바꿔 도착하고, 데이터를 중복하고, 겹치도록 허용했습니다. RFC 815의 재조립 논의는 겹침을 알고리즘이 관리해야 할 공학적 조건으로 다루었고, 모든 중복 바이트에 대해 하나의 보편적 승자를 강제하지 않았습니다. 따라서 서로 다른 호스트, 미들박스, 운영체제 세대는 같은 프래그먼트 열에서 서로 다른 패킷을 만들어낼 수 있었습니다.

이 구현 의존성은 양면적이었습니다. 그것은 이 메모가 모든 대상이 취약하다는 증거가 되지 못함을 의미했습니다. 동시에 필터가 엔드포인트가 자신의 해석을 공유한다고 안전하게 가정할 수 없음을 의미했습니다. 프래그먼트를 정규화하거나 재조립하지 않고 그대로 전달하는 보안 장치는 최종 바이트 선택을 다른 기계에 위임하는 셈입니다.

RFC 3128의 수리는 의도적으로 새로운 아키텍처보다 작았습니다. 오프셋 1의 TCP 프래그먼트를 거부하는 것에 더해, 필터는 전송부 길이가 최소 완전 헤더보다 짧은 오프셋 0 프래그먼트도 거부해야 합니다. 메모의 표기법으로 말하면, 프래그먼트 오프셋이 0이고 프로토콜이 TCP이며 전송 길이가 최소 TCP 헤더 길이보다 작으면 패킷을 폐기하라는 것입니다.

이 규칙은 특정 빈틈을 닫습니다. 짧은 오프셋 0 대체물이 더 이상 정책의 충분한 근거로 통과할 수 없기 때문입니다. 그것은 “첫 번째 프래그먼트에 아마 중요한 내용이 들어 있을 것이다”라는 암묵적 희망을 길이 불변량으로 바꿉니다. 필터가 TCP 포트와 제어 비트에 관한 판단을 내리려면, 최초 프래그먼트가 그 판단에 필요한 최소 필드 집합 전체를 노출해야 합니다.

그러나 이 규칙은 프래그먼테이션의 모호성을 폐지하지 않았습니다. 모든 방화벽에 완전한 재조립을 요구하지 않았고, 보편적인 IPv4 겹침 정책을 명시하지도 않았으며, 패킷이 응용에 도달했다는 것조차 보여주지 않았습니다. 프래그먼트 집합이 네트워크 장치를 통과한 이후에도, TCP는 재구성된 세그먼트를 받아들여야 하고, 서비스가 수신 대기 중이어야 하며, 핸드셰이크가 진행되어야 하고, 응용 동작이 뒤따라야 합니다. 각각은 별개의 증거 경계입니다.

이후의 표준들은 근본 문제가 얼마나 오래 지속되었는지 보여줍니다. RFC 6274는 IPv4 보안을 다시 살펴보며 프래그먼트의 일관되고 보수적인 처리를 권고했습니다. RFC 5722는 IPv6에 대해 더 강한 입장을 취했습니다. 프래그먼트가 겹치면 데이터그램 전체를 폐기해야 한다는 것입니다. RFC 7112는 미들박스가 필수 확장 헤더가 나중에 도착하는 패킷을 승인하지 않아도 되도록, 첫 번째 IPv6 프래그먼트가 완전한 헤더 체인을 담도록 요구했습니다. RFC 8900은 엔드포인트와 미들박스가 지원, 필터링, 패킷 크기에 대해 계속 불일치하는 이상, 프래그먼테이션을 운영상 취약한 것으로 기술했습니다.

이후의 문서들을 뒤집어 2001년의 모든 방화벽이 한 가지 방식으로 동작했다는 증거로 삼아서는 안 됩니다. 이들의 가치는 구조적입니다. 강제 지점과 소비하는 엔드포인트가 판단 대상에 대해 합의하지 않으면 보안 정책은 실패한다는 반복되는 설계 교훈을 보여줍니다.

이 교훈은 IP 프래그먼트를 넘어섭니다. 파서, 게이트웨이, 응용 서버는 같은 입력의 서로 다른 단계를 흔히 보게 됩니다. 프록시는 오리진 서버와 다르게 요청을 정규화할 수 있습니다. 침입 탐지기는 인코딩을 한 번 디코딩하는 동안 응용은 두 번 디코딩할 수 있습니다. 스키마 게이트웨이는 어느 한 표상을 검증하는 동안 다운스트림 코드는 다른 표상을 사용할 수 있습니다. 세부 사항은 달라지지만 제어 실패는 같습니다. 정책이 경로를 따라 안정적이지 않은 바이트나 필드에 붙는다는 것입니다.

RFC 3128은 그 실패를 거의 어떤 장치도 없이 구체적으로 만들어냈다는 점에서 인터넷 역사에 자리합니다. 첫 번째 프래그먼트는 합법적일 수 있었습니다. 두 번째는 국소적으로 그럴듯할 수 있었습니다. 세 번째는 데이터그램을 완성할 수 있었습니다. 보안 결함은 이 셋이 서로 다른 시점에 서로 다른 권위에 의해 해석될 때만 나타났습니다.

이 메모는 또한 허용(admission)과 효과(effect) 사이의 유용한 구분을 보존했습니다. 그것은 프래그먼트가 필터링 의도를 회피할 수 있는 방법을 기술했습니다. 침입에 성공했다고 주장하지는 않았습니다. 역사적 보안 서술은 흔히 프로토콜적 가능성을 운영 결과로 압축하기 때문에 이것은 중요합니다. RFC 3128의 자체 언어는 그런 과장에 저항합니다. 중요성은 보안 정책에 달려 있고, 결과는 재조립에 달려 있습니다.

그러므로 가장 깊은 기여는 목적지 포트 트릭 그 자체가 아니었습니다. 그것은 강제 판단이 네트워크가 대상 객체의 구성을 마친 이후에도 여전히 성립해야 한다는 요구였습니다. 이후의 처리가 허용의 근거가 된 바이트를 대체할 수 있다면, 그 허용은 애초에 최종 패킷에 관한 것이 아니었던 것입니다.

출처