오늘은 Month of PHP Bugs 에서 1개의 취약점을 발표했습니다. 취약점의 리스트는 아래 그림과 같습니다.

( 7일차 취약점 리스트 )
14번째 취약점은 PHP 5에 추가된 문자열 비교 함수인 substr_compare() 함수의 취약점입니다. 해당 함수에 integer overflow 취약점이 있다고 합니다.
이 함수의 내부 소스는 2차례에 걸쳐 나름의 사용자 입력값 검증을 시도하는데 직접 소스를 보시면...
두번째 검증 루틴에서 문자열 비교 offset 값과 길이가 버퍼의 길이 s1_len 를 못넘어서도록 검증하는 것을 보실 수 있습니다. 그러나 C 에서 integer 값 두 개를 더하다보면 오버플로우가 되서 음수가 될 수 있죠? 음수가 되면 당연히 s1_len 값보다 작으니까 검증 루틴을 우회해서 이후의 코드를 정상적으로 실행하게 됩니다. 이를 integer overflow 라고 하는데... 취약점 검증용 도구(Proof of Concept)의 소스를 직접 살펴보시면 매우 간단히 공격에 성공하는 것을 보실 수 있습니다.
해당 루틴의 전체 소스를 못보았습니다만lough rough 하게 생각해보면
처럼 검증했어야 하는게 아닌가 싶네요.
해당 취약점을 이용해 악의적인 해커가 heap 상에 기록한 민감한 데이터를 열람할 수 있으며, 추후 발표할 취약점은 이 취약점을 이용해서 임의의 명령어를 실행할 수 있었다고 하네요.

( PHP 6.0-dev 3월 7일자 버전에서 취약점 확인한 모습 )
현재 최신 버전인 5.2.1 을 포함한 PHP 5.x 가 전부 취약하다고 하고, 위의 그림에서 보시듯이 6.0 개발 버전 역시 예외가 아닙니다.
이 취약점은 조만간 패치가 나와야 한다고 봅니다만, PHP 개발팀이 어떻게 움직여줄지...

( 7일차 취약점 리스트 )
14번째 취약점은 PHP 5에 추가된 문자열 비교 함수인 substr_compare() 함수의 취약점입니다. 해당 함수에 integer overflow 취약점이 있다고 합니다.
이 함수의 내부 소스는 2차례에 걸쳐 나름의 사용자 입력값 검증을 시도하는데 직접 소스를 보시면...
if (offset < 0) {
offset = s1_len + offset;
offset = (offset < 0) ? 0 : offset;
}
if ((offset + len) > s1_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The start position cannot exceed ...");
RETURN_FALSE;
}
두번째 검증 루틴에서 문자열 비교 offset 값과 길이가 버퍼의 길이 s1_len 를 못넘어서도록 검증하는 것을 보실 수 있습니다. 그러나 C 에서 integer 값 두 개를 더하다보면 오버플로우가 되서 음수가 될 수 있죠? 음수가 되면 당연히 s1_len 값보다 작으니까 검증 루틴을 우회해서 이후의 코드를 정상적으로 실행하게 됩니다. 이를 integer overflow 라고 하는데... 취약점 검증용 도구(Proof of Concept)의 소스를 직접 살펴보시면 매우 간단히 공격에 성공하는 것을 보실 수 있습니다.
해당 루틴의 전체 소스를 못보았습니다만
if ((offset + len) > s1_len || (offset + len) <= 0 ) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The start position cannot exceed ...");
RETURN_FALSE;
}
처럼 검증했어야 하는게 아닌가 싶네요.
해당 취약점을 이용해 악의적인 해커가 heap 상에 기록한 민감한 데이터를 열람할 수 있으며, 추후 발표할 취약점은 이 취약점을 이용해서 임의의 명령어를 실행할 수 있었다고 하네요.

( PHP 6.0-dev 3월 7일자 버전에서 취약점 확인한 모습 )
현재 최신 버전인 5.2.1 을 포함한 PHP 5.x 가 전부 취약하다고 하고, 위의 그림에서 보시듯이 6.0 개발 버전 역시 예외가 아닙니다.
이 취약점은 조만간 패치가 나와야 한다고 봅니다만, PHP 개발팀이 어떻게 움직여줄지...

덧글
선환 2007/03/08 01:22 # 삭제 답글
본문중에 lough 가 아니고 rough 같습니다.좋은 자료 감사합니다. ^^
헐랭이 2007/03/08 08:46 # 답글
좋은 지적 감사합니다. *^^*