用途
php-filesystem-audit 用于分析 PHP 项目中对文件系统的关键操作,特别关注这些操作如何与路径校验/归一化失败(目录遍历、basePath 缺失)、落点写入/读取/包含链路、写后触发(可执行性、可包含性)以及竞争条件(TOCTOU)发生联动,从而提升真实利用可能性。
主要能力
覆盖范围包括:
-
创建/目录操作:mkdir($path, $mode, $recursive)、rmdir($path)、touch($path)、tmpfile()/tempnam(),以及框架封装的目录创建(如 Storage::put/ensureDirectory 的底层封装,若识别得到)。
-
权限/所有权变更(常用于提权链或绕过执行策略):chmod/chown/chgrp、umask。
-
链接与重定向落点(常见 symlink/hardlink 绕过):symlink($target, $link)、link($target, $link)、readlink($path)。
-
删除与清理(结合 TOCTOU 或覆盖链):unlink($path)、unlink/rename 变体删除、rename($src, $dest)(用于落点变更时需特别关注 TOCTOU)、copy/move 变体(当作为“落点准备步骤”出现)。
-
路径竞态与 TOCTOU(必须单独审计):对“检查-使用分离”的代码模式给出判定,包括是否存在 if (realpath/canonicalize + 前缀校验) 后又在某个分支/异常处理里重复 join/open/write(路径可能变化);是否存在先判断可写/再写入、先检查再执行文件操作;是否存在符号链接解析/不一致解析(检查时与实际打开时 resolved path 不一致)。
使用方式
每条发现必须包含:位置证据(文件路径与函数/调用点,尽量带行号;找不到行号则标注待定位)、操作类型(创建/权限/链接/删除/重命名/拷贝等)、路径控制来源(路径参数来自 GET/POST/SESSION/配置还是硬编码)、跟链路的关系(必须至少选一条说明:与 WRITE/UPLOAD 落点可执行性或可包含性关联;与 FILE(读取/包含)或 ARCHIVE(解压落点)关联;与鉴权/资源归属关联;与 TOCTOU 竞态关联)、可利用性判断(✅ 已确认 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖)。
可触发性约束:仅对“能够被具体 HTTP 路由/入口触发”的文件系统操作生成漏洞条目,并且必须能提供真实路由与完整参数用于 PoC。若无法定位具体路由入口(如纯后台任务/定时任务/命令行工具且入口不可追踪),该 FS 风险只能在报告中标注“未能定位入口,跳过条目生成(待人工补齐触发路径)”,不得仍按漏洞条目模板强行输出不可执行 PoC。
报告输出到:{output_path}/vuln_audit/fs_{timestamp}.md。漏洞编号规范:{C/H/M/L}-FS-{序号},详见 shared/SEVERITY_RATING.md。
漏洞条目模板(强制)包含:严重等级、可达性 (R)、影响范围 (I)、利用复杂度 (C)、可利用性、位置;数据流链(Source → Path Control → FS Operation → Chain Influence);可利用前置条件(鉴权要求、输入可控性、触发条件、链路承接);验证 PoC(强制:可观测验证框架,含 HTTP 请求与观察点);证据引用(强制:来自源码片段,至少三段);建议修复;代码搜索语句(强制)。
代码搜索语句示例:
rg -n "(mkdir\(|rmdir\(|touch\(|tmpfile\(|tempnam\(|chmod\(|chown\(|chgrp\(|symlink\(|readlink\(|link\(|unlink\(|rename\(|copy\(|symlink\())" . rg -n "(realpath\(|canonicalize\(|dirname\(|basename\(|baseDir|dest(path)?|target(path)?)" .
适用场景
适用于对 PHP 项目进行安全审计,尤其是需要评估文件系统操作在路径校验绕过、写入链利用、权限提升、符号链接绕过及 TOCTOU 竞态条件中的实际可利用性时。
限制
该工具不替代 FILE/UPLOAD/WRITE 等 sink 子审计,仅提供“可利用性增强证据”。仅对能够被具体 HTTP 路由/入口触发的文件系统操作生成漏洞条目;无法定位入口的风险需人工补齐触发路径。
修复建议要点
路径校验与实际使用必须绑定到同一个 resolved target:realpath/canonicalize 后用同一个值进行 open/rename/write(避免 TOCTOU)。禁止对可被攻击者影响的路径进行“先校验后使用”的拆分;若必须拆分,应在同一系统调用/同一文件描述符上下文内完成。对 symlink/hardlink:在目标落点启用防链接策略(平台支持时禁用跟随符号链接,或基于 inode/文件描述符校验一致性)。权限变更必须最小化并确保不可由用户影响;避免攻击者能控制 chmod/chown 的路径。