containerd CRIプラグイン:チェックポイントからの復元が、宛先のセキュリティコンテキストを回避する。
### 影響
containerdのCRI実装における脆弱性により、`CreateContainer` APIを介して信頼できないチェックポイントから復元されたコンテナが、宛先のセキュリティコンテキストを回避し、より高い権限で実行される可能性があります。チェックポイントアーカイブまたは注釈付きOCIイメージからコンテナを復元する場合、CRIUはプロセス認証情報、Linuxの機能、`no_new_privs`、およびseccompの状態を、宛先のCRIの`ContainerConfig`を適用するのではなく、直接チェックポイントデータから復元します。攻撃者が、細工されたチェックポイントイメージを使用してコンテナを実行できる場合、オーケストレーターが要求する制限付きのセキュリティポリシーにもかかわらず、rootユーザーとして完全な機能でプロセスを実行し、seccompフィルターが適用されない可能性があります。さらに、containerdのCRIステータス報告は、実際に復元されたプロセスの状態ではなく、要求された構成を反映するため、オーケストレーターから見ると、権限の不一致が隠蔽されます。この問題は、containerdでCRIチェックポイント復元が有効になっているLinuxシステムに影響を与えます。CRIチェックポイント復元を使用していないユーザーには影響はありません。
### 修正
このバグは、containerd 2.2.7および2.3.4で、`CreateContainer`を介したチェックポイント復元をデフォルトで無効にすることで修正されました。この機能は、containerd 2.4.0で完全に削除されました。この問題を解決するには、これらのバージョンにアップデートする必要があります。信頼できないチェックポイントから復元された実行中のコンテナは、停止し、削除し、再作成する必要があります。
`CreateContainer` APIを介した復元に依存しているユーザーは、新しい`enable_experimental_restore_via_create`構成オプションを設定することで、この機能を再度有効にすることができます。ただし、`CreateContainer`を介した復元を有効にすると、この脆弱性が残ります。なぜなら、containerdはCRIUプロセス復元中に宛先のセキュリティポリシーを適用できないからです。
### 対策
修正されていないバージョンのcontainerdでは、`CreateContainer`を介したチェックポイント復元を無効にするための設定オプションが提供されていません。デプロイメントでは、コンテナの作成権限を信頼できるユーザーに制限するか、コンテナイメージレジストリを検証するか、チェックポイントデータを含むイメージを拒否するためにadmissionコントローラーを使用する必要があります。
### 参照
* [CRIUイメージセキュリティ](https://checkpoint-restore.github.io/criu/security/image-security.html)
### 謝辞
containerdプロジェクトは、この問題を責任を持って報告してくれた@l2yyd5と@berkpolatCEに感謝します。これは、[containerdセキュリティポリシー](https://github.com/containerd/project/blob/main/SECURITY.md)に従って行われました。
### 詳細情報
このセキュリティアドバイザリーに関するご質問やご意見がありましたら、以下の方法でお問い合わせください。
* [containerd](https://github.com/containerd/containerd/issues/new/choose)でIssueを開く
* [security@containerd.io](mailto:security@containerd.io)までメールでお問い合わせください。
containerdにおけるセキュリティ上の問題の報告は、以下の方法で行ってください。
* [新しい脆弱性を報告](https://github.com/containerd/containerd/security/advisories/new)
* [security@containerd.io](mailto:security@containerd.io)までメールでお問い合わせください。
影響を受けるパッケージ:
- go github.com/containerd/containerd/v2: 影響を受けるバージョンは2.1.0以上、2.2.7未満。2.2.7で修正済み。
- go github.com/containerd/containerd/v2: 影響を受けるバージョンは2.3.0以上、2.3.4未満。2.3.4で修正済み。