cd /news/ai-safety/how-ossprey-protects-from-novel-ai-a… · home › topics › ai-safety › article
[ARTICLE · art-164103] src=ossprey.com ↗ pub= topic=ai-safety verified=true sentiment=↓ negative

How Ossprey protects from novel AI-accelerated malware development, and cross-ecosystem supply-chain attacks.

Ossprey Security reported detecting malicious versions of two MemTensor packages — `@memtensor/memos-cloud-openclaw-plugin` on npm (0.1.21, 0.1.23, 0.1.25) and `memoryos` on PyPI (2.0.34) — each carrying a novel Golang credential-stealing worm the firm calls sckit that scans environments for keys, tokens and secrets and re-publishes itself. Ossprey traced the initial publish to a misconfigured GitHub Action: two forged commits in the `MemTensor/MemOS` repository, authored by non-existent identities using `.invalid` email addresses, added an implant and swapped the build backend, after which a workflow pinned to a legitimate `pypa` commit handed the maintainer's real PyPI token to attacker code in the same job. Ossprey said it could not confirm the source of the npm publish permissions, and identified the malware as `supplychain.local/campaign` with campaign identifiers `cloud-openclaw-semi-nuclear` and `memos-semi-nuclear`, compiled for every major platform.

read7 min views1 publishedNov 4, 2026
How Ossprey protects from novel AI-accelerated malware development, and cross-ecosystem supply-chain attacks.
Image: source

This morning, Ossprey Security detected malicious versions of two MemTensor packages. @memtensor/memos-cloud-openclaw-plugin on npm (0.1.21, 0.1.23, 0.1.25) and memoryos on PyPI (2.0.34). Each of these malicious versions carried a novel Golang malware known as sckit -- a credential-stealing worm that scans environments for keys, tokens and secrets and then re-publishes itself wherever possible - not unlike other token stealers that we have covered before, like the Shai-Hulud attack, and the TeamPCP campaign.

Having covered similar attacks before, we instead decided to explore the risks this category of attack create. As always you'll be able to find IOCs for threat-hunting and securing your own environments at the bottom of this page.

Many supply chain attacks begin with fake profiles, typo-squatted libraries; lures and luck to draw victims into down and installing malware. Others begin with account compromises and takeovers, where known and trusted maintainer accounts are used to publish malware. In this case, the initial publish was caused by a mis-configured Github action.

The chain started with a forged commit in the MemTensor/MemOS repository, parented directly on the main branch but never merged into it, authored by an identity that doesn't exist:

An initial indicator of malicious activity is the email. The .invalid TLD is the one the standards reserve for things that are, by definition, not real. A second forged commit followed under a fake release-maintenance identity (no such GitHub account exists), and the two together added the implant and swapped the build backend.

An otherwise normal Github action, pinned to a legitimate pypa commit, handed the maintainer's real PyPi token to attacker code running in the same job, which used it to publish and upload a malicious version of the package to PyPi. On the NPM side the attacker was also able to push malicious updates, however we have been unable to confirm the initial source of the NPM publish permissions.

In fact we have seen many prominent supply-chain attacks begin like this, with this attack class being known as poisoned pipeline execution (PPE).

The lesson generalises past PyPI and past MemTensor. A workflow triggered by release: published which publishes with a stored secret is a machine where the ability to create a release is the ability to publish.

Most organisations that would never hand a developer the production publishing token have a CI job that grants exactly that power to anything that can tag a release. Audit it the way you audit credential access: which humans, which tokens, which other workflows can cause this job to run, and what can it publish?

By taking a brief look now at the malware, and we see a focus on cross-platform operability. The malware was compiled to be executable on every major platform and distribution, ensuring the widest possible reach, from a developer's macbook or thinkpad, to CI/CD and linux systems. During our analysis of the malware we found that it identifies itself as supplychain.local/campaign with 2 separate campaign identifiers cloud-openclaw-semi-nuclear, and memos-semi-nuclear.

In the last year or so the malware coverage and the defenders have spent considerable time defending against a particular attack vector: npm install scripts . We have seen extensive abuse of this and Microsoft, who owns Github and NPM have put significant resource into trying to mitigate this issue, it hasn't completely solved the problem. You can find more of our coverage on Shai-Hulud hitting 2000 npm packages and npm v12 blocking install scripts by default. As defenders have evolved, so too have attackers.

This specific malware used 3 execution channels.

Import-time execution means installing nothing and running nothing is not enough, merely importing the package launches the implant. The swapped build backend means the malware executes inside the CI job that's building the release, where it can append BASH_ENV to the job's environment file, poisoning every subsequent shell in the job.

The bridge it installs then lies in wait for the exact step that uploads to PyPI, grabs the token intended for that upload, and delivers a second-stage payload.

The key point to recognise: every lifecycle event that implicitly executes code, build backends, environment files, shell init hooks, plugin s, logging configuration acts as an equivalent to install hook scripts. Ossprey Security is able to protect from these by not solely relying on known attack vectors but detecting malicious and risky behaviour wherever it may be configured, at the package, repo or pull-request level.

Alongside stealing secrets and tokens, the affected package is an AI agent gateway.

The plugin's dropper runs at gateway startup and again on every memory recall, which happens with each prompt, handing the raw prompt text to the implant. Everything users typed into their AI agent from source code, credentials pasted in frustration to internal plans was sent to the attacker.

AI tooling has been a significant part of the engineer toolset and is placed in a position where inference providers have visibility of the most sensitive data in your organisation, and code harnesses are perfectly positioned to have access to code, tooling and the ability to run and install arbitrary scripts.

Domains and URLs defanged ([.], hxxps); strip brackets for tooling. All hashes verified against registry-published artifacts on 2026-09-23. Affected versions

- npm: `@memtensor/memos-cloud-openclaw-plugin`**0.1.21, 0.1.23, 0.1.25** (0.1.25 is` latest` at time of writing)
- PyPI: `memoryos`**2.0.34**
  • Verified clean pins: plugin 0.1.20 (0.1.22 and 0.1.24 are byte-equivalent rebuilds of it), memoryos2.0.33

Domains

URLs (C2 paths) Implant binaries (Go 1.27.1, module supplychain.local/campaign/cmd/implant)

The six npm binaries are byte-identical across 0.1.21 / 0.1.23 / 0.1.25 — only the launcher changed between versions.

Distribution and component files

Forged GitHub commits

Embedded key material (Ed25519 public keys, base64)

C2-side pins (from _pypi_bridge.sh) Hunting strings

Filesystem paths and environment

Kill-switch timestamps

MITRE ATT&CK #

Built from confirmed behaviors in the published artifacts and recovered binary symbols.

Tactic ID Technique Where found
Resource Development T1583.001 Acquire Infrastructure: Domains skyleen[.]fr drop-caught 2026-09-15, eight days pre-attack — anonymized registrant, Namecheap NS, ProtonMail verification
Initial Access T1195.002 Supply Chain Compromise: Compromise Software Supply Chain Trojanized @memtensor/memos-cloud-openclaw-plugin 0.1.21/0.1.23/0.1.25 andmemoryos 2.0.34 published under the maintainer's own identity
Initial Access / Defense Evasion T1078 Valid Accounts Stolen npm automation token for direct registry publishes; GitHub token for forged commits and the v2.0.34 release
Execution T1059 Command and Scripting Interpreter Implant executes C2-issued commands (credential-collector ,authority-classifier ,commandWithAuthority ); worm drivesnpm ,git ,twine ,python3
Persistence T1574 Hijack Execution Flow Poetry build-backend swapped to sckit_poetry_build ; agent-plugin hooks (launchStageZero at startup and per-prompt) redirect legitimate execution paths
Persistence T1546.004 Event Triggered Execution: Unix Shell Configuration Modification Build hook appends BASH_ENV=src/memos/_pypi_bridge.sh toGITHUB_ENV ; every later bash step in the CI job — including the twine upload — sources it
Defence Evasion T1036 Masquerading Forged git author identities (ci-review@memtensor.invalid , nonexistentrelease-maintenance account); clean/malicious version ladder withclean-inverse-* dist-tags
Defence Evasion T1070.004 Indicator Removal: File Deletion scheduleSelfDelete removes the implant's own binary; StateStoreCleanup /Tombstone manage remaining traces
Defence Evasion 1497 Virtualisation/Sandbox Evasion ja4_deny TLS-fingerprint deny-list anddeny_iso geo filtering steer analysis environments away from live C2
Credential Access T1552.001 Unsecured Credentials: Credentials In Files .netrc ,.pypirc ,.npmrc ,.vault-token ,.git-credentials ,credentials.db ,access_tokens.db , plus credential environment variables (NPM_TOKEN ,NODE_AUTH_TOKEN ,PYPI_API_TOKEN ,INPUT_PASSWORD )
Discovery T1082 System Information Discovery Host profiling: OS, arch, hostname, interfaces, IPs, timezone, languages
Discovery T1083 File and Directory Discovery inventory_roots: [$HOME] ; repository discovery by glob;read_globs over victim trees
Collection T1005 Data from Local System Credential files, repo contents, git author fingerprints — and every user prompt handed over as SCKIT_EVENT_TEXT
Command and Control T1105 Ingress Tool Transfer Signed second stage fetched from 10729e014d0e[.]skyleen[.]fr/.../initial-ci-v2 — hash-pinned, single-use per CI job, five-second window
Exfiltration T1041 Exfiltration Over C2 Channel Chunked, AEAD-sealed result uploads to the /{...}/batch endpoints on the campaign fronts
── more in #ai-safety 4 stories · sorted by recency
── more on @ossprey security 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/how-ossprey-protects…] indexed:0 read:7min 2026-11-04 · —