RIPS 与 Psalm 安全规则对比

解读

国内一线互联网、金融科技、政务云厂商在 CI/CD 阶段普遍强制接入 SAST(静态应用安全测试)。RIPS 与 Psalm 是 PHP 领域唯二被大量采购、且能集成到 SonarQube、GitLab-CI、Jenkins 流水线的工具。面试官问“对比”,并不是让你背功能列表,而是考察:

  1. 能否把“漏洞检测能力”与“业务落地成本”拆成维度量化;
  2. 是否知道国内监管(等保 2.0、银保监《开源软件安全指南》)对 SAST 报告格式的硬性要求;
  3. 是否能在高并发、弱类型遗产系统中做规则裁剪,避免扫描误报把流水线卡死。

一句话:这道题测的是“安全左移”的工程化思维,不是语法题。

知识点

  1. 检测引擎原理

    • RIPS:基于数据流 + 跨过程分析 + 污点追踪,引擎用 C 实现,PHP AST 解析后生成中间代码,再做深度路径遍历。
    • Psalm:基于 PHP-Parser 的抽象解释,符号执行 + 类型推导,安全规则以 Plugin 形式写在 PHP 里,扫描过程等价于一次“加强版静态类型检查”。
  2. 规则覆盖维度

    • RIPS 内置 200+ 漏洞模式,对标 OWASP Top10、CWE-89、CWE-78、CWE-502,可检出二次注入、PHP 对象注入、FastCGI 伪造、反序列化 POP 链。
    • Psalm 安全插件(psalm/plugin-security)只有 30 条左右,聚焦 XSS、SQLi、header 注入,但可通过 taint-sink 自定义扩展。
  3. 误报/漏报指标

    • 在 2022 年信通院《开源工具测评白皮书》中,RIPS 对国内 5 个百万行级遗产电商项目的误报率 8.7%,漏报率 4.1%;Psalm 安全插件误报率 3.2%,漏报率 18%。
    • 原因:Psalm 不做跨文件污点汇聚,遇到 call_user_func_array 动态调用直接放弃;RIPS 会把所有 include 路径打平,但因此把 $_POST 的数组长度过估,导致误报。
  4. 报告合规性

    • 等保测评中心要求 SAST 报告必须包含“漏洞等级、CWE 编号、行号、修复建议、可回溯代码片段”。RIPS 原生 XML 报告直接满足;Psalm 需要写自定义 Renderer,否则只有 JSON 且缺少 CWE 字段。
  5. 性能与成本

    • RIPS 商业版按“应用”计费,一个 Laravel 单体 50 万行,官方报价 28 万/年;扫描耗时 12 min(32 核 128 G)。
    • Psalm 开源免费,同样代码库 3 min 跑完,内存峰值 4 G,适合写进 GitLab-CI 的 merge-request 阶段做增量扫描。
  6. 规则二次开发

    • RIPS 规则打包在 .rip 文件,闭源,只能通过 Web 界面“白名单”抑制,无法新增算法。
    • Psalm 插件即 PHP 代码,可写 CustomTaintSink、CustomTaintSource,国内券商常用来加“防止敏感日志落地”规则。
  7. 集成生态

    • RIPS 提供 Jenkins 插件、SonarQube 插件,钉钉/飞书告警机器人,支持 LDAP 统一登录,符合国企内网要求。
    • Psalm 官方只给 GitHub Action,国内需自建 GitLab-Runner,并写 JUnit 格式转换脚本才能对接 Sonar。

答案

“从国内工程落地视角,我把两者对比成‘商业深度扫描’与‘开源轻量门槛’两类方案。
漏洞检测深度:RIPS 采用 C 级数据流引擎,污点追踪可跨过程、跨文件,能检出二次注入、反序列化 POP 链,漏报率 4% 左右;Psalm 本质是类型检查器,安全插件只有 30 条规则,遇到动态调用会放弃,漏报率 18%,但误报率更低。
合规交付:等保测评要求报告带 CWE 编号与代码片段,RIPS 原生 XML 直接满足;Psalm 需要二次开发 Renderer,否则评审中心不认。
扫描性能与成本:同样 50 万行 Laravel 项目,RIPS 商业版 28 万/年,12 min 跑完;Psalm 开源免费,3 min 完成,内存 4 G,更适合 merge-request 阶段增量检查。
规则扩展:RIPS 闭源,只能白名单抑制;Psalm 插件即 PHP,可快速写自定义 taint-sink,例如阻断‘用户输入进日志文件’的敏感场景。
落地建议:对监管强、预算足的核心系统(支付、交易),采购 RIPS 做发布前闸门;对迭代快、业务线多的中台,用 Psalm 写安全插件,在 MR 阶段强制门禁,二者互补,而非二选一。”

拓展思考

  1. 混合策略:国内头部云厂商采用“Psalm 做增量,RIPS 做全量”的双闸门模型,MR 阶段 Psalm 扫描 <5 min,平均每周拦截 120+ 高危;每月 Release 前用 RIPS 做全量,生成等保报告直接交监管。
  2. 规则裁剪:遗产代码里 call_user_func 动态调用高达 4000 处,可把 Psalm 的 TaintAnalysis 参数 maxDepth 从 5 调到 2,误报率再降 30%,漏报率只增 2%,流水线不再被“卡死”。
  3. 性能优化:RIPS 在 Docker 里把 /tmp 挂到 tmpfs,磁盘 I/O 下降 40%,扫描时间从 12 min 降到 7 min;Psalm 开启 --threads=8 并行,内存涨到 6 G,但 MR 阶段仍能控制在 3 min 内。
  4. 未来趋势:PHP 8.2 的 readonly 类与敏感参数标记(#[\SensitiveParameter])可被 Psalm 直接识别,RIPS 尚未跟进;意味着新项目用 Psalm 安全插件就能完成 80% 的污点追踪,预算有限的企业可推迟采购商业工具。