본문 바로가기
기타 진열장/여러정보들 집합소

이미 개발된 SNI 차단을 무력화...

by JiNan's 2019. 2. 14.
반응형

기존 SNI의 한계점

TLS 1.3 표준에 정의된 SNI (Server Name Indication, 서버 이름 표시)는 암호화가 되지 않았기에 감청이 가능한 한계를 가지고 있음



(패킷 캡쳐 프로그램인 WireShark, 목적지인 74.125.132.138에 보낸 Client Hello에서 

Server Name Indication(SNI) 정보가 모두 노출됨을 확인할 수 있음)


(밑칸의 이상한 숫자와 문자들이 바로 암호화된 패킷의 데이터, 그런데 SNI는 암호화되지 않기 때문에 그대로 드러남.)



(2016년 6월 27일 개최된 IEEE 컨퍼런스의 내용 중 하나인 Improving SNI-based HTTPS Security Monitoring에서 발췌)

( 물론 SNI 필터링 기법은 2010년 초부터 이미 논의되기 시작했어 )

한국 정부는 TLS의 이러한 취약점을 이용해 

KT, SK, LG 등 통신사들의 DNS를 거치는 요청들을 감청해 

SNI를 확인하고 SNI가 가리키는 것이 불순한 사이트라면

필터링을 통해 진압을 하는 매커니즘이야.


이 진압 매커니즘을 전화에 비유하자면

1) 내가 불순한 전화번호에 전화를 건다. 예를 들면 북한 국제번호인 +850을 포함하는 번호에 국제전화를 건다. (+850 - 02 - XX - XXX)

2) 전화는 한국의 기지국을 거쳐가므로 전화의 수신번호는 감청 대상에 포함된다.

3) 수신번호에 +850이 포함된 것을 보고 진압을 한다.


물론 전화의 경우 말을 걸기도 전에 끊어지기 때문에 

이 비유는 컴퓨터 통신의 암호화된 패킷에 해당하는 것이 없기에 부적절한 면이 있음


이 진압 매커니즘의 단점

KT, SK, LG 등의 국내 DNS 서버가 아닌 해외 DNS 서버를 사용하면 한국 정부도 막을 방법이 없다.


따라서 해외 DNS 서버를 이용하면 되었으나...

한국 정부는 2017년경부터 해외 DNS를 

순차적으로 차단하고 있어서 진압당한 방법임 (그 근성에 공중제비 돌면서 울었다...)

그럼 답은 무엇이냐? 해외 VPN을 사용하면 되는 것이다.

하지만 속도가 너무 느리고, 속도를 높이려면 돈을 내야 하는 것이 문제인데...



해결책을 구상중인 외국의 존경스런 엔지니어들




https://tools.ietf.org/html/draft-rescorla-tls-esni-00#page-4


2018년 7월 2일 생성된 드래프트(밑그림) 문서


다행히도 외국의 선구적인 엔지니어들은 벌써 해결책을 개발해 놨어. 

위에서 봤듯이  IEEE 컨퍼런스에서 SNI 필터링 기법이 소개된지 2년만이야.


핵심 발췌


3.2. SNI Encryption

The protocol designed in this document is quite straightforward. First, the provider publishes a public key which is used for SNI encryption for all the domains for which it serves directly or indirectly (via Split mode). This document defines a publication mechanism using DNS, but other mechanisms are also possible. In particular, if some of the clients of a private server are applications rather than Web browsers, those applications might have the public key preconfigured. When a client wants to form a TLS connection to any of the domains served by an ESNI-supporting provider, it replaces the "server_name" extension in the ClientHello with an "encrypted_server_name" extension, which contains the true extension encrypted under the provider's public key. The provider can then decrypt the extension and either terminate the connection (in Shared Mode) or forward it to the backend server (in Split Mode).

이 밑은 구체적인 구현 방법에 대한 코드가 적혀 있어 설명하기도, 이해하기도 힘들기 때문에 핵심만 알고 넘어가자면


Encrypted SNI (암호화된 SNI)

SNI에 대해서도 암호화를 적용해서

패킷 감청 결과 "SERVER_NAME" (예를 들면 "www.pomhub.com") 이라고 보여지던 것이 

이제는 키에 의해 암호화된 ("bngha5_23_uNzI")로 보여진다는 것임.


따라서 SNI 필터링 기법은 무력화되고, 

해외 DNS나 VPN을 쓸 필요 없이 우린 그저 하던대로 https를 사용해서 불순한 사이트를 들락거릴 수 있다는 것이 이 글의 요지임



이 기능은 굉장히 최신이고 아직 시험단계라 모든 브라우저에 있지는 않고



파이어폭스 나이틀리 (FireFox Nightly) 에서 사용 가능함.  

Beta 버전, 개발자 버전 이런거 받으면 안 되고 Nightly에서만 가능함.

그럼 VPN 또는 나이틀리로 품위 있는 삶을 유지할 수 있기를 빌게!



* 한국 정부는 파이어폭스 나이틀리를 다운받지 못하도록 Mozilla 사이트를 차단할까? *




출처: 이미 개발된 SNI 차단을 무력화시키는 방법

댓글