Ilustrasi abstrak yang dihasilkan pada latar biru dongker pekat. Struktur jembatan lebar berwarna batu sabak membentang di seluruh bingkai, dan satu port persegi panjang di sisi kirinya terbuka serta menyala kuning keemasan. Melalui bukaan itu, aliran balok-balok kecil identik mengalir keluar melintasi kisi cetak biru samar, melewati batas tipis bertitik-titik berwarna sian yang digambar di latar depan tanpa terhenti. Di kanan bawah, balok-balok tersebut mengalir masuk ke kisi transparan rendah dari node-node yang terhubung yang menyerupai penyimpanan memori. Tidak ada teks, huruf, angka, orang, tanda merek, atau logo organisasi yang muncul. Logo OrcaRouter dikomposisikan di sudut kanan bawah strip putih di bawah karya seni.
AI Safety Incidents

RufRoot: satu permintaan tanpa autentikasi ke bridge MCP Ruflo menjalankan perintah, mencuri kunci, dan meracuni memori AI

Penulis

Rowan Sterling

Tanggal Terbit

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

Pada 30 Juni 2026, Noma Labs menyerahkan kepada pemelihara Ruflo sebuah eksploit yang berfungsi terhadap proyek itu sendiri. Lengan riset Noma Security telah menemukan bahwa Ruflo — platform orkestrasi agen sumber terbuka yang sebelumnya dirilis sebagai Claude Flow — menyertakan deployment Docker Compose bawaan yang mengikat jembatan Model Context Protocol ke port 3001 pada setiap antarmuka jaringan dan tidak meminta autentikasi sama sekali. Satu permintaan HTTP saja ke /mcp endpoint sudah cukup untuk menjalankan perintah shell di dalam kontainer sebagai node pengguna, dan dari shell tersebut penyerang dapat membaca setiap kunci API penyedia LLM di lingkungan, mengambil seluruh percakapan tersimpan, memunculkan kawanan agen yang ditagihkan ke kunci korban, dan menulis instruksi ke AgentDB penyimpanan pembelajaran yang akan terus mengarahkan jawaban AI bagi setiap pengguna instans tersebut. Cacat ini adalah CVE-2026-59726, dijuluki RufRoot, diberi skor CVSS 10.0 dan diperbaiki pada versi 3.16.3 dalam waktu 24 jam. Tidak ada sumber yang kami baca melaporkan bahwa cacat ini dieksploitasi di alam liar. Catatan arsip itu sendiri untuk cacat ini, beserta daftar sumber dan tingkat keyakinannya, berada di arsip insiden AI, di samping entri MCP dan infrastruktur lain yang dicatat di sekitarnya.

Default yang membuka pintu

Ruflo adalah yang disebut Noma Labs sebagai meta-harness agen: lapisan self-hosted untuk kawanan hingga 100 agen, dibuat untuk Claude Code dan OpenAI Codex, dengan memori jangka panjang dan server MCP bawaan untuk pemanggilan alat. Penyiapan yang umum adalah seperti yang dijelaskan Noma — kloning repositori, tambahkan kunci API LLM, jalankan docker compose up -d. Berkas compose default proyek mengikat bridge ke 0.0.0.0 pada port 3001 dan mengikat MongoDB pendampingnya ke semua antarmuka pada 27017, dengan autentikasi Mongo dimatikan. Seberapa jauh jangkauannya bergantung pada firewall, security group, dan segmentasi jaringan di sekitar deployment; rumusan Noma sendiri adalah bahwa setiap instans yang dapat dijangkau melalui jaringan sepenuhnya dapat dieksploitasi tanpa autentikasi.

MCP bridge adalah server Express.js yang mengubah permintaan JSON-RPC yang masuk melalui HTTP menjadi panggilan terhadap pustaka alat internal Ruflo. Pada baris rentan, pustaka tersebut menyimpan 233 alat yang mencakup akses shell, operasi basis data, manajemen agen, dan penyimpanan memori. Tulisan Noma blak-blakan tentang apa yang membuatnya demikian: "MCP Bridge bukan antarmuka debug tambahan yang sembarangan; melainkan, ini adalah sistem saraf pusat Ruflo. Setiap panggilan alat, setiap tindakan agen, setiap operasi memori melewati MCP Bridge."

Lapisan autentikasi tidak ada, bukan sekadar lemah. POST /mcp dan POST /mcp/:group mengimplementasikan protokol MCP JSON-RPC dan meneruskan permintaan tools/call yang masuk langsung ke fungsi internal executeTool(). Ruflo memang memelihara daftar blokir perintah, AUTOPILOT_BLOCKED_PATTERNS, yang dimaksudkan untuk menghentikan operasi shell berbahaya, tetapi advisory GitHub menyatakan secara eksplisit bahwa daftar itu "hanya ditegakkan dalam alur autopilot. POST /mcp dan POST /mcp/:group melewatinya." Satu panggilan tanpa autentikasi yang menyebut ruflo__terminal_execute karenanya menjalankan perintah arbitrer sebagai pengguna node pada kontainer, yang tercatat dalam advisory sebagai uid 1000, tanpa memerlukan token, sesi, atau interaksi sebelumnya. Tidak diperlukan eskalasi hak istimewa untuk hal yang terjadi berikutnya: kredensial, API agen, penyimpanan memori, dan basis data semuanya dapat dijangkau dari shell tersebut.

Rantai, dalam delapan langkah

Noma Labs menerbitkan proof of concept delapan langkah dan mengonfirmasi setiap langkah secara langsung terhadap deployment Ruflo default di AWS EC2, menggunakan callback out-of-band ke Burp Collaborator untuk memverifikasi eksekusi dan eksfiltrasi. Langkah-langkah tersebut bukan konsekuensi spekulatif yang ditumpuk pada bug teoretis; itu adalah urutan yang didemonstrasikan, dan bagian remediasi dalam advisory ditulis untuk operator yang mungkin sudah berada di dalamnya.

A hand-built HTML card headed 'The RufRoot chain, step by step', kicker 'RufRoot - CVE-2026-59726', subtitle 'Eight steps Noma Labs confirmed live against a default Ruflo deployment on AWS EC2'. Eight rows, each with a circled step number, the action, and what it yielded. 1, call tools/list: enumerate the 233 exposed tools. 2, call ruflo__terminal_execute over POST /mcp: shell inside the bridge container as node, uid 1000, verified by an out-of-band callback. 3, run printenv: every LLM provider API key in the container environment. 4, call ruflo__swarm_init and ruflo__agent_spawn: attacker-controlled agent swarms running on the victim's keys and compute. 5, call ruflo__agentdb_pattern-store: a fabricated SOC2 policy in the learning store, steering future output for all users. 6, query MongoDB on port 27017: every stored conversation, title and metadata. 7, write /app/beacon.js and inject it into index.js, then kill PID 1: a backdoor that survives the container restart policy. 8, clear shell history: no forensic trace. A footer cites Noma Labs and CVE-2026-59726, and marks step 5 as the step a patched redeploy does not undo.

Rekonaisans dilakukan lebih dulu karena daftar alat bersifat publik bagi pemanggil mana pun: tools/list mengembalikan semua 233 entri tanpa kredensial. Eksekusi perintah juga dapat dilakukan melalui endpoint yang sama, dan proof of concept Noma mengonfirmasinya dengan callback out-of-band alih-alih menyimpulkannya dari isi respons. Langkah lingkungan adalah langkah yang mengubah kompromi host menjadi masalah penagihan dan kehilangan data: file compose meneruskan kunci penyedia ke dalam kontainer dan proses backend mewarisi seluruh lingkungan melalui { ...process.env }, sehingga satu printenv saja membocorkan semuanya. Kunci-kunci itu kemudian memungkinkan ruflo__swarm_init dan ruflo__agent_spawn untuk memulai swarm yang dikendalikan penyerang yang menghabiskan kuota dan komputasi korban.

Langkah kelima adalah langkah yang bertahan lebih lama daripada intrusi tersebut. Menggunakan ruflo__agentdb_pattern-store, Noma menanam kebijakan kepatuhan SOC2 palsu yang menginstruksikan AI untuk menyematkan URL yang dikendalikan penyerang ke dalam setiap skrip deployment yang selanjutnya dihasilkannya. Karena AgentDB ada untuk menyimpan secara persisten pola semacam ini agar perilaku agen membaik di berbagai sesi, entri yang disuntikkan tersebut berperilaku sebagaimana sistem itu dirancang untuk berperilaku. "Percakapan di masa depan menghasilkan keluaran yang dipengaruhi penyerang, dan pengguna tidak punya cara untuk membedakannya," demikian pernyataan dalam tulisan Noma. Dark Reading, yang melaporkan cacat tersebut pada 29 Juli, menyampaikan perbedaan itu kepada seorang pakar eksternal: John Gallagher, wakil presiden di Viakoo, menyebutnya sebagai kelas masalah yang berbeda: "Ini bukan mengeksploitasi celah perangkat lunak, ini adalah keracunan memori."

Langkah-langkah tersisa adalah pasca-eksploitasi konvensional, dijalankan dengan kemudahan yang tidak biasa. MongoDB di jaringan Docker internal tidak memiliki autentikasi, sehingga para penyerang memasang klien di /tmp, mengekspor percakapan dan mengirimkannya keluar. Persistensi diperoleh dengan menulis /app/beacon.js, menambahkan baris require('./beacon.js') ke index.js dan mematikan PID 1, setelah itu kebijakan restart Docker mengembalikan kontainer dengan beacon aktif. Langkah terakhir adalah menghapus riwayat shell. Semua itu berawal dari satu permintaan tanpa autentikasi; tidak ada apa pun dalam deployment default yang menghentikan rantai tersebut pada titik mana pun.

Perbaikan, dan bagian yang tidak dapat dijangkau oleh patch

Pengelola merilis Ruflo 3.16.3 dalam 24 jam setelah pengungkapan pada 30 Juni, dan GitHub menerbitkan advisory GHSA-c4hm-4h84-2cf3 pada 1 Juli 2026. Perbaikan, yang dilacak di repositori sebagai ADR-166 dan digabungkan dalam pull request 2521, mengubah default alih-alih sekadar menambahkan pemeriksaan:

• Jembatan MCP mengikat 127.0.0.1 secara default; pengikatan publik memerlukan MCP_AUTH_TOKEN, dan proses keluar dengan pesan fatal saat boot jika token tidak ada.

• Middleware token Bearer dengan perbandingan waktu konstan berada di depan bridge.

• terminal_execute dibatasi di sisi server di balik MCP_ENABLE_TERMINAL=true, nonaktif secara default, dan gerbangnya diterapkan secara identik pada /mcp, /mcp/:group dan alur autopilot — tautan yang hilang yang telah memungkinkan rantai yang terungkap mencapai shell.

• MongoDB memerlukan autentikasi, dengan kata sandi root yang diperlukan agar container dapat boot.

• Container bridge menjalankan sistem berkas root hanya-baca dengan tmpfs, allowlist CORS menggantikan wildcard, dan pengunci regresi CI mencakup konfigurasi statis serta perilaku runtime.

Tidak satu pun dari itu menghapus entri yang sudah tertulis ke dalam AgentDB. Peringatan itu memberi tahu operator dari instans mana pun yang terekspos untuk segera memasang firewall pada port 3001 dan 27017, merotasi kunci penyedia, mengaudit penyimpanan pola untuk entriagentdb_pattern-store yang disuntikkan dan menghapusnya, mengaudit MongoDB untuk mendeteksi manipulasi, serta membangun ulang kontainer dari image bersih. Peringatannya luar biasa lugas: "Penyebaran ulang yang telah ditambal saja TIDAK membatalkan peracunan." Tulisan Noma sampai pada kesimpulan yang sama — mengaudit penyimpanan pola adalah bagian dari remediasi, dan patch bukanlah bagian darinya.

Alasannya bersifat struktural, bukan karena kelalaian. Penyimpanan pola yang membentuk keluaran model di masa depan tidak punya cara untuk membedakan instruksi sah yang telah dipelajari dari instruksi yang ditanam penyerang; keduanya datang sebagai pola, dan sistem dibangun untuk mempercayainya. Hal itu mengubah kerentanan jaringan menjadi masalah integritas data dengan backlog yang tidak diketahui, dan itu berarti pertanyaan bagi operator bukan hanya apakah port dapat dijangkau, tetapi apa yang kini tersimpan di memori.

A hand-built HTML timeline card headed 'From disclosure to coverage', kicker 'RufRoot - disclosure timeline', subtitle 'Five dates, from the private report to the day the record was filed'. Six dated rows. 30 June 2026: Noma Labs discloses the flaw to Ruflo's maintainer with a working proof of concept. 1 July 2026: Ruflo 3.16.3 ships and GHSA-c4hm-4h84-2cf3 is published with CVSS 10.0. 9 July 2026: the CVE record for CVE-2026-59726 is published in the National Vulnerability Database, later marked Deferred. 29 July 2026: The Hacker News and Dark Reading report the flaw; Noma Labs publishes its research. 30 July 2026: SecurityWeek reports it, and the record is dated to this day. A separate amber note reads: no source we read reports exploitation in the wild at any point on this timeline. A footer cites The Hacker News, the GitHub advisory API, the NVD record and SecurityWeek.

Apa yang sudah mapan, dan apa yang belum

Catatan teknis di sini bersifat primer dan konsisten. Advisory tersebut menyebutkan paket yang terdampak (npm ruflo di bawah 3.16.3), versi yang telah ditambal, endpoint persis, pengguna kontainer, dan dua port; catatan rilis pengelola menggambarkan rantai yang sama; tulisan Noma menyediakan detail proof-of-concept; dan media independen — The Hacker News dan Dark Reading pada 29 Juli 2026, SecurityWeek pada 30 Juli — melaporkan mekanisme yang sama tanpa menambahkan rincian yang saling bertentangan. Catatan riset Cloud Security Alliance tertanggal 5 Agustus 2026 menyatakan ulang urutan tersebut dan menempatkannya bersama kerentanan MCP dan orkestrasi agen tanpa autentikasi yang lebih awal yang telah dilacaknya. Arsip memberi catatan tersebut tingkat keyakinan A, tidak dipersoalkan, dan menandainya sebagai tonggak; tingkat keparahan untuk catatan tersebut tinggi, berbeda dari skor CVSS itu sendiri.

Satu detail penilaian perlu dinyatakan secara tepat, karena dua dokumen utama tidak sepakat. GHSA-c4hm-4h84-2cf3 mencantumkan CVSS 10.0 pada vektor AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — perubahan cakupanlah yang mendorongnya ke nilai maksimum. Salinan advisory yang sama di halaman rilis 3.16.3 menggambarkan skor tersebut sebagai "CVSS 9.8 kritis". Catatan National Vulnerability Database, yang diperiksa pada 30 Oktober 2026, diterbitkan pada 9 Juli 2026, dan ditandai Ditunda, mencantumkan nilai GitHub 10.0 sebagai metrik sekunder dan tidak memiliki skor buatan NVD sendiri. Kami tidak menemukan penjelasan untuk angka 9.8 tersebut, dan tulisan ini tidak menyelesaikannya.

Angka adopsinya lebih kecil. Noma Labs saat itu menggambarkan proyek tersebut sebagai memiliki lebih dari 67.000 bintang GitHub, sekitar 10 juta unduhan, dan sekitar 1 juta pengguna aktif; The Hacker News, sebagaimana dirangkum oleh Cloud Security Alliance, menyebut lebih dari 66.500 bintang. Jumlah unduhan dan pengguna merupakan data Noma sendiri dan tidak diverifikasi secara independen. Jumlah bintang repositori pada 30 Oktober 2026 adalah 80.198 — sebuah pemeriksaan atas jangkauan proyek, bukan ukuran eksposur, dan tidak ada sumber yang telah menerbitkan berapa banyak deployment yang benar-benar dapat dijangkau dari suatu jaringan.

A hand-built HTML card headed 'Established, and not', kicker 'RufRoot - evidence', subtitle 'What the advisory, the release notes and the research support, against what nobody has shown'. Two columns. The left column, headed 'Established', lists: CVE-2026-59726 affects npm ruflo below 3.16.3 and is patched in 3.16.3; the default compose file bound the MCP bridge to 0.0.0.0 on port 3001 and MongoDB to 27017 without authentication; POST /mcp and POST /mcp/:group reached 233 tools and terminal_execute with no credential, running as node, uid 1000; Noma Labs confirmed an eight-step chain live on AWS EC2 with out-of-band callbacks, including an AgentDB pattern injection; the advisory was published 1 July 2026 with CVSS 10.0 and the fix shipped within 24 hours of the 30 June disclosure; the archive record is confidence A, undisputed, no real harm recorded, GLOBAL, MCP and INFRA. The right column, headed 'Not established', lists: that anyone exploited the flaw in the wild; how many Ruflo deployments were actually network-reachable; that any instance's AgentDB was poisoned, since no audit results are published; whether 9.8 in the release notes or 10.0 in the advisory is the intended score; Noma's counts of 10M downloads and 1M active users, which no independent source confirms; that any operator received notice beyond the public advisory. A footer cites GHSA-c4hm-4h84-2cf3, the Ruflo 3.16.3 release notes, Noma Labs and SecurityWeek.

Yang tidak terbukti adalah bagian yang paling mudah dibesar-besarkan. Baik Noma, pengelola, maupun media mana pun yang kami baca tidak mengklaim bahwa celah tersebut dieksploitasi di dunia nyata, dan arsip tidak mencatat kerugian nyata untuk entri ini. Proof of concept Noma dijalankan terhadap deployment yang dikendalikan para peneliti di EC2, yang menunjukkan apa yang diizinkan oleh instalasi default, bukan apa yang dialami instans produksi tertentu. Belum ada jumlah deployment Ruflo yang terekspos ke internet yang dipublikasikan, dan belum ada operator yang mempublikasikan hasil audit AgentDB, sehingga populasi yang terdampak dan jumlah memori tercemar yang ada sama-sama tidak diketahui. Saran Cloud Security Alliance untuk memperlakukan deployment yang terekspos sebagai kompromi total adalah postur risiko yang dibenarkan oleh eksploitasi tanpa interaksi; itu bukan bukti bahwa telah terjadi pembobolan.

Mengapa arsip itu menandainya sebagai tonggak sejarah

Penanda tonggak arsip ini bertumpu pada sesuatu yang lebih spesifik daripada skor maksimum. Bug eksekusi kode jarak jauh CVSS 10.0 di layanan self-hosted populer adalah genre yang familier, dan perbaikannya di sini tiba dalam 24 jam. Yang membedakan RufRoot adalah bahwa eksploit tersebut berakhir di pipeline pembelajaran AI itu sendiri, tempat remedi konvensional — tingkatkan versi, deploy ulang, tutup port — membiarkan instruksi yang disuntikkan tetap di tempatnya dan masih membentuk jawaban. Catatan Cloud Security Alliance menilainya sebagai studi kasus dalam pola yang telah didokumentasikannya di berbagai perangkat agen, termasuk rantai checkpoint LangGraph dan permukaan AutoGen Studio tanpa autentikasi, dan berargumen bahwa memori persisten yang digunakan untuk membentuk perilaku agen harus diperlakukan sebagai penyimpanan data sensitif di bawah pemantauan integritas, bukan sebagai cache.

Pembingkaian ulang itu adalah inti praktisnya. Artefak yang terlihat dari insiden ini adalah dependensi yang telah ditambal dan sebuah advisory yang diterbitkan; yang tak terlihat adalah pola apa pun yang mungkin masih tersimpan dalam AgentDB milik seorang operator, dan tidak ada alat atau signature terbitan yang dapat membedakan kebijakan hasil pembelajaran yang sah dari kebijakan yang disisipkan secara sengaja. Bagi organisasi yang menjalankan file compose default di balik jaringan yang dapat dijangkau, respons yang berguna adalah respons yang diberikan oleh Noma maupun advisory tersebut: anggap kunci-kunci itu telah dibaca, putar ulang kunci tersebut, dan periksa memori sebelum memercayai jawaban yang dihasilkannya.