Redis 원격 코드 실행 취약점(CVE-2024-31449)

Redis 원격 코드 실행 취약점(CVE-2024-31449)

1. Overview

인기 있는 오픈소스 기반 데이터베이스 관리 시스템 Redis 에서 원격 코드 실행 공격을 발생시킬 수 있는 취약점이 발견되었다. 인증된 사용자가 적절하지 않은 값을 입력할 경우, 스택 버퍼 오버플로우가 발생하면서 원격 코드 실행 공격이 발생할 수 있는 잠재적 위험이 존재한다.

NIST 에서는 CVE-2024-31449 에 대해 7.0 이라는 높은 점수를 부여했다. 해당 취약점을 이용한 실제 공격 사례는 보고되지 않았지만, Redis 가 많은 사용자가 사용하는 인기 있는 오픈 소스 프로그램이라는 점, 대다수의 버전에서 취약점이 발생할 수 있다는 점을 생각하면 충분히 주의해야 한다.

CVE-2024-31449 취약점에 대한 NIST 평가

2. 취약점 발생 원인

NIST 에서는 해당 취약점이 Redis 에서 사용되는 Lua 스크립트 라이브러리에서 특정 함수를 호출할 때 입력 값을 적절하게 검증하지 않아서 발생한다고 밝혔다.

조사한 결과 문제가 되는 코드는 Lua 라이브러리의 bit.tohex() API 였다. DEFOLD 사이트에서 설명하는 bit.tohex() 는 요약하면, 이 API 는 2개의 인자를 받으며 첫 번째 인자를 hex string 으로 변환한다. 두 번째 인자는 선택적이며, 결과로 반환할 hex string 의 수를 정한다.

예제를 보면 좀 더 이해하기 쉽다. 아래는 DEFLOD 사이트에서 제공하는 예제이다. 첫 번째 인자를 hex string 으로 변환하여 반환하며, 두 번째 인자가 지정되면 해당 수 만큼만 문자를 반환한다.

print(bit.tohex(1))              --> 00000001
print(bit.tohex(-1))             --> ffffffff
print(bit.tohex(0xffffffff))     --> ffffffff
print(bit.tohex(-1, -8))         --> FFFFFFFF
print(bit.tohex(0x21, 4))        --> 0021
print(bit.tohex(0x87654321, 4))  --> 4321

상식적으로 생각해보았을 때, 위 API 의 두 번째 인자에는 음수가 들어가서는 안된다는 것을 알 수 있다. 하지만 문제가 발생하는 버전의 Redis 에서는 이를 적절하게 검증하지 않아 스택 버퍼 오버플로우가 발생할 여지를 남겼다.

Redis 에서 해당 취약점을 고치기 위해 commit 한 redis 코드를 읽어보면 이해할 수 있다. commit 된 코드는 두 번째 인자로 전달되는 값이 -2147483648 인지 검증하고 있다.

최신 업데이트된 버전의 redis 버전을 구축 후, redis-cli 를 통해 스택 버퍼 오버플로우가 발생하도록 bit.tohex() 를 실행한 결과, 패치된 내역에 따라 0000FFFF 를 반환하는 것을 확인할 수 있었다.

만약 redis-cli eval "return bit.tohex(65535, -2147483648)" 0 명령어를 실행했을 때 서버에서 에러가 발생하거나 서버가 다운된다면 취약점에 노출되고 있다는 뜻이므로 업데이트가 필요하다.

3. 취약점 발생 버전 & 해결책

해당 취약점은 Redis 내 Lua 라이브러리에서 발생하므로, Redis 를 업데이트하여 문제를 해결해야 한다.

CVE-2024-31449 취약점을 해결하기 위해서는 아래와 같은 최신 버전으로 업데이트해야 한다.

  • Redis OSS/CE/Stack
    • OSS/CE: 7.4.1, 7.2.6, 6.2.16 이상 버전
    • Stack: 7.4.0-v1, 7.2.0-v13, 6.2.6-v17 이상 버전
  • Redis Enterprise
    • 7.4.2-169 이상 버전
    • 7.2.4-109 이상 버전
    • 6.4.2-110 이상 버전