[하루한줄] CVE-2024-20328 : ClamAV의 Command Injection 취약점

URL

https://amitschendel.github.io/vulnerabilites/CVE-2024-20328/

Target

  • ClamAV
    • 0.104
    • 0.105
    • 1.0.0 ~ 1.0.4
    • 1.1
    • 1.20, 1.2.1

Explain

Cisco Talos가 개발한 오픈소스 Antivirus 엔진인 ClamAV에서 Command Injetion 취약점이 발견되어 세부 정보가 공개되었습니다.

ClamAV의 clamd.conf 설정파일에서는 바이러스가 탐지되면 사용자 지정 command를 실행하는 VirusEvent 기능을 활성화할 수 있습니다.

# clamd.conf 

# VirusEvent 설정 예시
VirusEvent "echo VIRUS DETECTED: %v in the path %f >> /dev/stdout"

VirusEvent가 활성화되어 있으면 바이러스 탐지 시 ClamAV 데몬 clamd의 virusaction 함수에서 아래 루틴을 실행합니다.

void virusaction(const char *filename, const char *virname, const struct optstruct *opts)
{
// ...
	for (i = 0, j = 0; i < len; i++) {
	        if (i + 1 < len && opt->strarg[i] == '%' && opt->strarg[i + 1] == 'v') {
	            strcat(buffer_cmd, virname);
	            j += strlen(virname);
	            i++;
	        } else if (i + 1 < len && opt->strarg[i] == '%' && opt->strarg[i + 1] == 'f') {
	            strcat(buffer_cmd, filename);
	            j += strlen(filename);
	            i++;
	        } else {
	            buffer_cmd[j++] = opt->strarg[i];
	        }
	    }
	
// ...
	
	_exit(execle("/bin/sh", "sh", "-c", buffer_cmd, NULL, env));

//...

바이러스가 탐지되면 clamd.conf 에서 지정한 사용자 지정 command를 execle을 통해 쉘에서 실행합니다. 이 때 전달되는 명령어 중 %v 는 바이러스명 virname, %f는 탐지된 파일명으로 치환하는데, 이때 탐지된 파일명에 임의의 실행할 명령어가 포함되어 있으면 Command Injection이 트리거됩니다.

탐지된 바이러스 파일명이 l0chvirname;whoami; 인 경우 아래와 같이 clamd 컨텍스트에서 임의 코드 실행이 가능합니다.

VIRUS DETECTED: Multios.Coinminer.Miner-6781728-2.UNOFFICIAL in the path
/home/l0ch/l0chvirname
root