중간자 개입 공격 구현(CNG 예제)

CNG(Cryptography Next Generation) 보안 통신 예제에서는 제3자(Mallory)가 두 통신 끝점(Alice와 Bob) 사이에 개입하는 중간자 개입 공격을 보여 줍니다.

CNG 예제에서는 명명된 파이프를 사용하여 프로세스 간 통신을 제공합니다.Alice는 항상 명명된 파이프 서버 역할을 하고 Bob은 항상 명명된 파이프 클라이언트 역할을 합니다.Mallory는 Alice와는 Bob을 가장하여 클라이언트 역할을 수행하고 Bob과는 Alice를 가장하여 서버 역할을 수행합니다.이 방법을 중간자 개입 공격의 전형적인 형태인 바꿔치기라고 합니다.

이 시나리오에 대한 자세한 내용은 단계별 키 및 메시지 교환(CNG 예제)을 참조하십시오.

CNG 예제에서 "가장"이라는 단어는 Mallory가 Bob을 가장하거나 Mallory가 Alice를 가장한다는 의미로 사용됩니다.그러나 가장이라는 용어에는 명명된 파이프와 관련하여 특별한 의미가 있습니다. 자세한 내용은 NamedPipeServerStream.RunAsClient(PipeStreamImpersonationWorker) 메서드에 대한 설명을 참조하십시오.

디지털 서명

디지털 서명을 사용하여 중간자 개입 공격을 막는 경우가 많습니다.일반적으로 PKI(공개 키 인프라)에서 서명 키를 제공하고 유지 관리합니다.PKI는 일반적으로 컴퓨터 로컬에 있지 않으며보안 또는 관리 그룹이나 인증 기관에서 지원합니다.이러한 인프라를 사용하는 방법은 이 예제의 범위를 벗어납니다.대신 이 예제에서는 CNG 클래스를 사용하여 로컬 디지털 서명 키를 만드는 방법을 보여 줍니다.

개입 지점

중간자 개입 공격을 수행하려면 신호 체인에 개입 지점이 있어야 합니다.메시지 교환을 처리하는 실제 하드웨어 장치가 침범된 경우 개입 지점이 생길 수 있습니다.예를 들어 회선을 바꿔치거나 우회할 수도 있고 전자 통신 서버를 침범하여 전자적으로 재구성할 수도 있습니다.그러나 보다 일반적인 방법은 네트워크를 유지 관리하는 소프트웨어를 다시 구성하는 것입니다.예를 들어 포트를 다시 할당하거나 다시 라우팅할 수도 있고 통신 응용 프로그램에 소프트웨어 개입 지점을 만들 수도 있습니다.

작은 허점

파일을 쓰기 모드로 열면 다른 응용 프로그램이 사용할 수 없도록 잠깁니다.마찬가지로 파이프 클라이언트가 파이프 서버에 연결되면 해당 클라이언트에서만 사용할 수 있도록 파이프가 잠기고 클라이언트의 연결이 끊어질 때까지 잠긴 상태로 유지됩니다.

일단 설정된 클라이언트/서버 채널은 침입하기가 매우 어렵습니다.그러나 CNG 예제에서 Mallory는 Alice와 Bob 사이에서 메시지를 손쉽게 가로채고 변경할 수 있습니다.Mallory는 실제로는 설정된 파이프 채널에 침입하는 것이 아닙니다.대신 Mallory는 회사의 통신 프로토콜에서 간과한 작은 허점을 활용합니다.

Alice와 Bob은 PublicChannel 파이프를 사용하여 개인 채널의 이름을 공유한 다음 판매 고객용 개인 채널을 사용하도록 지시를 받았습니다.이러한 지침으로 인해 Mallory는 개인 채널의 이름을 알아내서 Alice와 Bob 사이에 개입할 수 있습니다.다음 두 단원에서는 이러한 방법을 설명합니다.

타이밍

중간자 개입 공격의 성공 여부는 타이밍과 같은 미묘한 요소에 좌우되는 경우가 많습니다.CNG 예제에서는 이러한 개념을 보여 줍니다.

Mallory는 회사에서 개발한 새 IM(인스턴트 메시징) 소프트웨어가 명명된 파이프를 사용한다는 점을 알고 있습니다.또한 Alice와 Bob이 PublicChannel이라는 파이프를 연다는 사실을 알고 있습니다.뿐만 아니라 Alice가 Bob에게 두 번째 파이프의 이름을 전송한다는 점도 알고 있습니다.Alice와 Bob은 PublicChannel 파이프를 닫은 다음 두 번째 파이프를 열고 이 파이프를 사용하여 판매 고객에 대한 정보를 교환합니다.

판매 고객 정보를 알아내기 위해 Mallory는 Alice에게서 두 번째 파이프의 이름을 알아내고 Bob은 파이프 이름을 알지 못하게 해야 합니다.이를 위해 Bob보다 먼저 PublicChannel 파이프의 클라이언트 끝점을 열어야 합니다.

소스 코드에서는 이러한 가로채기를 허용하기 위해 Bob의 Run 메서드에서 System.Threading.Thread.Sleep(200) 명령문을 사용하여 200밀리초간 대기합니다.wait 명령문은 중간자 개입 공격을 보여 주려는 예제의 목적을 위해 의도적으로 눈에 잘 띄게 배치되었습니다.실제 상황에서는 보안 시나리오를 분석하기가 훨씬 더 어렵습니다.실제로는 소프트웨어 응용 프로그램 조합, 전송 프로토콜, 네트워크 인증, 사용자 계정, 로깅, 사용 권한, 사용자 교육, 트래픽 모니터링 및 기타 분석 기법을 동원해야 합니다.

이러한 복잡한 분석을 수행해도 네트워크 서버의 200밀리초 전파 지연이라는 단순한 허점이 수개월간 발견되지 않을 수 있습니다.따라서 가로채기 문제를 완전히 해결하기 위해 CNG 예제의 서로 다른 다섯 가지 버전을 만들었습니다.

바꿔치기

두 번째 파이프의 이름(AliceAndBobChannel)을 가로챈 Mallory는 Alice와 Bob의 통신을 도청하고 서로 전송하는 메시지를 변경할 수 있습니다.이러한 바꿔치기를 구현하는 방법은 다음과 같습니다.

  1. Alice가 PublicChannel 파이프를 서버 모드로 열고 Bob이 연결하기를 기다립니다.

  2. Mallory가 PublicChannel 파이프에 클라이언트 모드로 연결하고 Alice가 보내는 두 번째 파이프 이름(AliceAndBobChannel)을 받습니다.

  3. Alice와 Mallory가 PublicChannel 파이프를 닫습니다.

  4. Alice가 AliceAndBobChannel 파이프를 서버 모드로 열고 Mallory가 이 파이프에 클라이언트 모드로 연결합니다.

  5. Mallory가 PublicChannel 파이프를 통해 Bob에 서버로 연결하고 Bob이 클라이언트로 연결합니다.

  6. Mallory가 Bob에게 약간 변경된 파이프 이름(AliceAndBobChannel1)을 전송합니다.Bob은 이 정보를 Alice가 보내는 것으로 간주합니다.

  7. Mallory와 Bob이 PublicChannel 파이프와 연결을 끊습니다.

  8. Mallory가 AliceAndBobChannel1 파이프를 서버로 열고 Bob이 이 파이프에 클라이언트로 연결합니다.

이제 Mallory가 Alice와 Bob 사이에 개입했습니다.

Mallory는 Alice에게는 AliceAndBobChannel 파이프를 통해 클라이언트로 행동하고 Bob에게는 AliceAndBobChannel1 파이프를 통해 서버로 행동합니다.이제 Mallory는 메시지를 원하는 대로 읽고 변경하고 다시 전송할 수 있습니다.Alice와 Bob은 다른 사람이 메시지를 가로채서 변경한다는 사실을 알지 못합니다.

중간자 개입 공격이 성공하면 알아차리기 어려운 경우가 많습니다.Mallory는 발각되지 않도록 조심하면서 판매 고객 정보를 아주 조금만 변경합니다.변경 내용이 쉽게 눈에 띄면 안 됩니다.

결론

중간자 개입을 발견하려면 시간과 노력이 매우 많이 소요됩니다.이 예제에서는 한 번의 200밀리초 대기 시간을 다루고 있지만,5분의 1초라는 짧은 시간으로 인해 전체 판매 부서에서 정보가 노출될 수 있습니다.

참고 항목

개념

암호화 서비스

.NET Framework 암호화 모델

암호화 서비스

기타 리소스

암호화 작업