X509 파싱 혁신 구문 트리로 보안 취약점 완전 정복
초록
본 논문은 X.509 인증서 형식을 형식언어 이론에 기반한 문법으로 정형화하고, ANTLR을 이용해 자동으로 파서를 생성한다. 11 백만 개의 실세계 인증서를 분석한 결과 21.5 %가 구문적으로 잘못된 것으로 밝혀졌으며, 7개의 주요 TLS 라이브러리는 이러한 오류 인증서를 5.7 %‑10.5 % 수준에서 정상으로 받아들였다. 논문은 잘못된 구문이 실제로 인증서 위조 공격에 이용될 수 있음을 실증한다.
상세 분석
이 연구는 X.509 표준을 ‘언어’로 바라보고, ASN.1 구문을 전통적인 형식문법(EBNF)과 매핑함으로써 파싱 가능성을 체계적으로 검증한다. 저자들은 먼저 X.509이 본질적으로 컨텍스트‑센시티브(CS) 특성을 가지고 있음을 지적하고, 실제 구현에 방해가 되는 요소들을 식별한다. 특히, ASN.1의 ‘ANY DEFINED BY’, ‘CONTAINING’, ‘SIZE(MIN..MAX)’와 같은 동적 제약은 문법을 모호하게 만들며, 기존 파서들은 이러한 제약을 수동 코드로 처리해 버그를 초래한다는 점을 강조한다.
논문은 이러한 복잡성을 극복하기 위해 ‘예측적(predicated) 문법’을 설계한다. 이 문법은 가능한 모든 X.509 인증서를 포함하면서도, 입력 크기가 4 GiB 이하인 경우에 한해 결정적·선형 파싱이 보장된다. 구현 단계에서는 ANTLR4를 활용해 자동 파서를 생성했으며, 파서는 바이트 수준에서 256개의 심볼을 알파벳으로 사용하고, 모든 선택·반복·옵션 구조를 오른쪽 선형 규칙으로 변환해 메모리 사용을 상수 수준으로 제한한다.
성능 평가에서는 전 세계 IPv4 주소에 배포된 HTTPS 서버를 대상으로 11 M개의 인증서를 수집·분석하였다. 결과는 21.5 %가 구문 오류를 포함하고 있음을 보여준다. 이 중 상당수는 인증서 체인 검증 로직에서 무시되거나, ‘버전’, ‘시리얼 번호’, ‘확장 필드’ 등 비핵심 요소의 형식 오류였다.
저자들은 OpenSSL, BoringSSL, GnuTLS, LibreSSL, NSS, Java Secure Socket Extension, 그리고 WolfSSL 등 7개의 널리 사용되는 TLS 라이브러리를 대상으로 동일한 인증서 집합을 검증하였다. 라이브러리별로 허용된 오류 인증서 수는 631 k에서 1 156 k 사이였으며, 이는 전체 인증서의 5.7 %‑10.5 %에 해당한다. 특히, ‘Subject Alternative Name’ 필드의 잘못된 인코딩이나 ‘Basic Constraints’ 확장의 부정확한 길이 표기가 라이브러리마다 다르게 처리돼, 동일 인증서가 일부 구현에서는 유효, 일부에서는 무효로 판단되는 불일치가 발생했다.
보안적 영향 평가에서는 발견된 구문 오류 중 하나를 이용해 실제 ‘임의 도메인 사칭’ 공격을 구현하였다. 공격자는 잘못된 확장 필드(예: ‘Key Usage’가 비트 마스크 형태로 잘못 파싱되는 경우)를 조작해, 인증서 검증 단계에서 해당 비트를 무시하도록 만들었다. 결과적으로 OpenSSL과 BoringSSL은 위조된 인증서를 정상 인증서처럼 받아들였으며, TLS 핸드쉐이크가 성공해 중간자 공격이 가능함을 증명했다.
이 논문은 X.509 파싱을 형식언어 이론에 기반해 재정의함으로써, 기존 라이브러리의 ‘핸코드 파싱’ 방식이 갖는 구조적 한계를 명확히 드러낸다. 또한, 자동 생성된 파서는 결정적·선형 시간 복잡도를 보장하므로, 실시간 서비스에 적용해도 성능 저하가 최소화된다. 향후 연구에서는 RFC 5280에 정의된 정책 제약을 문법 수준으로 통합하고, 다른 인증서 포맷(예: OpenPGP)에도 동일한 접근법을 확장하는 방안을 제시한다.
댓글 및 학술 토론
Loading comments...
의견 남기기