PHP项目供应链安全审查指南
核心审查领域
依赖管理
# 检查Composer依赖 composer audit composer show --tree | grep -E "dev-master|dev-develop|alpha|beta"
典型风险点:
- 未锁定版本:
composer.json使用、范围导致自动升级 - 废弃包:使用截至审查日超过2年未更新的包
- 已知漏洞:通过
security-advisories数据库比对
安全审查清单
1 直接依赖检查
{
"require": {
"laravel/framework": "^9.0",
"vendor/package": "1.2.3"
}
}
- 检查
composer.lock是否在版本控制中 - 验证所有包来源(官方Packagist vs 第三方仓库)
- 审查
require-dev依赖在生产环境中的使用
2 代码质量审计
# PHPStan静态分析 vendor/bin/phpstan analyse --level=max # 敏感信息扫描 grep -rn "password\|secret\|api_key\|token" --include="*.php" --exclude="test/"
3 构建流程安全
- [ ] CI/CD管道是否验证签名(Codecov、GitHub Actions等)
- [ ] 是否使用
composer install --no-dev --optimize-autoloader - [ ] 是否缓存
composer.lock的hash值
常见威胁模型
| 攻击向量 | 案例 | 检测方法 |
|---|---|---|
| 依赖混淆 | 恶意包名与官方相似 | 核对vendor/目录签名 |
| 后门注入 | 通过PR注入eval()函数 | 代码审查+SAST工具 |
| 版本劫持 | 维护者账号被入侵 | 检查commit签名 |
| 供应链篡改 | 篡改Packagist源 | 使用--prefer-dist并验证hash |
自动化工具集成
# .github/workflows/audit.yml
on: [push]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: shivammathur/setup-php@v2
with:
php-version: 8.1
- run: composer install --no-dev
- run: composer audit --format=json | jq .
- uses: docker://aquasec/trivy:latest
with:
args: filesystem --scanners vuln .
合规要求(参考OWASP)
- SBOM生成:
composer licenses --format=json > sbom.json - 许可检查:禁止GPL v3(传播性)和WTFPL(无担保)
- 出口管制:检查包是否来自被制裁国家(伊朗、朝鲜等)
应急响应预案
# 发现漏洞时的紧急操作 composer require vendor/package:1.2.4 --no-update # 锁定已知安全版本 composer update --lock # 刷新锁定文件 git add composer.lock && git commit -m "[SECURITY] Fix CVE-2023-XXXX"
最终审查报告模板
## 依赖审计报告 ### 高风险项 - [ ] 包A (v1.0.0) 存在远程代码执行漏洞 (CVE-2023-XXXX) - [ ] 包B 使用 md5() 加密敏感数据 ### 中风险 - [ ] 8个包超过18个月未更新 - [ ] 未启用 PHP 8.1 的 `--repeat-pass` 安全检查 ### 改进建议 1. 实施 `pre-commit` 钩子自动运行 `composer audit` 2. 集成 `roave/security-advisories` 作为开发依赖 3. 每月执行 `composer update --prefer-lowest` 测试兼容性
持续监控方案
- Dependabot/ Renovate:自动创建安全更新PR
- Snyk.io:实时监控依赖漏洞
- PhpStorm X-Ray:IDE插件检查IDE的包依赖
特殊场景处理
私有包管理
composer config repositories.local path /path/to/package composer require your/package @dev # 明确标记为开发阶段
遗留系统(PHP 7.x)
{
"require": {
"php": "^7.4|^8.0",
"ext-mcrypt": "*" // 已废弃扩展
}
}
- 必须使用
--ignore-platform-reqs检查兼容性 - 建议迁移到
ext-sodium
最终审查应生成包含CVE编号、CVSS评分及修复步骤的详细报告,建议使用 composer audit --format=json | jq '.advisories | keys' 快速获取关键漏洞列表。
