|
[CVE-2017-8641] Microsof Edge Chakra Eval Integer 침해사고분석팀 2017.09.01 |
|
개요Microsoft Edge에 정수형 오버플로우 취약점이 존재한다. 해당 취약점은 eval()함수 인자 값에 매우 큰 값을 전달함으로 해당 값 처리시, 정수형 오버플로우가 발생하는 취약점이다. [CVE 정보]
CVE-2017-8641
[취약한 버전]
Microsoft Edge .
Microsoft Internet Explorer 11 Microsoft Internet Explorer 9 Microsoft Internet Explorer 10 [취약점 발생 함수]
GlobalObject::DefaultEvalHelper()
확인 내역해당 취약점 발생 원인은 eval() 함수에 매우 큰 값이 전달됨으로 발생한다. eval() 자바스크립트 함수가 호출 되었을 때, 내부의 GlobalObject::VEval() 함수가 호출된다. 호출된 이 함수에서는 eval() 함수 인자 값의 type을 체크하게 된다. 만약 eval() 함수 인자 값의 데이터가 type 문자열일 경우, GlobalObject::VEval() 함수가 GlobalObject::DefaultEvalHelper() 함수를 호출하고, 값과 길이를 인자 값으로 전달하게 된다.
GlobalObject::DefaultEvalHelper() 함수는 arg_length를 사용하여 버퍼 사이즈를 계산하게 되는데, 일반적을오 버퍼 사이즈는 아래의 공식을 따라 계산된다.
buffer_size = (arg_length + 1) * 3
다음으로, GlobalObject::DefaultEvalHelper() 함수가 buffer_size의 버퍼를 할당하고 utf8::EncodeIntoAndNullTerminate() 함수를 호출하여 eval() 함수 인자 값을 새롭게 할당된 버퍼에 복사하게 된다.
GlobalObject::DefaultEvalHelper() 함수가 buffer_size를 계산하기 이전에, arg_length 사이즈를 체크하지 않기 때문에 arg_length 값이 0x55555554 보다 큰 경우 정수형 오버플로우가 발생하게 되고, buffer_size 값이 arg_length 값 보다 작은 값이 된다. 그 결과, utf8::EncodeintoAndNullTerminate() 함수가 eval() 함수의 인자 값을 buffer_size 사이즈 만큼 버퍼에 복사 하게 되어 OoB write 취약점이 발생하게 된다.
이와 관련하여 공개된 POC 스크립트를 확인 해보도록 하자.
![]() [그림1] 공개된 POC 정보 다음은 취약한 함수부분의 소스코드 내용으로, 취약과 관련된 내용을 노란색 영역으로 표시해뒀다.
![]() [그림2] ChakraCore/lib/Runtime/Library/GlobalObject.cpp -1
[그림3] ChakraCore/lib/Runtime/Library/GlobalObject.cpp -2대응방안해당 벤더사에서 제공한 보안 권고문을 참고하여, 취약한 버전에 대해 패치를 진행 한다. https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-8641
참고https://www.exploit-db.com/exploits/42465/ |


[그림3] ChakraCore/lib/Runtime/Library/GlobalObject.cpp -2