
Hermes Agent 0.20.0: Secret Profil Default Bisa Bocor ke Profil Multiplex
Mode multi-profile seharusnya memisahkan credential antar-agent. Namun pada Hermes Agent 0.20.0, secret milik profil default dapat ikut masuk ke terminal dan worker Kanban milik profil sekunder ketika gateway.multiplex_profiles: true digunakan.
Masalah ini dilaporkan di issue #82936 dan diberi label bug, auth, gateway, terminal, profil, serta risiko security boundary. Reproducer upstream menunjukkan profil sekunder yang tidak mendefinisikan sebuah credential tetap bisa membacanya dari environment proses utama.
Ini berbeda dari bug otorisasi Discord multiplex yang sebelumnya dibahas Ramadigital. Bug tersebut membuat profil memakai allowlist yang salah. Issue #82936 menyentuh lapisan lebih dalam: nilai secret profil lain dapat terlihat oleh subprocess.
Status per 13 Agustus 2026: release publik terbaru masih Hermes Agent 0.20.0 / v2026.8.3. Kandidat fix PR #83007 masih open dan belum masuk patch release resmi.
Skenario yang dilaporkan upstream
Reproducer memakai dua profil pada satu gateway multiplex:
- profil A menjadi profil default dan memiliki
SERVICE_PASSWORDdi file.env; - profil B adalah profil sekunder;
- profil B tidak memiliki
SERVICE_PASSWORD; - profil B juga tidak memasukkan variable tersebut ke
terminal.env_passthrough; - dari profil B, terminal menjalankan pemeriksaan environment;
- worker Kanban yang ditugaskan ke profil B menjalankan pemeriksaan serupa.
Hasil yang diharapkan sederhana: profil B tidak boleh melihat credential yang hanya dimiliki profil A.
Hasil yang dilaporkan justru sebaliknya. Terminal profil B dan worker Kanban profil B sama-sama dapat membaca nilai SERVICE_PASSWORD milik profil A.
Nama variable pada reproducer hanyalah contoh. Pola yang sama relevan untuk credential aplikasi lain yang namanya tidak masuk daftar blokir provider Hermes.
Kenapa isolasi profil gagal
Hermes sudah memiliki secret scope per profil. Saat request diarahkan ke profil sekunder, nilai dari .env profil tersebut dapat dimuat tanpa harus mengubah environment global proses.
Celahnya ada pada profil default dan jalur pembuatan environment subprocess.
Ketika gateway boot memakai profil default, .env profil itu dimuat ke os.environ. Nilainya sudah menjadi bagian dari environment proses sebelum routing multiplex berjalan.
Lalu terminal lokal membangun environment child process dari gabungan os.environ dan environment tambahan. Hermes memang membuang beberapa credential yang dikenali, seperti nama variable provider tertentu dan secret internal. Namun penyaring itu tidak otomatis memblokir semua nama yang terlihat seperti credential.
Variable aplikasi seperti SERVICE_PASSWORD tidak harus masuk daftar provider bawaan. Jika tidak dikenali sebagai secret internal dan tidak ada rule lain yang memblokirnya, nilainya dapat disalin dari environment global ke subprocess profil sekunder.
Jalur worker Kanban lebih terbuka lagi pada reproducer. Dispatcher membuat environment worker dari salinan os.environ, menambahkan metadata worker dan profil, lalu menjalankan proses baru. Tanpa scrub yang setara, secret profil default ikut diwariskan.
Kenapa ini bukan sekadar salah konfigurasi .env
Profil B pada reproducer memang tidak meminta credential tersebut. Tidak ada definisi lokal dan tidak ada deklarasi passthrough.
Artinya, least-privilege di level konfigurasi profil tidak menghasilkan least-privilege di runtime. Operator bisa melihat file profil B yang tampak bersih, tetapi shell atau worker yang berjalan atas nama profil B tetap membawa secret dari proses induk.
Itulah sebabnya issue ini material untuk deployment yang memakai profil sebagai trust boundary. Jika beberapa profil hanya berbeda nama atau persona, dampaknya mungkin terbatas. Jika profil mewakili client, tim, bot publik, atau level akses berbeda, boundary-nya tidak dapat dianggap aman.
Dampak praktis
Issue upstream membuktikan exposure ke subprocess, bukan kebocoran otomatis ke internet. Secret baru menjadi lebih berbahaya ketika profil sekunder dapat menjalankan terminal, mengeksekusi task Kanban, membaca environment, atau meneruskan output ke channel dan service lain.
Risiko meningkat pada susunan seperti ini:
- satu profil publik dan satu profil operasional internal;
- profil client berbeda dalam satu gateway;
- profil read-only disatukan dengan profil yang memegang credential produksi;
- worker Kanban menerima task dari sumber dengan tingkat kepercayaan lebih rendah;
- profil sekunder memiliki tool yang dapat membaca process environment;
- environment profil default memuat API key, password database, webhook secret, cloud credential, atau token automation.
Jangan membatasi audit pada nama API_KEY. Issue ini secara spesifik menunjukkan celah pada nama credential aplikasi yang tidak dikenali daftar statis. Variable yang mengandung PASSWORD, TOKEN, SECRET, AUTH, DSN, atau istilah internal perusahaan tetap perlu diperiksa.
Workaround upstream bukan boundary yang layak
Reporter menemukan bahwa profil sekunder dapat menimpa variable yang bocor dengan nilai kosong di .env miliknya. Ini dapat menghentikan satu nama variable tertentu agar tidak membawa nilai profil default.
Namun workaround ini rapuh:
- operator harus mengetahui semua nama secret profil default;
- secret baru dapat ditambahkan kemudian tanpa ikut di-shadow;
- worker dan terminal memiliki jalur spawn yang berbeda;
- typo pada nama variable membuat perlindungan gagal diam-diam;
- daftar shadow perlu disinkronkan ke setiap profil sekunder.
Menambahkan nama variable ke env_passthrough tanpa memberi nilai lokal juga tidak terbukti aman untuk worker Kanban. Pada jalur tersebut, resolver dapat jatuh kembali ke environment yang diwarisi.
Jadi nilai kosong hanya cocok sebagai mitigasi darurat untuk variable yang sudah diketahui, bukan desain isolasi produksi.
Status perbaikan upstream
PR #83007 mengusulkan perbaikan pada sisi subprocess:
- environment worker Kanban dibangun melalui helper scrub terpusat;
- credential gateway, relay, GitHub, dan auxiliary internal tidak diteruskan ke worker;
- pada mode multiplex, variable yang bentuknya credential harus di-resolve dari profil target;
- bila credential tidak tersedia pada profil target, proses gagal tertutup alih-alih mewarisi nilai profil default;
- terminal dan PTY mendapat boundary profil yang sama;
- perilaku single-profile tetap dipertahankan untuk credential provider yang memang dibutuhkan.
Deskripsi PR mencatat 121 targeted test lolos dan linting bersih. Itu evidence yang bagus, tetapi status PR masih open. Commit di pull request belum sama dengan patch stabil yang sudah dirilis.
Diskusi issue juga menghubungkan bug ini ke kelas masalah yang lebih luas: state profil masih dapat diambil dari ambient process state saat digunakan, bukan selalu diikat ke profil pemilik sejak session dibuat. Karena itu, operator tidak boleh menyimpulkan seluruh isolasi multiplex selesai hanya karena satu jalur subprocess nantinya diperbaiki.
Mitigasi aman sekarang
1. Pisahkan profil dengan trust boundary berbeda
Jalankan profil sensitif dalam proses, service, container, atau VM terpisah. Jangan mengandalkan multiplex untuk memisahkan bot publik dari agent internal, client A dari client B, atau staging dari production.
Whole-process separation menutup sumber kebocoran utama pada kasus ini: profil tidak lagi berbagi os.environ yang sama.
2. Matikan terminal dan Kanban pada profil yang tidak membutuhkan
Kurangi tool surface sambil menunggu patch resmi. Profil komunitas atau profil yang menerima input lebih luas sebaiknya tidak mendapat terminal, PTY, code execution, atau worker dengan akses environment bila fungsi tersebut tidak dibutuhkan.
3. Audit environment tanpa mencetak nilainya
Buat inventaris nama variable sensitif pada profil default. Bandingkan dengan environment yang terlihat dari setiap profil sekunder, tetapi laporkan hanya nama variable dan status terlihat/tidak terlihat.
Jangan memasukkan nilai secret ke log, tiket, screenshot, artikel, atau chat audit.
4. Rotasi credential bila exposure sudah melewati boundary
Jika output environment pernah masuk transcript, log, artifact, channel, atau task yang dapat dibaca pihak lain, anggap credential telah terekspos. Cabut atau rotasi key, periksa pemakaian, lalu kurangi scope credential baru.
Mengubah konfigurasi profil tidak menarik kembali secret yang sudah tersimpan di histori.
5. Uji negatif setelah patch tersedia
Setelah fix masuk release resmi, jangan hanya menguji bahwa profil B dapat memakai credential miliknya. Uji juga bahwa profil B gagal membaca credential profil A melalui:
- terminal biasa;
- PTY atau shell interaktif;
- worker Kanban;
- hook atau plugin yang memulai subprocess;
- cron yang diarahkan ke profil sekunder;
- restart gateway dan session restoration.
Ulangi dengan nama variable custom, bukan hanya nama provider populer.
Checklist audit multiplex
Sebelum mempertahankan gateway.multiplex_profiles: true, pastikan:
- setiap profil memiliki daftar credential yang jelas;
- profil sekunder tidak melihat nama maupun nilai secret profil default yang tidak diperlukan;
- terminal dan worker Kanban diuji secara terpisah;
- profile-specific
.envtidak bergantung pada fallback environment global; - bot publik tidak berbagi proses dengan credential internal;
- output tool tidak memantulkan environment ke channel;
- permission setiap profil mengikuti least privilege di runtime, bukan hanya di file config;
- ada jalur rotasi credential dan audit log bila exposure ditemukan;
- patch yang dipakai berasal dari release resmi atau build internal yang sudah melewati canary;
- test negatif diulang setiap kali profil, plugin, worker, atau variable baru ditambahkan.
Keputusan operasional
Hermes Agent 0.20.0 belum layak dipakai untuk menggabungkan profil dengan trust boundary berbeda dalam satu proses jika terminal atau worker Kanban aktif. Konfigurasi profil sekunder yang terlihat minim credential belum membuktikan subprocess-nya bersih.
Rekomendasi Rama Digital: pisahkan instance sekarang, audit nama variable yang terlihat dari profil sekunder, dan rotasi credential bila pernah tercetak di output. Tunggu PR #83007 atau perbaikan setara masuk release resmi, lalu buktikan isolasinya dengan test negatif terminal serta Kanban sebelum multiplex dipakai kembali.
Sumber primer:


