영향 받는 대상
OpenSSL 3.0.x Version (3.0.0 ~ 3.0.6)
취약점 전제 조건
해당 취약점의 경우 CA가 취약한 인증서로 서명되었거나 유효한 인증서가 아님에도 불구하고 통신을 진행할 경우에만 발생 가능한 취약점 입니다. 즉, 일반적인 환경에서 발생할 수 있는 취약점은 아닙니다.
위와 같은 이유로 OpenSSL에서도 최초 취약점 등급이었던 Critical을 High로 다운그레이드 하였습니다.
취약점 분석
해당 취약점은 Punycode Domain의 디코딩에 사용되는 함수인 ossl_punycode_decode에서 발생하며, 4Byte의 Stack Buffer Over Flow가 가능합니다.
ossl_punycode_decode에서 디코딩된 punycode의 길이를 검증하는 로직은 다음과 같습니다.
※ written_out 변수는 현재까지 복사된 길이를 나타내며, max_out 변수는 복사되는 배열의 크기인 512를 나타냄
if (written_out > max_out)
return 0;
memmove(pDecoded + i + 1, pDecoded + i, (written_out - i) * sizeof *pDecoded);
pDecoded[i] = n;
written_out++;
해당 로직을 세세하게 나눈다면, 3가지로 나눠 볼 수 있습니다.
1. 길이 검사
if (written_out > max_out)
return 0;
2. 메모리 복사
memmove(pDecoded + i + 1, pDecoded + i, (written_out - i) * sizeof *pDecoded);
pDecoded[i] = n;
3. 길이 카운팅
written_out++;
길이 검사 로직에 따르면, written_out 값이 512일 경우 False가 발생하여 메모리 복사 로직을 실행하게 되는데, 배열의 크기가 512인 변수는 [0]~[511] 인자에 대해서만 접근이 가능해야 하나 [512] 인자에 메모리를 복사함으로써 4Byte의 Stack Buffer Over Flow가 발생하게 됩니다.
취약점이 패치된 3.0.7 Version에서는 길이 검사 로직을 >=으로 변경하여 최대 [511] 인자에 대해서만 접근이 가능하도록 패치를 진행하였습니다.
if (written_out >= max_out)
return 0;
memmove(pDecoded + i + 1, pDecoded + i, (written_out - i) * sizeof *pDecoded);
pDecoded[i] = n;
written_out++;
대응 방안
CVE-2022-3602 취약점은 OpenSSL Version을 3.0.7로 업그레이드 하는 것으로 피해를 방지할 수 있습니다.
참조 문서
'Hack > Network' 카테고리의 다른 글
[VUE JS] source map 파일을 통한 Frontend 소스 코드 획득 (0) | 2023.02.21 |
---|---|
[CVE-2022-3786] OpenSSL punycode Decoding Vulnerability (Stack Buffer over Flow) (0) | 2022.11.03 |
11월 1일 Releases 될 OpenSSL 취약점 정보 (0) | 2022.10.30 |
[Netfilter] MITM Tool With netfilter_queue (0) | 2022.08.28 |
[Netfilter] IP Spoofing With netfilter_queue (0) | 2022.08.28 |
댓글