// hackerlogs
login+ register
Supply ChainAgentic AIThreat BriefHigh

MemTensor's Latest Tag Was the Implant. Clean Builds Lasted Minutes.

On 23 September MemTensor's OpenClaw plugin and MemoryOS shipped a token stealer. Clean builds lasted minutes. Pulling the versions did not end the impact clock.

The short answer

On 23 September 2026 MemTensor published three bad npm builds of its OpenClaw memory plugin and PyPI MemoryOS 2.0.34. Each started a credential stealer on gateway boot, recall, or import. Clean builds between them lasted minutes. By 24 September the bad versions were gone and npm latest was 0.1.24. Hosts that loaded a bad build are still in scope.

Key takeaways

  • Socket's primary is three npm versions of @memtensor/memos-cloud-openclaw-plugin, 0.1.21, 0.1.23, and 0.1.25, plus PyPI MemoryOS 2.0.34. Each bundled a Go binary named sckit.
  • The package clock is minutes. A clean 0.1.22 lasted under four minutes before 0.1.23. A clean 0.1.24 lasted about three minutes before 0.1.25 was tagged latest.
  • The binary starts on gateway boot, on memory recall with the prompt text, or on import. A test container that imported memos is in the same blast as a developer laptop.
  • Socket has not confirmed how registry access was obtained. The npm publishes have no gitHead. The Hacker News attributes to SafeDep a claim that the release workflow handed over the token.
  • On 24 September the bad versions were gone from the public version lists and npm latest was 0.1.24. That closes the package clock. It does not close a token already read from a home directory.

On 23 September a legitimate MemTensor plugin that gives OpenClaw agents a memory store shipped a credential stealer as latest. Socket is the primary. Three npm versions of @memtensor/memos-cloud-openclaw-plugin and PyPI MemoryOS 2.0.34 each start a Go binary named sckit. A check of the public registries on 24 September shows those four versions removed and npm latest pointed at 0.1.24. Removal is the package clock. It is not the impact clock.

US X trends were football, a prime minister, and an Apple Watch. Hacker News did not lead with this. The Hacker News, Socket, StepSecurity, and Aikido did.

High A maintained agent plugin and its Python library published a token stealer under the real names. High because install, gateway start, and import were enough, not because a second package is confirmed wormed.

Three panels for the MemTensor plugin compromise: clean and malicious publishes a few minutes apart, a binary that starts when the agent plugin loads, and a registry removal that leaves stolen tokens in scope.

What Socket actually published.#

MemOS is MemTensor's open-source memory framework for language models and agents. Socket puts the main GitHub repository at about 11,500 stars. This was not a typosquat next to a famous name. The npm package is the OpenClaw lifecycle plugin: it recalls memory before a prompt and writes memory after a run. StepSecurity notes the same package also declares hooks for the Clawdbot and Moltbot runtimes. The PyPI package is MemoryOS.

The bad npm versions are 0.1.21, 0.1.23, and 0.1.25. The bad PyPI version is 2.0.34. Each bundles sckit for Linux, macOS, and Windows, on both 64-bit architectures. Socket's static read, which did not execute the samples, says the binary searches the home directory and the process environment for registry tokens, git credentials, cloud keys, Vault tokens, SSH keys, and a list of other well-known token shapes, then reports to hosts under skyleen.fr. On the npm plugin the binary is started when the OpenClaw gateway starts, and again on every memory recall, with the user's prompt text passed in. On PyPI, importing memos is enough, because the launcher is wired through logging setup that runs on import.

The publishes came from the same npm account as earlier legitimate releases, leason1974, and they have no gitHead. Socket's conclusion is that those npm cuts were not made by the project's CI workflow. It has not confirmed how publish access was obtained. Two commits, authored as Memtensor-AI and MemTensor CI Review, added the binaries and changed the release tooling so that it targets the registry publish token. When Socket looked, no branch or tag in either repository pointed at those commits.

The package clock and the impact clock.#

All times are UTC on 23 September, from Socket and StepSecurity, and they match the timestamps still on the npm registry record.

The last known-good npm build, 0.1.20, was 3 August. The last PyPI build before the compromise, 2.0.33, was 3 September. Then the channel flipped. Malicious npm 0.1.21 at 02:23. Clean 0.1.22 at 03:45, matching 0.1.20 apart from version strings. Malicious 0.1.23 at 03:49, three minutes and thirty-six seconds later. Clean 0.1.24 at 04:33. Malicious 0.1.25 at 04:36, about three minutes later, tagged latest. PyPI 2.0.34 at 05:25. The wheel jumped from 951,210 bytes on 2.0.33 to 19,201,772 bytes. The growth is the bundled binaries.

That is the package clock: a maintainer-looking account, a clean build that does not stick, and latest meaning the implant. The npm record's modified time is 11:53 the same day. On 24 September the public version list no longer contains 0.1.21, 0.1.23, or 0.1.25. Dist-tags point latest at 0.1.24 and carry two extra tags, clean-inverse-0-1-23 and clean-inverse-0-1-25, aimed at the clean neighbors. PyPI's current version is 2.0.33. 2.0.34 is not in the release list. The Hacker News' update matches that takedown. An August beta, 0.1.21-beta.0, is still on npm. Socket did not name it. Do not confuse it with the removed 0.1.21.

The shape is the one in the TanStack token and the mathmain loader. The registry can pull a version in an afternoon. A lockfile, a cache, and a laptop do not pull themselves. Aikido reads the binary as built to republish into other npm and PyPI packages and to drop a GitHub Actions template. It had not found a compromised public workflow when it published. Assume the worm is a capability until a second package shows up. Do not assume it already has.

  1. npm 0.1.20 publishes. Socket's last known-good plugin release.
  2. npm 0.1.21-beta.0 publishes. Still listed on 24 September. Not in Socket's malicious set.
  3. PyPI MemoryOS 2.0.33 publishes. Last release before the compromise.
  4. 02:23 to 05:25 UTC: three bad npm versions and MemoryOS 2.0.34, with clean 0.1.22 and 0.1.24 lasting minutes between them. 0.1.25 is tagged latest.
  5. 11:53 UTC: npm record modified. By 24 September the three bad versions and the PyPI release are off the public lists. Latest is 0.1.24.
  6. Not-after date inside the config Socket recovered. A date on the implant, not an expiry for tokens it already read.

What this is not.#

It is not a typosquat, and it is not a new package with no history. The stars, the prior versions, and the publish account are why a default install was rational on the morning of 23 September.

It is not proof that every OpenClaw, Clawdbot, or Moltbot install is owned. The blast is environments that resolved the bad versions or imported MemoryOS 2.0.34. A pin to 0.1.20 or 0.1.24, or to MemoryOS 2.0.33, was outside that set on Socket's comparison.

It is not a confirmed second-wave publish into unrelated packages. Aikido and The Hacker News both leave that open. The hunt is your own publish history if the affected host held a token, not a claim that the registry is broadly poisoned.

It is also not a CVE you can wait on. None of the primaries used here lead with a CVE number. The ticket name is the package, the four versions, and the date.

What to do.#

  1. Search lockfiles, requirements files, poetry.lock, uv.lock, and SBOMs for @memtensor/memos-cloud-openclaw-plugin and MemoryOS. If you resolved 0.1.21, 0.1.23, 0.1.25, or 2.0.34, the host is in scope even though the registry listing is gone. Include CI runners and test images.
  2. Pin npm to 0.1.20 or 0.1.24, and PyPI to 2.0.33, or remove the dependency. Socket says 0.1.22 and 0.1.24 differ from 0.1.20 only in version strings. Diff anyway. A floating latest is how 0.1.25 became the default for the hours it was tagged.
  3. Rotate every secret that lived in that user account or CI job. Socket names npm and PyPI tokens, GitHub and GitLab tokens, AWS keys, Vault tokens, SSH keys, and the usual collaboration and payment tokens. Prompt text that passed through the plugin on a bad version should be treated as exposed.
  4. Block skyleen.fr and its subdomains. Look for egress to that domain since 23 September. Then look for publishes of your own packages that you did not cut, if the host could publish.
  5. Alert on this plugin's release cadence, not only on a new CVE. The clean builds were real, and they lasted minutes. A job that pins latest and sleeps overnight will install whichever tag is winning at resolve time.
  6. Split the agent runtime from the publish token. A memory plugin that runs on gateway start does not need NPM_TOKEN in its environment. The TanStack lesson was the same: the package clock is public and fast, and the token spends in private after the version is gone.

The Hacker News front page on 24 September was the OpenAI scanner story, not this plugin. The operator fact is still the tag. For a few hours, the latest build of a popular agent memory plugin was the implant, and a clean build in between was not a rescue.

Frequently asked

Is npm latest safe to install now?

A check of the public npm registry on 24 September showed latest at 0.1.24, and 0.1.21, 0.1.23, and 0.1.25 no longer in the version list. Socket says 0.1.24 matches the last known-good 0.1.20 apart from version strings. PyPI's current MemoryOS version was 2.0.33, and 2.0.34 was absent. Pin those, or 0.1.20. Do not treat a floating latest as a control on this plugin until you have diffed the tarball yourself. The August beta 0.1.21-beta.0 is still listed and was not in Socket's bad set. It is not the removed 0.1.21.

Did the maintainer's GitHub release workflow publish the bad builds?

Socket says no for the npm cuts it inspected. They came from the same account as earlier legitimate releases and they have no gitHead, which means they were not published by the project's CI. Socket has not confirmed how that account's publish right was obtained. The same write-up says commits under maintainer-looking names altered the release tooling to target the publish token, and that no branch or tag pointed at those commits when Socket looked. The Hacker News, citing SafeDep, says the workflow did hand the token over. Rotate the token either way.

Does uninstalling the package end the incident?

No. Socket's bound is that the binary runs when the code is loaded. Developer machines, CI runners, and containers that only ran tests are in scope if they resolved a bad version. The registry removal stops the next default install. It does not delete a copy already on disk, and it does not expire a token that copy already read. The embedded config Socket recovered is dated through 22 October 2026. That date is not a promise the stolen credentials die then.

Are other packages already wormed?

Not on the evidence in hand. Aikido says the binary is built to republish through stolen npm and PyPI credentials and through GitHub Actions templates, and that it had not found compromised public workflow files when it wrote. The Hacker News says it is unclear whether any package besides MemTensor was hit. If a host that loaded a bad build also held a publish token, review your own releases for versions you did not cut.

Sources

Related