요약

  • RFC 2410은 항등 함수를 ESP의 NULL 암호화 변환으로 표준화했으며, 키 길이는 0비트, IV 길이는 0비트였다. 이로써 "기밀성 없음"이 누락이나 사적 관행이 아니라 명시적인 종단점 간 합의가 되었다.
  • ENCR_NULL이 보안 없음을 뜻하지는 않았다. ESP는 이를 강한 무결성·인증 알고리즘과 결합할 수 있었고, 이후 ESP 규칙은 암호화와 무결성이 모두 NULL이 되는 것을 금지했다. 또한 평범한 ESP 패킷이 이 선택을 중간 장비에 확정적으로 광고하지도 않았다.

RFC 2410의 테스트 벡터는 거의 무례할 만큼 단순하다. 알고리즘에 문자열을 넣는다. 같은 문자열이 나온다. 저자들은 명세를 로마 암호학자와 사라진 영에 관한 이야기로 감쌌지만, 수학은 정확하다:NULL(b) = I(b) = b.

아무것도 감추지 않았다. 그것이 핵심이었다.

1998년 IPsec 계열에서 ESP는 기밀성과 인증을 위한 독립된 자리를 갖고 있었다. 운영자는 페이로드를 암호화하지 않고도 데이터 출처 인증, 비연결형 무결성, 재전송 방어를 원할 수 있었다. 프로토콜은 다른 변환에 쓰이던 것과 같은 협상 기계 장치를 통해 이 선택을 표현할 방법이 필요했다. 침묵은 모호했을 것이다. 이름 붙은 무연산(no-op)은 상호운용 가능했다.

그래서 RFC 2410은 단순히 "암호화하지 마라"라는 표현 이상을 명세했다. IKE에서 추출할 키 크기를 0비트로 고정하고, IV 크기를 0비트로 고정하고, 변환을 상태 없는 것으로 기술하며 1바이트 블록 크기를 부여했다. ESP 패딩은 여전히 나타날 수 있었지만, 알고리즘 자체는 패딩이나 동기화 상태를 요구하지 않았다. 독립된 구현들이 사적인 부재 관례를 발명하지 않고도 같은 패킷 배치에 도달할 수 있었다.

이것이 특히 순수한 형태의 최소 명세다. 공통 계층은 공통이어야 하는 것, 즉 항등 변환과 그 운영 매개변수만을 정확히 규정했다. 특정 네트워크가 기밀성을 선호할지, 중간 장비가 트래픽을 검사할지, 애플리케이션이 패킷을 수용할지는 결정하지 않았다. 그것들은 이후의 지역적 결정으로 남았다.

이 구분은 "암호화"라는 단어에서 시작된다. NULL은 ESP와 IKE 협상에서 차지하는 슬롯이 암호화 변환 자리였기 때문에 암호화 변환으로 등록되었다. 라벨은 기밀성을 부여하지 않았다. RFC 2410은 정반대를 말한다. 이 변환 자체는 기밀성도 다른 보안 서비스도 제공하지 않는다.

그렇다고 ESP_NULL이 원시 IP와 동등해지는 것은 아니다. 강한 인증 알고리즘과 결합하면 ESP는 내용을 가시적으로 남겨두면서 데이터 출처와 무결성을 보호할 수 있었다. 1998년 명세는 이 용법을 AH와 비교하면서도 다른 커버리지 경계를 언급했다. ESP_NULL 인증에는 AH가 다루는 IP 헤더 부분이 포함되지 않았다.

비교는 범위가 한정되어 있었다. 두 프로토콜이 동일한 패킷을 만들거나, 모든 네트워크를 동일하게 통과하거나, 모든 정책을 충족한다는 말이 아니었다. 같은 인증 알고리즘을 사용할 때 ESP_NULL은 기밀성이 없다는 이유만으로 암호학적으로 더 약할 필요는 없다는 뜻이었다. 보안 주장은 선택된 무결성 메커니즘에 속했지 NULL에 속하지 않았다.

이 분리는 하나의 위험한 구성을 막았다. RFC 2406은 ESP 보안 연관(SA)이 암호학적으로 강한 암호화 알고리즘 또는 인증 알고리즘 중 적어도 하나를 선택하도록 요구했다. RFC 4303은 같은 불변식을 더 명확한 표현으로 유지했다. 기밀성과 무결성은 정의된 상황에서 각각 선택 가능할 수 있지만, 둘 다 NULL이어서는 안 된다.

따라서ENCR_NULL만 기록한 감사 기록은 불완전하다. 기록이 진본이고 올바른 SA에 붙어 있다면 어떤 기밀성 변환이 선택되었는지는 증명한다. 그러나 무결성 알고리즘, 재전송 정책, 키 출처, 셀렉터 승인, 설치 결과는 드러내지 않는다. "암호화 없음"은 강한 무결성, 약한 무결성, 잘못된 구성, 또는 활성 SA가 전혀 없는 상황과 공존할 수 있다. 나머지 필드들이 어떤 현실이 실재하는지를 결정한다.

숫자 11도 같은 경계를 보여준다. IKEv1/IPsec DOI 레지스트리는 변환 식별자 11을 ESP_NULL에 할당했다. 현재 IKEv2 변환 레지스트리도 ESP용 ENCR_NULL을 11로 등록하면서, IKEv2 자체를 보호하는 데는 허용되지 않는다고 명시한다. 레지스트리, 변환 유형, 프로토콜 맥락 없는 숫자는 보안 진술이 아니다.

레지스트리 상태는 어휘이지 런타임 증거가 아니다. 구현에 제안 값의 의미를 알려준다. 두 피어가 그 값을 제안했거나, 선택했거나, 설치했거나, 그 값으로 트래픽을 처리했는지는 보여주지 않는다. 이후 RFC 9395는 IKEv1을 폐기하고 구 ISAKMP 레지스트리를 닫았지만, 폐기된 암호화 알고리즘 목록에 ENCR_NULL을 포함하지 않았다. 무결성 전용 ESP 메커니즘은 이후 ESP 지침에서 계속 이어졌다.

RFC 8221은 인증 전용 모드에서 구현들이 상호운용할 수 있도록 ENCR_NULL을 ESP에서 구현 필수로 만들었으며, 특히 NAT 환경에서 ESP의 동작이 AH보다 유리할 수 있는 경우를 염두에 두었다. 구현 필수는 배포 필수가 아니었다. 명세는 공통 능력을 유지했고, 특정 정책이 그 사용을 허용할지는 운영자가 결정했다.

그 지역적 선택이 다운그레이드 분석의 출발점이다. ENCR_NULL을 보는 것만으로 공격이 증명되지 않는다. 정책이 의도적으로 무결성 전용 ESP를 선택했다면 변환은 설계대로 동작하는 것이다. 기밀성을 요구해야 하는 제안이나 구성에 구현이 NULL을 수용했다면, 그 증거는 무단 다운그레이드를 보여줄 수 있다. 같은 변환 식별자가 양쪽 서사를 모두 지지한다. 정책, 전송 기록(transcript), 상태만이 양자를 가른다.

종단점들은 자신의 보안 연관 상태로 이 선택을 알 수 있었다. 중간 장비는 다른 인식적 위치에 있었다. 평범한 ESP는 각 패킷에 "이 페이로드는 암호화되어 있다" 또는 "이 페이로드는 NULL을 사용한다"라는 단순한 공개 플래그를 넣지 않았다. SPI는 종단점의 상태를 선택했지만, 무관한 관측자가 그 상태를 가졌다는 보장은 없었다.

보안 어플라이언스가 암호화된 ESP와 무결성 전용 ESP를 구별하려 하면서 이는 운영 문제가 되었다. 페이로드가 ESP_NULL이라면 기업은 악성코드 검사나 접근 제어를 수행하고 싶어할 수 있다. 암호화되어 있다면 같은 바이트가 전송 계층이나 애플리케이션 구조를 드러내지 않았다. 잘못 추측하면 검사를 우회하거나 암호문을 평문으로 해석할 수 있었다.

RFC 5840은 평범한 ESP가 확정적인 패킷 가시 구분을 제공하지 않았기 때문에 작성되었다. WESP는 기밀성 사용 여부를 명시적으로 신호하고 무결성 전용 트래픽의 검사를 지원하는 래퍼를 추가했다. 이 후속 프로토콜의 존재는 빠진 관측 표면의 역사적 증거이며, 모든 배포가 이를 채택했다는 증거는 아니다.

RFC 5879는 다른 길을 갔다. 기존 종단점을 바꾸지 않고 ESP-NULL 패킷을 탐지하기 위한 휴리스틱을 문서화했다. "휴리스틱"이라는 말이 중요하다. 이 방법은 그럴듯한 내부 프로토콜 구조와 검증 규칙을 시도했다. 그 결과는 추론이었지 SA 소유자로부터의 인증된 공개가 아니었다.

이 문서는 또한 관리적 설정을 좁혔다. 기밀성 없는 심층 검사는 피어가 암호화된 ESP를 선택해 검사를 회피하는 것을 정책상 금지하는, 통제된 기업 도메인에서 가장 그럴듯했다. 관측자가 바이트에 접근하는 것만으로 권한을 얻을 수는 없었다. 네트워크는 종단점과의 정책적 관계가 필요했고, 그 관계는 여전히 강제되어야 했다.

가시성과 권한은 별개의 영수증이다. WESP 표시는 분류를 확정적으로 만들 수 있지만, 이 관측자가 페이로드를 읽을 자격이 있는지는 결정하지 않는다. 휴리스틱은 그럴듯한 평문을 찾을 수 있지만, 동의, 목적 제한 또는 보존 규칙을 확립하지 않는다. 반대로 유효한 검사 정책이 있다고 암호화된 패킷이 해독 가능해지는 것도 아니다.

이곳에서 역사는 "ESP는 곧 암호화"라는 쉬운 표현과 갈라진다. ESP는 보안 서비스 프레임워크이지 모든 서비스가 활성화되어 있다는 약속이 아니다. RFC 4303은 무결성 전용 ESP가 구성 가능하고 협상 가능한 상태로 유지되어야 한다고 명시적으로 요구했다. 와이어상의 프로토콜 번호는 봉투를 기술했다. 설치된 SA는 선택된 알고리즘을 기술했다. 어느 하나만으로 전체 정책을 기술하지 않는다.

이 분리는 사고 분석도 보호한다. 어플라이언스가 어떤 흐름이 ESP_NULL이라고 보고한다고 하자. 첫 질문은 그것을 어떻게 아는가다. 이 주장이 인증된 종단점 상태에서 나왔는가, 협상된 WESP 마커에서 나왔는가, RFC 5879류 휴리스틱에서 나왔는가, 제품의 추측에서 나왔는가. 이 증거 클래스들은 서로 다른 실패 양상을 갖는다.

다음으로 관측이 어느 SA에 속하는지 물어라. SPI와 목적지는 상태를 찾는 데 도움되지만, 상태는 오래되었거나, 재키 재설정되었거나, 방향별일 수 있다. 인바운드 SA와 아웃바운드 SA는 별개다. 구성 데이터베이스는 의도된 정책을 보여주는 반면, 커널은 부분 업데이트나 설치 실패 후 다른 변환을 보유할 수 있다.

그다음 무엇이 무결성을 담당했는지 물어라. NULL은 아무것도 기여하지 않는다. 승인된 키 하에서 성공한 무결성 검사는 알고리즘의 커버리지 내에서 데이터 출처와 변경에 대한 주장을 지지할 수 있다. 표시된 변환 이름은 그렇게 할 수 없다. 무결성마저 없다면, 그 구성은 무해한 "투명" 모드를 만드는 것이 아니라 ESP의 핵심 불변식을 위반하는 것이다.

재전송 처리도 또 하나의 영수증이다. 시퀀스 번호는 안티 리플레이를 지지할 수 있지만, 검사가 활성화되어 있는지, 패킷이 창 안에 들어오는지는 수신자 상태와 정책이 결정한다. 읽을 수 있는 페이로드가 수신자가 시퀀스를 수용했거나 상위로 전달했다는 증거는 아니다.

마지막으로 IPsec 이후에 무엇이 일어났는지 물어라. 무결성 검증이 방화벽이 내부 흐름을 허용했음을, 전송 계층 종단점이 수용했음을, 애플리케이션이 결과를 확정했음을 증명하지 않는다. 그것들은 다른 구성 요소들이 내리는 이후의 결정이다. "인증된 트래픽"이라는 표현은 그 증거가 지지하는 경계에서 멈추어야 한다.

Lu Heng의 현실 계층 논증은 이 역사에 규율 있는 어휘를 제공한다. RFC와 레지스트리는 상징 계층에 있다. 공유된 의미를 정의한다. 협상된 제안은 합의 계층에 있다. 설치된 SA는 실행 코드 계층에 있다. 패킷 검사는 관측 계층에 있다. 검사 정책은 권한 계층에 있다. 애플리케이션 처리는 결과 계층에 있다.

혼란은 한 계층이 다른 계층의 권한을 빌려오는 데서 시작된다. 레지스트리 번호는 SA를 만들지 않는다. SA는 모든 관측자에게 자신을 공개적으로 알리지 않는다. 가시성이 검사를 승인하지 않는다. 무결성이 기밀성을 증명하지 않는다. 검사가 애플리케이션 수용을 증명하지 않는다.

대리 문제도 똑같이 구체적이다. 표준 저자들은 변환을 명세한다. IKE 구현은 협상한다. 커널 팀은 SA를 설치한다. 보안 운영은 정책을 정한다. 미들박스 벤더는 트래픽을 분류한다. 컴플라이언스 팀은 검사 권한을 정의한다. 애플리케이션 소유자가 성공을 판단한다. "IPsec 보호됨"이라는 단일 녹색 아이콘은 한 에이전트가 자신의 증거를 쥐고 있지 않은 채 다른 모든 에이전트를 대변하게 한다.

실행 코드 우위는 표준에 반대하는 논거가 아니다. 표준의 절제를 올바르게 존중하는 방식이다. 제안과 선택 전송 기록, 정책 개정, 인바운드·아웃바운드 SA 기록, 무결성 알고리즘과 키 출처, 재전송 상태, 패킷 카운터, 관측자 분류 방법, 검사 승인, 애플리케이션 결과를 보존하라. 각 기록이 스스로 검증할 수 있는 주장만 하도록 하라.

역사가 계속된 이유는 어느 한 계층도 전지하게 되지 않았기 때문이다. RFC 4835와 RFC 8221은 ESP를 다시 쓰지 않으면서 알고리즘 요구사항을 갱신했다. RFC 5840은 명시적 가시성 옵션을 제공했다. RFC 5879는 그것이 없는 관측자를 위한 전환 기법을 문서화했다. RFC 6071은 이 문서들이 보편적으로 배포되었다고 가장하지 않고 그것들을 매핑했다.

RFC 2410의 농담이 살아남은 이유는 설계가 진지했기 때문이다. 그것은 "아무것도 아님"을 무언가로 표준화했다. 출력이 입력과 같은 결정적 변환이었다. 그것은 종단점 합의를 정밀하게 만들었다. 그러나 그 합의를 낯선 이에게 패킷이 자백하게 하지는 않았다.

출처