En genererad abstrakt illustration på ett mörkt marinblått fält: en liten bärnstensfärgad serverkub till vänster avger en tunn cyan linje av teckenliknande former som passerar rakt genom en hög genomskinlig blå glasmembran och fortsätter till en mörk terminalruta till höger, där ett enda bärnstensfärgat markörblock lyser. Linjen är obruten. Ingen text, inga personer eller organisationslogotyper förekommer. OrcaRouter-logotypen är komponerad i nedre högra hörnet.
AI Safety Incidents

OpenCodes MCP-inloggning lämnade över en servers URL till PowerShell – och det finns ingen CVE för att flagga det.

Författare

Magnus Corvin

Publiceringsdatum

Senaste modellerna · 20Visa alla modeller →
Benchmarks: Artificial Analysis · uppdateras dagligen
Tillbaka till alla inlägg

Den 19 oktober 2026 avslöjade Pillar Security en sårbarhet för fjärrkodkörning i OpenCode, den öppen källkods-kodningsagent som underhålls av Anomaly: en fjärransluten Model Context Protocol-server som en utvecklare hade konfigurerat kunde köra godtycklig kod på den utvecklarens egen maskin under MCP OAuth-inloggningen, utan någon samtyckesprompt däremellan. Felet var begränsat till Windows och Windows Subsystem for Linux, där OpenCode skickade den serverlevererade inloggnings-URL:en till ett PowerShell-kommando utan att escap:a den. Pillar anger det påverkade intervallet till 1.0.137 till och med 1.18.32. Anomaly åtgärdade det i 1.18.33, publicerat till npm den 28 september 2026, och begärde ingen CVE och publicerade inget rådgivande meddelande – så ingenting i ett normalt sårbarhetsflöde kommer att tala om för ett påverkat team att uppgradera. Pillar rapporterade inga bevis för att felet någonsin använts i en attack. Detta är en post i AI-incidentarkivet, där varje post har sina egna källor, allvarlighetsgrad, konfidensbetyg och flagga för omtvistat.

Vad felet faktiskt var

När en MCP-klient ansluter till en fjärrserver som vill ha auktorisering, kör den en OAuth-upptäcktshandskakning. Servern svarar med en 401 och en utmaning som pekar på dess upptäcktsdokument, och ett fält i dessa dokument — authorization_endpoint — talar om för klienten vart användaren ska skickas för att logga in. Det är en fritextsträng, och den part som autentiseras är den part som väljer den.

I OpenCode 1.18.32 gick den strängen från nätet till ett shell. Pillar spårade vägen från serverns discovery-dokument genom MCP SDK:n in i oauth-provider.ts, mcp/index.ts och browser.ts, som slutar vid open, det lilla paketet som OpenCode använder för att starta en webbläsare. Ingenting på den vägen kontrollerade URL:ens schema, och ingenting jämförde den med ursprunget för servern som utvecklaren hade konfigurerat. Handskakningen är avsiktligt automatisk — hela poängen är att skicka dig till en inloggningssida utan att du behöver kopiera en URL — så inget godkännandesteg stod mellan serverns svar och startaren.

The launcher is where it broke. On macOS and Linux, open passes the address as an argument vector and no shell is involved. On Windows, version 10.1.2 of open — the version every affected OpenCode release pinned — builds a PowerShell command, base64-encodes it and runs it with powershell -EncodedCommand. Pillar quotes the source: the application name is escaped on one line, and the target URL is not. PowerShell evaluates $(...) subexpressions inside double-quoted strings, so an address of the form https://evil.test/$([IO.File]::WriteAllText('C:\Users\Public\pwned.txt','RCE')) runs before the browser launch fails. OpenCode discards that failure.

Två egenskaper gjorde att det var lätt att missa. Nyttolasten innehåller inga mellanslag, så URL-normaliseringen lämnar den intakt, och det är en syntaktiskt sett vanlig httpsadress. Och servern behövde inte vara fientlig när den konfigurerades: Pillar påpekar att en senare kompromiss, en kapad registerpost, en typosquat eller en utgången domän var och en skulle förvandla en betrodd konfigurationspost till en leveransmekanism.

Vem exponerades

Den utsatta gruppen är Windows- och WSL-användare som kör OpenCode med en konfigurerad fjärr-MCP-server. Pillar beskriver OpenCode som att ha ungefär 3 miljoner veckovisa npm-nedladdningar och 211 000 GitHub-stjärnor; Infosecurity Magazines rapport anger antalet stjärnor till över 218 000. Ingen av siffrorna är en räkning av drabbade installationer, och ingen har publicerat någon.

Utlösaren är den punkt där de två primära redogörelserna går isär, och den har betydelse för både risk och allvarlighetsgrad. Pillar beskriver utnyttjandet som att det inte kräver någon ytterligare användarinteraktion eller samtycke. The Hacker News säger i sin rapport från 22 oktober att webbläsarsteget bara körs när en utvecklare påbörjar inloggningen – genom att köra opencode mcp auth eller göra motsvarande begäran – och att det inte nås bara genom att servern är konfigurerad eller genom att man öppnar en session. Hur som helst gör utvecklaren inget ovanligt; att påbörja autentisering mot en server som redan finns i konfigurationen är rutin. Men ”ingen interaktion” och ”en rutinmässig interaktion” är olika påståenden, och skillnaden påverkar poängen direkt.

Rättningen kom beskriven som en refaktorering

Pillar rapporterade bristen privat via ett GitHub Security Advisory den 29 augusti 2026, med fullständigt reproduktionsmaterial. Den 25 september följde de upp utanför advisory-tråden; Anomaly bekräftade att rapporten hade nått deras team och svarade att skadliga MCP-servrar föll utanför deras hotmodell. Samma dag landade pull request #51414 – sammanslagen som commit 29f07e0c. Den beskrivs som att konsolidera åtta anropsplatser för webbläsarstart till en hjälpfunktion. Version 1.18.33 nådde npm tre dagar senare, den 28 september.

Patchningen har tre lager. Beroendet open flyttades till 11.0.4, som omsluter målet i enkla citattecken, och PowerShell expanderar ingenting inom enkla citattecken. En ny openUrl()-hjälpfunktion avvisar scheman som inte är HTTP(S). En schemakontroll lades in i redirectToAuthorization själv, vid den gräns som Pillar hade namngett i sin rapport. Varken pull requesten eller versionsanteckningarna nämner någon säkerhetsbrist, och Anomaly begärde ingen CVE.

The Hacker News rapporterar att Anomalys publicerade säkerhetspolicy anger att MCP-servrar som en användare konfigurerar ligger "utanför vår förtroendegräns", och att företaget har utfärdat säkerhetsmeddelanden för andra kodkörningsbrister i OpenCode i år, inklusive en som åtgärdades i augusti. Pillars redogörelse för svaret det fick är mer rakt på sak: "vi har uppdaterat beroendet, men i allmänhet ligger det utanför vår hotmodell att försöka hantera en skadlig MCP-server."

An HTML timeline card titled 'How a five-year-old escaping bug reached OpenCode', subtitled 'Dated entries from Pillar Security's report and the open package's own issue history', listing nine rows: 22 October 2020, open issue #202 reports that a URL containing a dollar sign breaks on WSL 2; 18 October 2023, issue #323 titles 'OS command injection on windows when opening urls'; 9 July 2025, CVE-2025-6514 in mcp-remote, same sink, CVSS 9.6; 15 November 2025, open 11.0.0 quotes the PowerShell target; 7 December 2025, OpenCode calls open() with a server-supplied URL; 29 August 2026, Pillar reports privately via GitHub Security Advisory; 25 September 2026, pull request #51414 merged; 28 September 2026, OpenCode 1.18.33 published to npm, no CVE and no advisory; 19 October 2026, Pillar publishes. A footer cites Pillar Security and the open repository.

Läst som en sekvens placerar tidslinjen OpenCode-buggen i slutet av ett femårigt spår snarare än i början av ett. Defekten som orsakade den var redan offentlig, och dess rättning hade redan släppts, innan raden som använde den skrevs.

Varför schemavalidering inte hade stoppat det

Den överenskomna åtgärden för den här typen av bugg är validering av URL-scheman: blockera de underliga schemana, tillåt http och https, punkt slut. Det är vad MCP TypeScript SDK levererar, och det är vad OpenCode lade till i 1.18.33. Pillars nyttolast klarar alla dessa kontroller, eftersom den är https. SDK:ns denylista blockerar javascript:, data: och vbscript:; en striktare allowlist för http/https föreslogs i SDK:s pull request #841 i augusti 2025 och stängdes utan att slås ihop, medan pull request #877 levererade denylistan med tre scheman i v1.17.4 – och Pillar säger att det fortfarande var policyn i SDK 1.32.0 när den publicerades. Det som faktiskt stängde hålet i OpenCode var beroendeuppdateringen, inte kontrollerna som ser ut som säkerhetsfixen.

Historiken talar emot att betrakta detta som ett enskilt projekts misstag. Paketet open har sedan 2021 haft en varning i README om att det inte lämnar några säkerhetsgarantier och att det är anroparens ansvar att sanera indata. I oktober 2020 lämnade en användare in issue #202 med rapporten att en URL som innehöll ett dollartecken förlorade en del av sig själv på WSL 2 – strängexpansionen, inlämnad som ett irritationsmoment med trasiga länkar. I oktober 2023 lämnade en ingenjör på Adobe in issue #323, "OS-kommandoinjektion på Windows när URL:er öppnas", med ett enradigt proof of concept: open('https://$(calc.exe)'). Underhållaren citerade README och sade att pull requests som förbättrade escapningen var välkomna; ärendet stängdes som inte planerat tre dagar innan open 11.0.0 ändå levererade escapningen, den 15 november 2025. OpenCode skrev sitt anrop för att starta webbläsaren den 7 december 2025, tre veckor efter att den åtgärdade versionen av open fanns, mot en pinnad version som redan var flera månader gammal.

Under månaderna innan det där uppropet skrevs loggade MCP-ekosystemet tre CVE:er mot samma sink eller samma fält: CVE-2025-6514 i mcp-remote (CVSS 9.6, avslöjad av JFrog den 9 juli 2025), CVE-2025-58062 i openmcp-client och CVE-2025-10619 i sequa-mcp. Pillars kontrast är mot klienter som aldrig bygger ett skalkommando från en fjärrsträng över huvud taget: den nämner gemini-cli, Claude Code, github-mcp-server och Dockers mcp-gateway som sådana som skickar URL:en som en argumentvektor, vilket gör att frågan om vad strängen innehåller upphör att vara bärande.

A generated abstract illustration on a dark navy field: a long cyan ribbon of abstract glyph shapes runs left to right and splits in two at a hollow chrome ring, which the upper branch passes straight through while the lower branch curves downward into a glowing amber terminal rectangle at bottom right. A faint dotted outline of an empty browser window floats in the upper right. No text, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

Vad är fastställt, och vad är inte det

Posten är graderad till konfidensgrad A av arkivet, och rapporteringen bakom den håller. Infosecurity Magazine publicerade den 20 oktober en egen intervju med Eilon Cohen på Pillar; The Hacker News publicerade sin egen redogörelse den 22 oktober; DKCERT, Danmarks nationella CERT, sammanfattade fyndet den 21 oktober med hänvisning till Infosecurity; och Cloud Security Alliances forskningslabb publicerade en analys som tillför det enda väsentliga förbehållet nedan. Ingen av dem är den rapporterande parten, och de är överens om mekanismen, versionerna och den tysta rättelsen. Anomaly har själv inte publicerat något om felet.

Fastställt, officiellt:

• Defekten, dess mekanism och dess plattformsomfattning. Pillar identifierar specifika källrader och rättelsen är synlig i den offentliga diffen från 1.18.32 till 1.18.33; de två oberoende nyhetsrapporterna beskriver samma dataflöde.

• Det påverkade intervallet, 1.0.137 till och med 1.18.32, och den åtgärdade versionen, 1.18.33, publicerad 28 september 2026.

• Att det inte finns någon CVE och inget säkerhetsmeddelande. Detta går att kontrollera, och det är det bärande faktumet för försvarare.

• Att ingen exploatering har rapporterats. Pillar säger att man inte sett några tecken på användning i attacker, och The Hacker News noterar att inga indikatorer för kompromettering publicerades. Frånvaro av publicerade indikatorer är inte bevis för frånvaro, och utan telemetri från leverantören kan ingen av tolkningarna bekräftas.

Inte fastställt, eller i konflikt:

• Poängen 9,8. Den siffran är Pillars föreslagna CVSS v3.1-poäng, inte en officiell sådan: utan en CVE finns det ingen NVD-poäng och ingen leverantörspoäng. Cloud Security Alliances forskningsnot påpekar att 9,8 förutsätter ingen användarinteraktion, och att om The Hacker News redogörelse för utlösaren är korrekt skulle en bedömning som kräver användarinteraktion – ungefär 8,8 – passa bättre. Den här artikeln avgör inte den frågan; arkivets egen tagg för hög allvarlighetsgrad är en klassificering, inte en poäng.

• Publiceringsdatumet. Pillars rapport är daterad 19 oktober 2026 i dess sidhuvud, och båda nyhetsrapporterna använder det datumet; tidslinjen för offentliggörande längst ned i Pillars egen rapport anger publicering den 4 oktober. Arkivet registrerar 19 oktober med dagsprecision.

• Storleken på den exponerade populationen. Ingen siffra har publicerats. Nedladdnings- och stjärnsiffrorna ovan är mått för förvaret, inte antal installationer.

• Om någon maskin faktiskt blev komprometterad. Inget som publicerats stöder det, och dokumentationen visar ingen faktisk skada.

An HTML card titled 'Established, and not', split into two columns. The left column, headed 'Established', lists: affected versions 1.0.137 to 1.18.32, Windows and WSL only; fixed in 1.18.33 on 28 September 2026; no CVE and no security advisory issued; no exploitation reported and no indicators published. The right column, headed 'Not established', lists: official severity, since 9.8 is Pillar's proposed score with no CVE to attach it to; the publication date, 19 October in the report header and 4 October in its own timeline; the number of exposed installations; whether any host was compromised. A footer cites Pillar Security, The Hacker News and the Cloud Security Alliance research note.

Vad har ändrats, och vad du ska göra

Åtgärden är en versionskontroll, eftersom inget annat kommer att berätta det för dig. OpenCode 1.18.33 eller senare är åtgärdat. Drabbade installationer måste hittas genom att inventera paketet direkt: Pillars rekommendation är att inventera OpenCode självt i stället för att vänta på en feed, och Cloud Security Alliance-noten föreslår att man frågar efter paketversionen för opencode-ai, eftersom det inte finns någon identifierare som en feed kan matcha. Team som inte kan uppgradera och kör Windows eller Windows Subsystem for Linux bör ta bort fjärranslutna MCP-servrar som de inte har granskat från sin OpenCode-konfiguration; opencode mcp list visar vilka servrar som finns.

För alla som underhåller en MCP-klient är Pillars vägledning snävare än de vanliga råden: skicka URL:er som en argumentvektor och bygg aldrig en kommandorad från en fjärrsträng, bind OAuth-upptäckt till ursprunget för den server som användaren har konfigurerat, och behandla upptäcktsdokument, servermetadata och verktygsbeskrivningar som obetrodd indata i stället för som inställningar. Anteckningen från Cloud Security Alliance tillför heuristiker för hotjakt – en OpenCode-process som startar powershell.exe med -EncodedCommand, till exempel – samtidigt som den betonar att dessa är förslag för detektionsutveckling, inte publicerade kompromissindikatorer.

Inte Console-intrånget

Pillars avslöjande kom dagar efter att Anomaly bekräftat ett separat intrång i OpenCodes hostade Console, vilket kan ha exponerat lagrade API-leverantörsnycklar. De två händelserna hänger inte samman, och Pillars Eilon Cohen var tydlig med skillnaden i sin intervju med Infosecurity Magazine. "Intrånget drabbade ett äldre system bakom en hostad nyckelproxy och exponerade leverantörsnycklar som användarna hade lagrat där", sa han. "Sårbarheten vi rapporterade är den motsatta: en skadlig fjärransluten MCP-server som kör kod på utvecklarens egen dator under OAuth-handskakningen. Olika mål och angriparens position." Console-intrånget är en separat post i arkivet, och de två bör läsas som separata poster.

Det som förenar dem, i Cohens formulering, är frågan som ligger under båda: ”Vem du låter överlämna autentiseringsuppgifter och indata till ett AI-kodverktyg, och vad det verktyget gör med dem.”

Disclosure-gapet är den del som överlever buggen. En sårbarhet som dess upptäckare bedömer som kritisk, som åtgärdas i en beroendeuppdatering och som saknas i varje automatiserad signal en försvarare normalt förlitar sig på, lämnar direkt inventering som enda detektionsmetod – och leverantören publicerade inget säkerhetsmeddelande som uppmanade någon att göra en sådan.