
sckit: MemTensors AI-minnespaket försågs med bakdörrar för att stjäla agentautentiseringsuppgifter och promptar
- OrcaNYOrcaCyber: MiMo V2.6 Flash Abliterated2026-10-26$0.80 / $1.60 per 1M tokens · 109 tok/s
- MoonshotNYMoonshotAI: Kimi K3.1 Pro2026-10-2455Intelligens
- OrcaNYOrcaCyber: DeepSeek V4.1 Flash Abliterated2026-10-23$0.80 / $1.60 per 1M tokens · 170 tok/s
- minimaxNYMiniMax: M3.1 Flash2026-10-1943Intelligens
- OrcaNYOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 per 1M tokens · 42 tok/s
- deepseekNYDeepSeek: DeepSeek V4.1 Flash 10172026-10-1745Intelligens
- DeepSeekNYDeepSeek: DeepSeek V4.1 Flash2026-10-1740Intelligens
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 per 1M tokens · 130 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2952Intelligens
- anthropicAnthropic: Claude Sonnet 5.52026-09-2856Intelligens
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 per 1M tokens · 926 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2238Intelligens
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Intelligens
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Intelligens
- xAIGrok 4.72026-09-2146Intelligens
- OrcaOrca: OrcaCyber Zero 1.02026-09-17$3.00 / $7.50 per 1M tokens · 228 tok/s
- OrcaOrca: OrcaVerify Text 1.02026-09-16$2.00 / $0.00 per 1M tokens · 1906 tok/s
- OpenAIOpenAI: GPT-6 Astra2026-09-0453Intelligens77Kodning
- GoogleGoogle: Gemini 3.8 Flash2026-09-0241Intelligens76Kodning
- AlibabaQwen: Qwen3.8 Max (0902)2026-09-0245Intelligens76Kodning
Fyra MemTensor-utgåvor som publicerades den 23 september 2026 innehöll samma strippade Go-implantat, och var och en av dem var den nyaste versionen i sitt register medan den var tillgänglig. npms @memtensor/memos-cloud-openclaw-plugin gavs ut som 0.1.21 kl. 02:23 UTC, 0.1.23 kl. 03:49 och 0.1.25 kl. 04:36; PyPIs MemoryOS gavs ut som 2.0.34 kl. 05:25. Alla fyra levererades med sckit, som startar när OpenClaw-agentgatewayen startar, startar igen vid varje minnesåterkallning – där användarens prompttext skickas med i en miljövariabel – och, i Python-paketet, startar vid en vanlig import av memos-modulen. Den genomsöker sedan hemkatalogen efter hemligheter för npm, PyPI, GitHub, GitLab, AWS, Vault och SSH och skickar det den hittar till servrar under skyleen[.]fr. Socket, StepSecurity, SafeDep och Aikido dokumenterade komprometteringen oberoende av varandra samma dag, och ingen av dem rapporterade några bevis för att implantatet hade körts på en verklig värd. Orca AI Incident Archive innehåller den här posten i sin helhet, tillsammans med alla andra incidenter i leveranskedjan som det har loggat, och varje post har sin egen konfidensgrad och skadestatus.
Fyra versioner, och en offentlig buggrapport mitt bland dem
MemOS är MemTensors minnesramverk med öppen källkod för LLM-agenter, och npm-paketet är anslutningsmodulen som låter en OpenClaw-agentruntime läsa från och skriva till en hostad minnestjänst; StepSecurity noterar att samma paket även deklarerar integrationspunkter för Clawdbot- och Moltbot-runtimearna. Socket uppmätte repositoriet till cirka 11 500 stjärnor och 1 100 forks vid publiceringen. Den positionen är anledningen till att komprometteringen ledde till fyra separata utredningar: som StepSecurity uttryckte det, detta "placerar plugin-programmet i en process som rutinmässigt hanterar användarinmatning och kan ärva värdefulla autentiseringsuppgifter". De som exponerades är de som installerade något av paketen – utvecklare på sina egna maskiner samt CI-runners och containrar som bara körde en testsvit.
npm-sekvensen är den tydligaste delen av händelseförloppet eftersom registrets tidsstämplar är offentliga och flera företag registrerade dem oberoende av varandra. Sockets redogörelse och SafeDeps tidslinje stämmer överens på varje minut: 0.1.21 kl. 02:23:04, 0.1.22 kl. 03:45:44, 0.1.23 kl. 03:49:20, 0.1.24 kl. 04:33:30 och 0.1.25 kl. 04:36:58. Versionerna 0.1.22 och 0.1.24 var rena — Socket säger att de matchade 0.1.20 förutom versionssträngarna — och nyttolasten återkom tre och en halv minut efter var och en av dem.
Storlekshoppet är det avslöjande tecknet. Socket uppmätte 0.1.20 till cirka 272 kB uppackat och 0.1.21 till 43,6 MB, eftersom de skadliga utgåvorna innehöll sex statiskt länkade plattformsbinärer på ungefär 7,4 MB vardera. PyPI visar samma mönster: 2.0.34-wheel-filen var 19 201 772 byte mot 951 210 för 2.0.33, enligt Socket.
Klockan 04:17 UTC – sexton minuter före den rena 0.1.24 och nitton före nyttolasten kom tillbaka som 0.1.25 – öppnade en GitHub-användare vid namn omeridel issue #173 i plugin-förrådet, med titeln "Skadliga versioner 0.1.21 och 0.1.23 publicerade på npm – publiceringstoken verkar vara komprometterad." I ärendet noteras att 0.1.23 då var den senaste taggen, att ingen av versionerna matchade någon commit eller tagg i förrådet och att den senaste legitima commiten var daterad den 14 augusti. Det är fortfarande öppet utan några kommentarer från underhållarna per den 26 oktober 2026.

Vad sckit gör när paketet har laddats
Inget av paketen använde en installationshook, vilket är anledningen till att det vanliga rådet om --ignore-scripts inte gällde. StepSecuritys analys av npm-varianten beskriver en ny fil, lib/sckit.js, som exporterar en startare som pluginets befintliga start- och minnesåterkallningskod importerar och anropar. Vid start startar den en fristående .sckit/<os>-<arch>/sckit-process med stage0 --config64 och förälderns fullständiga miljö; vid återkallning gör den samma sak och skickar den rensade användarprompten via en miljövariabel med namnet SCKIT_EVENT_TEXT. Socket uttryckte konsekvensen klart och tydligt: binärfilen körs därför igen vid varje återkallning.
PyPI-varianten är kortare och i praktiken svårare att undvika. Socket fann att memos/log.py anropar en triggerfunktion inuti memos/_stage0.py när loggning är konfigurerad, att 149 moduler anropar loggern på modulnivå, och att en vanlig import av memos-modulen därför räcker för att starta nyttolasten en gång per process. StepSecuritys analys av samma paket var helt statisk – den installerade, importerade, byggde eller körde det inte.
Insamlingsomfånget är hela hemkatalogen. SafeDep listar inventarieroten som $HOME och de riktade filerna som .npmrc, .pypirc, .git-credentials, .netrc, id_rsa, id_ecdsa, id_ed25519, .vault-token, msal_token_cache, access_tokens.json och access_tokens.db, samt miljövariabler vars namn innehåller token, secret, password, API-nyckel eller databas-URL, samt igenkända tokenformat för GitHub, GitLab, npm, PyPI, Hugging Face, Slack, Stripe, AWS och SendGrid. OSV-posterna för de två paketen, MAL-2026-16476 för npm och MAL-2026-16475 för PyPI, beskriver samma fillista och tillägger att command-and-control-protokollet använder CBOR, X25519-nyckelutbyte och XChaCha20-Poly1305, med signerade lease-avtal och moduler som levereras vid körning – så modulernas innehåll observerades aldrig, endast lastaren som hämtar dem.
Två detaljer avgör vad en försvarare fortfarande kan återställa. Binärfilen innehåller självraderingsrutiner med namnen scheduleSelfDelete och deleteExecutable, enligt OSV-posten, vilket är anledningen till att vägledningen är att leta efter process- och nätverksartefakter snarare än filer. Dessutom lade 0.1.25 till lib/tls-trust.js, som ställer in SSL_CERT_FILE till en medföljande fil med 145 certifikatutfärdarcertifikat på minimala Linux-system, enligt StepSecurity – en åtgärd som syftar till att få dess egen trafik att fungera i containrar som saknar ett systemomfattande arkiv för betrodda certifikat.

Release-pipelinen var vägen in.
SafeDeps rekonstruktion är den mest detaljerade redogörelsen för initial åtkomst, och den pekar på GitHub Actions snarare än på ett stulet registerlösenord. Mellan 00:48 och 02:03 UTC skapade, pushade och raderade ett GitHub-konto som verkade under namnet Memtensor-AI en branch med namnet sc/release-0.1.21-20260922-cloud fem gånger. Commit 9b97ec6 ändrade arbetsflödesskriptet .github/scripts/validate-release-confirmation.mjs så att den lade till ett BASH_ENV-värde i $GITHUB_ENV, vilket gjorde att senare icke-interaktiva shellsteg läste in en av angriparen tillhandahållen sckit-publish-bridge.sh innan de körde sina egna kommandon. Den bryggan kontrollerade paketnamnet och publiceringsstegets tidsgräns på 150 sekunder, anropade tokeninsamlaren med NPM_TOKEN eller NODE_AUTH_TOKEN, raderade sig själv och avslutades med status 1 – så publiceringen misslyckades efter att token hade tagits. Den första skadliga npm-utgåvan dök upp tjugo minuter efter den sista branch-pushen.
PyPI-vägen använde samma trick mot en annan pipeline. SafeDep rapporterar att taggen v2.0.34 pekade på osignerade commits som inte fanns på main, och att commiten b52958f, författad som "MemTensor CI Review", lade till de sex binärfilerna, en Python-laddare och en anpassad byggbackend som hette sckit_poetry_build. Den backenden skrev en BASH_ENV som pekade på _pypi_bridge.sh i $GITHUB_ENV; bryggan agerade endast inuti twine-uppladdningswrappern, hämtade ett signerat index från värden skyleen[.]fr, verifierade en emitter med en Ed25519-implementation, skrev ut en markörrad, tog bort uppladdningslösenordet och avslutade utan att ladda upp något. Ungefär två timmar senare tog commiten 41bf5c7 bort det anropet med meddelandet "chore: allow native PyPI upload [skip ci]", taggen raderades och återskapades inom tio sekunder, och PyPI-uppladdningen följde 62 sekunder efter det. SafeDep tolkar den första commiten som en token-infångningskörning och den andra som körningen som lät MemTensors eget arbetsflöde bygga och publicera det skadliga paketet med projektets riktiga token.
Inte alla redogörelser stämmer överens om detta. Socket observerade att npm-utgåvorna kom från samma npm-konto som tidigare legitima versioner och saknade en gitHead, vilket det tolkade som ett tecken på att de inte hade producerats av projektets CI, och uppgav att det inte kunde bekräfta hur angriparen fick publiceringsåtkomst. SC Media, som rapporterade om Sockets fynd den 24 september, drog samma slutsats om ett komprometterat konto. De två versionerna är överens om att publiceringsuppgifter togs från release-pipelinen och skiljer sig åt när det gäller hur själva npm-artefakten producerades; ingen har publicerat arbetsflödesloggarna, eftersom GitHubs Actions-API inte visade några körningar efter den 7 september och SafeDep drar slutsatsen att posterna raderades. Hur Memtensor-AI-kontot först fick push-åtkomst är okänt i båda redogörelserna; SafeDep bedömer att en stulen kontotoken är sannolik men obekräftad.
Fastställd, härledd och frånvarande
Postens konfidensgrad är A och den är inte omtvistad, vilket är värt att vara precis om, eftersom vissheten fäster vid det som publicerades och inte vid vad den gjorde.
• Fastställt: innehållet i de fyra artefakterna, rekonstruerat genom statisk analys hos Socket, StepSecurity och SafeDep; npm-publiceringstiderna och den senaste taggen på 0.1.25; storlekshoppet i båda ekosystemen; commits, taggar och grenhistorik i de två repona; infrastrukturen skyleen[.]fr och kampanjidentifierarna cloud-openclaw-semi-nuclear och memos-semi-nuclear; samt nyttolastens konfiguration, som löper ut 22–23 oktober 2026 enligt Socket och SafeDep.
• Slutledning: att verktyget skrevs med hjälp av en språkmodell, vilket SafeDep säger direkt och kallar en slutsats; och att de stulna publiceringstokenerna var avsedda att återanvändas, vilket konfigurationens kanalsträng – "exact-ref-one-use-NPM_TOKEN" – stöder men inte bevisar.
• Ej fastställt: vem angriparen var; om någon kopia av sckit någonsin kördes utanför en sandlåda; om någon autentiseringsuppgift lämnade en värd; om någon prompt som skrivits in i en OpenClaw-agent nådde angriparen; och om något nedströms paket publicerades på nytt. Socket och StepSecurity arbetade båda statiskt, och StepSecurity anger att ingen processkörning, ingen överföring av hemligheter, ingen lyckad exfiltrering, ingen installation av arbetsflöden och ingen ytterligare paketpublicering observerades i dess analys.
Det gapet är anledningen till att arkivet registrerar den här incidenten med verklig skada markerad som falsk. Exponeringen är verklig och omfattande – alla som har installerat en drabbad version uppmanas att behandla värden som komprometterad – men skada, i betydelsen att en autentiseringsuppgift bevisligen har använts eller att ett system bevisligen har nåtts, har inte registrerats av något av de fyra utredande företagen.
![A self-built HTML card headed 'What the record supports', titled 'Four investigating firms, no confirmed victim', subtitled 'Socket, StepSecurity, SafeDep and Aikido documented the same four artefacts on 23 September 2026'. The left column, headed 'Established by static analysis', lists: four malicious releases, npm 0.1.21, 0.1.23 and 0.1.25 and PyPI MemoryOS 2.0.34; one implant, the same stripped Go binary sckit in all four; the publish window 02:23 to 05:25 UTC with 0.1.25 tagged latest; package growth from 272 KB to 43.6 MB on npm and 951 KB to 19.2 MB for the PyPI wheel; six builds per package for Linux, macOS and Windows on amd64 and arm64; collection scoped to the whole home directory across registry, source-control, cloud, Vault and SSH secrets; exfiltration to servers under skyleen[.]fr; and OSV tracking as MAL-2026-16476 and MAL-2026-16475. The right column, headed 'Not established', lists: the attacker's identity; how Memtensor-AI obtained push access; whether any copy ever executed outside static analysis; whether a stolen secret reached the attacker; whether any prompt text was received; and whether any downstream package was republished. A footer reads 'Archive classification for this record: incident, severity high, confidence A, real harm false.' The OrcaRouter logo is composited in the bottom-right corner.](https://cms.orcarouter.ai/api/media/file/4-2644.png)
Masken som aldrig sågs spridas
Binärfilerna innehåller mer än ett stjälarprogram. SafeDep listar funktioner med namnen recursivePublish, prepareRemoteNode, prepareRemotePython och prepareRemoteWorkflow, plus en inbäddad GitHub Actions-mall som utlöses vid push och möjligheten att skriva en arbetsflödesfil med namnet runtime-update.yml i repositorier som implantatet kan nå. Socket hittade strängar om kodning av paketmanifest och installation av repositoriefiler och bedömde att binärfilerna skulle kunna återpublicera paket med hjälp av stulna registry-token.
Det är en maskdesign. Det är inte en mask som har observerats fungera. StepSecurity fann inga belägg för att logiken någonsin användes för att sprida sig, och Cloud Security Alliances forskningsnotis av den 25 september tolkar förmågan som en begränsad potential för självspridning snarare än bekräftat maskbeteende. Flera medier beskrev fallet som den första leveranskedjemasken inriktad på minnesinfrastruktur för AI-agenter; beskrivningen är rimlig som ett uttalande om designen, och rapporterna stöder den inte som ett uttalande om vad som hände.
Vad förändrades efteråt?
Registren rensades samma dag. Vid kontroll den 26 oktober 2026 listar npm-paketets metadata inte längre 0.1.21, 0.1.23 eller 0.1.25 bland sina versioner, latest-taggen pekar på 0.1.24 och paketet ändrades senast 11:53 UTC den 23 september. Två ovanliga dist-taggar är fortfarande kopplade — clean-inverse-0-1-23 som pekar på 0.1.22 och clean-inverse-0-1-25 som pekar på 0.1.24 — vilket speglar de två rena utgåvorna som kortvarigt avbröt de skadliga. På PyPI är MemoryOS 2.0.34 borta och den nyaste utgåvan är 2.0.33, uppladdad den 3 september 2026; det har inte publicerats någon ytterligare PyPI-utgåva under de sju veckorna sedan dess.
Det som inte har förändrats är projektets offentliga redogörelse. Repositoriet listar inga säkerhetsmeddelanden, GitHub-ärendet från 04:17 dagen för incidenten är fortfarande öppet och obesvarat, och ingen av de rapporteringar som granskats här citerar något uttalande från MemTensor eller från OpenClaw. Inget av de skadliga paketen hade någon proveniensattestering, vilket enligt SafeDep tog bort den enda signalen om att artefakterna hade byggts från en oväntad commit.
Det svar som finns ligger på detekteringssidan: StepSecurity har lagt till C2-domänerna skyleen[.]fr i sin globala blockeringslista, och de två paketen spåras i OSV som MAL-2026-16476 och MAL-2026-16475.
Om en påverkad version har installerats
Sockets vägledning är den strängaste och enklaste: om någon listad version har laddats eller importerats ska den värddatorn betraktas som komprometterad, inklusive CI-runners och containrar som bara körde tester. De konkreta steg som de fyra företagen enas om:
• Ta bort paketet och lås till en ren version – npm 0.1.20, PyPI 2.0.33. StepSecurity varnar för att deras analys inte fastställde någon ren PyPI-baslinje, medan SafeDep och SC Media båda anger 2.0.33 som den senaste fungerande versionen.
• Leta efter processens kommandorad, eftersom den körbara filen kan radera sig själv: sckit stage0 --config64, och miljövariabeln SCKIT_EVENT_TEXT.
• Radera tillståndskatalogerna ~/.openclaw/.cache/runtime och ~/.memos/.cache/runtime, och kontrollera förråden efter en oväntad runtime-update.yml workflow eller .sckit/ kataloger.
• Rotera varje autentiseringsuppgift som är åtkomlig från hemkatalogen och processmiljön, från en ren maskin: npm, PyPI, GitHub, GitLab, AWS, Vault, SSH, Hugging Face, Slack, Stripe och SendGrid, samt alla .env-värden. Token för paketregister och källkodshantering går först.
• Granska versionerna av dina egna paket, ifall en stulen publiceringstoken har använts för att släppa versioner som du inte har skrivit.
• Blockera skyleen[.]fr och dess underdomäner, och läs egressloggar tillbaka till 23 september.
• Behandla varje prompt eller inklistrad hemlighet som passerade genom plugin-programmet medan det var aktivt som röjd. Detta är den del av incidenten som är specifik för agentminne: implantatet behövde inte skrapa en transkription, eftersom transkriptionen överlämnades till det vid varje minneshämtning.
