GCP - Container Privesc
container
container.clusters.get
container.clusters.get
この権限を使用すると、次のような方法でKubernetesクラスターの資格情報を収集できます:
追加の権限がない場合、資格情報はかなり基本的ですが、いくつかのリソースをリストするだけできますが、環境の設定ミスを見つけるのに役立ちます。
kubernetesクラスターはプライベートに設定されている可能性があることに注意してください。これにより、インターネットからKube-APIサーバーへのアクセスが拒否されます。
この権限がない場合でも、クラスターにアクセスすることはできますが、クラスターの情報を含む独自のkubectl構成ファイルを作成する必要があります。新しく生成されたものは次のようになります:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetesはデフォルトで、主体が持っている権限よりも多くの権限を持つRolesおよびClusterRolesを作成または更新することを防ぎます。しかし、その権限を持つGCPの主体は、この振る舞いに対するKubernetesの保護をバイパスして、より多くの権限を持つRoles/ClusterRolesを作成/更新することができます。
これらの特権昇格アクションを実行するには、それぞれ**container.roles.create
および/またはcontainer.roles.update
またはcontainer.clusterRoles.create
および/またはcontainer.clusterRoles.update
も必要**です。
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Kubernetesはデフォルトで、主体が持っている権限よりも多くの権限を持つRoleBindingsおよびClusterRoleBindingsを作成または更新することを防ぎます。しかし、その権限を持つGCPの主体は、この振る舞いに対するKubernetesの保護をバイパスして、より多くの権限を持つRolesBindings/ClusterRolesBindingsを作成/更新することができます。
これらの特権昇格アクションを実行するには、それぞれ**container.roleBindings.create
および/またはcontainer.roleBindings.update
またはcontainer.clusterRoleBindings.create
および/またはcontainer.clusterRoleBindings.update
も必要**です。
container.cronJobs.create
| container.cronJobs.update
| container.daemonSets.create
| container.daemonSets.update
| container.deployments.create
| container.deployments.update
| container.jobs.create
| container.jobs.update
| container.pods.create
| container.pods.update
| container.replicaSets.create
| container.replicaSets.update
| container.replicationControllers.create
| container.replicationControllers.update
| container.scheduledJobs.create
| container.scheduledJobs.update
| container.statefulSets.create
| container.statefulSets.update
container.cronJobs.create
| container.cronJobs.update
| container.daemonSets.create
| container.daemonSets.update
| container.deployments.create
| container.deployments.update
| container.jobs.create
| container.jobs.update
| container.pods.create
| container.pods.update
| container.replicaSets.create
| container.replicaSets.update
| container.replicationControllers.create
| container.replicationControllers.update
| container.scheduledJobs.create
| container.scheduledJobs.update
| container.statefulSets.create
| container.statefulSets.update
これらの権限は、ポッドを定義できるリソースを作成または更新することを可能にします。ポッドを定義することで、アタッチされるSAと実行されるイメージを指定できます。したがって、SAのトークンをあなたのサーバーに漏洩させるイメージを実行することができ、任意のサービスアカウントに昇格することができます。 詳細については、以下を参照してください:
GCP環境にいるため、メタデータサービスからノードプールGCP SAを取得し、GCPで権限を昇格させることもできます(デフォルトではコンピュートSAが使用されます)。
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
これらの権限を持つと、このページで説明されているように、KubernetesのすべてのSAのトークンを読み取ることができるため、それらに昇格することができます。
container.pods.exec
container.pods.exec
この権限を持つと、ポッドにエグゼクティブできるため、K8s内で権限を昇格するために実行されているKubernetes SAにアクセスできますが、NodePoolのGCPサービスアカウントを盗むこともでき、GCPで権限を昇格させることができます。
container.pods.portForward
container.pods.portForward
これらの権限を持つと、ポッドで実行されているローカルサービスにアクセスでき、それによりKubernetesで権限を昇格することができるかもしれません(そしてメタデータサービスに接続できればGCPで権限を昇格することができます)。
container.serviceAccounts.createToken
container.serviceAccounts.createToken
この権限の名前からすると、K8sサービスアカウントのトークンを生成できるように見えますので、Kubernetes内の任意のSAに特権昇格できるようになります。ただし、使用するAPIエンドポイントを見つけることができませんでしたので、見つけた場合はお知らせください。
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
これらの権限は、Kubernetesで権限を昇格させることができるかもしれませんが、より確実には、クラスターに永続化するためにそれらを悪用することができるかもしれません。 詳細については、このリンクを参照してください。
最終更新