CVE-2012-2836
Description
The exif_data_load_data function in exif-data.c in the EXIF Tag Parsing Library (aka libexif) before 0.6.21 allows remote attackers to cause a denial of service (out-of-bounds read) or possibly obtain sensitive information from process memory via crafted EXIF tags in an image.
해석하면 exif-data.c의 exif_data_load_data에서 발생하는 취약점으로 0.6.21 이전 버전의 EXIF Tag Parsing Library에서 발생한다. 이는 원격 공격자가 조작된 EXIF 태그를 통해 서비스 거부 상태를 유발하거나 프로세스 메모리에서 민감한 정보를 얻을 수 있는 가능성이 있다.(out-of-bounds read)
원인 분석
backtrace를 보면 알 수 있겠지만 exif_get_short의 첫 번째 인자가 잘못된 주소가 적혀있는 것을 알 수 있다
우선 exif_data_load_data 에서 exif_get_short의 인자를 보자
첫 번째 인자가 잘못된 곳을 가리키고 있다. 즉 d + 6 + offset의 값이 문제가 된다. 하지만 d는 data의 주소로 전달받은 값에서 값이 바뀌지 않았다. 아마도 offset에서 문제가 있을 것이다.
IFD0일 경우 offset을 구하는 과정이다. exif_get_long 함수가 쓰였다.
exif_get_long의 결과로 0xffffffff가 반환되었다. 이 부분이 문제가 되는 것 같다.
exif_get_long의 인자들이다. 첫 번째 인자가 가리키는 값이 이상한 것을 알 수 있다.
값이 FFFFFFFF로 이상한 값을 가지고 있는 것을 알 수 있다.
결론적으로 d + 6 + offset 에서 d의 size인 0x490보다 훨씬 큰 값이 offset으로 들어가면서 잘못된 주소를 참조함으로서 발생하는 문제임을 알 수 있다.
즉 IFD0의 값을 검증하지 않은 문제이다.
heap의 영역을 벗어난 곳을 참조하는 것을 알 수 있다.
patch
패치된 내용은 offset이 loader->bytes_read 보다 크면 return을 시킨다. 참고로 loader->bytes_read는 data의 전체 크기다.
<틀린 부분이 있다면 비난과 욕설을 해주세요>
'Fuzzing > CVE 분석' 카테고리의 다른 글
Fuzzing101 Exercise5 (1) | 2024.06.14 |
---|---|
Fuzzing101 Exercise4 (0) | 2024.05.10 |
Fuzzing101 Exercise3 (1) | 2024.04.19 |
Fuzzing101 Exercise2_1 (1) | 2024.02.26 |
Fuzzing101 Exercise1 (1) | 2024.01.16 |