composer audit 仅检测已知cve,无法识别非标代码库;需通过自定义插件监听pre_package_install事件实现多维校验,或用conflict/replace等声明式方式排除风险包。

composer audit 只查 CVE,不拦非标代码库
别指望 composer audit 能识别“非标”包——它只比对 FriendsOfPHP Security Advisories 数据库里的已知 CVE 编号,比如 CVE-2024-12345。一个包哪怕作者邮箱是 admin@gmail.com、autoload 里写了 "files": ["./backdoor.php"]、或者 GitHub stars 突然从 2 跳到 2000,composer audit 完全无感。
它不扫描 PHP 代码、不解析注释、不调用 GitHub API、也不校验签名状态。运行 composer audit --format=json 输出里永远不会有 “non-standard author” 或 “suspicious autoload” 这类字段。
真要拦截,得靠自定义插件监听 PRE_PACKAGE_INSTALL
Composer 2.5+ 提供了 PackageEvents::PRE_PACKAGE_INSTALL 事件,这是唯一能在包解压前介入的钩子。你得写个插件,在这个事件里检查每个待安装包的多维信号:
- 读取
$package->getMaintainers(),筛掉邮箱不在@your-company.com或含+admin的 - 解析
$package->getAutoload()['files'],匹配/shell\.php|eval\(|system\(/i - 检查
$package->getDist()['signature']是否为空(未签名包可设为高风险) - 调 GitHub API 查
stargazers_count,缓存结果避免 CI 卡住
匹配任一规则就抛 RuntimeException,Composer 会立刻中断安装流程。注意:v2.4 及以下版本不稳,得退回到监听 pre-install-cmd + 手动解析命令行参数。
repositories.exclude 和 conflict 字段不是黑名单,是声明式排除
repositories 里配 "exclude": ["malicious/package"] 不生效——Composer 没这字段。真正起作用的是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"conflict": {"malicious/package": "*"}:解析阶段报错,提示Your requirements could not be resolved -
"replace": {"malicious/package": "*"}:跳过安装,日志里显示skipping package malicious/package because it is replaced - 私有仓库里定义同名空包(
"type": "package"+ 内联"packages"),让 Composer 认为该包“已存在但不可安装”
这些都在 composer install 前完成判断,但无法动态响应新出现的恶意包——必须提前写死在 composer.json 里。
roave/security-advisories 只堵 CVE,不防混淆攻击
装了 roave/security-advisories,不代表能防“私有包被公共同名高版本覆盖”。它本质是一堆 conflict 规则,比如 "monolog/monolog": "=2.0.0 ,只管已知漏洞版本。
真正防混淆攻击的是 magento/composer-dependency-version-audit-plugin:它在 composer install 时对比私有源和 Packagist 上同名包的最高版本号,一旦发现公共版 > 私有版,立刻中断并输出明确错误。但它不查代码、不看作者、也不管 CVE。
三者必须共存:audit 查已知漏洞,allow-plugins 白名单控插件加载,magento/composer-dependency-version-audit-plugin 防版本覆盖——少一个,防线就有缺口。最易被忽略的是 allow-plugins 白名单没配全,导致某个二级依赖悄悄带进恶意插件,直接绕过所有审计逻辑。










