@nx/docker: OSコマンドインジェクションの脆弱性について(@nx/dockerのリリースパイプライン)
## 概要
`@nx/docker`のリリースパイプラインは、`docker`コマンドを実行する際に、シェルコマンド文字列を使用しています。この文字列には、Nxの設定ファイルから`release.docker.repositoryName`と`registryUrl`の値が埋め込まれます。これらの文字列が`/bin/sh -c`に渡されるため、悪意のあるリポジトリ名やレジストリ名が指定されると、`nx release version`や`nx release publish`の実行中にコマンドとして実行されてしまいます。Nxの設定をコントロールしていないリポジトリに対してDockerリリースを実行する場合、またはプルリクエストによって設定が変更された場合、攻撃者が指定したコマンドが、リリースジョブの権限で実行される可能性があります。通常、CI環境では、リリースジョブはレジストリの認証情報やクラウドトークンを保持しています。
## 深刻度
攻撃者が提供した設定を使用してDockerリリースを実行した場合に悪用される可能性があります。影響は大きく、リリースジョブが公開認証情報を保持しているためです。現状では、この脆弱性が実際に悪用されたという報告はありません。
## 影響を受けるバージョンと修正済みバージョン
| パッケージ | 脆弱性あり | 修正済み |
|---|---|---|
| `@nx/docker` | `>= 21.4.0, < 22.7.8`; `>= 23.0.0, < 23.1.1` | `22.7.8`, `23.1.1` |
修正前のすべての公開された`@nx/docker`のバージョンが影響を受けます。
> [重要]
> `--dry-run`オプションは保護しません。注入されたコマンドの1つは、dry-runチェックの前に実行されるため、dry-runによる公開もシェルに到達します。
## 対策
**22.7.8**(22.xバージョン)または**23.1.1**(23.xバージョン)以降にアップグレードしてください。
```
nx migrate 23.1.1
```
この修正は、追加の設定変更なしで適用できます。信頼できない設定を使用して`nx release version`を実行した場合は、次の公開前に生成されたDockerのバージョンファイルを削除してください。これは、参照情報がディスクから読み込まれるためです。
## 詳細
リリースパイプラインにおけるいくつかの `docker` コマンド(`nx release version` 時の `docker tag`、`nx release publish` 時のイメージ存在チェックと `docker push`)は、イメージ参照が埋め込まれたシェルコマンド文字列として構築されています。この参照は、プロジェクトの `release.docker` に定義された `repositoryName` と `registryUrl` から構成されており、`docker` コマンドに渡されるのではなく、シェル構文を含む値が実行されます。
## 貢献者
- **Arkadiusz Marta** (RE:SOURCE) — 報告者
影響を受けるパッケージ:
- npm (JavaScript) @nx/docker: 影響範囲は 21.4.0 以上、22.7.8 未満。22.7.8 で修正済み。
- npm (JavaScript) @nx/docker: 影響範囲は 23.0.0 以上、23.1.1 未満。23.1.1 で修正済み。