중간자 공격
고친 사람 github-actions[bot]
중간자 공격은 두 당사자가 주고받는 통신 사이에 공격자가 끼어들어 오가는 내용을 엿보거나 바꾸는 공격입니다. 양쪽은 서로에게 말하고 있다고 믿습니다. 공격자는 각각에게 상대인 척하면서 받은 것을 반대쪽으로 넘겨 줍니다. 그래서 대화는 멀쩡히 이어지고 양쪽 다 끼어든 공격자를 알아채지 못합니다.
쉽고 빠른 이해
공격자가 두 사람 사이에 앉아 대화를 중계하는 공격입니다. 카페 무선 인터넷에 가짜 접속점을 띄워 두고 거기 붙은 사람의 통신이 전부 자기를 거쳐 가게 만드는 것이 흔한 꼴입니다.
이 공격에 따로 이름이 붙은 까닭은 암호화만으로 못 막기 때문입니다. 내용을 잠가도 상대가 누구인지 확인하지 않으면 공격자와 잠긴 대화를 나누게 됩니다. 이 이름이 가리키는 구멍이 그것입니다.
어떻게 도나:
- 공격자가 두 당사자 사이의 길목을 차지합니다
- 양쪽에 각각 따로 연결을 맺고 자기가 상대라고 내세웁니다
- 받은 것을 넘기거나, 고쳐서 넘깁니다
막는 데도 대가가 있습니다. 상대가 맞는지 확인하려면 확인에 쓸 근거를 미리 나눠 갖고 관리하는 체계가 따로 있어야 합니다. 그리고 그 확인을 한 번 건너뛰면 그 연결은 도로 열립니다.
엿듣기만 하면 이 이름으로 부르지 않습니다. 양쪽과 각각 연결을 맺고 내용을 고칠 수 있게 된 공격자만 중간자입니다.
상세
끼어든 공격자가 무엇을 쥐게 되는지부터 보고, 그다음 막는 법을 봅니다.
바꿔 적힌 전화번호
서로 연락처를 모르는 두 사람에게 어떤 사람이 상대 번호라며 제 번호를 적어 주었다고 해 봅시다. 둘은 이제부터 그 사람에게 전화를 겁니다. 목소리는 또렷하게 들립니다.
이 공격이 무너뜨리는 것도 대화의 품질이 아니라 상대가 누구인가입니다. 양쪽 모두 상대와 말하고 있다고 여기는 동안 끼어든 쪽만 양쪽을 다 듣습니다.
끼어든 쪽이 할 수 있는 것
가운데 선 공격자는 오가는 것을 전부 손에 쥡니다. 아래 표는 할 수 있는 일과 그 일로 깨지는 성질을 짝지었습니다.
| 할 수 있는 일 | 깨지는 성질 |
|---|---|
| 내용을 읽는다 | 기밀성 — 남이 못 읽게 한다는 약속 |
| 내용을 고쳐서 넘긴다 | 무결성 — 보낸 것이 그대로 닿는다는 약속 |
| 상대인 척하며 말을 지어낸다 | 인증 — 말하는 쪽이 그 사람이 맞다는 약속 |
| 넘기지 않고 붙들거나 늦춘다 | 전달 — 보낸 것이 닿는다는 약속 |
셋째 줄이 이 공격의 힘입니다. 읽기만 하는 것은 도청입니다. 상대인 척할 수 있으면 양쪽을 서로 다른 말로 속일 수 있습니다.
둘로 갈리는 연결
공격의 핵심은 연결 하나가 둘이 되는 대목입니다. 통신하는 두 당사자를 앨리스와 밥이라고 부르겠습니다. 암호학에서 두 당사자를 부르는 관례 이름입니다.
앨리스와 밥이 처음 연결할 때는 서로 잠금에 쓸 키를 주고받습니다. 이 주고받기가 키 교환입니다. 공격자가 노리는 곳이 바로 이 순간입니다.
sequenceDiagram
participant 앨리스
participant 공격자
participant 밥
앨리스->>공격자: "내 키야"
공격자->>밥: "앨리스 키야" (실은 공격자 키)
밥->>공격자: "내 키야"
공격자->>앨리스: "밥의 키야" (실은 공격자 키)
앨리스->>공격자: 공격자 키로 잠근 글
Note over 공격자: 열어 본 뒤 밥의 키로 다시 잠근다
공격자->>밥: 다시 잠가 넘김
앨리스는 밥의 키를 받았다고 믿지만 손에 쥔 것은 공격자의 키입니다. 밥도 마찬가지입니다. 그래서 앨리스가 잠근 글은 공격자가 엽니다. 공격자는 그것을 읽은 뒤 밥의 키로 다시 잠가 넘깁니다.
양쪽 모두 잠긴 연결을 쓰고 있습니다. 다만 그 연결이 하나가 아니라 둘입니다. 가운데에서 한 번 열렸다 닫힙니다.
길목을 차지하는 수법
끼어들려면 먼저 통신이 자기를 지나가게 만들어야 합니다. 같은 무선 인터넷에 붙어 있는 것만으로도 길을 비틀 수 있습니다. 주소를 묻는 물음에 거짓 답을 먼저 보내 자기 기계를 상대인 것처럼 알리는 수법이 ARP 스푸핑입니다. ARP 는 Address Resolution Protocol 의 줄임말로, 같은 망 안에서 주소를 찾아 주는 규칙입니다.
이름을 주소로 바꿔 주는 DNS(Domain Name System, 도메인 이름 체계)에 거짓 답을 밀어 넣는 방법도 있습니다. 그러면 접속하려던 이름이 공격자의 주소로 풀립니다.
가짜 무선 접속점을 진짜와 같은 이름으로 띄워 두는 것도 흔합니다. 붙는 사람은 늘 쓰던 곳에 붙었다고 여깁니다. 집이나 사무실의 공유기처럼 경로 위에 놓인 장비가 넘어간 경우도 같은 결과를 냅니다.
암호화만으로 못 막는 까닭
암호를 건다는 것, 곧 내용을 잠근다는 것은 두 가지 일을 나눠서 합니다. 하나는 내용을 남이 못 읽게 하는 것이고, 다른 하나는 상대가 누구인지 확인하는 것입니다. 앞의 것만 하면 이 공격이 통합니다.
앞 그림이 그 까닭을 보여 줍니다. 키를 받을 때 그 키가 정말 밥의 것인지 확인할 방법이 없으면, 공격자의 키를 밥의 키로 알고 받게 됩니다. 잠금은 제대로 걸리는데 잠긴 상대가 밥이 아닙니다.
그래서 키를 받을 때 그 키의 임자를 같이 확인해야 합니다. 이 확인을 붙인 키 교환이 인증된 키 교환입니다. 이것을 하는 것이 TLS(Transport Layer Security, 전송 계층 보안)입니다. 웹 주소가 https 로 시작할 때 쓰이는 HTTPS(HyperText Transfer Protocol Secure, 보안 하이퍼텍스트 전송 규약)도 이 TLS 위에 얹혀 있습니다.
막는 수단
가장 널리 쓰는 방법은 키에 신원을 묶은 문서를 함께 받는 것입니다. 그 문서가 인증서입니다.
인증서에는 그 키의 임자 이름이 적혀 있습니다. 그것을 보증하는 곳의 서명도 함께 붙습니다. 보증하는 곳이 인증 기관입니다.
받는 쪽은 그 인증서에 먼저 두 가지를 묻습니다.
flowchart TD
A["상대가 보낸 인증서"] --> B{"믿는 기관이 서명했나"}
B -->|아니오| X["연결을 끊는다"]
B -->|예| C{"적힌 이름이 접속하려던 이름과 같나"}
C -->|아니오| X
C -->|예| E["가운데 끼어든 쪽이 없다고 본다"]
첫째 물음은 아무나 만든 인증서를 걸러 냅니다. 둘째 물음은 공격자가 자기 이름으로 제대로 받아 온 인증서를 내미는 것을 걸러 냅니다. 둘 다 통과하면 그 연결에 가운데 끼어든 쪽이 없다고 봅니다.
이 두 물음을 통과해도 유효 기간이 지났는지, 취소되지 않았는지는 따로 봅니다.
인증 기관이 없는 곳에서는 키의 짧은 요약값을 사람이 직접 맞춰 봅니다. 그 요약값이 키 지문입니다. SSH(Secure Shell, 보안 셸)로 서버에 처음 붙을 때 이 지문을 보여 주고 계속할지 묻는 것이 그것입니다.
한 걸음 더 나아가 특정 키나 기관만 받겠다고 미리 못 박아 두기도 합니다. 이것이 인증서 고정입니다. 그러면 공격자가 어딘가에서 제대로 된 인증서를 받아 와도 통하지 않습니다.
막아 놓고도 열리는 길
앞의 수단을 다 갖춰 놓아도 아래 세 곳에서는 도로 열립니다.
확인을 끄는 순간 이 방어는 사라집니다. 인증서 경고를 눌러 넘기거나, 도구의 확인 옵션을 꺼 두면 잠금만 남고 상대 확인은 없어집니다. 잠긴 연결이라는 표시는 그대로 뜨기 때문에 겉으로는 달라 보이지 않습니다.
잠금을 아예 벗기는 수법도 있습니다. 잠긴 연결로 가려는 요청을 가로채 잠기지 않은 쪽으로 되돌리는 수법이 SSL 스트리핑(Secure Sockets Layer stripping, 보안 소켓 계층 벗기기)입니다. SSL 은 TLS 의 옛 이름이고 잠긴 연결을 가리키는 말로 아직 남아 있습니다. 사용자는 주소창의 자물쇠가 없어진 것을 알아채야 합니다.
메시지 자체를 양 끝에서만 열 수 있게 잠그는 종단 간 암호화도 같은 물음을 안고 있습니다. 중간 서버가 키를 바꿔치기할 수 있으니, 대화 상대의 키 지문을 서로 맞춰 보는 절차가 따로 붙습니다.
이 이름으로 부르지 않는 것
끼어들지 않고 지나가는 것을 엿듣기만 했다면 도청입니다. 이 표제어는 양쪽과 각각 연결을 맺고 내용을 다룰 수 있게 된 공격자를 가리킵니다.
예전에 오간 정상 메시지를 붙잡아 두었다가 나중에 다시 보내는 것은 재전송 공격입니다. 내용을 열어 보거나 고칠 필요가 없다는 대목이 다릅니다.
이미 맺혀 있는 대화를 도중에 빼앗아 한쪽을 밀어내는 것은 세션 하이재킹입니다. 중간자 공격은 밀어내지 않고 양쪽을 다 살려 둡니다. 살려 두어야 들키지 않습니다.
구조가 같아도 양쪽이 알고 허락했으면 공격이라고 부르지 않습니다. 회사가 검사용 인증서를 직원 기기에 심어 두고 프록시에서 내용을 풀어 보는 TLS 가로채기가 그런 예입니다. 가르는 것은 수법이 아니라 동의입니다.
관련 항목
중간자 공격이 노리는 통신 구간과 프로토콜
TLS · HTTPS · HTTP · DNS · ARP · BGP · NTP · Wi-Fi · 네트워크
중간자 공격이 길목을 만드는 수법
ARP 스푸핑 · DNS 스푸핑 · 가짜 액세스 포인트 · SSL 스트리핑 · 다운그레이드 공격 · 인증서 위조 · BGP 하이재킹 · 스푸핑
중간자 공격을 막는 수단
인증서 · 인증 기관 · 공개 키 기반 구조 · 인증서 고정 · 인증서 투명성 · 상호 TLS · HSTS · 메시지 인증 코드 · 채널 바인딩 · 종단 간 암호화
중간자 공격이 깨뜨리는 보안 성질
기밀성 · 무결성 · 인증 · 전방향 비밀성 · 부인 방지
중간자 공격이 파고드는 암호 재료
키 교환 · 디피-헬만 키 교환 · 공개 키 암호 · 전자 서명 · 해시 함수 · 키 지문 · 암호화
중간자 공격과 헷갈리는 이웃
도청 · 재전송 공격 · 세션 하이재킹 · 가장 공격 · 피싱 · 능동 공격자
허락을 받고 중간에 서는 장치
다른 이름: man-in-the-middle attack · MITM · MITM 공격 · 중간자 개입 공격