不能。 准确的说法是:能打的,是指纹库里有它那个构建(或同族几何)的站点。
上游与出处:每个被引用仓库的链接、当前许可状态、以及我们收录时的 commit,统一列在 NOTICE.md。
| 条件 | 不满足会怎样 | 能否自动化 |
|---|---|---|
| 未修复版本 | 链子在预初始化阶段就断(实测 8.4.27:OOM 不再发生) | ✅ 被动 + 行为 |
| mod_php + 持久 worker | LSAPI 首请求即退出;FPM 需要另一条时序 | ✅ 行为判定 |
memory_limit 有限且低于 post_max_size |
生产者达不到 OOM ⇒ 无状态发布 | ✅ in-band 文本直接读出限额 |
| 同一 worker 收到生产与消费 | 命中率 ~1/N(N 个 worker) | 🟡 只能靠重复 + 会话粘性 |
| 前置放行 multipart / 无 CL 的 chunked | 生产者被吞 ⇒ 整链不成立 | ✅ 预检阶段可判 |
| 符号偏移 | 跳错地址 ⇒ 破坏而非执行 | ✅ 从目标 .so 读(stripped 也行) |
布局常量(几何、s_off、hsv_off) |
写错位置 ⇒ 破坏而非执行 | 🟠 需要"该族有人量过"或现场 --measure-layout |
| 证据通道(docroot 可写 / 出网) | 打中了也证明不了 | 🟡 支持三种通道,但可写路径要试 |
| 判据 | 含义 | 你该做什么 |
|---|---|---|
leaked-our-own-flood |
越界读发生了,但内容是我们的洪水 ⇒ 生产者状态没形成 | 重跑(换生成期),与 .so 无关 |
no-page-offset-match |
窗口里有指针但没有一个页偏移与候选 dtor 相符 | 那个 .so 不是目标的构建 |
PROFILE_INCOMPLETE |
泄露自证通过,但缺 s_off/hsv_off |
结论是"存在、未利用";跑 --auto-calibrate 或补 profile |
厂商自己的口径就是"能否利用取决于 PHP 版本与 SAPI"、"可靠性取决于构建、扩展、 前置行为与分配器布局"。本仓库把这句话变成可核对的形式:布局常量只能实测, 而实测需要一份该构建的克隆——所以覆盖率的唯一来源是有人量过(我们,或者上游公布的 profile)。
两处原语都是 7.0+ 的形状,不是"我们没测过 5.x":
| 原语 | 7.0+ | 5.4 - 5.6 |
|---|---|---|
| 越界读 | php_url_encode(ZSTR_VAL(PS(id)), ZSTR_LEN(PS(id))) —— 长度是已释放分配里的头部字段,可伪造(一发读出 4KB–800KB) |
php_url_encode(PS(id), strlen(PS(id))) —— 裸 char*,长度不可伪造,读到下一个 NUL 为止 |
| 终端假数组 | packed zend_array:nTableMask = -nTableSize、arData 连续桶(zend_types.h) |
arBuckets 指针数组 + pListHead/pListTail + nApplyCount + 链式 pNext(zend_hash.h),同一份载荷描述的是另一种结构 |
而漏洞面本身从 5.4.0 就在(5.6 的 php_session_rfc1867_callback 同样在
MULTIPART_EVENT_FORMDATA 里无条件接受 body 的 PHPSESSID)。所以工具对 PHP < 7.0
给 UNSUPPORTED_CHAIN(退出码 6):漏洞存在、本链不适用 —— 与"未受影响"必须分开,
后者会被运维读成"可以不打补丁"。
老版本上目前只有应用层链可用(session 文件 + LFI、serialize_handler 错配 + __destruct)。
需要留意的是这些链的前提在公开演示里多为实验室内自建(自造的 LFI 端点、自造的两个
.user.ini、自定义的 Evil 类、use_only_cookies=0、cleanup=Off、pm.max_children=1),
所以"通杀 5.x"目前是没有公开实证的说法。
- 8.2 / 8.3 / 8.5 的几何:云机实测只到破坏(
decoded=26B/ 界内 195B),需要一次自标定; - aarch64:
s_off已实测且与 x86-64 一致(chunk+0xf8398);仍缺hsv_off——它的正确量法需要 读模块全局PS(hash_serialize_verifier),而--a2那条"扫等于 S 的指针"的路径不成立(A2 时 假数组还没发出去)。识别阶段的pDestructor也不在窗口 +8 处 的窗口位置:判据no-page-offset-match说明伪造几何随架构移动, 而"取众数指针当符号"这个从上游继承的做法在 arm64 上不成立(已改用位置判据)。