CI/CD 中必须使用 composer install --no-scripts --no-plugins --no-interaction 完全禁用脚本与插件执行,配合可信镜像源、vendor 目录清理、严格权限控制,四者缺一不可。

CI/CD 中如何防止 composer install 自动执行恶意脚本
默认情况下,composer install 会无条件运行 post-install-cmd、pre-autoload-dump 等钩子——只要 composer.json 里写了,它就执行,不问来源、不看签名。这不是漏洞,是设计行为。
自动化测试环境(尤其是 CI)必须切断这个执行链,否则一次拉取被投毒的包,就等于在构建机上直接执行攻击者代码。
-
composer install --no-scripts --no-plugins --no-interaction是唯一官方支持的禁用方式;漏掉任一参数都可能留后门 -
--no-scripts关闭所有scripts字段定义的命令,包括混淆过的php -r "eval(base64_decode(...))" -
--no-plugins阻止插件加载,避免像symfony/flex这类插件动态注册额外钩子绕过--no-scripts - 参数顺序不能错:
composer --no-scripts install无效,必须是composer install --no-scripts
镜像源配置如何影响安全测试结果的可信度
如果 CI 使用的是未经审核的镜像源(比如自建但未开启 GPG 校验的 Satis),那么 composer install 下载的包可能早已被中间人替换,而 composer.lock 中的 shasum 仍显示“校验通过”——因为 lock 文件记录的是镜像源返回的哈希,不是原始 Packagist 的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确保镜像源本身启用
security.signature-verification true,且上游是https://packagist.org - 禁止在 CI 中使用
repositories动态覆盖源地址,尤其警惕"type": "package"手动定义 dist URL 的写法 - 若必须用私有镜像,应在镜像同步环节强制校验原始包签名,并拒绝无签名或签名失效的版本
- 运行
composer show --security,确认输出含Signature verification: enabled和Secure HTTP: enabled
为什么 composer audit 不能替代运行时防护
composer audit 只查已知 CVE,对 Laravel-Lang 那种篡改 Git 标签植入的 0day 完全无感——它不解析 PHP 代码、不展开变量、不执行任何逻辑。
- 它依赖 FriendsOfPHP Security Advisories 数据库,新攻击手法曝光前,扫描结果永远是 “No security vulnerabilities found”
- 即使报告了 CVE,也只说明包“曾被披露有问题”,不代表当前安装版本就安全(比如你锁的是 v1.2.3,而 CVE 修复在 v1.2.5,但 lock 文件没更新)
- 真正起作用的是组合:用
--no-scripts --no-plugins拦住执行,用verify-checksums --strict复核 vendor 文件完整性,再用magento/composer-dependency-version-audit-plugin防混淆攻击 - CI 中应把
composer audit --no-dev当作辅助项,而非防线核心
自动清理与权限控制常被忽略的细节
CI 构建机反复复用 vendor/ 目录时,残留文件可能绕过所有校验——比如有人手动往 vendor/autoload.php 插入 file_get_contents("http://..."),而 composer install 不会覆盖它。
- 每次 CI 运行前,必须清空
vendor/并删除composer.lock缓存(composer clear-cache),否则--dry-run校验可能跳过部分包 -
chmod -R 700 vendor/没用,真正要修的是属主:sudo chown -R $USER:$USER vendor/,否则 root 写入的文件普通用户无法覆盖 -
~/.composer/auth.json权限必须为600,否则 CI 日志可能泄露私有源凭据;CI 环境应避免全局配置,改用--repository-url临时指定 - Docker 构建中务必设
RUN umask 0022,否则composer install生成的文件权限不可控

















