11,500
GitHub stars on MemOS, the AI memory framework for LLM agents whose npm and PyPI packages were backdoored by the sckit supply chain worm on September 23, 2026
13+
Distinct credential categories targeted by sckit: npm tokens, PyPI tokens, GitHub tokens, GitLab tokens, SSH keys, AWS credentials, GCP credentials, Azure secrets, HashiCorp Vault tokens, Hugging Face tokens, Slack tokens, Stripe keys, and SendGrid API keys
3
Package ecosystems sckit can self-propagate into after a successful credential harvest: npm packages, PyPI packages, and GitHub Actions workflows
0
Protection offered by npm's --ignore-scripts flag against this attack: sckit is deployed as a compiled Go binary, not a postinstall script, bypassing the most commonly recommended install-time supply chain defense

Reach 50,000+ security professionals

Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.

Summarize with:

The MemTensor supply chain attack, disclosed September 23, 2026, exposed every developer credential in the home directory of anyone who installed two backdoored packages: @memtensor/memos-cloud-openclaw-plugin versions 0.1.21, 0.1.23, or 0.1.25 on npm, and MemoryOS version 2.0.34 on PyPI. The attacker injected sckit, a cross-platform Go worm, by compromising MemTensor's GitHub Actions release pipelines.

MemOS is an open-source AI memory framework for LLM agents with 11,500 GitHub stars and 1,100 forks. The attacker did not need to compromise the MemTensor organization directly. By pushing commits that caused the GitHub Actions release workflow to expose its npm and PyPI publish tokens before completing a legitimate publish, the attacker obtained the registry credentials needed to release backdoored versions. The malicious releases were available on npm and PyPI as default installations from approximately 02:23 UTC to 05:55 UTC on September 23, giving the sckit binary time to execute on developer machines and CI/CD runners that imported the packages.

sckit activates without postinstall scripts. It runs on first package import or agent gateway startup. Because it does not use npm's postinstall hook, the commonly recommended --ignore-scripts flag provides no protection. Once active, sckit reads 13-plus categories of credentials from the home directory, environment variables, and cloud credential stores, sends them to C2 servers at skyleen.fr, then writes worm templates into any npm or PyPI packages it has publish access to from the stolen tokens, allowing the infection to spread.

If you have ever imported @memtensor/memos-cloud-openclaw-plugin or MemoryOS in any project or CI/CD pipeline, treat every credential that was accessible from that environment as compromised and rotate immediately.

How sckit Compromised MemTensor CI/CD Release Pipelines

The attacker gained access to MemTensor's GitHub account, likely through a previously stolen token, and used it to push short-lived branches to the MemTensor repository between 00:48 and 02:03 UTC on September 23. These branches contained modifications to the repository's npm and PyPI release workflows.

For the npm package, the attacker modified a validation script to inject a path into the BASH_ENV environment variable pointing to a malicious shell script. GitHub Actions processes BASH_ENV before each step in a workflow, causing the injected shell script to execute before the actual npm publish step. The malicious script captured the NPM_TOKEN from the workflow environment and delivered it to the attacker's C2 before any legitimate package publication occurred.

For the PyPI package, the attacker replaced the Poetry build backend used in the release workflow with a custom backend that performed an identical BASH_ENV injection, this time capturing the PYPI_API_TOKEN. In both cases, the legitimate publish job failed silently after the token was stolen, but the attacker then used the captured credentials to publish the backdoored versions directly.

The malicious npm versions (0.1.21, 0.1.23, 0.1.25) and the malicious PyPI version (2.0.34) each carry a sckit binary compiled for Windows, Linux, and macOS, in both AMD64 and ARM64 variants. The binary does not rely on any postinstall hook. It activates when the package is first imported during application startup or a memory-recall operation, runs silently in the background, and immediately begins harvesting credentials.

The clean versions remain npm 0.1.20, 0.1.22, and 0.1.24 (with 0.1.20 being the recommended safe pin), and PyPI 2.0.33. Anyone relying on npm install or pip install without version pinning received the backdoored version by default during the compromise window.

1

Attacker pushes BASH_ENV injection commits to MemTensor GitHub repo

Between 00:48 and 02:03 UTC, the attacker creates and deletes five short-lived branches containing modified release workflows that inject BASH_ENV with a path to a malicious exfiltration script. The branches are deleted after each CI token is captured.

2

Captured npm and PyPI tokens used to publish backdoored packages

Using the stolen NPM_TOKEN and PYPI_API_TOKEN, the attacker publishes sckit-carrying versions: npm 0.1.21 at 02:23 UTC, npm 0.1.23 and 0.1.25 through 03:45-04:36 UTC, and PyPI 2.0.34 at 05:24 UTC. Default installs receive the malicious version throughout this window.

3

sckit binary activates on first package import and harvests credentials

When a developer or CI runner imports the compromised package, the sckit binary launches as a background process. It reads npm token files, SSH keys, cloud CLI credentials, git credential stores, and environment variables, then sends all captured material to C2 servers at skyleen.fr via HTTPS with XChaCha20-Poly1305 encryption.

4

Worm templates propagate sckit into packages the victim controls

Using stolen npm and PyPI publish tokens, sckit writes its own worm templates into packages the infected developer controls, adding new backdoored versions. Using stolen GitHub tokens, it injects runtime-update.yml workflow files that trigger on each push, spreading the worm to CI environments.

Which Developer Credentials and Environments Are at Risk

sckit targets 13 distinct credential categories from developer home directories and CI/CD environment variables. The full list includes: npm publish tokens, PyPI API tokens, GitHub personal access tokens, GitLab access tokens, SSH private keys, AWS CLI credentials, GCP service account keys, Azure CLI tokens, HashiCorp Vault tokens, Hugging Face API tokens, Slack tokens, Stripe API keys, and SendGrid API keys. On CI/CD runners, sckit also captures any secrets injected into the workflow environment as environment variables, including database connection strings and container registry credentials.

The affected packages are part of the MemOS ecosystem, an AI memory framework used by LLM agent developers to give AI models persistent memory across sessions. Any developer building LLM agents, AI pipelines, or memory-augmented applications who pulled these packages in their development environment, virtual environment, Docker container, or CI/CD pipeline should assume full credential exposure.

CI/CD environments are a priority concern. When sckit runs inside a GitHub Actions runner or other CI system, it captures not just the environment variables of the current job but also any credentials cached in the runner's home directory from previous jobs. If the runner has npm, PyPI, or GitHub publishing access, sckit uses those tokens immediately to propagate itself into additional packages.

The worm also performs host profiling including timezone, system language, and privilege level. It applies geo-based filtering, meaning not every infected machine will receive follow-on tasking. Organizations in certain regions may see sckit harvest credentials without delivering subsequent payloads.

For an in-depth look at how stolen npm registry credentials are weaponized downstream, see the prior coverage of the LiteLLM supply chain attack and Sapphire Sleet's npm supply chain campaign.

Free daily briefing

Briefings like this, every morning before 9am.

Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.

sckit C2 Infrastructure and Worm Self-Propagation

The sckit C2 infrastructure is hosted under skyleen.fr. The npm campaign uses three subdomains resolving to 139.84.223.178: 8a8acaf167b3.skyleen.fr, 0b48fafd6fbe.skyleen.fr, and 266297c6df27.skyleen.fr. The PyPI campaign uses three separate subdomains: c747d139e7e9.skyleen.fr, 73376a079d87.skyleen.fr, and d4f77a3a8cb0.skyleen.fr. A seventh subdomain, 10729e014d0e.skyleen.fr, serves as the CI token capture endpoint, receiving POST requests to /eb57efaa7365698fc1e4decc/initial-ci-v2 from infected CI runners.

All C2 communication uses HTTPS with XChaCha20-Poly1305 encryption over a CBOR-encoded binary protocol, making payload inspection difficult without TLS interception. The binary validates downloaded task signatures before executing them, providing attribution resistance and preventing third parties from hijacking compromised machines.

The actor self-identifies as "supplychain.local" within the sckit Go module path. Campaign IDs embedded in the base64-encoded configuration strings are "cloud-openclaw-semi-nuclear" for the npm variant and "memos-semi-nuclear" for the PyPI variant. No external attribution to a named threat actor or nation-state has been made.

The worm carries three propagation template sets. The npm template publishes a new backdoored version to any registry the victim has write access to. The PyPI template does the same for Python packages. The GitHub Actions template injects a runtime-update.yml workflow file into any repository the stolen GitHub token can push to, triggering sckit execution on each subsequent push. This three-vector propagation design means a single compromised developer machine can seed hundreds of downstream packages and CI environments.

The September 19 Brevo supply chain attack via WordPress demonstrates how supply chain footholds from one compromised package vendor can cascade across unrelated infrastructure. sckit is designed to scale the same cascade.

“The binary runs in the background each time the package loads and collects credentials from the home directory, sending them to servers under skyleen.fr.”

SafeDep threat intelligence report, September 23, 2026

IOCs to Block and Hunt Across Your Environment

Block skyleen.fr and all subdomains immediately at DNS and egress firewall. The IP 139.84.223.178 currently hosts the npm campaign's C2 subdomains and should also be blocked. Hunt for sckit process execution artifacts and the worm's state directories before completing credential rotation. If either directory exists on a developer machine or CI runner, treat credential rotation as urgent rather than precautionary.

Subscribe to unlock Indicators of Compromise

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Sigma Detection Rules for the sckit Supply Chain Worm

Two detection rules cover the sckit worm's primary behavioral indicators: process execution of the stage0 dropper and DNS resolution of the C2 infrastructure at skyleen.fr. The process creation rule requires endpoint telemetry with command-line argument logging enabled. The DNS query rule requires DNS logging at the resolver or endpoint level. Both carry experimental status; validate against your environment's log format before enabling automatic blocking.

Subscribe to unlock Sigma Detection Rules

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Subscribe to unlock Sigma Hunt Queries

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Subscribe to unlock WAF Detection Rules

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

How to Remove sckit and Recover Your Developer Environment

Recovery from a MemTensor exposure requires immediate action across four domains: package removal, process termination, credential rotation, and repository audit. Treat this as a confirmed breach until all steps are complete. Do not defer credential rotation, even if your machine showed no obvious signs of compromise: sckit runs silently in the background and suppresses its own output.

Remove affected package versions and pin to safe releases

Uninstall @memtensor/memos-cloud-openclaw-plugin versions 0.1.21, 0.1.23, or 0.1.25 and pin to 0.1.20 in all package.json files and lockfiles. Uninstall MemoryOS 2.0.34 from all Python environments and pin to 2.0.33 in requirements.txt or pyproject.toml. Apply the same pins in all CI/CD pipeline dependency files.

Kill sckit processes and delete state directories

Search for running processes with 'sckit' in the process name or 'stage0' and 'config64' in command-line arguments and terminate them. Delete the state directories $HOME/.openclaw/.cache/runtime (npm variant) and $HOME/.memos/.cache/runtime (PyPI variant) from every developer machine and CI runner that installed the compromised packages.

Block skyleen.fr and 139.84.223.178 at DNS and firewall

Add skyleen.fr and all subdomains to your DNS blocklist and egress firewall deny list immediately. Also block 139.84.223.178 at the network perimeter. This stops any active credential exfiltration from machines still running sckit during the remediation window.

Rotate all credentials accessible from infected environments

Rotate: npm publish tokens, PyPI API tokens, GitHub personal access tokens, GitLab access tokens, all SSH private keys from ~/.ssh, AWS access keys and secret keys (~/.aws/credentials), GCP service account credentials, Azure CLI tokens, HashiCorp Vault tokens, Hugging Face API tokens, Slack tokens, and any API key stored in .env files in project directories the infected environment could reach.

Audit all GitHub Actions workflows for sckit persistence artifacts

Check every repository accessible from the infected developer's GitHub token for runtime-update.yml files in .github/workflows/. Search workflow files for the strings 'sckit', 'SCKIT_EVENT_TEXT', 'SCKIT_CI_RESULT_V2', and 'SCKIT_CI_OBSERVATION_V2'. Delete any injected workflow files and rotate the repository's deploy keys and secrets.

Audit all npm and PyPI packages you control for unexpected versions

Check the npm and PyPI package pages for every package you publish. Look for releases published on or after September 23, 2026 that you did not initiate. A sckit-injected version typically increments the patch number and carries a binary bundled in the package. If found, yank the version immediately and rotate all associated registry tokens.

Implement trusted publishing and release environment protections

Enable GitHub Actions trusted publishing for npm and PyPI (OIDC-based publishing that does not persist long-lived tokens in workflow secrets). Require reviewer approval for release environments in repository settings. Set a package cooldown policy in your CI pipeline to flag any newly published external package version for manual vetting before adoption.

The bottom line

The MemTensor supply chain attack demonstrates that a single compromised CI/CD pipeline can propagate a credential-stealing worm across every package and repository a developer controls. The sckit worm actively circumvents the --ignore-scripts defense most developers rely on. Three actions are time-critical: block skyleen.fr at your DNS resolver and firewall now, rotate all credentials from any environment that installed @memtensor/memos-cloud-openclaw-plugin or MemoryOS before September 23 05:55 UTC, and audit GitHub Actions workflows for runtime-update.yml injection. The credential theft from compromised machines is ongoing until those machines are cleaned and C2 communication is blocked.

This analysis is generic. create a free account to score threats like this against your own stack.

Frequently asked questions

What is the MemTensor supply chain attack?

The MemTensor supply chain attack is a September 23, 2026 compromise of two packages in the MemOS AI memory framework ecosystem: @memtensor/memos-cloud-openclaw-plugin on npm and MemoryOS on PyPI. An attacker exploited MemTensor's GitHub Actions release pipelines to inject sckit, a cross-platform Go worm, into specific versions of both packages. sckit harvests developer credentials from infected machines and CI/CD environments, sends them to C2 servers at skyleen.fr, and propagates itself into additional npm and PyPI packages the victim controls.

Which versions of MemoryOS and the npm package are affected?

On npm, the malicious versions of @memtensor/memos-cloud-openclaw-plugin are 0.1.21, 0.1.23, and 0.1.25. Versions 0.1.20, 0.1.22, and 0.1.24 are clean; the recommended safe pin is 0.1.20. On PyPI, MemoryOS version 2.0.34 is the malicious version; 2.0.33 is clean and the recommended safe pin. Any default npm install or pip install performed between approximately 02:23 and 05:55 UTC on September 23, 2026 may have installed the backdoored version.

How does the sckit worm steal developer credentials?

sckit activates as a background process when the infected package is imported. It reads credential files from the home directory, including .npmrc, .pypirc, .git-credentials, ~/.ssh private keys, ~/.aws/credentials, and cloud CLI token files. It also reads environment variables matching token and secret naming patterns. All captured material is sent to C2 subdomains under skyleen.fr via HTTPS using XChaCha20-Poly1305 encryption. On CI/CD runners, sckit captures secrets injected into the job environment alongside home directory credentials.

Does npm's --ignore-scripts flag protect against the sckit worm?

No. The --ignore-scripts flag prevents npm from running package.json postinstall scripts, which is the most common vector for npm supply chain malware. sckit bypasses this defense entirely because it is deployed as a compiled Go binary that activates at runtime when the package is imported by the application, not during the npm install step. There is no install-time flag or safety check that prevents sckit from executing.

How do I check if sckit is running on my system?

Search for running processes with 'sckit' in the process name or with command-line arguments containing both 'stage0' and 'config64'. Check for the state directories $HOME/.openclaw/.cache/runtime (npm variant) and $HOME/.memos/.cache/runtime (PyPI variant). Review DNS query logs for any resolution of skyleen.fr or its subdomains. On CI/CD systems, check workflow run logs for the strings SCKIT_EVENT_TEXT, SCKIT_CI_RESULT_V2, or SCKIT_CI_OBSERVATION_V2.

What credentials do I need to rotate after the MemTensor compromise?

Rotate every credential that was accessible from the infected environment: npm publish tokens, PyPI API tokens, GitHub personal access tokens, GitLab access tokens, all SSH private keys in ~/.ssh, AWS access key pairs, GCP service account keys, Azure CLI tokens, HashiCorp Vault tokens, Hugging Face API tokens, Slack tokens, Stripe API keys, SendGrid keys, and any secrets stored in .env files the environment could reach. On CI/CD runners, also rotate all secrets configured in the workflow environment.

Can sckit spread to other npm or PyPI packages I control?

Yes. sckit contains worm templates for three propagation vectors. It uses stolen npm publish tokens to release new backdoored versions of any npm package you control. It uses stolen PyPI tokens to do the same for Python packages. It uses stolen GitHub personal access tokens to inject a runtime-update.yml workflow file into repositories you can push to, which triggers sckit execution in those repositories' CI/CD pipelines on every subsequent push event. A single compromised developer machine can seed dozens of downstream packages.

How do I find sckit infection artifacts in GitHub Actions workflow logs?

Search workflow run logs from September 23, 2026 onward for the strings SCKit credential receipt, SCKIT_CI_RESULT_V2, and SCKIT_CI_OBSERVATION_V2. These strings are written to the CI job output when sckit successfully executes in a runner and captures CI secrets. Also check all .github/workflows/ directories in repositories your GitHub token has push access to for unexpected runtime-update.yml files containing sckit commands.

Sources & references

  1. SafeDep: MemTensor npm and PyPI Packages Hit by a Go Worm
  2. The Hacker News: Compromised MemTensor Packages Deliver sckit Credential Stealer via npm and PyPI
  3. StepSecurity: Sckit Supply Chain Worm Hits MemTensor npm and PyPI Scopes
  4. Aikido Security: MemTensor npm and PyPI hit by supplychain.local malware
Summarize with:

Free resources

25
Free download

Critical CVE Reference Card 2025–2026

25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.

No spam. Unsubscribe anytime.

Free download

Ransomware Incident Response Playbook

Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.

No spam. Unsubscribe anytime.

Follow Decryption Digest

Daily briefings + Google Top Stories in one step.

Enter your email and we'll subscribe you to the daily briefing and add Decryption Digest to your Google Search feed at the same time.

Free. Unsubscribe anytime. Google popup confirms the Top Stories add.

Eric Bang
Author

Founder & Cybersecurity Evangelist, Decryption Digest

Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.

Daily Briefing

Get briefings like this every morning

Actionable threat intelligence for working practitioners. Free. No spam. Trusted by 50,000+ SOC analysts, CISOs, and security engineers.

Unsubscribe anytime.

Mythos Brief

Anthropic's AI finds zero-days your scanners miss.