VPN 프로토콜 명세가 무엇을 증명하고 무엇을 증명하지 않는가
명세는 메시지 형식, 알고리즘, 위협 가정을 정한다. 설치한 빌드나 운영자가 계정을 처리하는 방식까지 보증하지는 못한다.
프로토콜 문서는 구현들 사이의 계약이며, 주의 깊게 읽으면 두 준수 피어가 무엇을 주고받는지, 설계자들이 어떤 속성을 의도했는지 알 수 있다. 그러나 연결하는 서버에서 어떤 바이너리가 실행되는지, 그 서버가 어떻게 설정되었는지, 이후에 계정 기록이 어떻게 되는지는 알려주지 않는다. 이들은 서로 다른 세 종류의 증거이며, 명세를 세 가지 모두로 취급하는 것이 프로토콜 이름이 할 수 없는 일을 시작하게 되는 방식이다. 셋을 분리해 두는 것이 이 연습의 전부다.
문서는 논증의 시작이지 결론이 아니다.
문서가 실제로 규정하는 것
WireGuard의 경우 프로토콜 설명은 Noise IK 핸드셰이크, 고정된 프리미티브 집합, 메시지 레이아웃, 그리고 이후 패킷을 운반하는 전송 프레이밍을 정의한다. IKEv2의 경우 비교 가능한 산출물은 RFC 7296이며, 교환, 페이로드, 제안 협상을 규정한다. 두 경우 모두 범위는 정확하다: 메시지, 상태 기계, 그리고 보안 목표가 성립하는 가정이다.
선택 모드는 읽기를 복잡하게 만든다. 한 핸드셰이크에 성립하는 속성이 다른 인증 구성이나 대체 설정을 쓰는 배포에는 적용되지 않을 수 있다.
보증이 멈추는 곳
형식 분석은 모델에 관한 질문에 답한다. WireGuard의 검증 작업은 Tamarin 증명기 안의 기호 모델을 사용하며, 이는 설계가 가정 아래에서 특정 공격을 견딘다는 것을 보여줄 수 있지만, 배포된 사용자 공간 구현에 메모리 안전 결함이 없다는 것은 보여주지 않는다. 모델과 기계 사이의 이 간극이 실제 사고가 사는 곳이다. 증명을 구현 인증서로 읽는 것은 범주 오류다.
전방 비밀성은 같은 경계를 보여준다. 이 속성은 키가 프로토콜이 의도한 대로 파괴되는지에 달려 있으며, 그것은 메시지 형식이 아니라 구현과 그 환경의 속성이다. 삭제를 규정하는 설계도 메모리를 디스크로 내보내는 플랫폼에서는 강제할 수 없다.
계층적 의존성은 TLS 기반 터널 뒤의 TLS 라이브러리, 사용자 공간 터널이 쓰는 커널 인터페이스, 난수 생성기가 모두 프로토콜 텍스트 밖에 있어 간극을 더 넓힌다.
바이트를 빌드 안까지 따라가라
버전을 확인하고 그것을 실제로 트래픽을 처리하는 것과 비교함으로써 문서에서 산출물로 넘어가라. 프로토콜을 명시하는 제품은 명세가 결코 설명하지 않는 프로비저닝, 원격 측정, 관리 구성 요소를 추가할 수 있다.
openvpn --version | head -3 wg --version dpkg -l | grep -E 'openvpn|wireguard|libssl' ss -lunp | grep -E '1194|51820' sha256sum ./wireguard-tools_1.0.20210914_amd64.deb
재현 가능한 빌드와 공개된 체크섬은 소스 트리를 배포된 바이너리에 연결하는 것을 가능하게 한다. 그 연결이 없으면 공개된 소스는 검사가 가능하다는 것만 증명할 뿐, 실행 중인 파일이 그와 일치한다는 것은 아니다.
설정도 같은 단계에 속한다. 암호 스위트, 허용된 피어, 라우팅 설정은 배포 선택이며, 준수하는 빌드라도 부주의하게 설정하면 약한 터널이 된다.
운영 관행은 분리해 두라
계정 기록, 결제 데이터, 지원 제출은 어떤 프로토콜 텍스트도 제약하지 않는 운영자의 결정이다. 감사 보고서는 선언된 범위 안에서 명명된 구성 요소를 다루고, 개인정보 정책은 의도와 관행을 서술하지만, 어느 것도 다른 것을 대신하지 않으며 어느 것도 암호학적 진술이 아니다.
정확한 결론은 누적적이다: 명세는 설계를, 빌드와 설정은 터널을, 운영자의 문서화된 관행은 터널이 결코 보지 못하는 모든 것을 설명한다. 이 중 무엇을 검증했는지 말하라, 그러면 주장은 참으로 남는다.