[하루한줄] A deep-dive into the SolarWinds Serv-U SSH vulnerability

URL

https://www.microsoft.com/security/blog/2021/09/02/a-deep-dive-into-the-solarwinds-serv-u-ssh-vulnerability/

Target

  • SolarWinds Serv-U

Explain

이번 취약점은 실제로 공격에 사용되었던 취약점입니다. Microsoft Threat Intelligence Center(MSTIC)에서 이런 공격 행위를 포착하였고 이와 관련된 데이터를 Microsoft Offensive Research & Security Engineering team에 넘겨 분석하고 SolarWinds에 분석 내용을 전달하였고 합니다. 이런 연계성은 신기하네요. 그리고 Microsoft Offensive Research & Security Engineering team은 데이터를 받은 후 바로 퍼저를 작성했다고 하는데… 엄청나네요…

아무튼 취약점은 Serv-U FTP 서버의 SSH 모듈에서 발생합니다. 서버에서는 루프를 돌며 클라이언트에서 전달된 메시지를 처리합니다. 이 때 메시지에는 메시지 ID도 같이 들어 있는데, 이에 따라 처리하는 루틴이 달라집니다.

https://www.microsoft.com/security/blog/uploads/securityprod/2021/09/Fig6a-Serv-U-SSH-blog.png

먼저 버전을 확인하고 아래 메시지들을 순차적으로 처리합니다. 이 때 EVP_EncryptInit_ex 함수를 호출하는데, 함수 프로토타입과 호출할 때의 코드는 다음과 같습니다.

int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         ENGINE *impl, const unsigned char *key, const unsigned char *iv);

https://www.microsoft.com/security/blog/uploads/securityprod/2021/09/Fig6b-Serv-U-SSH-blog.png

이 때, 4번째 인자인 key가 NULL로 전달이 되는데, 이는 ctx가 key가 세팅되기 전 KEXINIT 메시지를 핸들링할 때 생성이되기에 상관이 없지만 ctx→cipher_data 구조체 안에 저장되는 데이터는 AES key expansion은 key expansion이 발생해야만 초기화되기 때문에 초기화되지 않은 상태로 남아있게 됩니다.

https://www.microsoft.com/security/blog/uploads/securityprod/2021/09/Fig5a-Serv-U-SSH-blog.png

이로 인해 데이터를 처리하던 중 aes_ctr_cipher 함수에서 ctx→cipher_data를 하게 되고 그 안에 멤버 변수를 CRYPTO_ctr128_encrypt 함수에서 바로 함수 포인터로 사용하게 되어 rip를 바로 제어할 수 있게 됩니다.