netresearch/composer-audit-responsibility
GitHub: netresearch/composer-audit-responsibility
这是一个 Composer 插件,通过责任传播机制自动区分框架传递依赖和开发者直接依赖的安全责任,防止上游漏洞告警阻断库或扩展的 CI 流程,同时保持审计报告的完整性。
Stars: 1 | Forks: 1
# Composer Audit 责任
[](https://github.com/netresearch/composer-audit-responsibility/actions/workflows/ci.yml)
[](https://packagist.org/packages/netresearch/composer-audit-responsibility)
[](https://packagist.org/packages/netresearch/composer-audit-responsibility)
一个为安全审计实现**责任传播**的 Composer 插件。
阻止上游/框架传递依赖建议阻止您的库、扩展或插件 CI —— 同时在审计报告中保持它们的可见性。
## 问题所在
自 Composer 2.9 起,[`block-insecure`](https://getcomposer.org/doc/06-config.md#block-insecure) 默认为 `true`,这会在 `composer update`、`require` 或 `remove`(以及没有 lock 文件触发依赖解析的 `install`)期间阻止任何带有安全建议的包版本。对于库/扩展开发者,这意味着:
- 您的 **TYPO3 extension** 需要 `typo3/cms-core` 以保持兼容性
- `typo3/cms-core` 传递依赖于 `firebase/php-jwt`
- 当 `firebase/php-jwt` 收到安全建议时,**您的 CI 会中断**
- 您对此**没有控制权** —— 您并没有选择 `firebase/php-jwt`
- **TYPO3 团队**负责更新其框架依赖
这影响着每一个框架生态系统:Drupal modules、Symfony bundles、Laravel packages、WordPress plugins、Magento modules、Shopware plugins 等等。
### 目前的做法(以及为什么不好)
**1. 完全禁用安全检查**
```
COMPOSER_NO_SECURITY_BLOCKING=1 composer update
```
这会屏蔽**所有**建议 —— 包括您自己依赖中*可以*且*应该*修复的建议。您彻底失去了安全网。您选择的包中的真正漏洞会被忽视。
**2. 手动维护 `config.audit.ignore`**
```
{
"config": {
"audit": {
"ignore": {
"PKSA-y2cr-5h3j-g3ys": "firebase/php-jwt - framework dep",
"CVE-2024-XXXXX": "some-other/lib - framework dep"
}
}
}
}
```
每一个新的建议都需要向每个受影响的 repo 提交手动提交。面对数十个扩展和频繁的建议,这变成了持续的维护负担。更糟糕的是:过时的忽略条目会累积,而且没人审查它们是否仍然需要 —— 或者它们现在是否隐藏了您*确实*能控制的包中的漏洞。
这两种方法都有一个共同的根本缺陷:它们将安全视为全有或全无,而真正的问题是**谁对哪个依赖负责**。
## 解决方案:责任传播
安全责任遵循依赖链:
| 角色 | 负责对象 |
|------|----------------|
| **Extension/Plugin 开发者** | 他们的直接依赖 |
| **Framework 团队** | 框架的传递依赖 |
| **Application/Project 组装者** | 所有内容(他们交付最终产品) |
此插件会自动检测您的框架依赖,并防止其传递安全建议阻止依赖解析(`composer update/require/remove`)。建议仍然会被**报告** —— 只是不会**阻止**。
## 安装
此插件必须**全局**安装 —— 它需要在您项目的依赖被解析之前加载。
```
composer global config allow-plugins.netresearch/composer-audit-responsibility true
composer global require netresearch/composer-audit-responsibility
```
### CI 设置
在 PHP 设置之后、`composer install` 之前添加此步骤:
```
- name: Install audit-responsibility plugin
run: |
composer global config allow-plugins.netresearch/composer-audit-responsibility true
composer global require netresearch/composer-audit-responsibility --no-interaction
```
无需更改您项目的 `composer.json`。
## 配置
### 自动检测
插件从 `composer.json` 的 `type` 字段自动检测您的框架:
| Package 类型 | 检测到的 Framework |
|---|---|
| `typo3-cms-extension` | `typo3/cms-core` |
| `symfony-bundle` | `symfony/framework-bundle`, `symfony/http-kernel` |
| `drupal-module` | `drupal/core` |
| `wordpress-plugin` | `johnpbloch/wordpress-core`, `roots/wordpress` |
| `magento2-module` | `magento/framework` |
| `shopware-platform-plugin` | `shopware/core` |
| `contao-bundle` | `contao/core-bundle` |
| `cakephp-plugin` | `cakephp/cakephp` |
| `neos-plugin` | `neos/neos` |
| `flow-package` | `neos/flow` |
| `oroplatform-bundle` | `oro/platform` |
| `silverstripe-vendormodule` | `silverstripe/framework` |
| `pimcore-bundle` | `pimcore/pimcore` |
| `laravel-package` | `laravel/framework` |
| `yii2-extension` | `yiisoft/yii2` |
### 显式配置
对于使用 `type: library` 或需要自定义上游声明的项目:
```
{
"extra": {
"audit-responsibility": {
"upstream": ["typo3/cms-core", "helhum/typo3-console"]
}
}
}
```
### 按项目禁用插件
如果您全局安装了该插件,但希望某个特定的扩展/库退出
(即让所有建议正常阻止):
```
{
"extra": {
"audit-responsibility": {
"block-upstream": true
}
}
}
```
## 工作原理
1. **检测** — 从您的 `type` 或显式配置中识别 platform/framework 包
2. **图分析** — 遍历依赖图 (BFS) 以对每个包进行分类:
- **Direct**:位于您的 `require` 中 —— 您的责任
- **Platform-only**:仅可通过 framework 包到达 —— framework 的责任
- **Shared**:可通过您的依赖和 framework 同时到达 —— 您的责任(保守策略)
- **User-transitive**:仅可通过您的非 framework 依赖到达 —— 您的责任
3. **策略执行** — Platform-only 建议不会阻止;其他一切仍正常阻止
### 菱形问题
当一个包既可以通过您的依赖又可以通过 framework 到达时:
```
your-extension
├── typo3/cms-core → psr/log (platform path)
└── my/logging-lib → psr/log (user path)
```
**保守规则**:如果您有*任何*通往某个包的依赖路径,那就是您的责任。在这种情况下 `psr/log` 会阻止,因为您选择了同样依赖于它的 `my/logging-lib`。
## 与替代方案的对比
| 方式 | 范围 | 维护 | 可见性 |
|---|---|---|---|
| 按建议配置 `config.audit.ignore` | 按建议 | 需为每个新建议更新 | 隐藏 |
| `COMPOSER_NO_SECURITY_BLOCKING=1` | 所有依赖 | 无 | 隐藏 |
| **本插件** | 仅 Framework 依赖 | 无(自动检测) | 保留 |
## 要求
- PHP >= 8.1
- Composer >= 2.9
## 许可证
MIT 许可证。详情请见 [LICENSE](LICENSE)。
## 贡献
欢迎贡献!请在 [GitHub](https://github.com/netresearch/composer-audit-responsibility) 上提出 issue 或 pull request。
标签:Composer, Composer-Plugin, Drupal, ffuf, GPT, Laravel, Magento, OpenVAS, PHP, Shopware, Symfony, TYPO3, WordPress, 传递依赖, 依赖管理, 开源框架, 持续集成, 漏洞管理, 自动化运维, 责任传播, 软件开发