flawopen.com/Teardowns/cve-2026-87913-aws-security-agent-mcp-s3-bucket-ownership
CVE-2026-87913: Kebocoran S3 MCP AWS
Bucket yang mudah ditebak dapat menerima arsip pemindaian privat di akun lain. Perbarui ke 0.2.0 dan verifikasi pemiliknya.[1], [2], [4]
Bayangkan kurir yang hanya memastikan ada gedung di suatu alamat, tanpa memeriksa pemiliknya. Orang lain dapat mendaftarkan alamat itu lebih dahulu dan menerima paket. Perbaikan meminta S3 memastikan pemilik yang diharapkan saat pemeriksaan dan unggahan.[2], [1]
Konsep Kunci & Istilah
Server MCP- Layanan lokal yang menyediakan operasi sebagai tool untuk asisten AI; operasinya memakai izin proses server.[3]
Bucket S3- Kontainer Amazon S3 bernama global; nama tidak membuktikan akun AWS mana yang memilikinya.[2], [3]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-283 CWE-341
- OWASP GenAI 2025 — LLM06:2025 Agensi berlebihan
Analisis Akar Masalah (Root Cause)
Server MCP AWS Security Agent membentuk nama bucket masukan pemindaian dari ID akun AWS pelanggan dan Region: security-agent-scans-<account-id>-<region>. AWS dan advisori maintainer menyatakan versi rentan hanya memeriksa keberadaan bucket, bukan kepemilikan akun pelanggan. Nama S3 bersifat global dan ID akun bersifat publik. Pihak lain yang lebih dahulu mendaftarkan nama tersebut dapat menerima arsip privat yang diunggah server; arsip dapat berisi kode, kredensial, dan status infrastruktur. Ini adalah kegagalan verifikasi kepemilikan sumber daya cloud dan nama yang mudah ditebak, bukan prompt injection model AI. Versi 0.1.0–0.1.5 terdampak; 0.2.0 menambahkan ExpectedBucketOwner pada operasi S3 dan gagal jika pemilik berbeda. Pembaruan tidak membebaskan nama yang telah didaftarkan pihak lain: verifikasi pemilik sebenarnya dan jangan lanjutkan pemindaian jika bucket milik pihak ketiga.
Nama bucket tidak membuktikan kepemilikannya
| Batas | Kondisi yang terdokumentasi | Tindakan operator |
|---|---|---|
| Versi terdampak | awslabs.security-agent-mcp-server versi 0.1.0 hingga 0.1.5 terdampak; versi 0.2.0 menambahkan pemeriksaan kepemilikan. | Tingkatkan ke versi 0.2.0 atau lebih baru dan verifikasi versi paket yang sedang berjalan. |
| Nama bucket yang dapat diprediksi | Nama bucket pemindaian dibuat dari ID akun dan Region; akun AWS lain dapat mendaftarkannya lebih dahulu. | Anggap nama yang cocok sebagai alamat, bukan bukti kepemilikan. |
| Unggahan lintas akun | Server rentan dapat menerima bucket berdasarkan nama tanpa memverifikasi pemilik, lalu mengunggah arsip pemindaian privat ke sana. | Verifikasi bucket dimiliki akun yang diharapkan sebelum memindai atau mengunggah. |
| Batas kepemilikan yang diperbaiki | ExpectedBucketOwner membuat S3 membandingkan pemilik saat pemeriksaan kepemilikan maupun saat unggah. | Tingkatkan versi, verifikasi pemilik sebenarnya, dan hentikan pemindaian jika nama dimiliki pihak lain; peningkatan versi tidak memindahkan bucket. |
Alur Serangan Langkah demi Langkah
Kode Sumber: Rentan vs Aman
Kode ini skematis, bukan salinan persis. Keberadaan saja tidak cukup: S3 harus membandingkan akun pemilik yang diharapkan saat pemeriksaan dan penulisan. Ambil akun dari identitas AWS terautentikasi dan gagalkan operasi jika berbeda. Setelah pembaruan, periksa pemilik secara terpisah karena nama yang sudah terdaftar tidak dipindahkan atau dibebaskan. AWS mendokumentasikan ExpectedBucketOwner pada HeadBucket dan PutObject: ketidakcocokan membuat permintaan gagal dengan 403. Gunakan sebagai pengaman fail-closed, tetapi selidiki kesalahan akses ditolak melalui jalur pemeriksaan kepemilikan yang berwenang sebelum menyimpulkan bucket dimiliki pihak lain.[2], [8], [9]
Cuplikan sumber: Contoh AWS SDK berdasarkan advisori; bukan diff sumber yang verbatim.
# Bentuk rentan sederhana: nama diperiksa, tetapi pemiliknya tidak.
s3.head_bucket(Bucket=bucket_name)
s3.put_object(
Bucket=bucket_name,
Key=object_key,
Body=archive_bytes,
)
# Kaitkan setiap operasi dengan akun yang seharusnya memiliki bucket.
expected_owner = sts.get_caller_identity()["Account"]
s3.head_bucket(
Bucket=bucket_name,
ExpectedBucketOwner=expected_owner,
)
s3.put_object(
Bucket=bucket_name,
Key=object_key,
Body=archive_bytes,
ExpectedBucketOwner=expected_owner,
)
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui
awslabs.security-agent-mcp-serverke 0.2.0 atau lebih baru dan periksa versi aktif, termasuk plugin, image CI, serta fork.[2], [4] - ✓Sebelum memindai, pastikan bucket turunan dimiliki akun AWS yang dimaksud; nama yang ditemukan bukan bukti kepemilikan.[1], [2]
- ✓Kirim akun yang diharapkan sebagai
ExpectedBucketOwnerpada setiap operasi S3, termasuk unggahan.[8], [9] - ✓Hentikan proses jika pemilik berbeda. Jika pihak lain memiliki nama tersebut, hentikan pemindaian dan hubungi AWS.[1]
- ✓Jika sesuai, buat bucket di akun pelanggan sebelum penggunaan pertama dan terapkan hak minimum serta enkripsi.[3], [1]
- ✓Tinjau pemindaian dari versi terdampak dan rotasi kredensial jika arsip mungkin mengandung rahasia.[2], [1]
Sumber
- AWS Security Bulletin 2026-105-AWS — CVE-2026-87913
- Maintainer GHSA-3jxw-vj8m-8x77
- AWS Security Agent IDE integration and scan bucket workflow
- awslabs.security-agent-mcp-server 0.2.0 release
- NVD — CVE-2026-87913
- MITRE CWE-283 — Unverified Ownership
- MITRE CWE-341 — Predictable from Observable State
- Boto3 HeadBucket — ExpectedBucketOwner
- Boto3 PutObject — ExpectedBucketOwner
- Kerentanan terkait dalam paket yang sama (CVE terpisah): injeksi argumen Git AWS MCP, CVE-2026-97662