A package install reads your home directory. This week two of them did it on purpose.
The implant did nothing clever. It read the files your shell reads, in the place your credentials live, and sent them somewhere else. That is the whole attack, and it works.
- Published
- 23 September 2026
- npm
- memos-cloud-openclaw-plugin, versions 0.1.21, 0.1.23, 0.1.25
- PyPI
- memoryos, version 2.0.34
- Payload
- A Go implant named sckit, runs on package load
- Exfiltration
- Servers under skyleen[.]fr
- OSV records
- MAL-2026-16476 (npm), MAL-2026-16475 (PyPI)
What was published
On 23 September, OSV recorded malicious versions of two related packages. On npm, memos-cloud-openclaw-plugin under the memtensor scope, at versions 0.1.21, 0.1.23 and 0.1.25. On PyPI, memoryos at version 2.0.34. The interleaved version numbers are worth noticing: 0.1.22 and 0.1.24 are reported clean, so a team pinning to a recent version had roughly even odds.
An open issue on the project's own GitHub repository, filed by an outside researcher, reports that versions were published to npm that do not correspond to any commit or tag in the repository, and says the package's npm publish token appears to have been compromised. That is the researcher's assessment. The maintainers have not publicly commented, and no primary source describes a compromise of the company itself, so we are not going to.
What the implant does
The payload is a Go binary called sckit that executes when the package loads. OSV describes functions named credentialPaths, readCredentialFile and extractJSONCredentials that target a specific list of files: .npmrc, .pypirc, .git-credentials, .netrc, id_rsa, id_ecdsa, id_ed25519, .vault-token, msal_token_cache, access_tokens.json and access_tokens.db. It collects credentials from the home directory and sends them to servers under skyleen[.]fr.
There is nothing sophisticated in that list, and that is the point worth internalising. It is simply the set of places developer tooling stores long-lived secrets by convention. Registry tokens, git credentials, SSH private keys, a Vault token, cached cloud tokens. Everything a working developer machine accumulates and rarely audits.
In CI the implant adds a second stage. OSV records that when GITHUB_ENV is set, it appends a BASH_ENV entry pointing at a script inside the package, which gives it a hook into subsequent shell invocations in the job. The quoted behaviour concerns capturing PyPI publishing tokens.
The scope problem nobody prices in
When you add a dependency, you are asking a program to run on your machine with your permissions. Package managers run install scripts, and imported modules execute code at load time. There is no sandbox between a dependency and your home directory by default, on any of the major ecosystems.
That means the blast radius of one bad package is not the feature that package provides. It is every credential the process can read. A small utility library that helps format dates has, by default, exactly as much access to your SSH key as your deployment script does.
This is why the rotation list after an incident like this is so much longer than the package itself suggests. The question is not what the package could legitimately need. It is what was reachable from the account that ran the install.
If you think you were exposed
Work from the machine outward. Every credential that was readable from the home directory of the user that ran the install should be treated as known to someone else.
- Check lockfiles across every repository, and check agent and tool configurations, which often pull packages outside your main dependency tree
- Rotate npm and PyPI tokens first, because those let an attacker publish as you and widen the blast radius to your own users
- Rotate GitHub personal access tokens, SSH keys and any cloud credentials cached on the machine or runner
- Search CI logs and network egress records for connections to skyleen[.]fr
- Check for unexpected releases of your own packages, and review the publish history of anything you maintain
The structural fix landed five days earlier
On 18 September GitHub shipped a new npm token permission level, read and write, stage only. A workflow with that token runs npm stage publish to submit a version for review, and npm rejects a direct npm publish attempt with that token even if it is configured to bypass two-factor authentication for automation. A maintainer then approves the release with a second factor. GitHub says npm is targeting January 2027 to remove direct publishing through bypass-2FA tokens.
That change is aimed squarely at this class of attack, where the entire objective is a publish token sitting in a release job. A stolen stage-only token cannot ship anything to your users on its own.
It has a genuine cost, and it is worth stating rather than glossing: releases now require a human being with a second factor, which is slower and occasionally inconvenient at the wrong hour. That is the trade. Given what a stolen publish token does to everyone downstream of you, it is a reasonable one.
What to do
- 1Search every lockfile and agent configuration for the affected package names and versions.
- 2If found, rotate registry tokens, git credentials, SSH keys and cached cloud tokens from that machine or runner.
- 3Grep CI logs for outbound connections to skyleen[.]fr.
- 4Replace npm CI automation tokens with stage-only tokens, or move to trusted publishing.
- 5Pin dependencies by exact version and review lockfile diffs on every update, so an unexpected version bump is visible.
Common questions
Which package versions are malicious?
Per OSV, the npm package memos-cloud-openclaw-plugin under the memtensor scope at versions 0.1.21, 0.1.23 and 0.1.25, and the PyPI package memoryos at version 2.0.34. Versions 0.1.22 and 0.1.24 are reported clean.
What does the implant steal?
OSV lists .npmrc, .pypirc, .git-credentials, .netrc, SSH private keys including id_rsa, id_ecdsa and id_ed25519, .vault-token, msal_token_cache, access_tokens.json and access_tokens.db, collected from the home directory and sent to servers under skyleen[.]fr.
What should I rotate if I installed an affected version?
Everything readable from that user's home directory: npm and PyPI tokens, GitHub personal access tokens, SSH keys, and any cached cloud credentials. Start with registry tokens, since those let an attacker publish as you.
What is a stage-only npm token?
A token permission level GitHub added on 18 September 2026. It can submit a version with npm stage publish for a maintainer to approve with two-factor authentication, but npm rejects a direct npm publish attempt with it, even if it is configured to bypass 2FA for automation.
Has the maintainer confirmed the compromise?
Not publicly, as of 25 September 2026. The claim that the npm publish token appears to have been compromised comes from an outside researcher in an open issue on the project repository, not from the maintainers.
Sources
Read against the primary documentation rather than secondary coverage. Where a figure comes from a provider's own docs, it is quoted as published on 2026-09-25.
Related
More from Signals
Open the tool.
Ten production categories, three minutes, and a ranked list of what to fix first.
Check your own stack