作者lance70176 (十三夜)
看板Soft_Job
标题[心得] PHP 7.1 没人修?自己把修补编进 RPM
时间Sun Oct 25 04:12:30 2026
PHP2Shell 那篇有人问:sury 的回补套件只有 Debian/Ubuntu 能用,那 CentOS 怎麽办?
这篇就是答案。我们手上有二十几台 CentOS 7,跑的是 Webtatic 的 php71w 7.1.33。
Webtatic 早就不维护了,其中一套系统光评估升 PHP 8 就要 6 到 8 人天。
所以就自己打包了。网路上找不到有人针对 Webtatic 做过,顺手记下来。
先讲结论:
rpmbuild 大约 35 分钟,每台主机上线含检查 2 到 7 分钟,php-fpm 只停 6 秒左右。
修补从哪来
官方给旧版本的最小修补是 php-src 的 commit 712e60f9ed(Avoid state corruption
via bailout),但它没办法直接套到 7.1。
GitHub 上有几个社群做的 7.1 移植版,我拿四个去跟官方逐行比,最接近的是
Qsnh/php2shell-fixed,就用它。
sury 的 Debian patch 要先套他另一个 patch 才编得过,就没拿来用。
这个修补大概做了几件事:
- 记忆体爆掉时直接让 worker 结束(_exit),不再带着做到一半的状态跳回去继续跑
- 关掉 upload_progress
- 解析上传表单时只留必要的栏位,另外加了上传栏位数量上限
- 请求结束时把几个全域变数清乾净
我自己只改了一行。
移植版里把阵列初始容量设成 1,但 7.1 的杂凑表索引大小跟 7.3 以後不一样,设 1
会让记忆体对不齐。这是我请 Codex 看 diff 时它抓到的,我再回去翻 7.1 原始码确认,
改成 2:
#define array_init_singleton(arg) do { \
array_init(arg); \
- Z_ARRVAL_P(arg)->nTableSize = 1; \
+ Z_ARRVAL_P(arg)->nTableSize = 2; \
} while (0)
很小的一行,但没改的话是那种平常不会出事、哪天突然挂掉也查不出原因的坑。
怎麽编
用 podman 开一个 centos:7 容器,套件来源指到 vault 的封存 repo。
先验 Webtatic SRPM 的签章,再确认里面的原始码压缩档跟 php.net 官方的
sha256 一样。
spec 只改四个地方:Release 後面加 .php2shell1、加一行 Patch400、加一行
%patch400、补一笔 changelog。
接着:
yum-builddep -y --define 'dist .w7' SPECS/php71.spec
rpmbuild -bb --define "dist .w7" SPECS/php71.spec
第一次跑就死在 make: command not found,因为 yum-builddep 不会帮你装 make。补
装之後再跑,大约 35 分钟编完。Webtatic 的 spec 会编好几种 SAPI,所以不算快。
编出来 33 个 RPM,版本都是 7.1.33-1.w7.php2shell1。版本号排序比原本的 1.w7 新,
以後就算有人手滑 yum update,也不会被盖回去。
怎麽验
我没有拿网路上的攻击程式去打,自己写了一个不会造成破坏的检查,五项:
1. 送 3000 个栏位的上传表单,要被数量上限挡下
2. 正常上传 1MB 档案,要完整收到
3. 上传进度不能被写进 session
4. memory_limit 设 32M 让它爆掉,worker 要直接结束(没修补的版本只会报 Allowed
memory size,然後继续活着)
5. 爆掉之後的请求还是要正常回 200
结果:原版 2/5,修补版 5/5,降回原版又变 2/5。
另外跑了 php.net 官方测试,9,454 项:
原版 通过 8,751 失败 34
修补版 通过 8,742 失败 43
多出来的 9 个失败都是预期内的:8 个是上传进度相关的 session 测试,1 个是在检查
旧的记忆体错误讯息。移植版作者回报的也是同样这 9 个。
怎麽上线
每台的流程:
1. 先记下 rpm -qa,再从 Webtatic 的镜像把原本的套件抓回来,当作退路
2. yum --assumeno 预览,画面只能出现「Upgrade N Packages」
3. 停 php-fpm,yum upgrade 本机的 RPM,php-fpm -t 检查设定,再启动
php-fpm 停大约 6 秒,一台含检查 2 到 7 分钟。要退回就用 yum downgrade 装回刚刚
备份的原版。
踩到的两个坑
1. 升级会把 /var/lib/php/session(还有 wsdlcache、opcache)的拥有者重设成
root:apache 770。我们的 php-fpm 不是用 apache 跑的,结果有一台 session_start()
坏了大约 4 分钟,chown 回去才恢复。容器测试没抓到,因为测试环境刚好就是用
apache 跑。升级前先把拥有者记下来。
2. WorkerMan 这种常驻的 CLI 程式,会继续跑旧的执行档,看 /proc/<pid>/exe 会显
示 (deleted)。记得一起重启。
7.4 呢
7.4 我没有自己编。exception0x876 有一份 php74-el7,是拿 Remi 的 7.4.33 重新编,
带的是同一个官方 commit。我验过他签章的 SHA256SUMS,也把他的 SRPM 跟 Remi 官方
的逐档比过,才放心用。
最後讲清楚:这只补了这两个 CVE,7.1 还是 7.1。
它换到的是时间,让我们能好好规划真正的升级,不用在骇客敲门的时候硬升。
--
Key君:「哈哈哈哈哈哈,我就是後宫之王——杉崎键!
我是为了野心不惜伤害重要的人,
但同时为了让她幸福也不怕万苦的男人!」
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.54.124 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1792872763.A.47C.html
1F:嘘 ladyboy99: PO这什小AI文 语句顺一下好吗 10/25 14:40
2F:→ asdfghjklasd: 他会回你几百亿流水 10/25 15:09
3F:嘘 encorek22554: 都用AI了直接升不就好了 10/25 16:17
4F:→ angusyu: 你烦不烦,是要几篇 10/25 16:34
5F:推 TAKADO: 大家现在可以体会热门套件维护者审山积的AI PR的心情了吧 10/25 17:22
6F:推 chan15: 我升级了好几个专案,5.6 7.x 都有,先主要功能都写 unitt 10/26 06:24
7F:→ chan15: est,开始修改程式码,升级 8.4 後跑测试跟语法检查,然後 10/26 06:24
8F:→ chan15: playwright-cli e2e,其中一个是功能极大的商城花了三个 10/26 06:24
9F:→ chan15: 小时,其他都两小时内,全程 opus 5.5 10/26 06:24
10F:推 Romulus: 我怀疑这几篇连续发文是来钓黑名单的 10/26 10:33
11F:→ Obama19: 就是个怪咖 不知道为何台湾软体业一堆这种人 10/26 12:01
12F:→ superpandal: 浪费时间弄这些一点意思也没有 我很久前也是一直在 10/26 20:44
13F:→ superpandal: rpmbuld dpkg-buildpackage 打补钉 最後发现这两个编 10/26 20:45
14F:→ superpandal: 译打包工具链都很垃圾 只是流行 用这些系统就更新就 10/26 20:48
15F:→ superpandal: 好 不是给你方便自定义和打安全补钉用的 其实一堆管 10/26 20:50
16F:→ superpandal: 理工具都是这样 一堆web介面的管理工具更是 10/26 20:52
17F:→ superpandal: 现在的运维就是学一下基本的工具 然後拿流行开源出来 10/26 20:56
18F:→ superpandal: 的web介面工具用来管理 devops其实也差不多 有意思的 10/26 20:59
19F:→ superpandal: 真的很少 以前有创意有想法多了 10/26 21:01
20F:嘘 mirror0227: AI 10/28 11:37
21F:嘘 kevin9527: ai随便用就好的东西 意义不明的文章 10/28 20:55
22F:推 holishing: 理论上这种事情选对发行版事半功倍,那麽喜欢自己打包的 11/02 20:08
23F:→ holishing: 话,只有 dpkg/rpm, dpkg-buildpackage/rpmbuild 也不够 11/02 20:10
24F:→ holishing: (能chroot/容器化却不做只会搞死自己), 所以...还是问 11/02 20:11
25F:→ holishing: AI吧 XDDD 11/02 20:11
26F:推 holishing: 合理的答案不会像你文章里那种挖东墙补西墙,这一定有更 11/02 20:14
27F:→ holishing: 成熟的工具不会让流程那麽混乱容易出错 11/02 20:15