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

203e5cc4766b6b4d2360f8329b8e7559?s=47 O. Yuanying
February 19, 2019

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

203e5cc4766b6b4d2360f8329b8e7559?s=128

O. Yuanying

February 19, 2019
Tweet

Transcript

  1. Z氏 Kubernetes クラスタを、 手中に収めることができた か OTSUKA, Motohiro / Yuanying

  2. None
  3. 2018年12月4日

  4. None
  5. CVE-2018-1002105

  6. None
  7. None
  8. Z A

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

    相当 権限を持っていない。 Z氏: 協力会社社員。k8s へ アクセス権を持っていな い。ひょんなことから k8s API エンドポイントを知ってし まった。
  10. Z氏 Kubernetes クラスタを、 手中に収めることができた か

  11. None
  12. kube-apiserver

  13. Central dogma of molecular biology https://en.wikipedia.org/wiki/Central_dogma_of_molecular_biology

  14. None
  15. Central dogma of Kubernetes apiserver master node

  16. 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
  17. reconciliation loop 各コンポーネント 、apiserver に保持された 状態を監視し、実際 オブジェクト Actual な状態を apiserver

    に宣言された状態へと変 化させていく。
  18. 例え ReplicaSets

  19. replicasets controller apiserver Node (kubelet) RS replica:2

  20. replicasets controller apiserver Node (kubelet) RS replica:2

  21. replicasets controller apiserver Node (kubelet) Pod Pod

  22. replicasets controller apiserver Node (kubelet)

  23. replicasets controller apiserver Node (kubelet)

  24. Central dogma of Kubernetes apiserver master node

  25. apiserver replicasets controller Node (kubelet) RS replica:2 watch watch post

  26. apiserver replicasets controller Node (kubelet) RS replica:2 get watch

  27. apiserver replicasets controller Node (kubelet) post watch Pod Pod

  28. apiserver replicasets controller Node (kubelet) get Pod Pod

  29. apiserver replicasets controller Node (kubelet)

  30. reconciliation loop 各コンポーネント 、apiserver に保持された 状態を監視し、実際 オブジェクト Actual な状態を apiserver

    に宣言された状態へと変 化させていく。
  31. 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
  32. There is no general rule without some exceptions. https://en.wikipedia.org/wiki/Feline_leukemia_virus

  33. Central dogma of molecular biology https://en.wikipedia.org/wiki/Central_dogma_of_molecular_biology

  34. Reverse transcription (RNA -> DNA) Rev. Transcriptase

  35. RNA replication (RNA -> RNA) RNA Polymerase

  36. Central dogma of Kubernetes apiserver master node

  37. apiserver ? ?

  38. apiserver Pod (Node) Aggregated API server 1. Pod に対する exec/attach/port_forward

    2. Aggregated API Server
  39. Pod に対する exec/attach/port_forward

  40. Pod に対する exec/attach/port_forward apiserver kubelet Kubernetes API (ユーザ 権限) Kubelet

    API (apiserver 権限)
  41. Kubelet API • /pods • /spec/ • /exec/{podNamespace}/{podID}/{containerName} • /attach/{podNamespace}/{podID}/{containerName}

    • /portForward/{podNamespace}/{podID}/{containerName}
  42. Kubelet API -- 認証 --

  43. 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}
  44. 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 自在に操ることができそうだぞ ……!?
  45. Aggregated API Server

  46. Kubernetes APIを 拡張する方法 1. Custom Resource Definition (CRD) ◦ オススメ

    方法 2. Aggregated API Server ◦ CRD で 実現不可能な API を実装する場合
  47. k8s api metrics server service catalog Kubernetes に Kubernetes API

    に加えて別 API を追加する。
  48. Aggregated API Servers k8s api metrics server service catalog Aggregator

    (k8s api endpoint)
  49. Aggregated API Servers kube-apiserver k8s api metrics server service catalog

    Aggregator
  50. Aggregated API Server -- サービスディスカバリ --

  51. $ curl -k https://${API_ENDPOINT}/apis $ curl -k https://${API_ENDPOINT}/apis/${API_GROUP}/${API_VERSION}

  52. None
  53. None
  54. Aggregated API Server • Service Catalog • Metrics Server •

  55. Aggregated API Server -- 認証 --

  56. Aggregated API Aggregator (apiserver) Aggregated API Server に、認証 情報をどう伝えるか? Kubernetes

    いくつも 認証手段 を持っているため、単にリクエストを 転送するだけだと、バックエンドがそ 認証手段を解決しなけれ ならな くなる。
  57. 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 から認証し、 ユーザアカウント名を取得 認証プロキシとして動作
  58. 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 自在に操ること ができそうだぞ……!?
  59. 唐突に HTTP 基礎

  60. Web Server

  61. Web Server TCP 接続

  62. Web Server TCP 接続 HTTP 要求

  63. Web Server TCP 接続 HTTP 要求 HTTP 応答

  64. Web Server TCP 接続 HTTP 要求 HTTP 応答

  65. Web Server TCP 接続 TCP 解放 HTTP 要求 HTTP 応答

  66. TCP 接続 TCP 解放 HTTP 要求 Reverse Proxy Backend TCP

    接続 HTTP 応答 HTTP 応答 TCP 解放 HTTP 要求
  67. WebSocket?

  68. TCP 接続 TCP 解放 HTTP Upgrade Reverse Proxy Backend TCP

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

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

  71. TCP 接続 HTTP Upgrade Reverse Proxy Backend TCP 接続 HTTP

    Upgrade HTTP Upgrade 失敗! WebSocket 接続モード HTTP Upgrade に失敗し、 WebSocket を受信する準備が 整っていないサーバに対して無制 限にデータを送れてしまう! エラーハンドリングに問題があり、Upgrade が失敗したにも関わらず、Reverse Proxy が WebSocket 接続モードに移行してしま う。
  72. 何ができるか?

  73. バックエンド APIをリクエストできる人 誰でも、 apiserver 権限でバックエンド APIをリクエストできてしまう。

  74. 権限昇格 脆弱性

  75. デモ

  76. apiserver kubelet A氏: 社内開発者 Z氏: 協力会社社員 $ kubectl exec $

    kubectl exec GET /pods 本来呼び出せない kubelet API を呼び出してみる
  77. デモ環境 namespace: production namespace: development A氏: 社内開発者 Z氏: 協力会社社員 nginx-prod

    nginx-dev
  78. デモ環境 namespace: production namespace: development A氏: 社内開発者 Z氏: 協力会社社員 nginx-prod

    nginx-dev
  79. デモ環境 namespace: production namespace: development A氏: 社内開発者 Z氏: 協力会社社員 nginx-prod

    nginx-dev
  80. namespace: production namespace: development apiserver kubelet A氏: 社内開発者 $ kubectl

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

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

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

    Aggregator A氏: 社内開発者 Z氏: 協力会社社員 本来呼び出せない metrics api を呼び出してみる
  84. Aggregated API Server -- サービスディスカバリ --

  85. None
  86. TCP 接続 HTTP 要求 apiserver metrics server TCP 接続 HTTP

    要求 GET /apis/metrics.k8s.io/v1beta1 Host: minikube GET /apis/metrics.k8s.io/v1beta1 Host: metrics-server
  87. 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 に対応し てない で…。 アタックチャンス!
  88. 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 から認証し、 ユーザアカウント名を取得
  89. None
  90. Aggregated API Server API を呼び出すことができる。

  91. ただし!

  92. Aggregated API Server API で 「Kubernetes クラスタ乗っ取り」API が実装されていれ 可能。

  93. kubectl exec できる かもしれない。

  94. まとめ 1. Kubernetes API に対する exec/attach/port_forward 呼び出し 権限を 持っている人 、ノード上

    Podに対して任意 コ マンドを実行できてしまう。 2. Kubernetes API エンドポイントを知ってる人 ク ラスタを乗っ取ることができる、という 言い過 ぎ。
  95. まとめ 2 1. どちらにしろ環境による。 ◦ 他 人から 情報を鵜呑みにせず、脆弱性が 自分 環境ど

    ような影響を与える かちゃん と確認しましょう。
  96. Z氏 Kubernetes クラスタを、 手中に収めることができた か OTSUKA, Motohiro / Yuanying

  97. Who am I ? • OTSUKA, Motohiro / Yuanying ◦

    Z Lab Corporation ◦ 元 OpenStack Magnum コントリビュータ ◦ 言語 ▪ Ruby (2007 - ) ▪ Python (2014 - ) ▪ Go (2017 - ) ◦ 趣味 ▪ ロードバイク (2009 - ) ▪ トライアスロン (2010 - )
  98. We are hiring

  99. 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