
2021년 1월 10일, 2021년 1월 11일 수정
약 7년 전 텔레그램이 자체 개발한 암호화 프로토콜에서 발견해 수정한 버그가 있었다. 당시 러시아어로만 공개돼 널리 알려지지 않았으며, 글쓴이는 이 버그가 백도어처럼 보이는 사례 중 가장 인상적이라고 평가한다.
텔레그램은 MTProto라는 자체 프로토콜로 서버와의 메시지를 암호화하고, 사용자가 선택하는 1대1 종단 간 암호화 대화인 ‘비밀 대화’도 제공한다. 글쓴이는 당시 알려진 최신 버전은 구현이 올바르다는 전제 아래, 최종 사용자에게 영향을 줄 만큼 심각하거나 관련 있는 방식으로 깨졌다고 알려진 바가 없다고 설명한다. 다만 초기 버전에는 이해하기 어려운 방식의 결함이 있었다고 지적한다.
키 교환에 추가된 임의값
텔레그램의 종단 간 대화는 유한체 디피-헬먼 키 교환으로 두 참여자 사이의 공유 키를 만든다. 절차는 텔레그램 서버를 거쳐 진행된다. 디피-헬먼만으로는 서버가 앨리스와 밥에게 각각 별도의 연결을 맺는 중간자 공격을 막지 못한다. 이를 알아차리려면 두 참여자가 같은 비밀값을 만들었는지 확인해야 한다. TLS는 인증서 서명을 사용하고, 여러 보안 메신저는 지문을 별도 경로로 대조하는 방식을 쓴다.
텔레그램 종단 간 API 문서의 ‘키 생성’ 항목에 따르면 앨리스는 디피-헬먼 매개변수 (p, g)를 서버에서 받아 검증하고 임의의 a를 계산한 뒤 g^a mod p를 보낸다. 밥은 이를 받아 임의의 b와 g^b mod p를 계산해 돌려보낸다.
통상 양쪽은 (g^a)^b mod p와 (g^b)^a mod p를 공유 키로 삼는다. 그러나 MTProto 초기 버전은 여기에 서버가 상대방의 공개값과 함께 보낸 임의의 nonce를 XOR하는 단계를 추가했다.
(g^a)^b mod p XOR nonce
글쓴이는 이 추가 단계가 표준적이지도 유용하지도 않았으며, 오히려 서버가 탐지되지 않는 중간자 공격을 수행할 수 있게 했다고 설명한다. 일반적인 중간자 공격에서는 앨리스와 밥이 서로 다른 키를 만들어 지문을 비교하면 공격을 발견할 수 있다. 하지만 서버가 두 사람에게 전달하는 nonce를 조작하면 앨리스의 키를 밥의 키와 일치시킬 수 있다. 두 사람은 같은 지문을 보지만 서버도 공유 키를 알게 돼 메시지를 복호화할 수 있다는 것이다.
Alice Telegram Bob a = random() A = g^a mod p -> t = random() T = g^t mod p -> b = random() <- B = g^b mod p key = T^b mod p <- T key = T^a mod p T^a mod p != T^b mod p
nonce_bob = random() key_bob = T^b mod p XOR nonce_bob nonce_alice = A^t mod p XOR B^t mod p XOR nonce_bob key_alice = T^a mod p XOR nonce_alice = T^a mod p XOR (A^t mod p XOR B^t mod p XOR nonce_bob) = B^t mod p XOR nonce_bob = key_bob
이 취약점은 API 문서에서 nonce 단계를 조용히 삭제하는 방식으로 수정됐다. 문서 변경 내역과 이후의 API 개정판에서는 nonce 매개변수가 사라졌고, 개정판에는 “비밀 대화 개선”이라는 설명이 붙었다. 초기 API 참조 문서는 nonce를 “키 계산을 위한 임의의 서버 시퀀스”라고만 설명했다.
텔레그램의 설명과 글쓴이의 반론
2021년 1월 11일 수정 내용에서 글쓴이는 텔레그램의 공식 설명을 소개한다. 텔레그램은 이 nonce가 난수 생성기가 약한 클라이언트를 보호하기 위한 것이라고 설명했다.
글쓴이는 이 설명에 반박한다. MTProto의 메시지 인증 방식도 페이로드의 난수성에 의존하며, API는 클라이언트가 비밀값과 XOR할 임의 바이트를 서버에 요청하는 것도 허용했다는 것이다. 또 종단 간 암호화에서 서버가 제공하는 추가 난수는 서버가 공격자인 상황을 막지 못한다고 주장한다. 서버와 클라이언트 사이의 메시지를 가로챌 수 있는 공격자는 그 난수도 볼 수 있기 때문이다. 글쓴이는 어차피 침해로 이어지는 상황을 막겠다며 프로토콜을 복잡하게 만드는 것은 암호 설계에서 의미가 없다고 평가한다.
글쓴이는 이 오래된 버그보다 텔레그램 암호화를 신뢰하지 말아야 할 더 나은 이유가 있다고 덧붙인다. 종단 간 암호화가 기본으로 꺼져 있고 사용이 번거로우며 그룹 대화에서는 사용할 수 없어, 대부분의 메시지가 텔레그램 서버에서 종단 간 암호화되지 않는다는 점이다. 또한 텔레그램이 보안 메신저로 자신을 홍보하면서 ‘모든 것이 암호화되고 비밀 대화는 더 암호화된다’는 취지로 설명한다고 비판한다.
참고 자료: 디피-헬먼 키 교환, 중간자 공격, 핸런의 면도날.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요