Skip to content

Latest commit

 

History

History
59 lines (44 loc) · 4.37 KB

06-limits.md

File metadata and controls

59 lines (44 loc) · 4.37 KB

06 — 边界:能不能打"任意站点"

不能。 准确的说法是:能打的,是指纹库里有它那个构建(或同族几何)的站点。

上游与出处:每个被引用仓库的链接、当前许可状态、以及我们收录时的 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)。

版本下限:为什么这条链止步于 PHP 7.0(源码依据)

两处原语都是 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"目前是没有公开实证的说法。

已知的三个未闭合项

  1. 8.2 / 8.3 / 8.5 的几何:云机实测只到破坏(decoded=26B / 界内 195B),需要一次自标定;
  2. aarch64:s_off 已实测且与 x86-64 一致(chunk+0xf8398);仍缺 hsv_off——它的正确量法需要 读模块全局 PS(hash_serialize_verifier),而 --a2 那条"扫等于 S 的指针"的路径不成立(A2 时 假数组还没发出去)。识别阶段的 pDestructor 也不在窗口 +8 处 的窗口位置:判据 no-page-offset-match 说明伪造几何随架构移动, 而"取众数指针当符号"这个从上游继承的做法在 arm64 上不成立(已改用位置判据)。