지식

[Security] 암호기술에 대한 최소 이론 9강 — 비대칭키 시스템을 해킹하는 원리: 중간자 공격은 키가 아니라 키의 출처를 노린다

암호기술에 대한 최소 이론 시리즈 정리 — 9강. 참고: 널널한 개발자 TV, 비대칭키 시스템을 해킹하는 원리 (재생목록)

앞의 두 편에서 비대칭 키로 비밀 통신을 시작하는 절차를 세웠다. 키 쌍을 만들고, 공개키를 주고받고, 그 공개키로 세션 키를 안전하게 건네는 구조다. 그런데 이 구조에는 아직 채워지지 않은 구멍이 하나 있다. 인터넷을 타고 도착한 그 공개키를 믿을 근거가 어디에도 없다는 것이다. 이번에는 그 구멍을 파고드는 공격, 곧 중간자 공격(MITM, Man-in-the-Middle) 의 원리를 정리한다. 비대칭 키 자체를 깨는 것이 아니라, 키를 주고받는 순간을 노리는 공격이다.

복습 — 실제 키 교환은 이런 모양이다

먼저 8강에서 세운 구조를 짧게 되짚는다. 실제 시스템은 두 주체가 대칭적으로 키 쌍을 만드는 방식으로 굴러가지 않는다.

서버는 자기 키 쌍을 사전에 미리 생성해서 하드디스크 같은 곳에 파일 형태로 저장해 둔다. 접속이 들어올 때마다 새로 만들지 않는 이유는 단순하다. 키 쌍 생성은 CPU를 많이 먹는 연산이라 매번 하면 서버 성능에 영향을 준다. 그래서 한 번 만들어 저장해 두고 계속 쓴다.

PC 쪽에는 키 쌍이 필요 없다. PC가 만드는 것은 대칭 키, 즉 이 접속에서만 쓸 세션 키다. 대칭 키는 암호화와 복호화에 같은 키를 쓰는 방식이고, 연산이 가벼워서 실제 데이터 전송에는 이쪽이 쓰인다. 비대칭 키는 그 대칭 키를 상대에게 안전하게 건네는 용도로만 등장한다.

그 건네는 절차가 키 교환(IKE) 이다. 서버가 자신의 공개키를 PC에 보내고, PC는 자기 세션 키를 그 공개키로 암호화해 서버로 보낸다. 서버는 자기 개인키로 그것을 풀어 세션 키를 얻는다. 이제 양쪽이 같은 세션 키를 갖게 됐으니, 이후 데이터는 전부 그 세션 키로 암호화한다.

[ 정상적인 키 교환 ]   서버는 키 쌍을 미리 생성해 파일로 저장해 둔다

① 서버 ──── 서버 공개키 ────▶ PC
② PC : 세션 키(대칭 키) 생성
③ PC ──── 세션 키를 서버 공개키로 암호화 ────▶ 서버
④ 서버 : 서버 개인키로 복호화 → 세션 키 획득
⑤ PC ════ 이후 데이터는 세션 키로 암호화 ════▶ 서버

세션 키를 아는 주체 : PC, 서버 — 둘뿐이어야 한다

여기서 보안 문제가 시작된다

③번 단계를 다시 본다. PC는 방금 도착한 공개키로 자기 세션 키를 잠갔다. 그 공개키는 인터넷을 타고 왔다.

질문은 여기서 나온다. 이 키를 믿어도 되는가. 정말 서버가 보낸 것이 맞는가. 오는 도중에 바뀌지 않고 원본 그대로인가, 즉 무결한가.

지금까지 세운 구조 안에는 그것을 확인할 방법이 없다. 공개키는 그냥 바이트 덩어리다. 파일을 열어 봐도 키 값과 알고리즘 파라미터가 들어 있을 뿐, 누구의 키인지는 어디에도 적혀 있지 않다.

# 받은 공개키 파일을 그대로 뜯어보면 나오는 것
openssl rsa -pubin -in received.pem -text -noout

# Public-Key: (2048 bit)
# Modulus: 00:c4:8f:... <생략>
# Exponent: 65537 (0x10001)
#
# → 키 값과 알고리즘 정보뿐이다.
#   소유자·발급자·유효기간 같은 신원 정보는 들어 있지 않다.

받은 쪽이 확인할 수 있는 것은 "이것이 형식상 올바른 공개키다"까지다. "이것이 그 서버의 공개키다"는 확인할 수 없다. 그래서 이 지점에 신뢰할 수 있는 체계를 따로 만들어 넣게 된다. 그 체계 이야기는 다음 편이고, 이번에는 그 체계가 없으면 무슨 일이 벌어지는지를 본다.

중간자 공격 — 두 연결 사이에 앉는다

해커가 PC와 서버 사이에 끼어들었다고 하자. 어떤 방법으로 끼어드는지는 이 글의 범위가 아니다. 여기서는 끼어드는 데 성공한 다음에 무엇이 가능해지는지만 다룬다.

끼어든다는 것은 PC와 서버가 주고받는 데이터가 전부 해커를 거쳐 간다는 뜻이다. 두 친구 사이에 앉아 양쪽 말을 전달하는 척하며 내용을 바꿔치기하는 사람과 같다. 양쪽은 서로 직접 이야기하고 있다고 믿지만, 실제로는 각자 그 사람과 이야기하고 있다.

해커도 자기 키 쌍을 가지고 있다. 해커의 공개키와 해커의 개인키다. 공격은 이 키 쌍으로 이루어진다.

[ 중간자 공격(MITM)이 성립한 키 교환 ]
해커는 자기 공개키·개인키를 갖고 있다

① 서버 ──── 서버 공개키 ────▶ 해커
   가로채기 : PC에 닿지 못한다 — 진짜 서버 공개키는 해커가 보관해 둔다
② 해커 ──── 해커 공개키 ────▶ PC
   바꿔치기 : PC는 "이것이 서버 공개키다"라고 믿는다
   PC : 세션 키(대칭 키) 생성
③ PC ──── 세션 키를 해커 공개키로 암호화 ────▶ 해커
④ 해커 : 해커 개인키로 복호화 → PC의 세션 키 획득 ★
⑤ 해커 ──── 같은 세션 키를 진짜 서버 공개키로 재암호화 ────▶ 서버
   서버 : 서버 개인키로 정상 복호화 → 세션 키 획득
⑥ PC ════ 세션 키로 암호화된 데이터 ════▶ 서버

해커도 같은 세션 키를 갖고 있으므로 오가는 내용을 전부 읽는다

절차를 말로 풀면 이렇다.

① 서버가 PC로 보낸 서버 공개키를 해커가 중간에서 가로챈다. 이 진짜 공개키는 해커가 나중에 쓰려고 보관해 둔다.

② 해커는 PC에게 자기 자신의 공개키를 대신 보낸다. PC 입장에서는 요청한 자리에서 공개키가 도착했으니 그것이 서버의 것이라고 생각한다. 여기서부터 착각이 시작된다.

③ PC는 서버 공개키인 줄 알고 자기 세션 키를 해커의 공개키로 암호화해 보낸다.

④ 해커는 자기 개인키로 그것을 푼다. 자기 공개키로 잠긴 것이니 당연히 풀린다. PC의 세션 키가 해커 손에 들어온다.

⑤ 해커는 여기서 멈추지 않는다. 얻어낸 세션 키를 ①에서 가로챘던 진짜 서버 공개키로 다시 암호화해 서버로 보낸다.

⑥ 서버는 자기 개인키로 그것을 정상적으로 푼다. 서버 입장에서 이상한 점은 하나도 없다. PC와 서버는 같은 세션 키를 공유하게 되고, 이후 데이터를 그 키로 암호화해 주고받는다. 그리고 그 세션 키를 해커도 가지고 있다.

PC가 믿는 것과 실제

공격의 핵심은 어느 단계에서도 암호가 깨지지 않는다는 데 있다. 알고리즘은 처음부터 끝까지 정상 작동한다. 어긋난 것은 키의 출처뿐이다.

항목 PC가 믿는 것 실제
손에 든 공개키의 주인 서버 해커
세션 키를 아는 주체 PC와 서버, 둘뿐 PC와 서버, 그리고 해커
서버가 받은 것 PC가 직접 보낸 세션 키 해커가 풀었다가 다시 암호화해 보낸 세션 키
연결 상태 PC ↔ 서버, 하나의 연결 PC ↔ 해커, 해커 ↔ 서버, 두 개의 연결
통신 내용 아무도 못 읽는다 해커가 전부 읽는다

양쪽 모두 아무것도 눈치채지 못한다는 점이 이 공격의 성질이다. PC는 정상적으로 암호화하고 있고, 서버는 정상적으로 복호화하고 있다. 오류도, 실패도, 경고도 없다. 그 사이에서 세션 키가 조용히 새어 나간다.

공격이 기대는 두 가지 동작은 이렇게 요약된다.

  가로채기(intercept)  : 서버가 보낸 진짜 공개키를 중간에서 붙잡는다
  바꿔치기(substitute) : 그 자리에 해커 자신의 공개키를 대신 밀어 넣는다

  공격이 성립하는 전제 = 받은 공개키의 출처를 확인할 수 없다
  따라서 방어의 방향   = 공개키에 신원 보증을 붙인다

위험의 크기와, 겁먹을 필요는 없다는 것

중간자 공격이 성공하면 그 위에 쌓아 둔 보안이 전부 무너진다. 세션 키가 넘어간 이상 그 뒤로 오가는 것은 해커에게 평문이나 다름없다. 암호를 걸었다는 사실이 오히려 안심을 주기 때문에 더 위험하다.

덧붙이면 해커가 반드시 인터넷 저편에 있는 것도 아니다. 같은 망에 붙어 있는 다른 PC도 얼마든지 이 자리에 앉을 수 있다. 내부의 해커라는 가능성이 늘 함께 있다.

다만 겁먹을 이야기는 아니다. 이 공격은 오래전부터 알려져 있고, 실제로 쓰이는 시스템들은 이미 대책을 갖추고 돌아간다. 이 글이 다루는 것은 그 대책이 왜 필요한가이지, 지금 인터넷이 뚫려 있다는 뜻이 아니다. 원리를 아는 쪽이 대책의 의미도 정확히 이해한다.

남은 질문

돌아보면 문제는 처음의 한 문장으로 수렴한다. 키 교환을 할 때 서버가 뭔가를 보내줬는데, 그걸 그냥 그대로 믿어도 되는가.

믿을 수 없다면 어떻게 해야 하는가. 지금 구조에는 답이 없다. 그러니 답을 밖에서 가져와야 한다. 공개키에 "이 키는 누구의 것이다"라는 보증을 붙이고, 그 보증을 붙인 주체를 믿을 수 있게 만드는 체계가 필요하다. 그 보증이 있으면 해커가 자기 공개키를 밀어 넣어도 PC가 그 자리에서 알아챌 수 있다.

정리

  • 실제 키 교환에서 서버는 키 쌍을 미리 생성해 파일로 저장해 둔다. 매번 만들면 CPU 부담이 커서 서버 성능에 영향을 주기 때문이다. PC 쪽은 키 쌍이 아니라 대칭 키(세션 키) 를 만든다.
  • 키 교환(IKE)에서 서버 공개키가 PC로 건너간다. 그런데 인터넷을 타고 온 그 공개키를 신뢰할 방법이 이 구조 안에는 없다. 정말 서버가 보낸 것인지, 원본 그대로인지 확인할 근거가 없다.
  • 중간자 공격(MITM) 은 이 구멍을 노린다. 해커가 서버 공개키를 가로채고, 그 자리에 자기 공개키를 밀어 넣는다.
  • PC는 해커 공개키로 세션 키를 잠그고, 해커는 자기 개인키로 풀어 세션 키를 얻는다. 그리고 가로채 둔 진짜 서버 공개키로 다시 암호화해 서버로 넘긴다. 서버는 정상적으로 복호화한다.
  • 결과적으로 하나였어야 할 연결이 두 개가 되고, 양쪽 모두 이상을 감지하지 못한 채 세션 키가 해커에게 넘어간다. 이후 데이터는 전부 읽힌다.
  • 이 공격에서 암호 알고리즘은 한 번도 깨지지 않는다. 깨진 것은 키의 출처에 대한 신뢰뿐이다. 그래서 방어의 방향도 알고리즘 강화가 아니라 공개키에 신원 보증을 붙이는 것이다.
  • 해커는 바깥에만 있지 않다. 같은 망의 다른 PC도 이 자리에 앉을 수 있다. 다만 실제 시스템들은 이미 대책을 갖추고 있다.

다음 편은 인증 기관과 인증서로 이 신뢰 문제를 푸는 방법이다.

조회 1댓글 0

댓글

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.