Ilustrasi abstrak yang dihasilkan pada latar biru dongker gelap: garis luar jendela peramban di sebelah kiri mengirim pita berbentuk mirip glif pucat melintasi soket sempit yang bercahaya ke panel terminal di sebelah kanan. Pita kedua yang lebih gelap bergabung ke soket yang sama dari bawah dan glif-glifnya tiba di terminal tanpa bisa dibedakan dari yang pertama. Tidak ada teks, orang, atau logo organisasi yang muncul. Logo OrcaRouter ditempatkan pada strip footer putih di kanan bawah.
AI Safety Incidents

Tencent BrowserSkill Hanya Memeriksa Apakah ID Ekstensi Tampak Valid — Ekstensi Apa Saja Dapat Menyuapi Agen dengan Halaman Palsu

Penulis

Rowan Sterling

Tanggal Terbit

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

Pada 17 September 2026, seorang pengguna GitHub dengan nama pengguna carfeii membuka issue #273 pada proyek sumber terbuka BrowserSkill milik Tencent dengan klaim yang sempit: daemon lokal yang menghubungkan ekstensi browser ke agen AI tidak memeriksa ekstensi mana yang terhubung, hanya bahwa koneksi tersebut tampak seperti ekstensi sama sekali. Tiga hari kemudian, pada 20 September, VulnCheck menerbitkan temuan tersebut sebagai CVE-2026-94111, yang menggambarkan daemon yang "menerima origin chrome-extension apa pun dengan 32 karakter dalam rentang a-p," mengklasifikasikannya sebagai CWE-346 (kesalahan validasi origin), dan mencantumkan George Chen sebagai kreditnya. Advisory tersebut memberinya skor CVSS 4.0 6.9, sedang, dengan dampak integritas dinilai tinggi serta kerahasiaan dan ketersediaan rendah. Tidak ada dalam catatan yang menunjukkan bahwa kelemahan tersebut digunakan: arsip tidak mencatat eksploitasi dan menilai keyakinan entri A, dengan real_harm false. Ini adalah satu catatan dalam arsip insiden AI, di mana setiap entri membawa sumbernya sendiri, tingkat keparahan, tingkat keyakinan, dan tanda yang diperdebatkan.

Pemeriksaan format yang tidak pernah memeriksa identitas

Kode di pusat catatan itu kecil. Di crates/bsk-cli/src/daemon/ws.rs, fungsi origin_allowed() mengambil header Origin dari handshake WebSocket, menghapus string chrome-extension://, dan mengembalikan true jika sisanya tepat 32 karakter dan setiap karakter berada di antara a dan p. Itu adalah pengujian lengkap. Pengujian itu dijalankan sekali, di dalam callback upgrade HTTP, dan kegagalan mengembalikan 403 dengan pesan "Origin not in chrome-extension allow-list" — meskipun sebagaimana dipublikasikan tidak ada daftar yang bisa dimasuki.

Pola itu tidak sembarangan. ID ekstensi Manifest V3 Chrome terdiri dari 32 karakter yang diambil tepat dari enam belas huruf tersebut, sehingga pemeriksaan itu dengan benar mengenali bentuk origin ekstensi yang nyata. Cacatnya adalah setiap ekstensi memiliki bentuk itu. Pemeriksaan itu menanyakan apakah pemanggil tampak seperti ekstensi browser, tidak pernah apakah itu ini ekstensi browser proyek, dan pengenal yang seharusnya dibandingkan dengannya sudah publik: README proyek menautkan listing Chrome Web Store, yang ID-nya adalah hhcmgoofomhgciiibhipgmgkgnoenaoi, dan ID Edge Add-ons di sampingnya. Tidak satu pun dari kedua string itu muncul di mana pun dalam gate.

Daemon mendengarkan pada port lokal tetap, 52800, yang dideklarasikan sebagai DEFAULT_WS_PORT di CLI dan digunakan tanpa variasi pada jalur koneksi lokal. Port tersebut terdokumentasi, konstan, dan dapat dijangkau oleh apa pun yang sudah berjalan di profil browser pengguna. Lokasi adalah alasan vektor dalam advisory dimulai dengan AV:L — penyerang memerlukan pijakan di mesin, dan PR:L mencatat bahwa pijakan dengan hak istimewa rendah sudah cukup. Ekstensi yang terpasang di profil yang sama persis merupakan jenis pijakan tersebut.

Berapa nilai kursi itu, dan seberapa besar darinya yang sudah mapan

Kalimat dampak dalam advisory itu bersifat luas: penyerang yang mendaftarkan ekstensi berbahaya sebagai klien browser dapat “mencegat dan memanipulasi konten halaman, DOM, dan tangkapan layar yang dikembalikan ke agen AI.” Itulah deskripsi yang dimuat oleh CVE, catatan advisory GitHub GHSA-x6f2-qp26-2xrh, dan arsip tersebut, dan itu menjelaskan peringkat integritas CVSS yang tinggi. Itu juga merupakan ringkasan yang ditulis oleh pihak yang menetapkan CVE, bukan laporan serangan yang telah didemonstrasikan.

Uraian yang lebih cermat muncul pada minggu yang sama, di dalam utas issue itu sendiri. Pada 20 September, seorang komentator dengan nama pengguna bb6894 melaporkan telah memeriksa ulang kode terhadap main pada commit fa953dc6 (18 September) dan menelusuri apa yang sebenarnya dapat dijangkau klien asing setelah handshake. Sebagian besar metode tool masuk, kata komentar itu, mengembalikan UnknownMethod kepada peer WebSocket; permintaan audit dibatasi pada catatan milik klien itu sendiri; dan tindakan lintas sesi seperti window_closed, user_interrupt, dan update_interaction dijaga terhadap sesi yang dimiliki peramban lain. Yang lolos dari filter tersebut lebih sempit dan, bagi agen, bisa dibilang lebih buruk daripada intersepsi: ekstensi asing dapat mengambil slot peramban dengan instance_id yang dipilih penyerang, dan jika ekstensi itu satu-satunya peramban yang terdaftar — cold start atau restart daemon — ia menerima permintaan tool dari agen dan menjawabnya dengan konten halaman, DOM, atau tangkapan layar yang direkayasa. Komentator menyebut ini "pemalsuan hasil terhadap agen" dan "saluran masuk ke persepsi agen." Efek kedua adalah denial of service: dengan peramban asli juga online dan tanpa selector, startup sesi dapat gagal dengan MultipleBrowsersOnline.

Tidak satu pun dari kedua versi itu telah didemonstrasikan secara publik. Reporter menggambarkan proof of concept sebagai "tersedia berdasarkan permintaan"; tidak ada yang menerbitkannya, dan tidak ada eksploitasi yang tercatat. Jadi perbedaan antara kedua versi tersebut adalah perbedaan antara dua pembacaan atas berkas sumber yang sama, bukan antara sebuah teori dan eksploit yang berfungsi — dan artikel itu melaporkan keduanya alih-alih memilih. Yang dapat dikatakan secara pasti adalah bahwa tidak pernah ada pemeriksaan identitas kedua setelah handshake, sehingga apa pun yang diizinkan masuk oleh gerbang itu tetap diizinkan masuk selama koneksi berlangsung.

Kodenya sudah tahu

Dokumen yang paling tidak nyaman dalam catatan ini bukanlah advisory-nya. Dokumen itu adalah komentar yang berada tepat di atas fungsi, yang ikut dikirimkan dalam rilis bertag yang dirujuk oleh advisory tersebut. Komentar itu menandai celah tersebut sebagai TODO(M10/M12), menyebutkan allow-list yang ingin dibangunnya — sebuah himpunan DaemonConfig::allowed_extension_ids yang diisi dari file konfigurasi atau alur pairing — lalu menyatakan alasan penundaannya: "celah defense-in-depth yang dapat diterima untuk saat ini karena pairing terjadi melalui popup, tetapi ekstensi yang di-side-load di mesin yang sama saat ini masih lolos dari gerbang tersebut."

Dibaca apa adanya, para maintainer tahu pemanggil mana yang diloloskan gerbang, mencatat bahwa mereka mengetahuinya, dan tetap merilisnya. Itu tidak membuat paparan menjadi lebih besar daripada yang dinyatakan dalam advisory; itu membuatnya lebih tidak mengejutkan, dan memindahkan pertanyaan dari "bagaimana ini bisa lolos peninjauan" menjadi "apa yang akan membuat perbaikan yang ditunda menjadi mendesak." Asumsi desain yang memitigasi itu nyata dan juga didokumentasikan: koneksi lokal bersifat opt-in. Menurut README, pengguna memasang ekstensi, membuka popup-nya, dan mengaktifkan koneksi lokal, dan daemon harus berjalan agar semua ini dapat dijangkau. Profil dengan ekstensi terpasang tetapi toggle mati, atau tanpa bsk daemon yang berjalan, bukan target yang mendengarkan.

Lima minggu kemudian, gerbang itu tidak berubah

An HTML timeline card titled 'From a filed issue to an unmerged patch', subtitled 'Nine dated entries in the BrowserSkill daemon origin-check record', listing: 16 September 2026 BrowserSkill extension 0.3.0 tagged; 17 September the bsk CLI 0.3.0 release, and issue #273 filed the same day at 15:14 UTC; 20 September CVE-2026-94111 published by VulnCheck and listed by NVD and GitHub, with a narrower impact analysis posted in the thread; 21 September CISA's SSVC assessment records exploitation none and automatable no; 23 September CLI 0.3.1 released with the same origin check; 28 September pull request #363 opened from a fork to pin the store extension IDs; 30 September CLI 0.3.2, same check; 15 October CLI 0.3.3, same check; 27 October issue still open and the patch still unmerged. A footer cites the GitHub issue, the VulnCheck advisory, NVD and the project's release tags, with the OrcaRouter logo in a white strip at the bottom right.

Rentang terdampak pada catatan tersebut adalah "hingga 0.3.0", dan itulah rentang yang ditetapkan oleh CNA. Namun itu bukan akhir ceritanya di repositori. Rilis 0.3.0 CLI diberi tag pada 17 September pukul 02:22 UTC; issue tersebut diajukan pada hari yang sama pukul 15:14 UTC, sekitar tiga belas jam kemudian. Tiga rilis CLI lainnya telah terkirim sejak saat itu — 0.3.1 pada 23 September, 0.3.2 pada 30 September, dan 0.3.3 pada 15 Oktober — dan fungsi origin_allowed() pada setiap tag tersebut merupakan pemeriksaan yang sama seperti dijelaskan di atas, dengan TODO yang masih berada di atasnya. Branch main juga memuatnya per 27 Oktober.

Perbaikan sudah ada, tetapi hanya sebagai proposal. Pada 28 September, seorang kontributor yang memposting sebagai dangzitou membuka pull request #363 dari fork pribadi, berjudul "fix(daemon): pin WS origin gate to BrowserSkill's own extension ids." Pull request itu menggantikan uji bentuk dengan perbandingan terhadap dua ID toko, dan menambahkan BSK_ALLOWED_EXTENSION_IDS sebagai jalur penerimaan eksplisit untuk build sideloaded dan pengembangan, yang ID hasil unpack-nya diturunkan dari jalur instalasi. Isi pull request mengklaim bahwa ini menutup jalur pemalsuan dan juga denial of service MultipleBrowsersOnline. Per 27 Oktober, pull request tersebut masih terbuka dan belum di-merge, dan issue tersebut tetap terbuka tanpa pernyataan vendor yang terlampir padanya.

Konsekuensi praktisnya adalah tidak ada versi yang dapat ditingkatkan ke sana yang memuat perbaikan tersebut. Siapa pun yang menyarankan "tingkatkan melewati 0.3.0" sedang menyarankan langkah yang belum ada: rilis-rilis setelahnya memang lebih baru, bukan sudah diperbaiki. Rentang dalam catatan itu harus dibaca sebagai rentang yang dinilai oleh CNA pada 20 September, bukan sebagai pernyataan bahwa 0.3.1 dan versi setelahnya sudah bersih.

Apa yang sudah mapan, dan apa yang belum

• Terbukti: sumber yang dirilis pada tag cli-v0.3.0 berisi gerbang origin yang menerima origin chrome-extension 32 karakter a–p mana pun. Pelapor, CNA, dan berkas itu sendiri sepakat, dan kodenya bersifat publik.

• Ditetapkan: gerbang hanya dijalankan sekali, saat peningkatan WebSocket, tanpa pemeriksaan identitas selanjutnya, pada port lokal tetap 52800.

• Ditetapkan: komentar sumber proyek itu sendiri mengakui bahwa ekstensi yang di-sideload akan lolos, dan menunda daftar-izin.

• Ditetapkan: CVSS 4.0 6.9 dan CVSS 3.1 6.6 keduanya merupakan skor VulnCheck, yang dicatat oleh NVD sebagai sekunder. Status NVD sendiri untuk entri tersebut adalah Deferred, artinya NVD telah menerbitkan data CNA tanpa menambahkan analisis yang ditulis oleh NVD.

• Ditetapkan:Penilaian SSVC CISA, tertanggal 21 September, mencatat eksploitasi sebagai tidak ada, dapat diotomatiskan sebagai tidak, dan dampak teknis sebagai sebagian. EPSS FIRST menempatkan probabilitas eksploitasi dalam tiga puluh hari ke depan sebesar 0,00135, yaitu persentil ke-2,9, per 26 Oktober.

• Belum dapat dipastikan: adanya penggunaan apa pun di dunia nyata. Tidak ada eksploitasi, tidak ada proof of concept yang dipublikasikan, tidak ada jumlah instalasi yang terdampak. Metrik repositori proyek bukanlah jumlah instalasi, dan belum ada yang mempublikasikannya.

• Belum ditetapkan: dampak mana yang berlaku. "Intersepsi dan manipulasi" milik CNA dan "pemalsuan hasil plus penolakan layanan" dari thread tersebut menggambarkan batas maksimum yang berbeda, dan keduanya belum didemonstrasikan di luar pembacaan kode.

• Tidak terbukti: bahwa cacat tersebut berhenti pada 0.3.0. String versi merupakan penilaian CNA; kode tidak berubah dalam tiga rilis setelahnya, dan tidak ada pernyataan vendor yang menyatakan ketiganya bebas.

• Bertentangan, belum terselesaikan: satu agregator, DevGuard, menampilkan sinyal "upaya eksploitasi telah terdeteksi" untuk CVE ini tanpa menyebutkan sumber, IOC, atau penyedia telemetri. Hal itu bertentangan dengan penilaian tercatat CISA tentang tidak adanya eksploitasi dan dengan tidak adanya laporan publik apa pun; arsip juga tidak mencatat adanya eksploitasi. Anggap tanda dari agregator tersebut sebagai tidak terbukti, bukan sebagai titik data kedua.

An HTML card titled 'Established, and not', split into two columns. The left column, headed 'Established', lists: an origin gate that accepts any 32-character a-p chrome-extension origin, in the released cli-v0.3.0 source; checked once at the WebSocket upgrade on local port 52800; the project's own comment conceded sideloaded extensions pass; CVSS 4.0 6.9 and 3.1 6.6 are VulnCheck's scores, NVD status Deferred; CISA SSVC records exploitation none and automatable no; EPSS 0.00135 as of 26 October. The right column, headed 'Not established', lists: any real-world use or published proof of concept; which impact account holds, interception or result forgery; that the flaw stops at 0.3.0, since 0.3.1 to 0.3.3 carry the same check; an installation count; an unsourced aggregator claim of exploitation attempts. A footer cites VulnCheck, NVD, CISA, FIRST and the GitHub issue, with the OrcaRouter logo in a white strip at the bottom right.

Mengapa transport menjadi target yang menarik

Sebagian besar panduan injeksi prompt menarik batas yang sama: perlakukan teks halaman yang diambil sebagai tidak tepercaya, dan perlakukan mekanisme yang mengantarkannya sebagai tepercaya. Alat yang membaca halaman web dianggap sedang membaca halaman itu; pertanyaannya adalah apa yang dikatakan halaman tersebut. Catatan ini membaliknya. Apa yang diterima agen sebagai konten halaman, DOM, dan tangkapan layar adalah apa pun yang dipilih klien di ujung lain soket lokal untuk dikirim, dan satu-satunya gerbang pada soket itu menanyakan pertanyaan yang dapat dijawab dengan benar oleh setiap kandidat. Jika kliennya asing, "verifikasi apa yang dikatakan halaman" tidak menyisakan apa pun untuk dijadikan dasar verifikasi.

Itulah sebabnya tingkat keparahannya berada di posisi tersebut dan bukan lebih tinggi. Serangan ini bersifat lokal, mengandaikan adanya ekstensi yang sudah terpasang di profil atau kode lokal lain, dan mensyaratkan daemon berjalan dengan koneksi lokal diaktifkan. Kondisi tersebut wajar bagi pengguna yang dituju alat ini dan tidak biasa bagi orang lain. Tingkat keparahan sedang pada arsip dan tidak adanya kerugian yang tercatat konsisten dengan bentuk tersebut: perluasan kepercayaan yang nyata tepat pada batas yang seharusnya dijaga oleh desain, tanpa bukti ada orang yang melewatinya.

Saran praktis yang sempit berikut bukanlah mitigasi yang pernah diterbitkan oleh siapa pun, melainkan hanya batas yang dibiarkan tetap berdiri oleh kode. Karena penerimaan diputuskan sekali pada handshake di port yang dipublikasikan, permukaan yang dapat dijangkau ditentukan oleh ekstensi mana yang terpasang di profil yang menjalankan daemon, dan oleh apakah daemon tersebut serta koneksi lokal ekstensi diaktifkan pada saat itu. Sampai daftar izin ID ekstensi dirilis, kedua fakta itu adalah keseluruhan kendalinya.

A generated abstract illustration on a dark navy field: two identical hexagonal tokens of the same size and colour approach a narrow blue aperture from opposite sides; both pass through, and beyond it their outputs merge into a single stream of pale glyph shapes entering a terminal panel. A faint dotted outline of a browser window sits above. No text, people or organisation logos appear. The OrcaRouter logo is set in the white footer strip at the bottom right.

CVE-2026-94111 akan menua dengan salah satu dari dua cara. Entah pull request itu digabungkan dan catatan tersebut menjadi entri singkat tentang celah yang sudah diketahui yang butuh waktu lama, atau pemeriksaan bentuk yang sama masih ada di dalam tree setahun kemudian dan entri itu dikutip sebagai contoh awal dari kelasnya: bukan halaman yang membawa instruksi bermusuhan, melainkan pipa yang menentukan halaman mana yang sedang dibaca agen.