Ilustrasi teknis abstrak pada latar biru dongker gelap: port masukan bercahaya di dinding kiri sebuah kotak tembus pandang menerima satu garis pucat tipis yang tidak membawa lencana dan tidak membawa kunci. Di dalam kotak, garis itu bertemu dengan tumpukan panel kecil membulat dan bercabang menjadi deretan pendek guratan bersudut mirip perintah yang bergerak turun ke kompartemen bawah yang berisi sekelompok token berbentuk kunci bercahaya. Gerbang kedua yang tertutup dengan garis tepi biru pucat terletak di samping port masukan. Tidak ada teks, tidak ada orang, tidak ada logo organisasi.
AI Safety Incidents

Satu POST Tanpa Autentikasi ke API Manajemen Bifrost Menjalankan Perintah sebagai Pengguna Gateway

Penulis

Magnus Corvin

Tanggal Terbit

Model terbaru · 20Lihat semua model →
Benchmark: Artificial Analysis · diperbarui setiap hari
Kembali ke semua artikel

Pada 14 September 2026, JFrog Security Research menerbitkan CVE-2026-90898, sebuah cacat eksekusi perintah di Bifrost — gateway AI sumber terbuka yang dikelola oleh Maxim — dan memberinya skor 9,8 dari 10. Serangannya adalah satu permintaan HTTP. Tanpa autentikasi, POST /api/mcp/client mendaftarkan klien MCP stdio, yang dibaca Bifrost sebagai nama program plus daftar argumen dan langsung dijalankan, sebelum handshake MCP apa pun, sebagai pengguna yang menjalankan gateway; pada image resmi, pengguna itu adalah appuser. Gateway juga merupakan tempat kunci penyedia dan kunci virtual milik operator berada, sehingga proses yang berjalan di sana dapat menjangkau kredensial. Yang membuat permintaan itu anonim adalah default yang dikirimkan: governance.auth_config.is_enabled bernilai false, dan, dalam frasa JFrog, "auth nonaktif berarti setiap pemanggil adalah admin lokal." Tidak ada sumber yang dikutip melaporkan bahwa cacat ini pernah dieksploitasi. Sumber catatan itu sendiri, tingkat keparahan, dan penilaian keyakinan berada di arsip insiden AI, bersama kerentanan gateway AI dan MCP lain yang terdokumentasi selama setahun terakhir.

Bifrost adalah layanan tunggal yang berada di antara aplikasi dan model bahasa yang dipanggilnya. Repositorinya mendeskripsikannya sebagai gateway sumber terbuka berlisensi Apache-2.0 yang "menyatukan akses ke 23+ penyedia ... melalui API tunggal yang kompatibel dengan OpenAI", dengan proxy MCP, kunci virtual, anggaran, dan penyeimbangan beban per penyedia sebagai sebagian fiturnya, dan layanan ini memiliki sekitar 9.150 bintang GitHub pada 28 Oktober 2026. Kombinasi itulah alasan utama shell di host tertentu ini layak mendapat skor kritis: proses yang merutekan permintaan juga merupakan proses yang memegang kredensial untuk setiap upstream yang dirutekannya. Hacker News, yang melaporkan cacat tersebut pada 22 September, menyatakan konsekuensinya secara gamblang — karena gateway menyimpan kunci API untuk setiap penyedia yang terhubung, menjalankan perintah pada proses gateway memberi penyerang akses ke kredensial tersebut.

Seluruh serangan itu hanyalah satu POST

Advisory JFrog, yang diterbitkan dengan referensi JFSA-2026-001686326, menjelaskan sebuah endpoint yang ada untuk memungkinkan administrator menambahkan server MCP. Klien stdio dalam spesifikasi MCP bukanlah URL; itu adalah perintah dan argumennya, yang diharapkan dijalankan oleh program host. Bifrost menerima konfigurasi tersebut melalui API manajemen dan memulai program segera setelah klien ditambahkan. Tidak ada negosiasi kemampuan, tidak ada pemeriksaan identitas server, tidak ada handshake yang harus berhasil terlebih dahulu — advisory tersebut secara eksplisit menyatakan bahwa handshake bukanlah yang memulai proses.

Proof of concept dalam advisory adalah body JSON singkat yang dikirim ke gateway dengan autentikasi dibiarkan pada default-nya. Ini mendaftarkan klien yang perintahnya /bin/sh dan argumennya menulis file penanda, lalu membaca penanda itu kembali. JFrog menambahkan detail operasional yang penting selama respons insiden: permintaan HTTP dapat timeout saat Bifrost menunggu handshake yang tidak pernah datang, dan timeout dalam log bukan berarti perintah gagal dijalankan. Prosesnya sudah berjalan pada saat itu.

Catatan CVE, yang ditetapkan oleh JFrog sebagai Otoritas Penomoran CVE, memetakan cacat tersebut ke CWE-306, ketiadaan autentikasi untuk fungsi kritis, dan CWE-284, kontrol akses yang tidak semestinya, serta menyebutkan dua berkas yang memuat handler dan middleware-nya: transports/bifrost-http/handlers/mcp.go dan transports/bifrost-http/handlers/middlewares.go. Modul yang terdampak adalah github.com/maximhq/bifrost/transports, pada Linux dan macOS, untuk semua versi di bawah 2.1.0.

Default yang membuat permintaan tersebut anonim

Tidak ada satu pun dari itu yang dapat dieksploitasi tanpa kondisi kedua, dan kondisi kedua adalah default produk itu sendiri. Middleware autentikasi manajemen Bifrost dibatasi oleh governance.auth_config.is_enabled, yang dirilis dengan nilai false. Saat fitur itu dimatikan, middleware memperlakukan setiap pemanggil sebagai administrator lokal — ringkasan dari advisory itu sendiri adalah bahwa autentikasi yang dimatikan berarti setiap pemanggil adalah admin lokal — sehingga pemeriksaan yang seharusnya menghentikan permintaan itu tidak pernah ada dalam jalur.

Perbaikan tersebut, pull request #6757, digabungkan ke dalam proyek pada 2 September 2026, dua belas hari sebelum CVE dipublikasikan dan enam hari sebelum rilis yang membawanya. Deskripsinya luar biasa terus terang tentang bentuk masalahnya: pull request tersebut menutup dua primitif akses tanpa autentikasi dalam API registrasi yang sama, bukan satu. Yang pertama adalah klien stdio. Yang kedua adalah klien MCP http atau sse yang diarahkan ke alamat loopback atau jaringan privat, yang oleh permintaan itu disebut sebagai primitif SSRF terhadap layanan internal, "termasuk endpoint metadata cloud 169.254.169.254". Keduanya kini ditolak dengan HTTP 403 ketika permintaan mencapai handler tanpa pemeriksaan kredensial yang sah. Administrator yang terautentikasi tetap mempertahankan kedua kemampuan tersebut, dan operator masih dapat menyediakan klien stdio melalui config.json.

Primitif kedua itu tidak muncul dalam teks CVE. Primitif tersebut ada di patch, dan itulah alasan perbaikannya berupa gate, bukan penghapusan: fitur itu tidak pernah menjadi bug. Yang menjadi bug adalah memperlakukan pemanggil yang tidak terautentikasi sebagai administrator.

Di mana API manajemen sebenarnya mendengarkan

Reachability adalah bagian dari catatan yang paling konsisten dijelaskan oleh sumber-sumber, dan paling sedikit diukur. Advisory JFrog menyebutkan nilai default binary bawaan sebagai localhost:8080, yang membatasi penyerang pada host itu sendiri. Advisory tim yang sama untuk celah pendamping menyatakan bahwa image Docker resmi mengikat 0.0.0.0 sebagai gantinya, dan The Hacker News mengulanginya: image tersebut membuat API manajemen dapat dijangkau dari luar kontainer jika port dipublikasikan. Quick start README Bifrost sendiri menjalankan "docker run -p 8080:8080 maximhq/bifrost", dan -p Docker mempublikasikan port kontainer pada setiap antarmuka host kecuali alamat diberikan. Advisory GitHub untuk celah tersebut mencatat bahwa jalur yang dilaporkan telah diverifikasi terhadap image maximhq/bifrost:latest yang dipublikasikan, di mana permintaan tanpa autentikasi meluncurkan /bin/sh dan menulis penanda sebagai appuser.

Apa yang tidak disediakan sumber mana pun adalah angka. Tidak ada hitungan instans Bifrost yang menghadap internet, tidak ada hasil pemindaian, tidak ada telemetri, dan tidak ada korban. Catatan itu tidak memuat kerugian nyata, dan ketiadaan tersebut adalah fakta tentang pelaporan alih-alih jaminan — kelas kerentanan hanya berbahaya ketika dua kondisi bertepatan, listener yang terekspos dan default yang tak tersentuh, dan belum ada yang menerbitkan seberapa sering keduanya terjadi.

Satu endpoint, dua kelemahan, satu akar penyebab

Delapan hari sebelum advisory MCP, pada 6 September 2026, tim riset yang sama menerbitkan CVE-2026-86242, jalur kedua tanpa autentikasi ke dalam proses yang sama. Ditemukan oleh Or Peles dan diberi skor 8.1, ia menyalahgunakan POST /api/plugins: Bifrost menerima plugin kustom yang diaktifkan yang jalurnya berupa URL HTTP, loader shared-object memperlakukan jalur berawalan http sebagai unduhan, menulis isi body ke file .so sementara lalu menyerahkan file tersebut ke plugin.Open milik Go. Jika pemuatan berhasil, fungsi Init opsional langsung dijalankan dengan konfigurasi penyerang, sebagai pengguna gateway.

Varian build menentukan apa yang didapat penyerang. Pada build yang ditautkan secara dinamis yang didokumentasikan proyek untuk plugin Go kustom, pemuatan diharapkan berhasil, yang oleh advisory disebut sebagai eksekusi kode jarak jauh tanpa autentikasi. Pada image Docker bertaut statis yang diterbitkan, plugin.Open gagal dengan "Dynamic loading not supported", sehingga permintaan yang sama turun menjadi server-side request forgery. Plugin yang dapat dimuat juga harus cocok dengan versi Go, sistem operasi, arsitektur, dan linkage host, yang merupakan batasan nyata, bukan sekadar formalitas. Perbaikannya adalah transports/v2.0.0, melalui pull request #5763, dan rentang yang terdampak adalah semua versi di bawahnya.

Jebakannya adalah urutan rilis. v2.0.0 memperbaiki jalur plugin dan tidak memperbaiki jalur MCP — The Hacker News menyatakannya secara eksplisit, dan advisory MCP JFrog mengonfirmasi bahwa v2.0.0 masih mengizinkan registrasi stdio tanpa autentikasi. Seorang operator yang menambal dengan cepat setelah advisory 6 September, berdasarkan titik itu saja, masih terekspos hingga transports/v2.1.0 dirilis pada 8 September. Kedua cacat bermuara pada kalimat yang sama dalam kedua advisory dan dalam pull request milik vendor itu sendiri: autentikasi dinonaktifkan adalah default.

Apa yang ditetapkan oleh sumber-sumber, dan apa yang tidak mereka tetapkan

Mekanisme, rentang versi, perbaikan, dan kreditnya telah disepakati di seluruh advisori, catatan CVE yang ditetapkan JFrog, pull request dan catatan rilis proyek itu sendiri, serta The Hacker News. Perbedaan pendapat yang tersisa adalah tentang tingkat keparahan, dan itu nyata.

Skor 9,8 adalah skor JFrog sebagai CNA yang menetapkan, dan skor itulah yang tercantum di NVD — catatan NVD mencantumkan reefs@jfrog.com sebagai sumber metrik dan, per 28 Oktober 2026, masih menampilkan entri tersebut dalam status "Awaiting Analysis", yang berarti NVD telah menerbitkan vektor pemberi penetapan, bukan analisisnya sendiri atas vektor itu. Penilaian SSVC dari Koordinator CISA yang terlampir pada catatan yang sama, bertanda waktu 14 September 2026, menyebut eksploitasi "none", dapat diotomatiskan "yes", dan dampak teknis "total". Model EPSS FIRST menetapkan probabilitas eksploitasi dalam 30 hari berikutnya sebesar 2,3 persen pada 27 Oktober 2026, pada persentil ke-83 di antara semua CVE yang dinilai, dan baik CVE ini maupun CVE-2026-86242 tidak muncul dalam katalog CISA Known Exploited Vulnerabilities bertanggal 27 Oktober 2026.

Terhadap hal itu, Maxim membantah penilaian tersebut. Dalam pernyataan kepada The Hacker News, Akshay Deo, chief technology officer dan salah satu pendiri perusahaan, mengatakan bahwa risiko praktisnya lebih rendah daripada yang disiratkan oleh skor kritis, karena eksploitasi memerlukan antarmuka manajemen dapat dijangkau dari jaringan yang tidak tepercaya dan operator membiarkan autentikasi tidak diatur; penerapan default dan yang didokumentasikan, katanya, menempatkan gateway di dalam jaringan privat. The Hacker News melaporkan bahwa Maxim menganggap celah tersebut bertingkat keparahan rendah dan sedang bekerja sama dengan JFrog, yang menetapkan CVE, untuk merevisi penilaian. Pernyataan itu muncul di satu media tersebut; tidak ditemukan publikasi kedua yang mengutip posisi Maxim, dan belum ada revisi yang diterbitkan per 28 Oktober 2026 — catatan CVE terakhir diperbarui pada 14 September dan entri NVD pada 18 September, keduanya masih 9.8.

Dua celah lain perlu disebutkan secara eksplisit, bukan ditutupi. Advisori GitHub proyek tersebut, yang diterbitkan pada 23 September 2026 dan mencantumkan peneliti JFrog sebagai pelapor, masih memuat nilai 9.8 untuk celah MCP dan 8.1 untuk celah plugin, tanpa tanda-tanda revisi yang dijelaskan Maxim. Dan rentang terdampak dalam advisori tersebut ditulis terhadap versi modul Go — di bawah 1.5.27 dan di bawah 1.6.3 — bukan terhadap tag rilis transports yang digunakan advisori JFrog, sehingga operator yang mencocokkan satu dokumen dengan dokumen lainnya harus menyelaraskan dua skema penomoran sebelum memutuskan apakah suatu build terdampak.

Rendered two-column card with the kicker 'BIFROST · CVE-2026-90898' and the title 'What the sources establish — and what they do not', subtitled 'Sources: JFrog JFSA-2026-001686326 (14 September 2026), the CVE record assigned by JFrog, NVD, FIRST EPSS, the CISA KEV catalogue, and the project's pull request 6757 and release tags.' The left column, headed 'ESTABLISHED' in blue, lists eight items: score 9.8 with the vector AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H supplied by the CNA; CWE-306 missing authentication with CWE-284 access control; unauthenticated POST /api/mcp/client starting a program as the gateway user; affected below transports 2.1.0 when management auth is disabled, the default; fixed in transports 2.1.0, PR 6757 merged 2 September, released 8 September 2026; CISA SSVC of 14 September 2026 with exploitation none, automatable yes, impact total; EPSS 2.3 percent at the 83rd percentile on 27 October 2026; and not in the CISA KEV catalogue dated 27 October 2026. The right column, headed 'NOT ESTABLISHED, OR CONTESTED' in amber, lists eight items: no exploitation reported, and the archive records real harm as false; no count of exposed or affected deployments in any cited source; severity contested, the vendor's CTO telling The Hacker News it is low; no published revision to the score as of 28 October 2026; NVD still Awaiting Analysis, so the 9.8 is the assigner's and not NVD's; affected ranges stated in two numbering schemes across the advisories; no detection or triage guidance in either advisory; and no evidence tying the flaw to any intrusion. A footer reads 'Card rendered by OrcaRouter'. The OrcaRouter logo is composited in the bottom-right corner.

Apa yang berubah, dan apa yang diperintahkan kepada operator untuk dilakukan

Kronologinya bergerak mundur dari pengungkapan, yang merupakan bagian paling tidak intuitif dari catatan ini. Pull request #6757 digabungkan pada 2 September 2026. transports/v2.1.0, rilis yang disebut advisory sebagai yang pertama memuat perbaikan, diterbitkan pada 8 September — enam hari sebelum CVE-2026-90898 diterbitkan pada 14 September. Perbaikan plugin proyek mendahului advisory-nya sendiri dengan cara yang sama: transports/v2.0.0 dirilis pada 26 Agustus, sebelas hari sebelum CVE 6 September. Operator yang memantau rilis alih-alih feed sudah memiliki patch sebelum menerima peringatan.

Yang diperoleh dari peningkatan versi ini sempit dan spesifik. Pada 2.1.0 dan yang lebih baru, pendaftaran stdio tanpa autentikasi mengembalikan 403 dan perintahnya tidak dimulai; administrator yang terautentikasi tetap memiliki kemampuan tersebut, dan penyediaan melalui config.json masih berfungsi. Solusi sementara dari advisory bagi siapa pun yang tidak dapat melakukan migrasi adalah menyetel governance.auth_config.is_enabled ke true, menggunakan kredensial administrator yang kuat, dan menjaga listener manajemen tetap berada di luar jaringan yang tidak tepercaya. Instruksi JFrog untuk instans yang berjalan terekspos dengan autentikasi dinonaktifkan bukanlah menyelidiki dan berharap: anggap instans tersebut telah disusupi, lalu rotasi kunci virtual dan kredensial penyedia.

Aritmetika versi adalah bagian yang paling mungkin salah dibaca. v2.0.0 tidak memperbaiki cacat ini. Lini 1.6.x hingga 1.6.11 juga tidak memuat perbaikan tersebut, dan tag seri 1.6 terbaru proyek adalah transports/v1.6.11, yang diterbitkan pada 14 Agustus 2026, tanpa lini 1.7 di repositori per 28 Oktober 2026 — jadi tidak ada rilis yang ditambal dalam seri itu, dan operator 1.6.x harus beralih ke 2.1.0 atau yang lebih baru daripada menunggu backport. Lini rilis saat ini sudah jauh melewati titik itu: transports/v2.3.2 diterbitkan pada 20 Oktober 2026.

Rendered release-timeline card with the kicker 'BIFROST · RELEASE TIMELINE', the title 'The fix shipped six days before the advisory' and the subtitle 'Dates from the project's release tags and pull request metadata, the JFrog advisories and The Hacker News. Every date below is a single day.' A horizontal timeline carries seven dated markers: 26 Aug 2026, transports 2.0.0 published; 2 Sep 2026, PR 6757 merged; 6 Sep 2026, CVE-2026-86242 published, 8.1; 8 Sep 2026, transports 2.1.0, the fix; 14 Sep 2026, CVE-2026-90898 published, 9.8; 22 Sep 2026, vendor statement reported; 23 Sep 2026, GitHub advisories published. Below it, three bars show release lines: a hatched amber bar labelled '1.6.x line' reading 'affected — no patched release in the series; newest tag 1.6.11, 14 August 2026'; a bar labelled '2.0.0' split between a pale blue segment reading 'plugin flaw fixed' and a red segment reading 'MCP flaw still open'; and a solid blue bar labelled '2.1.0 and later' reading 'MCP fix — unauthenticated stdio registration returns 403'. A foot band headed 'THE PART THAT IS EASY TO GET WRONG' notes that 2.0.0 was the patched release on 6 September and did not close the MCP path, that for the two days before 2.1.0 an operator who patched on the day of the warning was still exposed, and that the 1.6.x series has no fixed release at all. A footer reads 'Card rendered by OrcaRouter'. The OrcaRouter logo is composited in the bottom-right corner.

Dua hal terjadi setelah publikasi yang dapat dimanfaatkan oleh defender. Advisory keamanan GitHub proyek — GHSA-86gf-xh3g-rvxq untuk celah MCP dengan tingkat critical dan GHSA-2qp8-4xgm-fw6g untuk celah plugin dengan tingkat high — dipublikasikan pada 23 September 2026, sehingga feed dependensi dan advisory memiliki identifier kedua untuk dicocokkan. Dan pada 13 Oktober 2026, templat deteksi untuk CVE-2026-90898 digabungkan ke repositori publik nuclei-templates, yang berarti pemeriksaan untuk upaya registrasi tanpa autentikasi kini menjadi sesuatu yang dapat dijalankan oleh pipeline pemindaian, bukan sesuatu yang harus ditulis sendiri oleh setiap tim.

Abstract illustration on a dark navy field: a wide translucent slab representing a credential store, filled with evenly spaced glowing key-shaped tokens, stands behind a low wall. A narrow gateway aperture in the wall holds a fresh, brighter set of tokens, a blank card-shaped slip lies pushed aside on the ground in front of it, and a thin amber arc sweeps from the aperture around to the store. A second gateway aperture in the background remains closed and unlit. No text, no people, no organisation logos.

Yang masih terbuka adalah tingkat keparahannya, dan akan diselesaikan atau tidak oleh dua organisasi yang masih membicarakannya. Posisi Maxim, sebagaimana dilaporkan, adalah bahwa {{1}}9.8{{/1}} melebih-lebihkan cacat yang memerlukan listener yang terekspos dan default yang tidak disetel agar berdampak — klaim yang secara prinsip dapat diuji dan belum diuji secara publik, karena belum ada yang menerbitkan berapa banyak deployment yang memenuhi kedua kondisi tersebut. Posisi JFrog adalah skor yang ditetapkannya sebagai CNA, yang masih berlaku dalam catatan CVE dan di NVD. Sampai salah satunya menerbitkan revisi, pembacaan operasionalnya sama saja dalam kedua kemungkinan: cacat tersebut nyata dan telah diverifikasi secara menyeluruh pada image kontainer yang diterbitkan, perbaikannya dirilis sebelum peringatan, seri {{2}}1.6{{/2}} tidak memiliki perbaikan sama sekali, dan setiap instance yang berjalan dengan autentikasi dinonaktifkan pada listener yang dapat dijangkau harus diperlakukan sebagai insiden kredensial, bukan sebagai patch yang perlu dijadwalkan.