{
  "campaign": {
    "name": "sckit",
    "slug": "sckit",
    "href": "/ti/campaigns/sckit",
    "description": "Supply chain operation using the sckit Go implant framework (Go module supplychain.local/campaign, C2 under skyleen.fr). First seen 2026-09-23 in the compromise of MemTensor packages @memtensor/memos-cloud-openclaw-plugin (npm) and MemoryOS (PyPI). The attacker pushed commits as the MemTensor GitHub account Memtensor-AI (victim account; how access was obtained is not confirmed) that made the project's own GitHub Actions release jobs hand the npm and PyPI publish tokens to sckit via a BASH_ENV entry written to GITHUB_ENV. Per-target campaign configs: cloud-openclaw-semi-nuclear (npm) and memos-semi-nuclear (PyPI), profile semi-nuclear, schema sckit.runtime.v1. No code or infrastructure overlap with Shai-Hulud or other public npm worms was found. Self-propagation code and templates are present in the binary (indicated by function names and strings); spreading beyond MemTensor was not observed.",
    "objective": "Steal developer and CI credentials (including npm and PyPI publish tokens) and use them to spread the implant into further packages and repositories. Spreading objective is indicated by implant code, not observed.",
    "aliases": [
      "supplychain.local worm",
      "supplychain.local/campaign"
    ],
    "discovered_at": "2026-09-23"
  },
  "packages": [
    {
      "ecosystem": "npm",
      "name": "@memtensor/memos-cloud-openclaw-plugin",
      "href": "/ti/packages/npm/@memtensor/memos-cloud-openclaw-plugin",
      "threat_types": [
        "credential_stealer",
        "c2_agent",
        "data_exfiltration",
        "worm"
      ],
      "versions": [
        "0.1.21",
        "0.1.23",
        "0.1.25"
      ]
    },
    {
      "ecosystem": "pypi",
      "name": "MemoryOS",
      "href": "/ti/packages/pypi/MemoryOS",
      "threat_types": [
        "credential_stealer",
        "c2_agent",
        "data_exfiltration",
        "worm"
      ],
      "versions": [
        "2.0.34"
      ]
    }
  ],
  "indicators": [
    {
      "kind": "domain",
      "value": "skyleen.fr",
      "href": "/ti/ioc/domain/skyleen.fr",
      "context": "sckit campaign parent domain. All subdomains are campaign infrastructure. Registered 2026-09-15; wildcard DNS to 127.0.0.1 observed 2026-09-23."
    },
    {
      "kind": "file_path",
      "value": "runtime-update.yml",
      "href": "/ti/ioc/file_path/file_path-e46d7e2620f0",
      "context": "Name found in the sckit binary; inferred (not confirmed) to be the file name of the worm's push-triggered GitHub Actions template that runs sckit stage0."
    },
    {
      "kind": "domain",
      "value": "8a8acaf167b3.skyleen.fr",
      "href": "/ti/ioc/domain/8a8acaf167b3.skyleen.fr",
      "context": "sckit C2 front for campaign cloud-openclaw-semi-nuclear (npm). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "domain",
      "value": "0b48fafd6fbe.skyleen.fr",
      "href": "/ti/ioc/domain/0b48fafd6fbe.skyleen.fr",
      "context": "sckit C2 front for campaign cloud-openclaw-semi-nuclear (npm). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "domain",
      "value": "266297c6df27.skyleen.fr",
      "href": "/ti/ioc/domain/266297c6df27.skyleen.fr",
      "context": "sckit C2 front for campaign cloud-openclaw-semi-nuclear (npm). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "file_path",
      "value": "$HOME/.openclaw/.cache/runtime",
      "href": "/ti/ioc/file_path/file_path-7baf1854d1d7",
      "context": "sckit state directory for campaign cloud-openclaw-semi-nuclear."
    },
    {
      "kind": "file_path",
      "value": "lib/sckit.js",
      "href": "/ti/ioc/file_path/file_path-ecfaf4efb56b",
      "context": "npm loader module (launchStageZero / collectStageZero) in the malicious plugin versions."
    },
    {
      "kind": "file_path",
      "value": ".github/scripts/sckit-publish-bridge.sh",
      "href": "/ti/ioc/file_path/file_path-bd6c2c009e58",
      "context": "CI bridge sourced via BASH_ENV in the npm publish step; passes NPM_TOKEN to sckit, deletes itself, exits 1. Commit 9b97ec6."
    },
    {
      "kind": "sha256",
      "value": "381ac6dc1715d9298fe81b2a53a11f7b7d78e361ee3a6619ad54f8c4b062cc18",
      "href": "/ti/ioc/sha256/381ac6dc1715d9298fe81b2a53a11f7b7d78e361ee3a6619ad54f8c4b062cc18",
      "context": "sckit implant linux-amd64 (ELF/Mach-O), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/linux-amd64/."
    },
    {
      "kind": "sha256",
      "value": "e077c387b223811064b7bbc5a55a0182fca9bf50894f949ff284d4be87d44b26",
      "href": "/ti/ioc/sha256/e077c387b223811064b7bbc5a55a0182fca9bf50894f949ff284d4be87d44b26",
      "context": "sckit implant linux-arm64 (ELF/Mach-O), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/linux-arm64/."
    },
    {
      "kind": "sha256",
      "value": "65faf8ccbcf5b34eb4f72c71bf82815fa9c1e2f947b9c898491540e866132c31",
      "href": "/ti/ioc/sha256/65faf8ccbcf5b34eb4f72c71bf82815fa9c1e2f947b9c898491540e866132c31",
      "context": "sckit implant darwin-amd64 (ELF/Mach-O), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/darwin-amd64/."
    },
    {
      "kind": "sha256",
      "value": "f8ccdd1da7dff1aef16377a2842bc7acf7c516e32122dd6e42dc4a4e57653fce",
      "href": "/ti/ioc/sha256/f8ccdd1da7dff1aef16377a2842bc7acf7c516e32122dd6e42dc4a4e57653fce",
      "context": "sckit implant darwin-arm64 (ELF/Mach-O), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/darwin-arm64/."
    },
    {
      "kind": "sha256",
      "value": "56cd3416d2ec2aa7e7cec2a06010cf0b58eb09c0a5486809df52afeaca8f14be",
      "href": "/ti/ioc/sha256/56cd3416d2ec2aa7e7cec2a06010cf0b58eb09c0a5486809df52afeaca8f14be",
      "context": "sckit implant windows-amd64 (.exe), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/windows-amd64/."
    },
    {
      "kind": "sha256",
      "value": "d6b3e77c36ee8017c9bf30d1da7218ec0ea843768d313eb8e35845c8a9b38a26",
      "href": "/ti/ioc/sha256/d6b3e77c36ee8017c9bf30d1da7218ec0ea843768d313eb8e35845c8a9b38a26",
      "context": "sckit implant windows-arm64 (.exe), campaign cloud-openclaw-semi-nuclear, shipped in npm @memtensor/memos-cloud-openclaw-plugin 0.1.21-0.1.25 under .sckit/windows-arm64/."
    },
    {
      "kind": "domain",
      "value": "c747d139e7e9.skyleen.fr",
      "href": "/ti/ioc/domain/c747d139e7e9.skyleen.fr",
      "context": "sckit C2 front for campaign memos-semi-nuclear (PyPI). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "domain",
      "value": "73376a079d87.skyleen.fr",
      "href": "/ti/ioc/domain/73376a079d87.skyleen.fr",
      "context": "sckit C2 front for campaign memos-semi-nuclear (PyPI). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "domain",
      "value": "d4f77a3a8cb0.skyleen.fr",
      "href": "/ti/ioc/domain/d4f77a3a8cb0.skyleen.fr",
      "context": "sckit C2 front for campaign memos-semi-nuclear (PyPI). Paths /<24 hex>/config, /status, /batch."
    },
    {
      "kind": "domain",
      "value": "10729e014d0e.skyleen.fr",
      "href": "/ti/ioc/domain/10729e014d0e.skyleen.fr",
      "context": "sckit CI delivery host for memos-semi-nuclear (signed index + emitter binary download during the PyPI token-capture run)."
    },
    {
      "kind": "url",
      "value": "https://10729e014d0e.skyleen.fr/eb57efaa7365698fc1e4decc/initial-ci-v2",
      "href": "/ti/ioc/url/url-6cc0f45686e9",
      "context": "Base URL passed by src/memos/_pypi_bridge.sh to _initial_ci_delivery.py during the PyPI publish step. Delivery paths /index/<64 hex>, /file/<64 hex>/<64 hex>, /observe/<64 hex>."
    },
    {
      "kind": "email",
      "value": "ci-review@memtensor.invalid",
      "href": "/ti/ioc/email/ci-review@memtensor.invalid",
      "context": "Fabricated commit author identity \"MemTensor CI Review\" on malicious MemTensor/MemOS commit b52958f (.invalid TLD, not a real mailbox). Detect in git history."
    },
    {
      "kind": "file_path",
      "value": "$HOME/.memos/.cache/runtime",
      "href": "/ti/ioc/file_path/file_path-ef9c19ad8038",
      "context": "sckit state directory for campaign memos-semi-nuclear."
    },
    {
      "kind": "file_path",
      "value": "memos/_stage0.py",
      "href": "/ti/ioc/file_path/file_path-94f3877240d7",
      "context": "Python loader (trigger()) called from memos/log.py configure_logging() in MemoryOS 2.0.34."
    },
    {
      "kind": "file_path",
      "value": "src/memos/_pypi_bridge.sh",
      "href": "/ti/ioc/file_path/file_path-6f390e9e2d53",
      "context": "CI bridge sourced via BASH_ENV inside pypa/gh-action-pypi-publish; forwards INPUT_PASSWORD to the CI delivery script. Commit b52958f."
    },
    {
      "kind": "file_path",
      "value": "sckit_poetry_build.py",
      "href": "/ti/ioc/file_path/file_path-8526c2b66887",
      "context": "In-tree Poetry build backend (backend-path [\".\"]) that writes BASH_ENV=src/memos/_pypi_bridge.sh to GITHUB_ENV on import. Commit b52958f."
    },
    {
      "kind": "sha256",
      "value": "c1b0998347b489582bae7b7f4930f9831d9ef4b6bc150cfd488ee1a43272dd36",
      "href": "/ti/ioc/sha256/c1b0998347b489582bae7b7f4930f9831d9ef4b6bc150cfd488ee1a43272dd36",
      "context": "sckit implant linux-amd64 (ELF/Mach-O), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/linux-amd64/. Same hash as the emitter pinned by _pypi_bridge.sh (--emitter-sha256) and run in initial-ci-emit mode."
    },
    {
      "kind": "sha256",
      "value": "8f647f17a1934679c4095e21bee2b9bd83e28476603758bc91408a0c8443e3b4",
      "href": "/ti/ioc/sha256/8f647f17a1934679c4095e21bee2b9bd83e28476603758bc91408a0c8443e3b4",
      "context": "sckit implant linux-arm64 (ELF/Mach-O), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/linux-arm64/."
    },
    {
      "kind": "sha256",
      "value": "9de0d5b0ca184f71f630be5781d134998883a02d5d7bc65aeb9559d8f9efb364",
      "href": "/ti/ioc/sha256/9de0d5b0ca184f71f630be5781d134998883a02d5d7bc65aeb9559d8f9efb364",
      "context": "sckit implant darwin-amd64 (ELF/Mach-O), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/darwin-amd64/."
    },
    {
      "kind": "sha256",
      "value": "5405e330507602e803f7dd6f2a9d4555aec8558ab222b51413594a962da6888a",
      "href": "/ti/ioc/sha256/5405e330507602e803f7dd6f2a9d4555aec8558ab222b51413594a962da6888a",
      "context": "sckit implant darwin-arm64 (ELF/Mach-O), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/darwin-arm64/."
    },
    {
      "kind": "sha256",
      "value": "16de381deb978744535b10f68fe15165251374b86eef18ffc2c47f61ea673047",
      "href": "/ti/ioc/sha256/16de381deb978744535b10f68fe15165251374b86eef18ffc2c47f61ea673047",
      "context": "sckit implant windows-amd64 (.exe), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/windows-amd64/."
    },
    {
      "kind": "sha256",
      "value": "f7c4014e284f3d56c452b8b222a287c54f73dc4a40a7e022e765ac8376362947",
      "href": "/ti/ioc/sha256/f7c4014e284f3d56c452b8b222a287c54f73dc4a40a7e022e765ac8376362947",
      "context": "sckit implant windows-arm64 (.exe), campaign memos-semi-nuclear, shipped in PyPI MemoryOS 2.0.34 under .sckit/windows-arm64/."
    }
  ],
  "ttps": [
    {
      "name": "Compromise Software Supply Chain",
      "mitre_attack_id": "T1195.002",
      "href": "/ti/ttps/T1195.002"
    },
    {
      "name": "Steal Application Access Token",
      "mitre_attack_id": "T1528",
      "href": "/ti/ttps/T1528"
    },
    {
      "name": "GITHUB_ENV BASH_ENV Injection",
      "href": "/ti/ttps/github-env-bash-env-injection"
    },
    {
      "name": "Unix Shell",
      "mitre_attack_id": "T1059.004",
      "href": "/ti/ttps/T1059.004"
    },
    {
      "name": "JavaScript",
      "mitre_attack_id": "T1059.007",
      "href": "/ti/ttps/T1059.007"
    },
    {
      "name": "Execution Guardrails",
      "mitre_attack_id": "T1480",
      "href": "/ti/ttps/T1480"
    },
    {
      "name": "File Deletion",
      "mitre_attack_id": "T1070.004",
      "href": "/ti/ttps/T1070.004"
    },
    {
      "name": "Web Protocols",
      "mitre_attack_id": "T1071.001",
      "href": "/ti/ttps/T1071.001"
    },
    {
      "name": "Credentials In Files",
      "mitre_attack_id": "T1552.001",
      "href": "/ti/ttps/T1552.001"
    },
    {
      "name": "System Information Discovery",
      "mitre_attack_id": "T1082",
      "href": "/ti/ttps/T1082"
    },
    {
      "name": "System Location Discovery",
      "mitre_attack_id": "T1614",
      "href": "/ti/ttps/T1614"
    },
    {
      "name": "Encrypted Channel",
      "mitre_attack_id": "T1573",
      "href": "/ti/ttps/T1573"
    },
    {
      "name": "Exfiltration Over C2 Channel",
      "mitre_attack_id": "T1041",
      "href": "/ti/ttps/T1041"
    },
    {
      "name": "Python",
      "mitre_attack_id": "T1059.006",
      "href": "/ti/ttps/T1059.006"
    },
    {
      "name": "Ingress Tool Transfer",
      "mitre_attack_id": "T1105",
      "href": "/ti/ttps/T1105"
    }
  ],
  "related_campaigns": [],
  "reports": [
    {
      "title": "MemTensor npm and PyPI Packages Hit by a Go Worm",
      "url": "https://safedep.io/memtensor-sckit-worm-npm-pypi",
      "published_at": "2026-09-23"
    },
    {
      "title": "sckit: A New Go Implant Framework for Supply Chain Worms",
      "url": "https://safedep.io/sckit-go-implant-framework",
      "published_at": "2026-09-23"
    }
  ]
}