본문 바로가기
Hack/Network

[CVE-2022-3602] OpenSSL punycode Decoding Vulnerability (off-by-one)

by Becoming a Hacker 2022. 11. 2.
반응형

영향 받는 대상

OpenSSL 3.0.x Version (3.0.0 ~ 3.0.6)

 

취약점 전제 조건

출처 : https://securitylabs.datadoghq.com/articles/openssl-november-1-vulnerabilities/

해당 취약점의 경우 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로 업그레이드 하는 것으로 피해를 방지할 수 있습니다.

 

참조 문서

 

The OpenSSL punycode vulnerability (CVE-2022-3602): Overview, detection, exploitation, and remediation | Datadog Security Labs

Learn how the OpenSSL punycode vulnerability (CVE-2022-3602) works, how to detect it, and how it can be exploited.

securitylabs.datadoghq.com

 

댓글