요약

  • RFC 7474는 32비트 부팅 카운트를 32비트 패킷 카운터와 결합하여, 휘발성 인접 상태가 사라진 후에도 OSPFv2의 신선도가 유지되도록 한다. 수신자는 해당 패킷 유형에 대해 마지막으로 수용한 값보다 크지 않은 카운터를 거부하며, 다이제스트가 그 외의 부분에서 유효하더라도 마찬가지다.
  • Acee Lindem은 Manav Bhatia, Sam Hartman, Dacheng Zhang과 함께 이 4인 저자 표준을 편집했다. 이 메커니즘만큼 중요한 것은 한계다: 영구 부팅 상태를 잃으면 새 키가 필요하고, 자동 키 관리는 범위 밖이며, 안전한 키 교체는 운용 중인 라우터에서 시간, 피어, 인터페이스, 방향의 일치에 달려 있다.

재부팅을 기다린 패킷

공격자가 인증된 OSPF Database Description 패킷을 기록해 뒀다고 상상해 보자. 키는 알려져 있지 않고 다이제스트는 위조할 수 없다. 따라서 수신 라우터가 더 높은 시퀀스 번호를 기억하고 있는 동안 이 패킷은 무용지물이다. 그러다 인접이 끊기고 프로세스가 재시작되면 수신자의 이전 상태가 사라진다. 기록된 패킷이 더 진짜가 된 것은 아니다. 검증자가 그것이 오래된 이유를 잊어버렸기 때문에 위험해진 것이다.

2015년 4월 Standards Track으로 발표된RFC 7474의 핵심이 바로 이 구분이다. 이전의 OSPFv2 암호 인증은 시퀀스 번호를 이웃 인접 상태에 붙였다. 인접이 내려가면 그 값들은 재초기화될 수 있었다. 다이제스트는 키 보유자가 패킷을 만들었다는 사실을 증명할 수 있었지만, 수신자는 그 패킷이 시간상 어디에 속하는지 더 이상 확립할 수 없었다.

이 문서는 Manav Bhatia, Sam Hartman, Dacheng Zhang, Acee Lindem을 명시하며, Lindem이 편집자였다.IETF Datatracker 기록은 Lindem을 이 발표물과 더 넓은 라우팅 경력과 연결한다. 그러나 이것이 그를 단독 발명가로, OSPF의 소유자로, 어떤 구현의 보증인으로 만들지는 않는다. 유용한 귀속은 더 좁다: 그의 문서화된 기여는, 이전에 지워지던 장애 경계를 넘어 프로토콜의 기억을 살리려는 공동의 시도에 속한다는 것이다.

더 강한 해시는 “언제”라는 질문에 답하지 못했다

RFC 5709는 이미 OSPFv2 인증에 HMAC-SHA 알고리즘을 추가했다. 저자는 Manav Bhatia, Vishwas Manral, Michael Fanto, Russ White, Michael Barnes, Tony Li, Randall Atkinson이며, Lindem이 아니다. 더 강한 알고리즘은 위조 저항을 개선하고 keyed MD5에 대한 의존을 대체했다. 그러나 그것만으로 올바르게 인증된 패킷을 현재의 것으로 만들지는 못했다.

Vishwas Manral, Manav Bhatia, Joel Jaeggli, Russ White가 쓴RFC 6039는 라우팅 프로토콜에 대한 수동 키 보호의 더 넓은 약점을 기술했다: 장기 공유 키, 어려운 키 교체, 재생 노출, 그리고 패킷과 그것이 수용되어야 하는 맥락 사이의 불완전한 결합. 여기서도 Lindem은 저자가 아니다. 이 출처가 여기 있는 이유는, RFC 7474가 OSPFv2에 대해 좁혀 주는 문제의 계층을 설명하기 위해서다.

그 결과 얻어지는 교훈은 보안 대시보드에서 놓치기 쉽다. “인증 성공”은 키 자료의 보유와 보호된 바이트의 무결성이라는 한 가지 질문에 답할 뿐이다. 이 패킷이 현재 세션에 속하는지, 보호된 출처 맥락에서 도착했는지, 이 프로토콜을 위한 것인지는 답하지 않는다. 신선도, 출처 맥락, 프로토콜 분리에는 각자의 인증된 사실이 필요하다.

라우터는 암흑기를 넘어 에포크를 짊어진다

RFC 7474는 암호 시퀀스 번호를 64비트로 확장한다. 상위 32비트는 부팅 카운트를 담고, 하위 32비트는 엄격히 증가하는 패킷 카운터를 담는다. 둘을 합하면 에포크와 그 안에서의 위치가 된다.

부팅 카운트는 OSPFv2 라우터의 배치 수명 동안 비휘발성 저장소에 있어야 한다. 구현이 이전 패킷 시퀀스 상태를 잃을 때마다—콜드 재시작을 포함하여—이 카운트는 증가한다. 문서는 SNMPv3의snmpEngineBoots값을 사용할 수 있음을 허용하지만, SNMP와 OSPF는 서로 다른 이유로 재초기화할 수 있으므로 별도의 OSPF 카운트를 권고한다. 이 분리는 한 하위 시스템의 수명 주기가 다른 시스템의 우연한 시계가 되지 않도록 한다.

전송되는 모든 OSPF 패킷에 대해 하위 32비트 카운터가 증가한다. 수신자는 결합된 신선도 상태를, 그 이웃으로부터 수용한 같은 OSPF 패킷 유형의 마지막 패킷과 비교한다. 더 크지 않은 값은 재생된 것이므로 폐기해야 한다. 패킷 유형은 별도로 추적되는데, 우선순위 처리로 예컨대 Hello와 Link State Update 트래픽이 재정렬될 수 있어도 어느 쪽도 재생이 아니기 때문이다.

하위 카운터가 결국 감돌(랩)하면 부팅 카운트가 다시 증가하여 전체 값은 엄격히 증가 상태를 유지한다. 이 설계는 재부팅이 일어나지 않았다고 가장하지 않는다. 재부팅을 인증된 단조적 변화로 바꿔, 더 오래된 기록이 따라잡을 수 없게 한다.

64비트 값은 예전 헤더 필드에 맞지 않는다. RFC 7474는 여덟 옥텟을 OSPF 패킷 뒤에 배치하고 다이제스트 계산에 포함시킨다. 인증 타입 3을 정의하고 Key ID를 32비트로 확장한다. 이것들은 보안 속성과 무관한 포장 세부사항이 아니다. 에포크가 인증된 자료 밖에 있다면 공격자가 교체할 수 있다. 수신자가 패킷 유형별 스트림 대신 하나의 전역 스트림을 비교한다면 합법적인 재정렬이 적대적으로 보일 수 있다.

출처 주소가 증명에 합류한다

이전 인증 계산은 IPv4 헤더를 다루지 않았다. 브로드캐스트 및 non-broadcast multiaccess 네트워크에서 OSPF는 IP 출처 주소로 송신 이웃을 식별한다. 따라서 캡처한 패킷에서 그 주소를 바꿀 수 있는 공격자는 이전 다이제스트를 무효화하지 않고도 어느 이웃의 시퀀스 상태가 갱신되는지를 바꿀 수 있었다.

RFC 7474는 RFC 5709가 사용하는 패딩 입력을 바꿔 처음 네 옥텟이 IPv4 출처 주소를 담도록 한다. 송신자는 자신이 사용할 주소를 인증하고, 수신자는 도착한 주소를 인증한다. 이제 출처가 바뀌면 인증 실패가 된다. 이것은 이웃이 일방향처럼 보이게 하거나 Database Description 교환을 흔들 수 있었던, 문서화된 반사 또는 재명시(relabelled) 패킷 계층을 차단한다.

경계는 정확하다. 이 문서는 IPv4 헤더의 모든 변경 가능 필드를 인증하지 않는다. OSPF가 이웃 식별에 실제로 사용하는 출처 사실만 추가한다. 인증되지 않은 의미가 프로토콜 상태를 방향 전환시킬 수 있는 그 필드를 보호하는, 운용상 목적이 보이는 최소 공유 사양이다.

하나의 비밀이 모든 프로토콜에 말해서는 안 된다

장기 키 데이터베이스는 같은 비밀을 두 개 이상의 라우팅 프로토콜에 노출할 수 있다. 인증 입력에 프로토콜 식별자가 없다면, 한 용도에서 유효한 메시지 구성이 다른 용도로 이식될 수 있다. RFC 7474는 해시가 키를 사용하기 전에 2옥텟 OSPFv2 암호 프로토콜 ID를 인증 키 뒤에 덧붙인다.

이것이 도메인 분리다. 기저 비밀은 운영자의 선택에 따라 공유될 수 있지만, 유효 키 맥락은 “OSPFv2”라고 말한다. 어떤 패킷도 같은 저장된 바이트로 다른 곳에서 인증되었다는 이유만으로 이 맥락을 주장할 수 없다.

도메인 분리가 넓은 키 공유를 면죄부로 만들지는 않는다. 장기 비밀의 유출은 여전히 중요하며, 독립 키는 피해 반경을 줄인다. 프로토콜 식별자는 공유 인프라가 존재할 때의 방어 경계를 제공할 뿐, 시스템 간 단일 키가 좋은 관리라는 선언이 아니다.

키 교체는 자정의 스위치가 아니라 구간이다

수동 키에는 양방향 수명이 있다. 송신 키는 현재 시간이SendLifetimeStart와SendLifetimeEnd사이에 있을 때만 사용 가능하다. 수신 키는 자체 수용 구간을 사용한다. 이 차이 덕분에 새 키가 모든 송신자가 사용하기 전에 수용될 수 있고, 송신 선호가 옮겨진 뒤에도 이전 키가 잠시 수용 가능하게 남을 수 있다. 안전한 키 교체는 바로 이 겹침 속에 산다.

RFC 7474는 이어서 범위로 선택을 좁힌다. 키는 보안 알고리즘, 피어 또는 에어리어, 인터페이스, 방향과 일치해야 한다. 명시적 인터페이스 또는 피어 일치가 포괄 항목보다 우선한다. 그래도 여러 송신 키가 남으면 송신 수명 시작이 가장 최근인 키가 선택된다. 패킷은 32비트 Key ID를 실어 가며, 수신자는 그 ID와 함께 인터페이스, 피어, 방향, 알고리즘, 수용 수명으로 대칭 키를 찾는다.

이 안무(콜레오그래피)는 키 변경을 순간적인 가정에서 관찰 가능한 전이로 바꾼다. 먼저 새 키를 배포한다. 다음으로 그 수용 구간을 연다. 그다음 송신 선택을 옮긴다. 승인된 허용 오차 내의 지연 패킷과 시계가 맞지 않는 장치를 위해 이전 수용 구간을 충분히 유지한다. 마지막으로 모든 요구되는 인접이 새 선택을 증명한 뒤에 이전 키를 닫고 제거한다.

따라서 시간은 라우팅 가용성의 일부다. 시계 오류는 송신 키를 하나도 선택하지 못하게 하거나, 이웃의 새 키를 거부하게 하거나, 이전 키를 의도보다 오래 유지하게 할 수 있다. “두 키가 모두 설치됨”을 보고하는 구성 시스템은 양쪽 끝에서 송신·수용 창이 올바르게 겹친다는 것을 증명한 것이 아니다.

호환성이란 모호성을 거부하는 것

인증 타입 3은 새로운 것이다. 구성된 인터페이스가 다른 인증 타입을 기대하는 수신자는 기존 OSPF 규칙에 따라 그 패킷을 폐기한다. 이전 타입으로 조용히 협상하거나 새 트레일러를 옛 형식으로 해석하려 시도하지 않는다.

이 행동은 부분 배치 중 인접 형성을 막을 수 있다. 그래도 더 안전한 호환 결과다. 각 끝점이 같은 인증된 패킷에 서로 다른 신선도 의미를 부여한 채 인접을 형성하면, 도입 중이던 보안 속성을 버림으로써 링크가 건강해 보이게 된다.

따라서 운영자는 배치를 로컬 체크박스가 아니라 인접 마이그레이션으로 다루어야 한다. 양쪽 끝에 호환 코드, 일치하는 타입, 일치하는 유효 키, 사용 가능한 수명 겹침, 단조적 상태가 필요하다. 관문은 첫 라우터에서의 구성 성공이 아니라 대칭적인 패킷 수용, 이어지는 안정적인 인접과 포워딩이다.

기억을 잃으면 키도 오래된 것이다

RFC 7474는 가장 힘든 운용 규칙을 단호하게 밝힌다. 수리, 업그레이드, 라우터 교체가 비휘발성 부팅 카운트를 잃게 되면, 인증 키를 반드시 바꿔야 한다. 리셋된 에포크와 함께 이전 키를 재사용하면, 그 키 아래에서 만들어진 기록들이 새로운 낮은 시퀀스 공간과 경쟁할 수 있다.

이것은 기기 교체를 암호 수명 주기 이벤트로 만든다. 구성 파일 복원으로는 부족하다. 교체된 기기는 같은 라우터 ID, 주소, 에어리어, 키 바이트를 가지면서도, 오늘의 패킷을 어제의 패킷과 구별해 주던 그 하나의 사실만은 갖지 못할 수 있다. 종이 위의 정체성 연속성이 실행 중인 코드에서는 재생 취약성이 된다.

더 많은 한계가 있다. 라우터가 완전히 서비스에서 빠지는 경우, 동일한 인접 수립 교환 전체를 재생하는 것은 명시된 그대로이지만 매우 가능성이 낮은 시나리오로 남는다. 관련 키를 교체하면 그것을 막는다. 하나의 출처 IP와 하나의 암호 시퀀스를 두 개의 탭된 무번호 point-to-point 링크에서 사용하는 경우, 문서는 인터페이스별로 다른 키를 권고한다. 자동 키 관리는 여전히 범위 밖이다.

이 주의사항들은 잘못된 결론을 막는다. RFC 7474는 수동 키를 스스로 유지되게 하거나 모든 토폴로지에서 재생을 불가능하게 하지 않는다. 유한하고 검증 가능한 개선을 제공하며, 그 가정을 무효화하는 사건들을 명시한다.

최소한의 와이어 규칙, 현지의 관리

Lu Heng의 후속 저작Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption은 이 설계에 대한 분석적 렌즈를 Sofia Ren에게 제공한다. 공유 계층은 작을 수 있다: 시퀀스 구조, 인증된 출처, 프로토콜 식별자, 키 식별자, 거부 의미론. 키 생성, 저장, 인터페이스 범위, 수명 겹침, 배치 단위, 복구에 관한 결정은 운영자에게 남는다.

공유 계층이 모든 관리 시스템을 규정한다면 과잉이 될 것이다. 단조적 에포크와 수신자 규칙을 생략한다면, 상호운용 가능한 패킷들이 서로 양립하지 않는 신선도 개념을 실어 다닐 수 있다. 유용한 경계는 두 라우터가 반드시 합의해야 하는 것을 표준화하면서, 각 네트워크가 자기 구현을 보호하고 증명할 책임은 남겨 둔다.

Running-Code Primacy는 증거의 기준을 높인다. 구성된 알고리즘과 Key ID는 의도일 뿐이다. 증명은 영구 부팅 상태, 송출된 시퀀스, 선택된 키, 출처 결합 다이제스트, 수신자 비교, 재생 폐기 카운터, 인접 상태, 포워딩을 연결해야 한다. Heng 텍스트들은 이후의 편집적 틀이며, RFC들 너머의 Lindem 개인 의도나 IETF 합의의 증거가 아니다.

결과 규칙은 위협이 인내하기 때문에 엄격하다. 공격자는 라우터가 잊는 것을 기억할 수 있다. RFC 7474는 라우터의 보안 정체성이 재부팅 경계를 넘도록 요구함으로써 그 우위를 뒤집는다. 그 기억을 신뢰할 수 없을 때, 이전 키는 더 이상 새로운 수명을 안전하게 인증할 수 없다.

출처