聚焦源代码安全,网罗国内外最新资讯!
专栏·供应链安全
数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的根本性、基础性问题。
随着软件产业的快速发展,软件供应链也越发复杂多元,复杂的软件供应链会引入一系列的安全问题,导致信息系统的整体安全防护难度越来越大。近年来,针对软件供应链的安全攻击事件一直呈快速增长态势,造成的危害也越来越严重。
为此,我们推出“供应链安全”栏目。本栏目汇聚供应链安全资讯,分析供应链安全风险,提供缓解建议,为供应链安全保驾护航。
注:以往发布的部分供应链安全相关内容,请见文末“推荐阅读”部分。
前言
北京时间3月29日,php官方发布其 git.php.net 服务器遭攻陷,攻击者仿冒PHP编程语言作者Rasmus lerdorf和软件开发者 Nikita Popov 的账号发起了两次恶意代码提交,并留下了远程代码执行后门。本文将从技术角度分析这起事件,并探讨它所折射出的软件供应链安全问题。
源码分析
拉取被植入恶意代码版本的源码后,定位到函数php_zlib_output_compression_start() 。
攻击者仿冒开发者身份,将恶意后门代码插入于 zlib 扩展的php_zlib_output_compression_start() 函数中。
触发 php_zlib_output_compression_start() 函数后,会进行两个判断:
第一个判断全局变量TRACK_VARS_SERVER 类型是否为ARRAY,以及参数_SERVER是否存在。
在第二个判断中,zend_hash_str_find() 把第二个参数作为 KEY值,在第一个数组参数中查找并返回一个指针结果。
当同时满足这两个判断时,将enc参数转换为字符串类型:
通过Z_STRVAL_P(enc)引用指针地址,使用strstr()函数判断字串 zerodium 是否存在。
当攻击者留下的请求判断被通过后,就可以进入代码执行函数:
Zend_eval_string() 函数通过第一个参数以指针移动8位跳过“zerodium”字符,引用“zerodium”后面的代码内容进行命令执行,第三个参数作为执行描述进行标识。
可以在http头部构造类似的payload:
User-Agent:zerodiumsystem(“touch /tmp/php-evil/evil”);
触发此代码执行后门。
zlib_output_compression功能会根据用户请求对页面返回信息进行压缩,以提高反应速度,默认情况下为关闭状态。
修改配置信息后,