Vulnerability
하드 코딩된 키를 사용하지 마시오, DUCK
2017 10 27
  • Facebook
  • Twitter
  • Copy URL

최근 들어 오래된 암호화 시스템이 뚫리는 공격에 대한 발표가 있었다. 그리고 앞서 얘기한 KRACK, ROCA와 같은 공격의 후유증이 완전히 가시기도 전에 나타난 것이 있으니, 그것이 DUHK(Don’t Use Hard-Coded Keys)이다.[1] 하드 코드화 된 키를 사용하지 말라고? DUCK 공격을 통하면 암호화를 복구하는 키로 VPN 연결을 노출한다.[2] 이게 무슨 말인즉, VPN과 같은 가상사설망을 통하여 서버에 연결하였을 때 VPN으로 오가는 정보가 외부의 위험으로부터 노출된다는 이야기다. 어떻게? 자, 그럼 새로운 암호 공격인 DUCK에 대해 더 알아보자.

이미지를 불러오는데 실패했습니다.

DUHK 공격의 핵심은 두 가지의 요소가 합쳐져 나온다. 먼저, ANSI X9.31 난수 생성기(RNG)의 사용법이다. ANSI X9.31 RNG는 간단히 말해 암호화 키를 가져와 VPN 연결을 하고, VPN을 타고 오가는 트래픽, 데이터를 암호화하여 보호하는 데 사용되는 암호화 키를 생성하는 알고리즘이다. 두 번째로 앞서 얘기한 ANSI X9.31 RNG 알고리즘을 구현하는 하드웨어 공급 업체가 ‘시드 키’를 하드 코딩해버리는 경우를 말한다. 이러한 작업은 일반적으로 장치를 제공하는 하드웨어 공급 업체가 ANSI X9.31 알고리즘을 시작하기 전에 임의의 시드 키를 생성하여 구현한다.[3] 즉, DUCK 공격은 ANSI X9.31 RNG에서 사용하는 시드 키가 하드웨어 혹은 소프트웨어에 있는 경우 공격자는 이를 통해 암호화된 통신을 해독할 수 있다. 이렇게 공격자에게 노출된 VPN 통신 정보는 로그인 정보, 인트라넷 정보, 개인 엔터프라이즈 데이터 등을 VPN 연결을 통하여 암호화된 웹 세션으로 오가는 모든 데이터를 포함한다.[4]

ANSI X9.31 RNG는 뭐고 시드 키는 뭘까. 먼저 RNG(Random Number Generator)는 짧은 랜덤 시드를 다수의 명백한 난수로 넓히기 위해 설계된 알고리즘으로[5], ANSI X9.31는 RNG 알고리즘의 종류다.[6] 미국 정부(FIPS)는 2016년 1월까지 ANSI X9.31 RNG을 RNG 알고리즘 목록에 포함했고, 그 이후에도 계속 사용되었던 터라 널리 퍼져 많은 이가 사용하고 있는 알고리즘이다.[7] 하지만, 많이 사용한 것이 무색하도록 DUCK 취약점은 이전부터 언급되었다. 1998년, US NIST는 이 알고리즘에 사용하는 ‘시드 키’가 유출되면, 알고리즘이 손상될 수 있다고 경고를 해왔었다.[8]

ANSI X9.31 RNG 알고리즘은 블록 암호(AES)를 기반으로 하는 레거시 난수 생성기다. 먼저, 초기 시드로 한 쌍의 값 K와 V를 취한다. 여기서 K는 킷값이고, V는 시드(상태) 값인데, 이 두 개의 값을 블록 암호로 반복적으로 적용하여 난수 비트의 긴 스트림을 생성한다. 이 블록 암호를 통해 긴 스트림을 생성할 때에는 타임 스탬프 값과 하드웨어 기계 발전기의 출력 값을 이용하는데 이를 통해 라운드를 돌릴 때마다 V 값이 업그레이드된다. 문제는 이때, K 값인 키 값이 변경되지 않는다는 것이다.[9]

거의 약 20년 전, 펜실베니아 대학의 두 연구자와 존스 홉킨스 대학의 한 연구원에 의해 이 사실이 발견되면서, ANSI 알고리즘은 끔찍하게도 안전하지 못하다고 지적했다.[10] 만약, 공격자가 어떻게든 K 값을 알아낸다면 이 K 값을 통해 RNG 작업을 거슬러 올라가면 앞서 사용된 값들을 추려낼 수 있을 것이란 이야기다. 따라서 ANSI를 사용하여 난수를 생성하고, 이를 통해 비밀 키를 생성하는 경우, 공격자가 잠재적으로 프로토콜을 완전히 깰 수 있는 비밀 키를 복구할 수 있다는 것이다.

물론, 이 DUHK 공격에 성공하기 위해선 K 값인 킷값을 알아야 한다는 것이 요구된다.[11] 이 때문에 1998년에 이러한 취약점을 얘기했었어도 가능성이 희박하여 묻혀버린 것이다. 하지만 최근 연구팀은 설계된 펌웨어 이미지를 뒤집어서 하드 코딩된 시드 키를 발견했다고 전했다.[12] 그들의 ‘레거시 RNG 구현에 대한 실용적인 상태 복구 공격’라는 제목의 논문을 보면 그들은 전 세계 기업에서 사용하는 방화벽이나 개인 VPN 네트워크를 생성하는 장치에서 암호화된 트래픽을 복구할 수 있었다고 얘기했다. 또한, 하드 코딩된 시드 키를 통해 암호화에서 사용된 매개 변수를 추측하여 장치에서 들어오는 트래픽을 관찰하고 암호화된 데이터를 확인할 수 있다고 한다.[13]

연구팀에서 직접 언급한 곳은 VPN 장비 및 방화벽을 구현하는 데 있어 상당히 유명한 업체 ‘포티넷(Fortinet)’이었다. 해당 업체에서 제공하는 장비 중 DUCK 취약점에 취약한 장치는 FortiOS 4.3.0에서 FortiOS 4.3.1를 사용하는 Fortinet FortiGate 장치가 취약하다고 한다. 다행히도 이 외에 FortiOS 5.x는 이번 DUCK 공격에 영향을 받지 않고, FortiOS 4.3.19에서 하드 코딩된 시드 키는 연구원이 회사에 연락하여 Fortinet이 제거했다고 한다. 또한, DUCK 취약점을 연구할 당시인 2017년 10월 기준으로 약 23,000개 이상의 오래된 Fortinet 장치가 위협으로부터 노출되어 있다고 전했다. 또한, 일부 장치는 방화벽이 있는 네트워크에 있지만, 공격에 취약하므로 위협은 더 클 수도 있다고 한다.[14]

근데, 이거 실제 공격에 사용할 수 있는 것인가. 이번에 이를 발표한 연구원들은 이를 공격할 수 있는 공격 코드는 공개하지 않았다.[15] 또한, 실제로 이러한 공격을 Fortinet VPN 연결에 적용하기란 쉬운 일이 아니다. 하지만 IPv4 주소 공간을 광범위하게 검사하여 네트워크를 통해 들어오는 트래픽을 받아들이는 FortiOS 장치를 검색할 수 있고, 그 장치에 DUCK 공격을 해볼 수 있을 것이다.[16] 물론, 앞서 얘기한 것처럼 공격은 간단하지 않다. 하지만 지금 시대의 컴퓨터를 사용하는 공격자라면 연결하는 FortiOS 장치 하나당 약 4분 내로 암호화 키를 복구할 수 있다고 한다. 더욱이, DUHK 공격을 위한 사용자 상호 작용이 필요 없으므로, 사용자는 누군가가 자신에게 DUHK 공격을 하는지 알 수 없다고 한다.[17] 이를 발표한 연구원들은 Fortinet 업체의 하드웨어, 소프트웨어 제품만 외에도 하드웨어 및 소프트웨어 제품도 DUHK 공격의 영향을 받을 수 있으며, 연구원들이 발견한 하드 코딩된 ANSI X9.31 시드 키가 있는 제품 목록을 게시하기도 했다.[18]

이처럼 최근 암호화에 대한 취약점이 드러나면서 이와 같은 버그에서 주목해봐야 할 것이 있다. 첫 번째로 결국 사람들의 실수로 나타난다는 것이다. 아마도 우리는 암호화 프로세스를 설계하는 과정에서 이러한 취약점을 예상하고 이를 고려하여 구현했었을 것이다. 하지만 사람의 실수로 Forti OS 버전 4부터 5전까지 아주 잠깐 이러한 취약점에 노출되었다는 것이다. 두 번째로 정부의 암호 인증이 거의 쓸모 없다는 것이다. 이러한 무늬만 암호 인증은 하나의 취약점으로 만들어나갈 수 있는 요소라고 본다. 더욱이, 이런 공식적인 인증을 통한 것은 하나의 기업이 아니라 여러 업체가 사용될 수 있으므로 잠재적 위협을 더 크게 만들 수 있을 걸로 보인다. 마지막으로 이 취약점이 알려진 것이 무려 20년 전이다. 이러한 알고리즘을 사용할 때에는 최소한 이러한 취약점의 유무 여부는 알고 있었어야 하지 않나 싶다. 한마디로, 무신경한 업체들이란 생각이 든다. 더욱이 이 알고리즘은 2016년부터 사용 중단되었다. 하지만 여전히 많은 수의 제품이 이를 사용하고 있다. 이것이 무신경이 아니고 무엇인가.  

유성경 yuopboy@grayhash.com