- end-to-end 암호화와 그 중요성
- 이메일 암호 해결을 위한 다양한 시도
- end-to-end 암호화가 메시징 환경을 변화시키는 방법
용어 정리
*CA(Certificate Authority) : 인증 기관
TLS, Noise같은 프로토콜을 통한 운송 보안을 확보할 수 있다.(기밀성, 무결성, 인증)
웹에서의 신뢰는 CA 네트워크에 기반한다. 브라우저와 운영 체제가 CA를 신뢰하고 있으며, 이들은 웹사이트의 정체성을 확인해주는 디지털 인증서를 발급한다.
대칭 암호화 알고리즘은 충분히 신뢰할 수 있다. 여기서 문제는 당사자 간 신뢰를 구축하는 일이다.
즉, Alice와 Bob이 누구인지를 증명하고, 공개 키를 안전하게 공유하는 것이 중요하다는 것.
암호학에서는 상황에 따라 실용적/확장 가능한 여러 신뢰를 구축할 수 있는 솔루션을 제공한다.
예로, PKI는 공개 키를 배포하고 검증하는 데 사용되고, Noise 프로토콜은 동적으로 신뢰를 구축한다.
이 장에서는 참가자들이 서로 알지 못하는 상황에서도 신뢰를 보장할 수 있는 시스템 설계의 필요성을 강조한다.
암호학을 실제 사용할 때는 신뢰 구축 방법이 중요하다!
왜 end-to-end 암호화인가?
단순하게 암호화 프로토콜이 아니라, 통신을 안전하게 보호하려는 개념이다.
적대적인 경로를 거쳐서 두명 이상의 참여자 간 통신을 보호하는 방법이다.
통신 보안을 위해서 TLS로 충분하지 않을까?
이론적으론 그럴 수 있다. TLS는 통신을 보호하는데 사용된다. 하지만, E2EE는 실제 사람 간의 신뢰를 기반으로 한 개념이다.
반면, TLS는 설계상 "men in the middle" 시스템에서 가장 자주 사용된다.
이런 시스템에서는 TLS가 중앙 서버-사용자 간 통신을 보호하는 데만 사용되므로 중앙 서버는 모든 메세지를 볼 수 있는 것이다.
이 MITM 서버가 메세지를 훔쳐볼 수 있는 문제를 해결하는 방법 중 하나로, 이 MITM 서버를 믿을 수 있는 서버로 (trusted third parties) 생각할 수도 있다
즉, 프로토콜을 안전하다고 간주하기 위해 시스템의 이런 부분을 신뢰하는 것이다.
실제로 사용되는 구조 중 더 최악이 있다
사용자-서버 간 통신은 여러 네트워크 홉을 통해 이루어지며, 이 hop 중 일부가 트래픽을 살펴볼 수 있다.(이런 머신을 middlebox라고 한다)
트래픽이 암호화되더라도 일부 미들박스는 TLS 연결을 종료하도록 설정되어 있고, 해당 시점부터 트래픽을 평문으로 전달하거나 새 TLS 연결을 시작하기도 한다.
이런 방식은 "트래픽을 더 잘 필터링하기 위해", "데이터 센터 내에서 연결을 지리적으로 분산시키기 위해"같이 좋은 의도로 사용되기도 한다.
그러나, 이는 트래픽이 평문으로 노출될 위험을 높이고, 공격 대상 면적을 넓힌다.
최악의 경우, TLS 종료는 "트래픽을 가로채거나", "데이터를 기록하거나", "사용자 활동을 감시하는" 악의적인 이유로 사용되기도 한다.
실제 사례
2015년, 레노버가 특정 SW와 CA을 사전 설치한 노트북을 판매하다 발각되었다.
이 SW는 HTTPS 연결을 MITM 방식으로 중단하고, 웹페이지에 광고를 삽입하였다.
중국과 러시아 같은 나라에서 인터넷 트래픽을 자국 네트워크로 우회시켜 통신을 가로채고 감시하기도 했다.
2015년에 Edward Snowden이 미국 NSA 및 여러 정부가 인터넷 케이블을 가로채서 사람들의 통신을 감시했다고 폭로하기도 했다.
기업 관점에서 문제
사용자의 데이터를 소유하거나 접근할 수 있다는 건 기업 입장에서도 부담이다.
데이터 유출/해킹 사고가 자주 발생하고, 기업 신뢰도에 치명적일 수 있는 중요한 책임인 것이다.
그러나 EE2E 시스템에서는 공유할 데이터 자체가 없어 이런 문제들을 피할 수 있다.
결론
현재 사용하는 대부분의 인기 있는 온라인 애플리케이션은 이미 하나 이상의 정부가 데이터를 볼 수 있거나, 볼 수 있는 방법을 갖고 있을 가능성이 높아. 애플리케이션의 위협 모델(어떤 위험을 방어하려 하는지)에 따라, 또는 가장 취약한 사용자를 보호하기 위한 위협 모델에 따라, 엔드투엔드 암호화는 사용자 기밀성과 프라이버시를 지키는 데 핵심 역할을 한다.
end-to-end encryption는 송신자와 수신자만 데이터 내용을 열람할 수 있도록 보장하며, 이는 현재의 TLS 기반 시스템이 제공하지 못하는 프라이버시와 보안의 최고 수준을 제공한다.
: 찾을 수 없는 신뢰의 근원
가장 단순한 엔드투엔드 암호화 시나리오: Alice가 인터넷을 통해 Bob에게 암호화된 파일을 보내려한다.
1. Bob이 자신의 공개 키를 Alice에게 보낸다
2. Alice가 그 공개 키를 사용해 파일을 암호화한 뒤, Bob에게 파일을 보낸다.
이런 시나리오에서, Alice와 Bob이 실제로 만나거나, 신뢰할 수 있는 다른 채널을 사용해 첫 번째 과정에서 공개 키를 교환할 수 있다면 최고일 것이다. -> 이 경우를 out-of-band 방식으로 신뢰를 생성한다고 한다.
하지만, 현실에서는 out-of-band 방식으로 할 수 없다.
Alice는 자신이 받은 공개 키가 정말로 Bob의 공개 키인지 어떻게 알까? 첫 번째 메세지가 중간에서 변조되었을 가능성은 항상 존재한다.
암호학은 이 신뢰 문제에 대한 완벽한 해결책을 제공하지 못한다.
대신, 다양한 상황에서 쓸 수 있는 여러 해결 방법을 제시한다.
공개 키 변조를 막는 문제의 어려움
공개 키 변조로부터 보호하는 것은 실질적인 공개 키 응용 분야에서 가장 어려운 분야이다. 이는 공개 키 암호학의 아킬레스건이며, 이 문제를 해결하기 위해 소프트웨어 설계가 복잡할 수밖에 없다. - Zimmermann et al. 1992
다시 Alice&Bob의 시나리오에서,
악의적인 능동적 MITM 공격자가 밥의 공개 키를 첫 번째 메시지에서 교체하지 않았다면, 이 프로토콜은 안전하다 볼 수 있다. 심지어 이 메세지가 기록되었더라도, 공격자는 두 번째 메세지를 암호화된 상태에서 해독할 수 없다.
물론, "MITM 공격 가능성이 낮을 것이다"의 가정에 기대어 암호학을 설계하는 것은 최선의 방법이 아니다.
turtles all the way down problem
예로, 구글 크롬은 CA 세트를 신뢰하도록 설정되어 있다.
크롬 설치 -> 운영체제의 기본 브라우저 -> 노트북 -> ....
threat mode에서는 특정 turtle 이후의 문제를 다루지 않고, 그 이후는 out-of-scope로 간주한다.
다음부터는 신뢰의 근원을 안전하게 확보할 방법이 있다고 가정한다.
모든 암호학 기반 시스템은 root of trust에 의존해서 작동한다. 신뢰의 근원은 프로토콜이 안전성을 쌓을 수 있는 기반이 되는 것이다. 이 신뢰의 근원은 프로토콜이 시작할 때 사용하는 비밀 값이나 공개 값, 또는 이를 얻을 수 있는 밴드 외 채널(out-of-band)이 될수 있다.
: 이메일 암호화 실패
이메일은 처음 만들어졌을 때부터 암호화되지 않은 프로토콜이었다. 당시에는 보안이 중요하지 않았다.
이메일 암호화는 1991년에 Pretty Goog Privacy(PGP) 도구가 등장하면서 구체적 아이디어로 자리잡기 시작한다. PGP의 창시자인 Phil Zimmermann은 '미국 정부가 모든 전자 통신 회사 및 제조사로부터 음성/텍스트 통신 데이터를 허용'하려 한 법안에 반발하며 공개했다.
짐머만이 쓴 "Why do you need PGP?"에서 "PGP는 사람들이 자신의 프라이버시를 스스로 지킬 수 있도록 도와줍니다. 이는 사회적으로 필요성이 커져가고 있기에 만들었습니다"라고 밝혔다.
PGP의 표준화와 OpenPGP
PGP는 1998년에 RFC 2440 표준으로 정식화됐고, OpenPGP라는 이름으로 알려졌다.
동시에, GNU Privacy Guard(GPG) 오픈 소스 구현이 등장하면서 많은 사람들이 사용하게 되었다.
오늘날에도 GPG는 주 구현방식으로 사용되고, 사람들은 PGP와 GPG를 같은 의미로 사용한다.
PGP, OpenPGP는 hybrid encryption을 사용한다.
이메일 서명(Signing)
OpenPGP는 발신자가 메시지를 서명해 본인임을 인증할 방법도 정의한다.
왜 암호화 전에 압축할까?
압축은 데이터의 패턴을 제거해 데이터를 더 작게 만들고, 암호화의 보안성을 높인다. 암호화 후에 압축하고자 한다면 암호화된 데이터는 이미 난수화되어 있어 압축이 효과를 발휘하지 못한다.
메타데이터 문제
암호화는 메시지의 본문 내용을 보호하지만, 항상 메타데이터를 숨길수는 없다.
메타데이터는 IP address
, 메시지 길이
, 송수신 빌도 및 대상
을 포함할 수 있다.
이 데이터는 사용자의 익명성을 해칠 수 있다.
PGP에서는 신뢰를 스스로 쌓아야 한다.
친구 Bob의 PGP 공개 키를 안전하게 얻을 수 있는 방법을 찾아야 한다. 가장 확실한 방법은 만나서 공개 키를 받는 것이다.
그럼 이메일을 보내고 싶은 사람에게 모두 이렇게 해야할까? 물론 아니다. 다음을 가정해 보겠다.
Bob은 Mark의 키에 간단히 서명할 수 있으며, 공개 키와 마크의 이메일 사이 연관성을 신뢰한다는 것을 보여준다.
Bob을 믿으면 Mark의 공개 키를 믿고 나의 레퍼토리에 추가할 수 있다.
이것은 PGP의 decentralized trust 개념의 주요 아이디어이다. Web of trust(WOT)라고 한다.
WOT: 사용자가 서명에 의존해 다른 사용자를 일시적으로 신뢰할 수 있는 개념
PGP는 공개 키를 검색(discovery)하는 문제를 해결하기 위해 key registries 방식을 시도했다.
: 내 PGP 공개 키와 내 신원을 보증하는 다른 사람들의 서명을 공개 목록에 올려서 다른 사람들이 이를 찾을 수 있도록 하는 것
현실적으로, 누구나 자신의 이메일에 해당하는 공개 키와 서명을 마음대로 게시할 수 있기에, 공격자도 의도적으로 잘못된 키를 업로드할 수 있다.
S/MIME: PGP의 대안
1995년 RSA 회사는 PGP의 대안으로 S/MIME를 제안했다.
S/MIME(Secure/Multipurpose Internet Mail Extensions): 이메일 표준의 확장판인 MIME 포맷을 기반으로 한 암호화 방식. RFC 5751로 표준화됨. PKI를 통해 신뢰를 중앙집중식으로 관리.
PGP와 S/MIME의 문제점
모두 이메일 송수신에 사용되는 SMTP(Simple Mail Transfer Protocol)위에서 동작한다.
SMTP 이후에 발명되었기 때문에 완벽히 통합되지 못했다.
Efail 취약점
최근 연구에서 두 프로토콜의 이메일 클라이언트 통합 방식에서 데이터 유출(exfiltration) 공격에 취약하다고 밝혀졌다.
exfiltration attack: 암호화된 이메일을 관찰한 공격자가 이를 변조해 수신자에게 보내서 내용을 탈취할 수 있다
현실적인 문제, PGP의 쇠퇴
대부분의 이메일이 여전히 전세계적으로 암호화되지 않은 상태로 전송되고 있다.
1. PGP의 복잡성
- PGP는 이해, 사용하기 어렵다
2. PGP 지원 낮음
- 대중적인 이메일 클라이언트는 PGP를 잘 지원하지 않거나 아예 지원하지 않는다.
이메일 암호화의 미래
이메일 암호화가 HTTPS처럼 성공적으로 채택될 가능성이 희박하다
saltpack
OTR(Off-The-Record) 프로토콜
Signal 프로토콜
signal이 해결하고자 하는 문제
PGP의 신뢰 모델(WOT)을 대체할 수 있을까?
- TOFU(Trust On First Use) 방식을 사용해서 처음 통신 시 사용자 간 신뢰를 맹목적으로 수용하고, 이를 기반으로 장기적인 안전 통신 채널을 구축한다
PGP에 매 대화마다 forward secrecy(순방향 비밀)을 추가하려면?
- 대화 시작 시 Extended Triple Diffie-Hellman(X3DH) 확장된 키 교환 방식 사용. 매번 새로운 키로 암호화됨
단일 메세지에 대해 forward secrecy를 추가하려면?
- 대화는 오래 이어질 수 있으므로, 키가 유출되더라도 과거 메세지가 해독되지 말아야한다.
세션 비밀이 유출되면 어떻게 복구할까?
- 새로운 Post-Compromise Security(PCS) 보안 속성 도입
WOT(Web Of Trust)의 한계
TOFU
TOFU 사례: SSH
Signal의 TOFU 구현
TOFU의 한계
TOFU는 완벽하지는 않지만 현실적으로 가장 실용적인 보안 모델이 되었다.
Signal의 프로토콜, X3DH(Extended Triple Diffie-Hellman) 는 비동기적(end-to-end) 암호화를 지원하는 현대적 접근 방식을 제공한다.
기존 메시징 앱은 대체로 동기적 방식으로 작동했기 때문에, 한쪽이 오프라인일 경우 대화를 시작하거나 지속하기 어려웠다.
반면, Signal은 이메일처럼 비동기적으로 작동하므로, 한쪽 사용자가 오프라인일 때도 안전한 통신을 시작할 수 있다.
X3DH의 핵심 개념
세 가지 Diffie-Hellman 키교환을 결합하여 강력한 보안을 제공한다.
Signal 대화 시작 흐름
identity key
, signed prekey
, 서명
, 여러 개의 one-time prekeys
(=prekey bundle)를 중앙 서버에 업로드한다.X3DH에서 이루어지는 키 교환
다음 네 가지 Diffie-Hellman 키 교환으로 구성된다
이 결과물은 KDF(Key Derivation Function)을 통해 단일 세션 키로 결합되고, 이후의 대화에서 사용된다.
X3DH의 장점
X3DH handshake 이후 단계는 두 사용자가 대화를 삭제하거나 키를 잃어버리지 않는 한 지속된다
signal은 메세지 단위에서 순방향 비밀성(forward secrecy)을 제공하기 위해 Double Ratchet이라는 프로토콜을 도입했다.
일반적으로 키가 서로 다른 목적으로 사용되면, 분리하는 것이 좋다.
이를 위해 X3DH의 결과물을 KDF(Key Derivation Function)의 입력값으로 사용해 두 개의 키를 생성한다.
signal에서는 메시지 세션이 수년간 지속될 수 있기에, 세션 키가 한번 유출되면 과거에 기록된 모든 메시지가 복호화될 위험이 있다. 이 해결을 위해 signal은 symmetric ratchet 방식 도입
Symmetric Ratchet
Sending chain key, Receiving chain key
기존의 sending key는 sending chain key로 이름이 변경되고, 메시지 암호화를 위해 직접 사용되지 않는다.
메시지를 보낼 때마다 Alice는 sending chain key를 one-way function에 통과시킨다
메시지를 받을 때에도 동일한 방식으로 receiving chain key가 처리
Forward Secrecy 보장
: 각 메시지를 보낼 때마다 sending chain key는 KDF(Key Derivation Function)를 통해 다음 키로 갱신됨(Forward Secrecy 보장)
Signal 프로토콜: PCS(Post-compromise security, backward secrecy)
PCS는 키가 어느 시점에서 손상되더라도 프로토콜이 스스로 복구할 수 있다는 개념
(공격자가 손상 이후에도 여전히 사용자의 기기에 접근할 수 있다면 무의미하긴 하다.)
entropy를 도입함으로서 PCS가 작동할 수 있다.
일시적인 손상(nonpersistent compromise)이 엔트로피에 접근할 수 없어야 한다.
새로운 엔트로피는 대화 참여자에게 동일해야 한다.
ephemeral key exchange를 수행하여 signal이 이러한 엔트로피를 찾는다.
송신되는 모든 메시지는 현재의 래칫 공개 키를 포함한다.
signal 프로토콜은 지속적인 엔트로피 갱신과 안전한 키 교환이 핵심이다.
Bob
ping-pong: Alice로부터 새로운 래칫 키를 수신했을 때 수행해야 하는 작업
메시지 복호화
i. Alice의 새 래칫 키와 자신의 래칫 키로 새로운 DH 키 교환 수행
ii. 키 교환의 출력값과 symmetric ratchet으로 수신된 메시지 복호화
새로운 무작위 래칫 키 생성
i. Alice의 새 래칫 키와 자신의 새 래칫 키로 또다른 키교환 수행하여 Alice에게 보낼 메시지 암호화
Double Ratchet: DH 래칫과 대칭 래칫의 결합
Alice의 관점
더블래칫은 DH래칫과 대칭 래칫 결합된 것. X3DH 프로토콜 이후, 손산 후 보안(PCS)과 전방 비밀성(Forward secrecy)을 제공.
첫 메시지에서는 아직 상대의 래칫 키를 모르기에 Bob의 presigned key를 대신 사
오늘날에는 이메일을 암호화하기 보다는 메시지 어플리케이션을 안전하게 만들어 통신한다.
이 속에 Signal 프로토콜이 많이 사용되고 있다. 어플리케이션뿐만 아니라 XMPP, Matrix 같은 오픈 소스나 연합 프로토콜에서도 채택되었다.
반면, PGP와 S/MIME는 사용되지 않는다.
그럼 자체 end-to-end encrypted messaging app을 만들고 싶다면?
불행하게도 이 분야에서 사용되는 많은 기술은 임시방편적으로 설계되있으며, 완전/안전 시스템을 만들기 위해서는 많은 세부사항을 직접 채워야 한다.
signal은 많은 코드를 오픈소스로 공개했지만, 문서화가 부족하고 정확히 사용하는 것이 어렵다.
만면, Matrix 같은 분산형 오픈소스 솔루션을 사용하는 것이 더 나을 수 있다.(프랑스 정부도 채택함)
활발히 진행되고 있는 몇 가지 연구들