Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Z氏はKubernetesクラスタを手中に収めることができたのか

O. Yuanying
February 19, 2019

 Z氏はKubernetesクラスタを手中に収めることができたのか

O. Yuanying

February 19, 2019
Tweet

More Decks by O. Yuanying

Other Decks in Technology

Transcript

  1. Z A

  2. 某X社 社内環境 A氏: 社内開発者、k8s クラスタ 開発 者アカウントを持っているも セキュ リティ上 理由によりクラスタ管理者

    相当 権限を持っていない。 Z氏: 協力会社社員。k8s へ アクセス権を持っていな い。ひょんなことから k8s API エンドポイントを知ってし まった。
  3. The API server is the gateway to the Kubernetes cluster.

    It is the central touch point that is accessed by all users, automation, and components in the Kubernetes cluster. -- Managing Kubernetes https://www.oreilly.com/library/view/managing-kubernetes/9781492033905/ch04.html
  4. kube-api Pod PV with CSI Vol Volume Attachment kube controller-manager

    attach/detach controller Storage Bacend Volume StatefulSet (replica: 1) external attacher Controller CSI Plugin Empty Dir Volume CSI call via UDS Node DaemonSet driver registrar Node CSI Plugin kubelet CSI/k8s internal call via UDS host /.../sockets Device /var/lib/kubelet/XXX CSI call via UDS Watch Watch Watch Watch/ Update Create
  5. apiserver kubelet Kubernetes API GET /api/v1/namespaces/${NS}/pods/${POD}/exec Authorization: Bearer ${USER_TOKEN} Kubelet

    API with Client Cert (API Server) GET /exec/${NS}/${POD}/${CONTAINER} apiserver から リクエストをどうにか して書き換えられれ 、kubelet API 自在に操ることができそうだぞ ……!?
  6. Kubernetes APIを 拡張する方法 1. Custom Resource Definition (CRD) ◦ オススメ

    方法 2. Aggregated API Server ◦ CRD で 実現不可能な API を実装する場合
  7. Aggregated API Aggregator (apiserver) Aggregated API Server に、認証 情報をどう伝えるか? Kubernetes

    いくつも 認証手段 を持っているため、単にリクエストを 転送するだけだと、バックエンドがそ 認証手段を解決しなけれ ならな くなる。
  8. Aggregated API Aggregator (apiserver) GET /api HTTP/1.1 Authorization: Bearer ${TOKEN}

    GET /api HTTP/1.1 X-Remote-User: user-a Authorization API user-a こ API を call できるか? token から認証し、 ユーザアカウント名を取得 認証プロキシとして動作
  9. Aggregated API Aggregator (apiserver) GET /api HTTP/1.1 Authorization: Bearer ${TOKEN}

    GET /api HTTP/1.1 X-Remote-User: user-a Authorization API user-a こ API を call できるか? token から認証し、 ユーザアカウント名を取得 apiserver から リクエストをどうにか して書き換えられれ 、Aggregated API Server API 自在に操ること ができそうだぞ……!?
  10. TCP 接続 TCP 解放 HTTP 要求 Reverse Proxy Backend TCP

    接続 HTTP 応答 HTTP 応答 TCP 解放 HTTP 要求
  11. TCP 接続 TCP 解放 HTTP Upgrade Reverse Proxy Backend TCP

    接続 TCP 解放 HTTP Upgrade WebSocket 接続モード Reverse Proxy WebSocket 接 続モードへと切り替わった ち、 Client から パケットを Backend へ中継 みを行う。
  12. TCP 接続 TCP 解放 HTTP Upgrade Reverse Proxy Backend TCP

    接続 TCP 解放 HTTP Upgrade Upgrade に失敗した場合、接続を 終了し以降 クライアントから リ クエスト 破棄する必要がある。 HTTP Upgrade 失敗!
  13. TCP 接続 HTTP Upgrade Reverse Proxy Backend TCP 接続 HTTP

    Upgrade HTTP Upgrade 失敗! WebSocket 接続モード HTTP Upgrade に失敗し、 WebSocket を受信する準備が 整っていないサーバに対して無制 限にデータを送れてしまう! エラーハンドリングに問題があり、Upgrade が失敗したにも関わらず、Reverse Proxy が WebSocket 接続モードに移行してしま う。
  14. apiserver kubelet A氏: 社内開発者 Z氏: 協力会社社員 $ kubectl exec $

    kubectl exec GET /pods 本来呼び出せない kubelet API を呼び出してみる
  15. namespace: production namespace: development apiserver kubelet A氏: 社内開発者 $ kubectl

    exec prod $ kubectl exec dev apiserver にて、ユーザ認証に基づ き、適切な kubelet api を呼び出して いる。
  16. TCP 接続 HTTP Upgrade Reverse Proxy Backend TCP 接続 HTTP

    Upgrade HTTP Upgrade 失敗! WebSocket 接続モード エラーハンドリングに問題があり、Upgrade が失敗したにも関わらず、Reverse Proxy が WebSocket 接続モードに移行してしま う。
  17. apiserver kubelet A氏: 社内開発者 Z氏: 協力会社社員 $ kubectl exec $

    kubectl exec GET /pods 本来呼び出せない kubelet API を呼び出してみる
  18. Aggregated API Servers kube-apiserver k8s api metrics server service catalog

    Aggregator A氏: 社内開発者 Z氏: 協力会社社員 本来呼び出せない metrics api を呼び出してみる
  19. TCP 接続 HTTP 要求 apiserver metrics server TCP 接続 HTTP

    要求 GET /apis/metrics.k8s.io/v1beta1 Host: minikube GET /apis/metrics.k8s.io/v1beta1 Host: metrics-server
  20. TCP 接続 HTTP 要求 apiserver metrics server TCP 接続 HTTP

    要求 GET /apis/metrics.k8s.io/v1beta1 Host: minikube Connection: Upgrade GET /apis/metrics.k8s.io/v1beta1 Host: metrics-server Connection: Upgrade 本来 必要 ない Connection: Upgrade を載 せてみると? HTTP Upgrade 失敗! そもそも Upgrade に対応し てない で…。 アタックチャンス!
  21. Aggregated API Aggregator (apiserver) GET /api HTTP/1.1 Authorization: Bearer ${TOKEN}

    GET /api HTTP/1.1 X-Remote-User: user-a Authorization API user-a こ API を call できるか? token から認証し、 ユーザアカウント名を取得
  22. まとめ 1. Kubernetes API に対する exec/attach/port_forward 呼び出し 権限を 持っている人 、ノード上

    Podに対して任意 コ マンドを実行できてしまう。 2. Kubernetes API エンドポイントを知ってる人 ク ラスタを乗っ取ることができる、という 言い過 ぎ。
  23. Who am I ? • OTSUKA, Motohiro / Yuanying ◦

    Z Lab Corporation ◦ 元 OpenStack Magnum コントリビュータ ◦ 言語 ▪ Ruby (2007 - ) ▪ Python (2014 - ) ▪ Go (2017 - ) ◦ 趣味 ▪ ロードバイク (2009 - ) ▪ トライアスロン (2010 - )
  24. References: • https://github.com/kubernetes/kubernetes/issues/71411 • http://icooon-mono.com/ • https://japan.zdnet.com/article/35129584/ • https://jp.tenable.com/blog/kubernetes-privilege-escalation-vulner ability-publicly-disclosed-cve-2018-1002105

    • https://nakedsecurity.sophos.com/ja/2018/12/05/kubernetes-clou d-computing-bug-could-rain-data-for-attackers/ • https://snyk.io/blog/critical-arbitrary-code-execution-vulnerability- found-in-kubernetes/ • https://en.wikipedia.org/wiki/Central_dogma_of_molecular_biology • https://en.wikipedia.org/wiki/Feline_leukemia_virus