このドキュメントでは、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 バイナリファイルをアップグレードするには、次の手順を実行します。
    1. 次のコマンドを実行して、docker-runc を見つけます。
      通常、docker-runc は /usr/bin/docker-runc にあります。
      which docker-runc
    2. 次のコマンドを実行して、元の runc をバックアップします。
      mv /usr/bin/docker-runc /usr/bin/docker-runc.orig.$(date -Iseconds)
    3. 次のコマンドを実行して、修正済み runc をダウンロードします。
      curl -o /usr/bin/docker-runc -sSL https://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/runc/docker-runc-17.06-amd64
    4. 次のコマンドを実行して、docker-runc の権限を設定します。
      chmod +x /usr/bin/docker-runc
    5. 次のコマンドを実行して、runc が正常に機能するかどうかをテストします。
      docker-runc -v
      # runc version 1.0.0-rc3
      # commit: fc48a25bde6fb041aae0977111ad8141ff396438
      # spec: 1.0.0-rc5
      docker run -it --rm ubuntu echo OK
    6. Kubernetes クラスター GPU ノードの runc バイナリファイルをアップグレードするには、次の手順を実行して nvidia-runtime もインストールする必要があります。
      1. 次のコマンドを実行して、nvidia-container-runtime を見つけます。
        通常、nvidia-container-runtime は、 /usr/bin/nvidia-container-runtime にあります。
        which nvidia-container-runtime
      2. 次のコマンドを実行して、元の nvidia-container-runtime をバックアップします。
        mv /usr/bin/nvidia-container-runtime /usr/bin/nvidia-container-runtime.orig.$(date -Iseconds)
      3. 次のコマンドを実行して、修正された 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
      4. 次のコマンドを実行して、nvidia-container-runtime の権限を設定します。
        chmod +x /usr/bin/nvidia-container-runtime
      5. 次のコマンドを実行して、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 モデルによって異なります。