
Hermes Agent baru saja menambahkan Browser Use mode ke branch main. Mode ini mengganti banyak tool browser menjadi satu tool bernama browser_exec, lalu membiarkan agent menulis Python untuk mengendalikan browser. Lebih ringkas, lebih hemat tool call, tetapi ada celah pada pemeriksaan URL-nya.
PR #84999, dibuka pada 13 Agustus 2026, menunjukkan bahwa pemeriksaan awal hanya melihat URL HTTP(S) yang tertulis utuh di source code. URL yang dirangkai saat runtime atau tujuan akhir sebuah redirect tidak diperiksa ulang. Akibatnya, browser dapat mendarat di loopback, layanan privat, atau endpoint metadata, lalu mengembalikan isi halaman ke agent.
Statusnya perlu dibaca dengan tepat. Release publik terbaru masih Hermes Agent 0.20.0 / v2026.8.3 dari 3 Agustus 2026. Release itu belum memuat browser_exec. Fitur Browser Use mode baru masuk ke main lewat PR #81958 pada 10 Agustus. Jadi, temuan ini terutama relevan untuk operator yang mengikuti main, memakai build development, atau sedang mengevaluasi fitur ini sebelum rilis berikutnya.
Di mana celahnya
Sebelum menjalankan Python dari model, browser_exec memindai source code dengan pola URL. Setiap URL literal yang ditemukan lalu dikirim ke pemeriksaan keamanan yang sudah ada.
Mekanisme ini dapat menahan kode yang menuliskan alamat terlarang secara langsung. Masalahnya, source scanner tidak tahu nilai akhir yang baru terbentuk saat program berjalan.
Contoh bentuk yang lolos dari pemeriksaan literal:
scheme = "http"
host = get_target_from_previous_step()
new_tab(scheme + "://" + host)
Tidak ada URL HTTP(S) lengkap di source tersebut. Nilai host baru diketahui saat runtime. Pola serupa dapat muncul tanpa niat jahat ketika agent mengambil host dari hasil tool, file konfigurasi, JavaScript halaman, atau respons API.
Redirect membuka jalur kedua. Kode dapat membuka URL publik yang terlihat aman, tetapi server tujuan mengalihkan browser ke alamat internal. Pemeriksaan hanya terhadap URL awal tidak menjawab pertanyaan terpenting: browser akhirnya mendarat di mana?
Pada implementasi di main saat audit dilakukan, hasil eksekusi langsung dikembalikan setelah subprocess selesai. Belum ada post-navigation check yang membaca kembali window.location.href sebelum output halaman diberikan ke model.
Kenapa output harus ditahan, bukan sekadar diberi peringatan
Dalam browser_exec, standard output adalah jalur kembalinya isi halaman. Jika pemeriksaan baru dilakukan setelah halaman internal dibaca tetapi kontennya tetap disertakan dalam respons, perlindungan SSRF praktis sudah terlambat.
Dampak yang masuk akal meliputi:
- membaca panel admin yang hanya tersedia di loopback;
- menjangkau service privat dalam jaringan yang sama;
- mengambil respons endpoint metadata cloud;
- memasukkan data internal ke konteks model;
- meneruskan isi tersebut ke log, memory, atau tool lain dalam workflow berikutnya.
Belum ada advisory publik atau bukti eksploitasi massal. Repository juga menjelaskan dalam Security Policy bahwa filter di dalam proses adalah heuristic, bukan security boundary yang diandalkan proyek. Boundary yang dianggap kuat tetap isolasi pada level OS.
Itu tidak membuat bug ini sepele. Dokumentasi Browser Use mode menyebut browser_exec menjalankan Python buatan model pada mesin operator. Saat agent menerima halaman web, email, pesan, atau konten lain yang tidak sepenuhnya dipercaya, model-written code berada di jalur yang dipengaruhi input eksternal. Filter URL tetap penting sebagai lapisan pencegahan, meskipun tidak boleh dijadikan satu-satunya pertahanan.
Ini berbeda dari bug SSRF monitor mode
Ramadigital.id sebelumnya membahas bug monitor mode Hermes Agent. Keduanya sama-sama menyentuh SSRF, tetapi jalurnya berbeda.
Monitor mode bermasalah pada fetch URL milik cron dan juga punya risiko kehilangan perubahan karena race pada state. Temuan terbaru berada di browser_exec, yaitu eksekusi Python untuk otomasi browser. Trigger, komponen, dan status rilisnya tidak sama.
Perbedaannya penting untuk audit. Mematikan monitor URL tidak menutup risiko browser_exec. Sebaliknya, operator stable 0.20.0 yang belum mengambil kode main tidak otomatis terkena bug baru ini hanya karena memakai tool browser lama.
Perbaikan yang diajukan upstream
PR #84999 menambahkan pemeriksaan kedua setelah kode selesai dijalankan.
1. Membaca URL tempat browser benar-benar mendarat
Hermes menambahkan trailer kecil pada kode yang dapat diparse. Trailer tersebut membaca window.location.href dan menulis URL akhir menggunakan marker internal. Parent process kemudian mengambil marker terakhir dari output.
Pemilihan marker terakhir juga mencegah halaman memalsukan URL aman dengan mencetak marker serupa lebih dulu.
2. Memeriksa URL akhir dengan policy yang sama
Jika URL akhir mengarah ke metadata cloud, private address, loopback, atau target lain yang ditolak policy, hasil eksekusi menjadi error.
3. Menahan seluruh output halaman
Saat landed URL ditolak, output halaman tidak dikembalikan. Ini keputusan yang benar karena output tersebut adalah saluran data utama dari browser ke model.
4. Mempertahankan pre-check sebagai fast path
Pemeriksaan URL literal tidak dihapus. URL terlarang yang sudah terlihat di source tetap ditolak sebelum subprocess dijalankan. Post-navigation check menjadi lapisan kedua untuk URL dinamis dan redirect.
Patch juga mengusulkan test regresi untuk metadata address yang dibentuk saat runtime, redirect ke private address, pemalsuan marker, URL publik, syntax error, dan fast path sebelum spawn.
Namun, PR tersebut masih terbuka ketika artikel ini ditulis. Required check publik belum berstatus hijau, dan belum ada tag atau patch release yang memuat perbaikan. Arah fix terlihat tepat, tetapi belum boleh diperlakukan sebagai patch produksi resmi.
Siapa yang perlu bertindak sekarang
Prioritas audit tinggi jika deployment Anda memenuhi satu atau lebih kondisi berikut:
- menginstal Hermes dari branch
mainsetelah 10 Agustus 2026; - memakai commit atau image development yang sudah memuat PR #81958;
- Browser Use mode aktif dan tool
browser_exectersedia; - Hermes dapat menjangkau loopback, subnet privat, panel internal, atau metadata cloud;
- agent menerima konten web, email, chat, MCP response, atau input lain yang tidak sepenuhnya dipercaya;
- output browser dapat diteruskan ke memory, file, webhook, atau channel eksternal.
Cara paling sederhana untuk memeriksa exposure adalah melihat toolset sesi. Jika model hanya mendapat tool browser lama dan tidak ada browser_exec, jalur spesifik ini tidak tersedia. Tetap audit tool browser lain sesuai policy versinya, tetapi jangan mencampur dua implementasi yang berbeda.
Mitigasi sebelum patch resmi
1. Jangan pakai Browser Use mode pada build main untuk workload untrusted
Untuk sementara, gunakan tool browser bawaan atau pin ke release stable yang belum memuat browser_exec. Pastikan perubahan mode benar-benar terlihat pada toolset sesi, bukan hanya pada file konfigurasi.
2. Batasi egress proses Hermes
Blokir akses yang tidak diperlukan ke:
- loopback service sensitif;
- private subnet;
- link-local address;
- metadata endpoint cloud;
- control plane, database, dan admin API internal.
Lakukan pada firewall, container network, VM policy, atau sandbox. Prompt dan source scanner tidak cukup untuk menjadi boundary.
3. Pisahkan browser agent dari service internal
Jika Hermes hanya perlu mengakses web publik, jangan jalankan browser pada host yang sekaligus memiliki akses luas ke database, secret manager, panel deployment, atau jaringan produksi.
4. Kurangi tool dan credential pada sesi browsing
Browser task tidak perlu otomatis mendapat file write, shell luas, credential produksi, webhook, atau delivery eksternal. Semakin kecil izin sesi, semakin kecil dampak bila halaman mencoba memengaruhi agent.
5. Jangan mengandalkan allow_private_urls untuk workload campuran
Akses private URL mungkin dibutuhkan saat mengembangkan aplikasi lokal. Pisahkan profile atau instance untuk pekerjaan tersebut. Jangan menyatukan akses LAN dengan browsing web tidak tepercaya dalam trust envelope yang sama.
6. Uji patch dengan canary yang Anda kontrol
Setelah fix dirilis, gunakan service dummy di private address dan redirector milik sendiri. Pastikan:
- URL privat literal ditolak sebelum eksekusi;
- URL privat yang dibentuk saat runtime ditolak;
- redirect publik ke target privat ditolak;
- isi halaman dummy tidak muncul di output;
- URL publik normal tetap bekerja;
- marker internal tidak bocor ke respons model.
Jangan menguji endpoint metadata asli jika canary lokal sudah cukup membuktikan policy.
Keputusan operasional
Temuan browser_exec ini material, tetapi scope-nya bukan release stable 0.20.0. Bug muncul pada fitur Browser Use mode yang baru masuk ke branch main setelah release terakhir.
Rekomendasi Rama Digital: operator stable tetap pin ke tag resmi, sedangkan pengguna main sebaiknya menonaktifkan browser_exec untuk input tidak tepercaya sampai fix final sudah merged dan masuk release. Untuk deployment produksi, tempatkan seluruh proses Hermes di boundary OS dengan egress minimum. Post-navigation URL check adalah defense-in-depth yang perlu, bukan pengganti isolasi jaringan.


