SSL과 man-in-the-middle 오해


91

이 문제와 관련된 많은 문서를 읽었지만 여전히 모든 조각을 모을 수는 없으므로 몇 가지 질문을하고 싶습니다.

  1. 우선 내가 이해하는대로 인증 절차를 간략히 설명하겠습니다. 그 점에서 착각 할 수 있습니다. 클라이언트는 연결을 시작합니다.이 연결은 서버가 공개 키, 일부 메타 데이터 및 디지털 서명의 조합으로 응답합니다. 신뢰할 수있는 권위. 그런 다음 클라이언트는 서버를 신뢰하는지 여부를 결정하고 공개 키로 임의의 세션 키를 암호화하여 다시 보냅니다. 이 세션 키는 서버에 저장된 개인 키로 만 해독 할 수 있습니다. 서버가이 작업을 수행 한 다음 HTTPS 세션이 시작됩니다.

  2. 따라서 위의 내용이 맞다면 중간자 공격이 이러한 시나리오에서 어떻게 발생할 수 있는가? 누군가가 공개 키로 서버 (예 : www.server.com) 응답을 가로 채서 그가 www.server.com이라고 생각하게 만드는 수단이 있어도 여전히 내 세션 키를 해독 할 수 없습니다. 개인 키없이.

  3. 상호 인증에 대해 말하자면, 클라이언트 ID에 대한 서버 신뢰에 관한 것입니까? 클라이언트는 이미 올바른 서버와 통신하고 있는지 확인할 수 있지만 이제 서버는 클라이언트가 누구인지 알고 싶어합니다.

  4. 마지막 질문은 상호 인증의 대안에 관한 것입니다. 설명 된 상황에서 클라이언트 역할을하는 경우 SSL 세션이 설정된 후 HTTP 헤더에 로그인 / 암호를 보내면 어떻게됩니까? 내가보기에이 정보는 연결이 이미 보안되어 있고 서버가 내 식별을 위해이를 신뢰할 수 있기 때문에 가로 챌 수 없습니다. 내가 잘못? 상호 인증과 비교할 때 그러한 접근 방식의 단점은 무엇입니까 (구현 복잡성이 아니라 보안 문제 만 중요 함)?

답변:


106

SSL에 대한 중간자 (man-in-the-middle) 공격은 SSL의 전제 조건 중 하나가 손상된 경우에만 가능합니다. 여기에 몇 가지 예가 있습니다.

  • 서버 키가 도난당했습니다. 즉, 공격자가 서버 인 것처럼 보일 수 있으며 클라이언트가 알 수있는 방법없습니다 .

  • 클라이언트는 신뢰할 수없는 CA (또는 루트 키를 훔친 CA)를 신뢰합니다. 신뢰할 수있는 CA 키를 가진 사람은 누구나 서버 인 것처럼 가장하여 인증서를 생성 할 수 있으며 클라이언트는이를 신뢰합니다. 오늘날 브라우저에 이미 존재하는 CA의 수가 실제 문제가 될 수 있습니다. 즉, 서버 인증서가 다른 유효한 인증서로 변경되는 것처럼 보이며, 이는 대부분의 클라이언트가 숨길 것입니다.

  • 클라이언트는 신뢰할 수있는 CA 목록에 대해 인증서를 올바르게 검증하지 않아도됩니다. 누구나 CA를 만들 수 있습니다. 유효성 검사가 없으면 "Ben의 자동차 및 인증서"는 Verisign만큼 유효한 것처럼 보입니다.

  • 클라이언트가 공격을 받고 가짜 CA가 신뢰할 수있는 루트 권한에 삽입되었습니다. 공격자가 원하는 인증서를 생성 할 수 있으며 클라이언트는이를 신뢰할 수 있습니다. 악성 코드는 예를 들어 가짜 뱅킹 사이트로 리디렉션하기 위해이를 수행하는 경향이 있습니다.

특히 # 2는 다소 불쾌합니다. 신뢰할 수있는 인증서에 대해 비용을 지불하더라도 사이트가 어떤 식 으로든 해당 인증서에 잠기지 않을 것 입니다. 클라이언트 브라우저에서 모든 CA 를 신뢰 해야 합니다. 유효한 사이트입니다. 또한 서버 또는 클라이언트에 대한 액세스가 필요하지 않습니다.


4
https 링크를 http 링크로 투명하게 다시 작성하려고 시도하는 sslstrip 과 같은 도구도 있습니다.
mpontillo 2013

3
인증서 확인의 또 다른 요점은 클라이언트가 호스트 이름을 확인해야한다는 것입니다. 인증서가 정품인지 확인하는 것만으로는 충분하지 않으며, 대화하려는 엔티티에 발급되어야합니다 ( 여기여기 참조 ). sslstrip의 경우, 불행히도 SSL / TLS를 사용하고 싶은지 확인하는 것은 궁극적으로 사용자에게 달려 있습니다 (HSTS가 도움이 될 수 있음).
Bruno

브라우저가 데이터를 암호화하기 전에 데이터를 가로채는 크롬 (또는 다른 브라우저) 플러그인을 작성할 수 있습니까?
Rosdi Kasim

또 다른 이유는 TürkTrust 문제에서와 같이 "신뢰의 오용"입니다.
ceremcem 2014

1
@Remover별로 ... # 1은 서버의 개인 키로, 진짜 공개 키와 쌍을 이룹니다. 이 시나리오에서는 실제 서버와 대화하지만 다른 사람이 중간에있어 트래픽을 해독 할 수 있습니다. 인증서를 수정할 수 없습니다. # 2는 클라이언트에게 합법적 인 것으로 보이는 "신뢰할 수있는"CA에서 발급 한 완전히 다른 인증서를 보내는 것입니다. 그러면 공격자는 사용자를 대신하여 요청을 프록시하고 그런 방식으로 메시지를 볼 수 있습니다. 둘 다 타협을 초래하지만 # 1은 귀하의 통제하에 있습니다. # 2는 안타깝게도 그렇지 않습니다.
Basic

17

먼저 내가 이해 한대로 인증 절차를 간략하게 설명하겠습니다. 아마도 그 단계에서 오해 할 수도 있습니다. 따라서 클라이언트는 연결을 시작하고 서버는 신뢰할 수있는 기관의 공개 키, 일부 메타 데이터 및 디지털 서명의 조합으로 연결에 응답합니다.

서버는 X.509 인증서 체인과 자체 개인 키로 서명 된 디지털 서명으로 응답합니다.

그런 다음 클라이언트는 서버를 신뢰하는지 결정합니다.

옳은.

공개 키로 임의의 세션 키를 암호화하고 다시 보냅니다.

아니요. 클라이언트와 서버는 세션 키 자체가 전혀 전송되지 않는 상호 세션 키 생성 프로세스에 참여합니다.

이 세션 키는 서버에 저장된 개인 키로 만 해독 할 수 있습니다.

아니.

서버는 이것을한다

아니.

그런 다음 HTTPS 세션이 시작됩니다.

TLS / SSL의 세션이 시작됩니다,하지만 더 많은 단계가 먼저가 있습니다.

따라서 위의 내용이 맞다면 이러한 시나리오에서 man-in-the-middle 공격이 어떻게 발생할 수 있습니까?

서버로 가장하고 SSL 끝점으로 작동합니다. 클라이언트는 인증 단계를 생략해야합니다. 안타깝게도 대부분의 HTTPS 세션에서 유일한 인증 단계는 호스트 이름 확인입니다.

누군가가 공개 키로 서버 (예 : www.server.com) 응답을 가로 채고 어떤 수단으로 그가 www.server.com이라고 생각하게하더라도 그는 여전히 내 세션 키를 해독 할 수 없습니다. 개인 키없이.

위 참조. 해독 할 세션 키가 없습니다. SSL 연결 자체는 안전합니다. 당신이 말하는 사람이 안전하지 않을 수 있습니다.

상호 인증에 대해 말하자면, 클라이언트 ID에 대한 서버 신뢰에 관한 것입니까? 내 말은, 클라이언트는 이미 자신이 올바른 서버와 통신하고 있는지 확인할 수 있지만 이제 서버는 클라이언트가 누구인지 알고 싶어합니다.

옳은.

마지막 질문은 상호 인증의 대안에 관한 것입니다. 설명 된 상황에서 클라이언트 역할을하는 경우 SSL 세션이 설정된 후 HTTP 헤더에 로그인 / 암호를 보내면 어떻게됩니까? 보시다시피이 정보는 연결이 이미 보안되어 있고 서버가 내 식별을 위해이를 신뢰할 수 있기 때문에 가로 챌 수 없습니다. 내가 잘못?

아니.

상호 인증과 비교할 때 그러한 접근 방식의 단점은 무엇입니까 (구현 복잡성이 아니라 보안 문제 만 중요 함)?

사용자 이름 / 암호만큼 안전하며 개인 키보다 유출하기가 훨씬 쉽습니다.


설명해 주셔서 감사합니다. 내가 얻지 못한 유일한 것은 클라이언트가 서버에 세션 키를 보내지 않는다고 말한 이유입니다. 음, 제가 잘못된 용어를 사용했을 수도 있습니다. 여기서는 이 데이터를 "사전 마스터 비밀"이라고합니다.하지만 어쨌든 클라이언트가 전송하지 않고 서버 개인 키로 암호를 해독합니까?
Vadim Chekry 2013

1
@VadimChekry 사전 마스터 암호는 세션 키가 아닙니다. 양쪽 끝에서 독립적으로 세션 키를 생성하는 데 사용되는 여러 데이터 중 하나입니다. 프로세스는 RFC 2246에 설명되어 있습니다.
Marquis of Lorne

1
@Chris 당신은 훨씬 덜 취약하지만 IP 주소 스푸핑이 가능합니다. 인증서에서 피어 ID를 직접 확인하는 대신 사용할 수 없습니다.
Marquis of Lorne

1
+1 이것은 대부분의 경우 꽤 좋은 대답입니다. 그러나 일부 요점은 한 단어로 대답하는 설명이 부족합니다. 만약 당신이 말한 부분을 확장하고 /하거나 정교하게 설명한다면 (즉, "아니오."대신에 실제로 일어나는 일을 간단히 언급 할 수 있습니다.) 결정적인 대답이 될 수 있습니다. 그것은 정말로 몇 가지를 명확히 할 것입니다. 감사.
목소리

1
@ tjt263 첫 번째 '아니오'는 실제로 일어나는 일에 대한 설명을 제공합니다. 다음 두 개의 '아니오'는 첫 번째 '아니오'를 생성 한 동일한 오해를 나타내며 동일한 설명을 가지고 있습니다. 다음이자 마지막 '아니오'는 '내가 틀렸나 요'를 의미하며 OP에서 방금 인용 한 정보를 나타냅니다. 따라서 여기에서 실제로 누락되었다고 생각하는 것을 이해하는 것은 어렵습니다.
Marquis of Lorne

17

클라이언트와 서버 사이를 오가는 사람이라면 누구나 https에서 중간자 공격을 할 수 있습니다. 이것이 드물거나 드물다고 생각하는 경우 인터넷 게이트웨이를 통해 모든 SSL 트래픽 을 체계적으로 해독, 스캔 및 다시 암호화하는 상용 제품이 있음을 고려하십시오.. 클라이언트에게 "실제"SSL 인증서에서 복사 한 세부 정보를 사용하여 즉석에서 생성되었지만 다른 인증서 체인으로 서명 된 SSL 인증서를 전송하여 작동합니다. 이 체인이 브라우저의 신뢰할 수있는 CA로 종료되면이 MITM은 사용자에게 표시되지 않습니다. 이러한 제품은 주로 회사 네트워크를 "보안"(경찰)하기 위해 회사에 판매되며 사용자의 지식과 동의를 얻어 사용해야합니다. 기술적으로는 ISP 나 다른 네트워크 사업자의 사용을 중단 할 수 없습니다. (NSA에 신뢰할 수있는 루트 CA 서명 키가 하나 이상 있다고 가정하는 것이 안전합니다 .)

페이지를 제공하는 경우 페이지에 서명해야하는 공개 키를 나타내는 HTTP 헤더포함 할 수 있습니다 . 이는 사용자에게 "보안"연결을 MITM에 알리는 데 도움이 될 수 있지만 처음 사용시 신뢰하는 기술입니다. Bob이 "실제"공개 키 핀에 대한 레코드가없는 경우 Mallory는 문서에서 pkp 헤더를 다시 작성합니다. 이 기술 (HPKP)을 사용하는 웹 사이트 목록은 매우 짧습니다. 여기에는 Google과 Dropbox가 포함됩니다. 일반적으로 https-intercepting 게이트웨이는 HPKP를 사용하는 몇 개의 신뢰할 수있는 대규모 사이트의 페이지를 통과합니다. 예상하지 못한 HPKP 오류가 표시되면주의하십시오.

암호와 관련하여 https 연결의 모든 것은 https로 보호됩니다. 단, 도메인 이름은 요청이 라우팅 될 수 있도록 명확하게 표시되어야합니다. 일반적으로 로그, 북마크 등에 사용할 수있는 쿼리 문자열에 암호를 넣지 않는 것이 좋습니다.하지만 https가 손상되지 않는 한 쿼리 문자열은 표시되지 않습니다.


그러나 이것은이 MITM 장비 (트래픽을 해독 / 스캔하고 다시 암호화하는 장비)가 신뢰할 수있는 CA 중 하나에 대한 액세스 권한을 가져야 함을 의미합니까? (서버 인증서를 "가짜"). 이런 일이 일어난다 고합시다. 그런 다음 누군가가 이것을 파열하고 정보가 공개되고 대가로 스캔들이 있고 CA 인증서가 모든 브라우저에서 제거됩니다. 내 말은, 이상적으로 ...
jazzcat

2
아니 아니. 게이트웨이의 "SSL 검사"는 즉석에서 인증서를 만들고 서명해야하지만이를 수행하기 위해 루트 인증서가 필요하지 않습니다. 체인이있는 중간 인증서가 있습니다. 브라우저에서 체인의 루트를 신뢰하는지 여부에 따라 인증서 오류가 표시되는지 여부가 결정됩니다. 직장에서 우리는 브라우저가 인증서 오류를 일으키지 않도록 fortinet 루트 인증서를 설치하라는 요청을 받았습니다. 그러나 이미 신뢰할 수있는 인증서로 체인이 종료되면 투명합니다.
bbsimonbb

직장 동료가 이러한 기업 네트워크 MITM 기술이 Google에 SSL을 강제하는 데 왜 나쁜 생각인지에 대한 제한적인 이해를 사용하고있었습니다. 실제로 그는 약간의 정확성을 가질 수 있습니까?
EmSixTeen

1
죄송합니다. 질문을 이해하지 못합니다!
bbsimonbb

2
  1. 옳은
  2. 별로 맞지 않습니다. 그런 종류의 공격에서 itermediate 서버는 귀하의 요청을 받아 귀하를 대신하여 목적지로 보냅니다. 그런 다음 결과로 응답합니다. 실제로 통신하려는 실제 서버가 아닌 사용자와 안전하게 연결하는 중간자 서버입니다. 그렇기 때문에 인증서가 유효하고 신뢰할 수 있는지 항상 확인해야합니다.
  3. 맞을 수있다
  4. 보안 연결이 신뢰할 수 있다고 확신하면 사용자 이름 / 암호를 보내도 안전합니다.

약 2-클라이언트가 연결 설정 절차 중에 서버에서 보낸 메타 데이터를 철저히 확인하고 클라이언트가 모든 인증서를 신뢰하지 않는다고 가정합니다. 따라서 a) 클라이언트가 위에서 말한 것을 수행하지 않거나 b) 중간자 (man-in-the-middle)가 신뢰할 수있는 CA가 서명 한 인증서를 어딘가에 가지고 있다면 그러한 시나리오는 가능하지 않을까요?
Vadim Chekry 2013

1
중간 서버가 유효한 인증서를 보내는 경우는 매우 드뭅니다. 작년에 잘 기억하면 Comodo CA에서 발생했습니다. 그러나 일반적으로 신뢰할 수있는 연결이면 완전히 안전합니다.
Boynux 2013

1

세션 키에 관한 부분을 제외하고 말한 모든 것이 정확합니다. CA의 요점은 중간자 (man-in-the-middle) 공격을 물리 치는 것입니다. 다른 모든 것은 SSL 자체에서 수행됩니다. 클라이언트 인증은 사용자 이름 및 암호 체계의 대안입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.