针对企业级 Linux 6 和 7 已停止维护(EOL)的 PHP 软件包——php-5.3.3(RHEL / CentOS / Oracle Linux 6)和 php-5.4.16(RHEL / CentOS / Oracle Linux / Scientific Linux 7)——CVE-2026-109618 和 CVE-2026-109619(“php2shell”)的非官方修复。
PHP 于 2026 年 10 月 21 日在 8.2.35、8.3.36、8.4.27 和 8.5.12 中修复了这两个漏洞,并发布了针对 7.4、8.0 和 8.1 的源码回溯补丁。PHP 5 没有任何发布,EL6 / EL7 的厂商也未提供修复。如果你必须让此类系统继续运行,本项目为你提供重新构建的厂商软件包,其中移植了官方的最小修复。
这不是来自 PHP、Red Hat 或 Oracle 的官方修复。 它在你能够迁移到受支持的 PHP 版本之前降低风险——请尽快完成迁移。 在 EL8 / EL9 / EL10 上,请改为安装厂商的更新(例如 ELSA/RHSA-2026:87080、87151、87079)。
php-5.4.16 /
php-5.3.3 发布压缩包,因为后者缺少厂商在同一代码中后续的安全修复
(例如 multipart 头部解析中的 CVE-2015-4024)。| 发行版 | 厂商软件包 | 本项目提供的修复软件包 |
|---|---|---|
| RHEL / CentOS / Oracle Linux / Scientific Linux 7 | php-5.4.16-48.el7 | php-5.4.16-48.el7.php2shell.1 |
| RHEL / CentOS / Oracle Linux 6 | php-5.3.3-50.el6_10 | php-5.3.3-50.el6_10.php2shell.1 |
发布版本后缀排序高于厂商软件包,且低于任何未来的厂商勘误
(例如 48.el7_9.1),因此如果官方修复出现,它会通过常规更新替换此修复。
可能比在 PHP 7 和 8 上轻,但目前尚无确定答案:
php 软件包评定为不受 CVE-2026-109619 影响(“不存在易受攻击的代码”),
并将 CVE-2026-109618 列为正在调查中
(CSAF VEX)。本项目仍然应用官方缓解措施:它移除了不安全的错误路径本身,而不仅仅是 已知的触发方式。
从 GitHub Pages 上已签名的 yum 仓库:
# EL7
curl -o /etc/yum.repos.d/php2shell-eol-backport.repo \
https://alvm.github.io/php2shell-eol-backport/php2shell-eol-backport-el7.repo
# EL6
curl -o /etc/yum.repos.d/php2shell-eol-backport.repo \
https://alvm.github.io/php2shell-eol-backport/php2shell-eol-backport-el6.repo
yum update 'php*' # confirm the signing key: fingerprint under "Signing key" below
service httpd restart # and php-fpm, if you use it
该仓库仅包含本项目的 PHP 软件包,且软件包与仓库元数据均已签名(gpgcheck=1、repo_gpgcheck=1)。RPM 包和源码 RPM 包也附在每个
release 中,并附带已签名的 SHA256SUMS;可使用
yum localinstall 进行安装。
./tools/check-patched.sh
它将每个已安装的 PHP 5 软件包列为 FIXED 或 VULNERABLE,检查 PHP CLI 是否运行修复后的代码,并在 httpd 或 php-fpm 于更新前启动且仍在运行旧代码时发出警告。
该修复遵循官方的最小化向后移植,优先考虑安全性而非优雅的错误处理:
memory_limit(或分配大小溢出)时,PHP 会向 stderr(Web 服务器错误日志)打印 Fatal error: ...,进程立即退出。Apache / php-fpm 会启动新的工作进程。关闭函数不会运行,该请求中上传的临时文件不会被删除——tmpwatch(EL6)和 systemd-tmpfiles(EL7)会随时间从 /tmp 中清理它们。Content-Disposition 和 Content-Type 头(PHP 仅使用这些),新的 php.ini 指令 max_multipart_body_parts 限制部分数量(默认 -1 = max_input_vars + max_file_uploads)。zend_mm_safe_error_ex),不更改任何现有 API 或 ABI,因此为供应商软件包构建的扩展可继续工作。这是对已公开攻击路径的最小化缓解措施,而非 PHP 5 的完整安全更新。
从供应商源码 RPM 构建(SHA-256 固定于 build/build.sh);spec 变更共 8 行(spec/*/php.spec.diff)。
将 PHP 测试套件(make test,在 RPM 构建期间运行)与同一供应商软件包的未修改重建版本进行比较。唯一新增的失败是预期内的:会话上传进度测试(功能已禁用)和 tests/lang/bug45392.phpt(致命错误消息现在以空行开头,与官方 7.4 补丁一致)。
| 测试数 | 失败:供应商 | 失败:已打补丁 | |
|---|---|---|---|
| EL7, PHP 5.4.16 | 12373 | 14 | 23(8 个上传进度 + bug45392) |
| EL6, PHP 5.3.3 | 11213 | 55 | 56(bug45392) |
确切计数在不同构建环境之间略有差异:在 GitHub runner 上,两个 SPL 文件所有者测试(DirectoryIterator_getOwner/getGroup_basic)也会失败,且 time_sleep_until_basic 对时序敏感。它们均未涉及补丁更改的代码。
将 PHP 5.4 补丁与针对 Amazon Linux 2 的 php-5.4.16 的同一修复的独立移植版本进行了比较:核心变更完全相同。差异列于 docs/ALTERNATIVES.md。
未编写或使用任何漏洞利用代码。请自行对照上游提交审查该补丁。
有关供应商状态、项目列表和比较,请参见 docs/ALTERNATIVES.md。
需要 Docker,每次构建约需 3 GB 可用磁盘空间。
build/build.sh el7 # results in _build/el7/RPMS
build/build.sh el6 # results in _build/el6/RPMS
脚本会下载厂商源码 RPM,校验其 SHA-256,并在一个固定版本的 Oracle Linux 容器中使用本仓库的 spec 文件和补丁重新构建。
软件包和发布标签使用以下密钥签名:
pub rsa4096/80797C97A561BC94 2026-10-22 [SC] [expires: 2029-10-21]
2757 B60F D23D ED25 021B BE37 8079 7C97 A561 BC94
uid Oleksii Molchanov (php2shell-eol-backport signing key) <[email protected]>
密钥位于此仓库(RPM-GPG-KEY-php2shell-eol-backport)以及 keyserver.ubuntu.com 上。
patches/el7, patches/el6 the fix, as a patch against the vendor source tree
spec/el7, spec/el6 vendor spec files with the patch added, and their diffs
build/ reproducible container build
tools/check-patched.sh check an installed system
docs/ALTERNATIVES.md vendor status, other projects, comparison
SECURITY.md how to report a security problem
如有缺陷,请提交 issue。若补丁本身存在安全问题,请参阅 SECURITY.md。
LICENSE.PHP),与其所修改的代码一致。构建脚本与工具:MIT(LICENSE)。Spec 文件源自 Red Hat / Fedora 打包(MIT)。