Executive Summary

    On August 4th, 2026, a supply chain attack was identified on two npm packages, Keyv and Cacheable by Wiz Research. Keyv and Cacheable are very popular JavaScript libraries with over 150 million weekly downloads and are used in many JavaScript deployments. Multiple malicious packages within the Keyv/Cacheable system were published via a compromised GitHub maintainer account to deploy a variant of the Shai-Hulud malware family.

    The malware collects a broad range of credentials used to publish future npm packages within a continuous integration / continuous deployment (CI/CD) pipeline, including personal and production credentials to facilitate further propagation. These secrets were exfiltrated using the description “Shai_Hulud: Here We Go Again” with the commit message “IfYouBlockThisAPIKeyItWillCrashTheLiveProductionServersOfAllThirdPartyClients”.

    Organizations that are affected should immediately audit their environments to confirm whether any identified npm packages were installed. If so, treat the machine as compromised and follow the Mitigations and Workarounds section below.

    Affected Systems or Products

    Product

    Affected Version

    babel-plugin-linaria-css-to-undefined

    0.3.1

    @cacheable/utils

    2.5.1

    cache-manager

    7.2.10

    cacheable-request

    13.0.20

    http-metrics-middleware

    2.2.2

    @hubsync/web-sdk-react

    6.3.7

    keyv

    6.0.0

    @nebula.js/nucleus

    0.5.1

    @ornikar/babel-preset-base

    6.0.3

    @ornikar/babel-preset-kitt-universal

    8.0.3

    @ornikar/babel-preset-react

    6.1.4

    @ornikar/browserslist-config

    8.0.3

    @ornikar/commitlint-config

    8.3.2

    @ornikar/eslint-config-babel

    24.0.1

    @ornikar/eslint-config-react

    24.0.1

    @ornikar/eslint-config-typescript

    24.0.1

    @ornikar/eslint-config-typescript-react

    24.0.1

    @ornikar/eslint-plugin-neverthrow

    1.3.1

    @ornikar/eslint-plugin-ornikar

    24.0.1

    @ornikar/graphql-config

    1.1.1

    @ornikar/intl-config

    10.0.2

    @ornikar/kitt2

    1.0.1

    @ornikar/monorepo-config

    14.3.2

    @ornikar/postcss-config

    9.1.2

    @ornikar/prettier-config

    9.0.3

    @ornikar/prismic-components

    0.0.2

    @ornikar/react-modern-calendar-datepicker

    3.2.1

    @ornikar/react-native-svg-transformer

    1.0.6

    @ornikar/renovate-config

    9.0.2

    @ornikar/repo-config-react

    13.0.8

    @ornikar/repo-config-react-legacy-css

    15.1.2

    @ornikar/rollup-plugin-postcss

    2.0.5

    @ornikar/stylelint-config

    14.0.3

    @ornikar/typed-css-modules-loader

    0.8.2

    picasso-plugin-hammer

    2.11.6

    picasso-plugin-q

    2.11.6

    pob-test-package-in-monorepo

    5.2.1

    @qlik/embed-react

    2.5.3

    @qlik/embed-runtime

    1.6.4

    @qlik/embed-web-components

    1.7.3

    @qlik/runtime-module-loader

    1.5.1

    @thiennq/docs-viewer

    1.6.2

    Mitigations / Workarounds

    Affected organizations should block the following command-and-control endpoints identified used for this attack:

    • npm-cache[.]com - 104.21.35[.]216
    • eth-mainnet.nodereal[.]io - 35.175.164[.]77
    • go.getblock[.]io - 185.44.207[.]215
    • eth.llamarpc[.]com - 172.67.167[.]200
    • pypi-get[.]com - 172.67.136[.]8, 104[.]21.54.63
    • js-mirror[.]com - 104.21.88[.]80, 172.67.174[.]77

    If you believe that a machine has already been compromised, we do not advise cleaning in place and instead recommend reimaging or rebuilding affected machines from known good images.

    Using pinned versions of libraries is also recommended to prevent this kind of attack if new malicious versions are released for any library.

    Additionally, npm offers a npm config set min-release-age 3 configuration setting that will enforce a 48 to 72-hour delay on new package releases before installing them on your machine. This is advised for all developers using external packages. For machines running without human interaction, such as CI/CD pipelines, we advise not only pinning package versions but also disabling scripts on installation with the --ignore-scripts argument wherever possible.

    Patches

    While not strictly a patch, affected npm packages should be removed and purged from impacted machines. This involves removing the affected packages and installing pinned versions of the unaffected npm package with these commands:

    • rm -rf node_modules/plain-crypto-js
    • npm install --ignore-scripts
    • npm cache clean --force

    Indicators of Compromise

    Network Activity

    The following domains and IP addresses have been associated with malicious activity observed during this campaign.

    Domain

    IP Address

    npm-cache[.]com

    104.21.35[.]216

    eth-mainnet.nodereal[.]io

    35.175.164[.]77

    go.getblock[.]io

    185.44.207[.]215

    eth.llamarpc[.]com

    172.67.167[.]200

    pypi-get[.]com

    172.67.136[.]8, 104.21.54[.]63

    js-mirror[.]com

    104.21.88[.]80, 172.67.174[.]77

    Wiz Research has also identified the user-agent performing malicious calls as Bun/1.3.13

    Files

    The following file names and hashes have been identified as part of the malware’s execution.

    Name

    SHA1 Hash

    Math_Symbol.js

    35a672cf34b996b91f3e1c28cbf3a05a37e036e4

    math_init.js

    35a672cf34b996b91f3e1c28cbf3a05a37e036e4

    setup.mjs (in .claude)

    686aa40d0fc22c8d569494543a0f891f359f2f99

    setup.mjs (in .vscode)

    f525d52ceb966516686b482d3dc0137028cc6a63

    How Beazley Security is responding

    Beazley Security is conducting threat hunts across our MDR environment to detect potential exploitation attempts against our clients.

    If you believe your organization may have been impacted by this attack campaign and need support, please contact our Incident Response team.