このドキュメントでは、runc に関するセキュリティ脆弱性 CVE-2019-5736 の影響と、それを取り除く方法について説明します。 この脆弱性は、Kubernetes クラスターバージョン 1.11 および 1.12 では修正されています。
背景
セキュリティの脆弱性は、Docker、containerd、または runc を使用するその他のコンテナーで発生する可能性があります。 この脆弱性により、攻撃者は特定のコンテナーイメージを使用するか、exec コマンドを実行して、実行中のホスト runc が使用するファイルハンドルを取得できます。 攻撃者は、ホストの runc バイナリファイルを上書きして、ホストにアクセスするためのルート権限を取得すると、ルート権限と同様にコマンドを実行できます。
影響を受けるクラスター
- 脆弱性の影響を受ける Alibaba Cloud Container Service クラスター:
- Docker v18.09.02 以前のバージョンのすべての Docker Swarm クラスター。
- サーバーレス Kubernetes クラスターを除くすべての Kubernetes クラスター。
- 脆弱性の影響を受ける自己構築 Docker および Kubernetes クラスター:
- v18.09.2 以前のバージョンの Docker を使用するすべてのクラスター。
- runc v1.0-rc6 以前を使用するすべてのクラスター。
解決策
V1.11 および V1.12 以前の Kubernetes クラスターのセキュリティ脆弱性 CVE-2019-5736 を修正するには、次の 2 つの方法のいずれかを使用します。
- 既存のすべてのクラスターの Docker バージョンを v18.09.2 以降にアップグレードします。 この方法を使用すると、クラスターコンテナーとサービスが中断されます。
- runc のみをアップグレードします。 この方法は、Docker v17.06 を実行しているクラスターに適用できます。 Docker エンジンのアップグレードによるサービスの中断を回避するために、各クラスターノードの
runc バイナリファイルを個別にアップグレードすることを推奨します。 runc バイナリファイルをアップグレードするには、次の手順を実行します。
- 次のコマンドを実行して、docker-runc を見つけます。
注 通常、docker-runc は /usr/bin/docker-runc にあります。
which docker-runc
- 次のコマンドを実行して、元の runc をバックアップします。
mv /usr/bin/docker-runc /usr/bin/docker-runc.orig.$(date -Iseconds)
- 次のコマンドを実行して、修正済み runc をダウンロードします。
curl -o /usr/bin/docker-runc -sSL https://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/runc/docker-runc-17.06-amd64
- 次のコマンドを実行して、docker-runc の権限を設定します。
chmod +x /usr/bin/docker-runc
- 次のコマンドを実行して、runc が正常に機能するかどうかをテストします。
docker-runc -v # runc version 1.0.0-rc3 # commit: fc48a25bde6fb041aae0977111ad8141ff396438 # spec: 1.0.0-rc5 docker run -it --rm ubuntu echo OK
- Kubernetes クラスター GPU ノードの runc バイナリファイルをアップグレードするには、次の手順を実行して nvidia-runtime もインストールする必要があります。
- 次のコマンドを実行して、nvidia-container-runtime を見つけます。
注 通常、nvidia-container-runtime は、/usr/bin/nvidia-container-runtime にあります。
which nvidia-container-runtime
- 次のコマンドを実行して、元の nvidia-container-runtime をバックアップします。
mv /usr/bin/nvidia-container-runtime /usr/bin/nvidia-container-runtime.orig.$(date -Iseconds)
- 次のコマンドを実行して、修正された nvidia-container-runtime をダウンロードします。
curl -o /usr/bin/nvidia-container-runtime -sSL https://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/runc/nvidia-container-runtime-17.06-amd64
- 次のコマンドを実行して、nvidia-container-runtime の権限を設定します。
chmod +x /usr/bin/nvidia-container-runtime
- 次のコマンドを実行して、nvidia-container-runtime が正常に機能するかどうかをテストします。
nvidia-container-runtime -v # runc version 1.0.0-rc3 # commit: fc48a25bde6fb041aae0977111ad8141ff396438-dirty # spec: 1.0.0-rc5 docker run -it --rm -e NVIDIA_VISIBLE_DEVICES=all ubuntu nvidia-smi -L # GPU 0: Tesla P100-PCIE-16GB (UUID: GPU-122e199c-9aa6-5063-0fd2-da009017e6dc)
注 このテストは、GPU P100 モデルのノードで実行されます。 テスト出力は GPU モデルによって異なります。
- 次のコマンドを実行して、nvidia-container-runtime を見つけます。
- 次のコマンドを実行して、docker-runc を見つけます。