
Tencent BrowserSkill controleerde alleen of een extensie-ID er echt uitzag — elke extensie kon de agent vervalste pagina's voeren
- OrcaNIEUWOrcaCyber: Qwen3.8 Flash Next Abliterated2026-10-26$0.80 / $1.60 per 1 mln tokens · 98 tok/s
- OrcaNIEUWOrcaCyber: MiMo V2.6 Flash Abliterated2026-10-26$0.80 / $1.60 per 1 mln tokens · 115 tok/s
- MoonshotNIEUWMoonshotAI: Kimi K3.1 Pro2026-10-2455Intelligentie
- OrcaNIEUWOrcaCyber: DeepSeek V4.1 Flash Abliterated2026-10-23$0.80 / $1.60 per 1 mln tokens · 138 tok/s
- minimaxNIEUWMiniMax: M3.1 Flash2026-10-1943Intelligentie
- OrcaNIEUWOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 per 1 mln tokens · 43 tok/s
- deepseekNIEUWDeepSeek: DeepSeek V4.1 Flash 10172026-10-1745Intelligentie
- DeepSeekNIEUWDeepSeek: DeepSeek V4.1 Flash2026-10-1740Intelligentie
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 per 1 mln tokens · 111 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2952Intelligentie
- anthropicAnthropic: Claude Sonnet 5.52026-09-2856Intelligentie
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 per 1 mln tokens · 698 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2238Intelligentie
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Intelligentie
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Intelligentie
- xiaomiXiaomi: MiMo-V2.6-Flash2026-09-21$0.14 / $0.28 per 1 mln tokens · 45 tok/s
- xiaomiXiaomi: MiMo-V2.6-Pro2026-09-21$0.43 / $0.87 per 1 mln tokens · 50 tok/s
- xAIGrok 4.72026-09-2146Intelligentie
- OrcaOrca: OrcaCyber Zero 1.02026-09-17$3.00 / $7.50 per 1 mln tokens · 231 tok/s
- OrcaOrca: OrcaVerify Text 1.02026-09-16$2.00 / $0.00 per 1 mln tokens · 3445 tok/s
Op 17 september 2026 diende een GitHub-gebruiker die postte als carfeii issue #273 in tegen het open-sourceproject van Tencent BrowserSkill met een beperkte bewering: de lokale daemon die de browserextensie met een AI-agent verbindt, controleerde niet welke extensie verbinding maakte, alleen dat de verbinding er überhaupt als een extensie uitzag. Drie dagen later, op 20 september publiceerde VulnCheck de bevinding als CVE-2026-94111, met een beschrijving van een daemon die "elke chrome-extension-origin met 32 tekens in het bereik a-p accepteert", en classificeert het als CWE-346 (fout in oorsprongsvalidatie), en schrijft de ontdekking toe aan George Chen. Het advies beoordeelt het als CVSS 4.0 6.9, gemiddeld, met impact op integriteit hoog en vertrouwelijkheid en beschikbaarheid laag. Niets in het record suggereert dat de fout is gebruikt: het archief registreert geen exploitatie en kent de vermelding vertrouwensgraad A toe, met real_harm false. Dit is één record in het AI-incidentenarchief, waar elke vermelding zijn eigen bronnen, ernst, vertrouwensgraad en een vlag voor betwisting heeft.
Een formaatcontrole die nooit de identiteit controleerde
De code in het midden van het record is klein. In crates/bsk-cli/src/daemon/ws.rs neemt de functie origin_allowed() de Origin-header van de WebSocket-handshake, verwijdert de tekenreeks chrome-extension://, en retourneert true als wat overblijft precies 32 tekens lang is en elk teken tussen a en p valt. Dat is de volledige test. Hij wordt één keer uitgevoerd, binnen de HTTP-upgrade-callback, en een mislukking retourneert een 403 waarvan het bericht luidt: "Origin not in chrome-extension allow-list" — hoewel er zoals gepubliceerd geen lijst was om in te staan.
Het patroon is niet willekeurig. De extensie-ID's van Chrome's Manifest V3 bestaan uit 32 tekens die uit precies die zestien letters zijn samengesteld, dus de controle herkent terecht de vorm van een echte extensie-origin. Het gebrek is dat elke extensie die vorm heeft. De controle vraagt of de aanroeper op een browserextensie lijkt, nooit of het deze browserextensie van het project is, en de identificatie waarmee vergeleken had moeten worden, was al openbaar: de README van het project linkt naar de Chrome Web Store-vermelding, waarvan de ID hhcmgoofomhgciiibhipgmgkgnoenaoi is, en de Edge Add-ons-ID ernaast. Geen van beide strings komt ergens in de poort voor.
De daemon luistert op een vaste lokale poort, 52800, gedeclareerd als DEFAULT_WS_PORT in de CLI en zonder variatie gebruikt in het lokale verbindingspad. De poort is gedocumenteerd, constant en bereikbaar voor alles wat al in het browserprofiel van de gebruiker draait. Locatie is de reden dat de vector van het advies begint met AV:L — de aanvaller heeft een foothold op de machine nodig, en PR:L geeft aan dat een foothold met lage privileges volstaat. Een extensie die in hetzelfde profiel is geïnstalleerd, is precies zo'n foothold.
Wat de zetel waard is, en hoeveel daarvan vaststaat
De impactzin van het advies is breed: een aanvaller die een kwaadaardige extensie als browserclient registreert, kan "pagina-inhoud, DOM en screenshots die aan de AI-agent worden teruggegeven, onderscheppen en manipuleren." Dat is de beschrijving die de CVE, het GitHub-adviesrecord GHSA-x6f2-qp26-2xrh en het archief allemaal bevatten, en het verklaart de CVSS-integriteitsbeoordeling 'hoog'. Het is ook een samenvatting geschreven door de partij die de CVE heeft toegewezen, niet een rapport van een aangetoonde aanval.
Een nauwkeuriger verslag kwam diezelfde week binnen, in de issuetread zelf. Op 20 september meldde een reageerder die postte als bb6894 dat hij de code opnieuw had gecontroleerd tegen main bij commit fa953dc6 (18 september) en traceerde wat een vreemde client na de handshake daadwerkelijk kan bereiken. De meeste inkomende toolmethoden, zo staat in de reactie, retourneren UnknownMethod aan een WebSocket-peer; auditverzoeken zijn beperkt tot de eigen records van de client; en cross-sessieacties zoals window_closed, user_interrupt en update_interaction zijn afgeschermd tegen sessies die eigendom zijn van een andere browser. Wat dat filter overleeft, is smaller en voor een agent mogelijk erger dan interceptie: een vreemde extensie kan een browserslot innemen onder een door de aanvaller gekozen instance_id, en als het de enige geregistreerde browser is — een koude start of een herstart van de daemon — ontvangt het de toolverzoeken van de agent en beantwoordt ze met verzonnen pagina-inhoud, DOM of screenshots. De reageerder noemt dit "resultaatvervalsing richting de agent" en "een kanaal naar de perceptie van de agent." Een tweede effect is een denial-of-serviceaanval: als er ook een echte browser online is en er geen selector is, kan het starten van een sessie mislukken met MultipleBrowsersOnline.
Geen van beide versies is in het openbaar aangetoond. De melder omschreef een proof of concept als "op verzoek beschikbaar"; niemand heeft er een gepubliceerd, en er is geen exploitatie vastgelegd. Het verschil tussen de twee versies is dus een verschil tussen twee lezingen van hetzelfde bronbestand, niet tussen een theorie en een werkende exploit — en het stuk doet verslag van beide in plaats van een keuze te maken. Wat zonder voorbehoud kan worden gezegd, is dat er nooit een tweede identiteitscontrole na de handshake was, dus wat de poort ook toeliet, bleef toegelaten zolang de verbinding bestond.
De code wist het al
Het meest ongemakkelijke document in dit dossier is niet het beveiligingsadvies. Het is de opmerking direct boven de functie, die is meegeleverd in de getagde release waarnaar het beveiligingsadvies verwijst. Ze markeert het gat als TODO(M10/M12), noemt de allowlist die ze van plan is te bouwen — een DaemonConfig::allowed_extension_ids set die gevuld wordt vanuit een configuratiebestand of pairingflow — en geeft vervolgens de reden waarom die is uitgesteld: "aanvaardbaar gat in defense-in-depth voor nu, omdat pairing via de popup gebeurt, maar een sideloaded extensie op dezelfde machine komt momenteel door de controle."
Simpelweg gelezen wisten de maintainers welke aanroeper de poort doorliet, legden ze vast dat ze dat wisten, en brachten ze het uit. Dat maakt de blootstelling niet groter dan het advies zegt; het maakt haar minder verrassend, en het verplaatst de vraag van "hoe is dit door de review gekomen" naar "wat zou de uitgestelde fix urgent hebben gemaakt". De mitigerende ontwerpaanname is reëel en ook gedocumenteerd: de lokale verbinding is opt-in. Volgens de README installeert de gebruiker de extensie, opent de popup en schakelt de lokale verbinding in, en moet de daemon draaien wil dit alles bereikbaar zijn. Een profiel met de extensie geïnstalleerd maar de schakelaar uit, of zonder draaiende bsk daemon, is geen luisterend doelwit.
Vijf weken later is de poort onveranderd.

Het getroffen bereik in het record is "tot en met 0.3.0", en dat is het bereik dat de CNA heeft toegewezen. In de repository is dat niet het einde van het verhaal. De 0.3.0-release van de CLI werd getagd op 17 september om 02:22 UTC; de melding werd dezelfde dag om 15:14 UTC ingediend, ongeveer dertien uur later. Sindsdien zijn er nog drie CLI-releases verschenen — 0.3.1 op 23 september, 0.3.2 op 30 september, en 0.3.3 op 15 oktober — en de functie origin_allowed() is bij elk van die tags dezelfde controle als hierboven beschreven, met de TODO er nog steeds boven. De main-branch bevat die ook sinds 27 oktober.
Er is een fix, maar alleen als voorstel. Op 28 september, een bijdrager die postte als dangzitou opende pull request #363 vanuit een persoonlijke fork, met de titel "fix(daemon): koppel de WS-origin-gate vast aan BrowserSkill's eigen extensie-id's." Deze vervangt de vormtest door een vergelijking met de twee store-ID's, en voegt BSK_ALLOWED_EXTENSION_IDS toe als een expliciet toelatingspad voor sideloaded en ontwikkelbuilds, waarvan de uitgepakte ID's zijn afgeleid van het installatiepad. In de beschrijving van de pull request wordt beweerd dat deze zowel het vervalsingspad als de MultipleBrowsersOnline-denial-of-service dicht. Per 27 oktober is deze nog steeds open en niet samengevoegd, en het issue blijft open zonder dat er een verklaring van de leverancier aan is gekoppeld.
Het praktische gevolg is dat er geen versie is om naar te upgraden die de oplossing bevat. Iedereen die adviseert om "voorbij 0.3.0 te upgraden", adviseert een stap die nog niet bestaat: de latere releases zijn later, niet gerepareerd. Het bereik in het record moet worden gelezen als het bereik dat de CNA op 20 september heeft beoordeeld, niet als een bewering dat 0.3.1 en later schoon zijn.
Wat is vastgesteld, en wat niet
• Vastgesteld: de vrijgegeven broncode bij tag cli-v0.3.0 bevat een origin-gate die elke 32 tekens lange a–p chrome-extension-origin accepteert. De melder, de CNA en het bestand zelf stemmen overeen, en de code is openbaar.
• Vastgesteld: de gate werd één keer uitgevoerd, bij de WebSocket-upgrade, zonder latere identiteitscontrole, op een vaste lokale poort van 52800.
• Vastgesteld: het eigen broncodecommentaar van het project erkende dat een sideloaded extensie zou worden toegestaan, en stelde de allowlist uit.
• Vastgesteld: CVSS 4.0 6.9 en CVSS 3.1 6.6 zijn beide scores van VulnCheck, door NVD geregistreerd als secundair. De eigen status van NVD voor de vermelding is Deferred, wat betekent dat het de gegevens van de CNA heeft gepubliceerd zonder een door NVD opgestelde analyse toe te voegen.
• Vastgesteld: De SSVC-beoordeling van CISA, gedateerd 21 september, registreert exploitatie als geen, automatiseerbaar als nee en technische impact als gedeeltelijk. De EPSS van FIRST stelt de kans op exploitatie in de komende dertig dagen op 0,00135, het 2,9e percentiel, per 26 oktober.
• Niet vastgesteld: enig gebruik in de praktijk. Geen exploitatie, geen gepubliceerd proof-of-concept, geen aantal getroffen installaties. De repository-statistieken van het project zijn geen telling van installaties, en niemand heeft er een gepubliceerd.
• Niet vastgesteld: welke impactbeschrijving standhoudt. De "onderscheppen en manipuleren" van de CNA en de "resultaatvervalsing plus denial-of-service" van de thread beschrijven verschillende bovengrenzen, en geen van beide is aangetoond buiten het lezen van code.
• Niet vastgesteld: dat het defect bij 0.3.0 ophoudt. De versiestring is de beoordeling van de CNA; de code is ongewijzigd in de drie releases erna, en geen leveranciersverklaring spreekt ze vrij.
• Tegengesproken, onopgelost: één aggregator, DevGuard, toont voor deze CVE een signaal "er zijn exploitatiepogingen gedetecteerd" zonder een bron, IOC of telemetrieleverancier te noemen. Dat staat tegenover CISA's vastgelegde beoordeling dat er geen misbruik is en tegenover het ontbreken van enig openbaar rapport; ook het archief vermeldt geen misbruik. Beschouw de markering van de aggregator als niet onderbouwd in plaats van als een tweede datapunt.

Waarom het transport het interessante doelwit is
De meeste richtlijnen voor prompt-injectie trekken dezelfde grens: behandel opgehaalde paginatekst als niet-vertrouwd en behandel de machinerie die deze levert als vertrouwd. Van een tool die een webpagina leest, wordt aangenomen dat hij de pagina leest; de vraag is wat de pagina zegt. Dit record keert dat om. Wat de agent als pagina-inhoud, DOM en screenshots ontvangt, is wat de client aan de andere kant van een lokale socket ook maar besluit te sturen, en de enige poort op die socket stelde een vraag die elke kandidaat correct kon beantwoorden. Als de client van buiten komt, heeft "verifieer wat de pagina zegt" niets meer om tegen te verifiëren.
Dat is ook de reden dat de ernst op dit niveau uitkomt en niet hoger. De aanval is lokaal, gaat ervan uit dat er al een extensie in het profiel is geïnstalleerd of dat er andere lokale code aanwezig is, en vereist dat de daemon draait met de lokale verbinding ingeschakeld. Die omstandigheden zijn gewoon voor de beoogde gebruikers van de tool en ongebruikelijk voor alle anderen. De medium ernst in het archief en het daarin vastgelegde uitblijven van schade passen bij dat patroon: een daadwerkelijke verbreding van vertrouwen precies op de grens die het ontwerp geacht werd te bewaken, zonder bewijs dat iemand erdoorheen is gegaan.
Het beperkte praktische advies dat volgt is geen mitigatie die iemand heeft gepubliceerd, alleen de grens die de code laat staan. Omdat toelating één keer wordt beslist bij de handshake op een gepubliceerde poort, wordt het bereikbare oppervlak bepaald door welke extensies zijn geïnstalleerd in het profiel dat de daemon uitvoert, en door of die daemon en de lokale verbinding van de extensie op dat moment zijn ingeschakeld. Totdat een allowlist voor extensie-ID's wordt uitgebracht, bestaat de controle volledig uit die twee feiten.

CVE-2026-94111 zal op één van twee manieren de geschiedenis ingaan. Ofwel wordt de pull request samengevoegd en wordt de vermelding een korte entry over een bekende lacune die lang bleef liggen, ofwel staat dezelfde vormcontrole over een jaar nog steeds in de tree en wordt de vermelding aangehaald als een vroeg voorbeeld van de klasse waartoe ze behoort: geen pagina met een vijandige instructie, maar de pijplijn die bepaalt welke pagina de agent leest.
