flawopen.com/Incidents/microsoft-autogen-studio-autojack-agent-rce-june-2026
AutoJack: rantai RCE riset di AutoGen Studio
Riset Microsoft menemukan rantai RCE lokal via MCP pada build pengembangan AutoGen Studio. Diperbaiki sebelum rilis; tidak masuk PyPI.[1], [2]
Bayangkan laboratorium riset tempat asisten membaca catatan pengunjung. Asisten boleh masuk ke ruang kendali karena bekerja di gedung yang sama. Resepsionis melewati pemeriksaan identitas biasa untuk ruangan itu, dan catatan pengunjung dapat menentukan alat yang dijalankan. AutoJack merangkai jalan pintas tersebut: agen penjelajah menampilkan konten tak tepercaya, konten itu mencapai control plane MCP lokal AutoGen Studio, lalu pengaturan dari pemanggil dapat menyebabkan proses anak dimulai. Autentikasi ruang kendali, keluarkan pengaturan peluncuran dari URL WebSocket, dan pisahkan asisten dari workstation pengembang. Microsoft mengatakan masalah ini diperbaiki di branch upstream sebelum rilis PyPI. Laporan ini membahas kode sumber pra-rilis, bukan rilis pelanggan yang terdampak.[1]
Konsep Kunci & Istilah
AutoJack- Nama Microsoft untuk rantai yang didemonstrasikan pada build pengembangan AutoGen Studio. Laporan menyebut rute MCP terdampak diperbaiki sebelum masuk ke paket PyPI yang dirilis.[1], [2]
Loopback / localhost- Antarmuka jaringan untuk mengakses layanan pada host yang sama. Ini membatasi akses dari jaringan luar, tetapi tidak mengisolasi proses lokal seperti browser agen dari layanan lain pada host tersebut.[1]
Validasi Origin WebSocket- Pemeriksaan server terhadap header Origin saat handshake WebSocket. Microsoft mendapati pemeriksaan ini saja tidak mencegah halaman yang ditampilkan dalam alur agen yang diuji mencapai layanan MCP lokal.[1], [3]
StdioServerParams- Konfigurasi stdio MCP AutoGen yang berisi program dan argumen untuk memulai proses server. Rute yang dilaporkan mendekode pengaturan ini dari parameter URL WebSocket.[1], [2], [5]
Confused deputy- Komponen berhak istimewa dibujuk memakai kewenangannya sendiri untuk pihak yang tak tepercaya. Di sini, agen penjelajah dan layanan Studio lokal menghubungkan konten halaman dengan pembuatan proses pada host.[1]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-78 CWE-306 CWE-1385
- OWASP GenAI 2025 — LLM06:2025 Agensi berlebihan
Kronologi Insiden
Microsoft menerbitkan riset AutoJack dan panduan mitigasinya. Laporan menjelaskan demonstrasi lokal yang terkendali, bukan serangan terkonfirmasi terhadap pelanggan.[1]
Alur Serangan Langkah demi Langkah
Agen diminta menjelajahi konten tak tepercaya
Prompt, halaman yang diambil, atau input tak tepercaya lain membuat agen penjelajah AutoGen menampilkan halaman yang dikendalikan penyerang pada workstation yang sama dengan AutoGen Studio.[1]
Kode Sumber: Rentan vs Aman
Contoh rentan mengurai pengaturan peluncuran yang dikendalikan pemanggil, tetapi sengaja tidak memulai proses. Perbaikan upstream memindahkan pengaturan dari query WebSocket ke status sesi sekali pakai di server dan mengaktifkan kembali autentikasi rute MCP. Pola defensif ini menambahkan kedaluwarsa, batas ukuran, penguncian konkurensi, dan daftar izin executable; ganti nama contoh dengan biner MCP yang secara eksplisit disetujui. Pola ini tidak menggantikan validasi Origin atau isolasi OS.[1], [2]
import base64
import json
from dataclasses import dataclass
@dataclass(frozen=True)
class StdioServerParams:
command: str
args: tuple[str, ...]
def params_from_websocket_query(query: dict[str, str]) -> StdioServerParams:
# Rute pengembangan memercayai konfigurasi yang diberikan melalui URL.
encoded = query["server_params"]
decoded = base64.b64decode(encoded)
return StdioServerParams(**json.loads(decoded))from dataclasses import dataclass
from threading import Lock
from time import monotonic
from uuid import uuid4
@dataclass(frozen=True)
class StdioServerParams:
command: str
args: tuple[str, ...]
SESSION_TTL = 30.0
MAX_PENDING = 256
ALLOWED_COMMANDS = {"approved-mcp-server"}
pending: dict[str, tuple[float, StdioServerParams]] = {}
pending_lock = Lock()
def register_params(params: StdioServerParams, authenticated: bool) -> str:
# authenticated harus berasal dari middleware terverifikasi, bukan dari data permintaan.
if not authenticated:
raise PermissionError("MCP control-plane authentication required")
if params.command not in ALLOWED_COMMANDS:
raise ValueError("unapproved MCP server executable")
now = monotonic()
with pending_lock:
for key, (expires, _) in list(pending.items()):
if expires <= now:
pending.pop(key, None)
if len(pending) >= MAX_PENDING:
raise RuntimeError("pending MCP session limit reached")
session_id = str(uuid4())
pending[session_id] = (now + SESSION_TTL, params)
return session_id
def consume_params(session_id: str, authenticated: bool) -> StdioServerParams:
if not authenticated:
raise PermissionError("MCP control-plane authentication required")
with pending_lock:
entry = pending.pop(session_id, None)
if entry is None or entry[0] <= monotonic():
raise ValueError("unknown or expired MCP session")
return entry[1]Daftar Periksa Penguatan Sistem Rekayasa
- ✓Wajibkan autentikasi dan otorisasi pada setiap rute control plane MCP, termasuk handshake WebSocket; uji semua mode autentikasi yang dikonfigurasi pada rute tersebut.[1], [2], [4]
- ✓Jangan menerima konfigurasi peluncuran proses melalui URL WebSocket atau input lain yang dikendalikan browser; daftarkan melalui permintaan terautentikasi dan ikat ke sesi server-side yang singkat dan hanya sekali pakai.[2]
- ✓Kedaluwarsakan sesi tertunda, batasi jumlahnya, konsumsi setiap sesi secara atomik, dan tolak ID yang tidak dikenal, kedaluwarsa, atau dipakai ulang.[2]
- ✓Izinkan hanya executable server MCP yang disetujui dan skema argumen tetap; jangan biarkan output model atau konten halaman memilih program arbitrer.[1], [5]
- ✓Pisahkan agen penjelajah yang menampilkan halaman tak tepercaya dari control plane lokal berhak istimewa; blokir akses loopback dari sandbox browser jika memungkinkan.[1], [3]
- ✓Jalankan agen dan Studio dengan identitas hak minimum atau VM/container sekali pakai, lalu buat peringatan untuk proses anak tak terduga dari runtime agen.[1]
- ✓Untuk build AutoGen Studio dari source, gunakan revisi b047730 atau yang lebih baru. Microsoft menyatakan rute terdampak tidak ada di paket PyPI saat itu; verifikasi artefak yang benar-benar Anda deploy.[1], [2]
Sumber
- Microsoft Security Blog — AutoJack: satu halaman dapat menjalankan kode pada host agen AI
- Commit Microsoft AutoGen b047730 — memperkuat endpoint MCP WebSocket
- CWE-1385: Validasi Origin WebSocket tidak ada
- CWE-306: Autentikasi untuk fungsi penting tidak ada
- CWE-78: Elemen khusus pada perintah OS tidak dinetralkan dengan benar