MAL-2026-17660

See a problem?
Import Source
https://github.com/ossf/malicious-packages/blob/main/osv/malicious/npm/hardhat-option/MAL-2026-17660.json
JSON Data
https://api.osv.dev/v1/vulns/MAL-2026-17660
Published
2026-10-08T03:38:47Z
Modified
2026-10-12T05:00:07Z
Summary
Malicious code in hardhat-option (npm)
Details

hardhat-option@2.0.1 was published to npm on 2026-10-07 09:12 UTC and removed by npm on 2026-10-07 15:29 UTC. Like hardhat-promised@2.21.0 (published the day before), the name targets the Ethereum development tool hardhat, and the package is a copy of the pino logger (README badges still point to pino) with one file added that pino does not contain: lib/config.js, a 4,499,968-byte obfuscated script. index.js requires ./lib/config on line 6, so the payload runs as soon as the package is required. package.json carries the same fake author as hardhat-promised (Robert King hello@jsonspack.com), no repository, and the added dependency axios.

Behavior observed when lib/config.js is loaded in an instrumented sandbox: axios.post of JSON to http://167.88.172.33:8087/api/log containing os.hostname(), os.platform()/release()/type() and os.userInfo().username, with a fixed key ukey=309 (hardhat-promised uses 301), a tag t=3, a timestamp and a SHA-256 'validation' header. The messages posted are 'Failed to spawn autoUploadScript', 'Failed to spawn ldbScript' and 'Failed to spawn socketScript', which name the same three stealer modules as hardhat-promised: automatic file upload, LevelDB (browser extension / wallet storage) reading, and a persistent socket connection to the operator.

Trigger: on import (require). Type: trojanized copy of a popular library acting as an information-stealer loader with a hard-coded C2 at 167.88.172.33:8087; second package of the hardhat-promised family.


-= Per source details. Do not edit below this line.=-

Source: amazon-inspector (2d460f6c739361d793fbc66b2aa32d1d9ab6fe0df4caefe13c590f40d05d5277)

The package's declared main index.js immediately requires./lib/config, which is a single-line ~4.5MB obfuscator.io-style bundle (26,234-entry hex-escaped string array, rotated decoder wrappers, control-flow flattening) whose top-level IIFE executes as soon as the module is loaded. The exported middleware is a no-op, so the sole effect of require('hardhat-option') is to run the opaque payload with the installer's privileges. The package also presents a false identity: the name is hardhat-option but README, index.d.ts and lib/* are copied from pinojs/pino and index.js re-exports module.exports.pino = middleware to satisfy consumers expecting pino's API, while package.json attributes authorship to 'Robert King hello@jsonspack.com' with an unrelated bugs URL at jsonspack.com. A multi-megabyte, fully obfuscated module body that auto-executes on import inside a package falsely wrapped in another project's identity is the canonical loader/dropper shape.

Database specific
{
    "iocs":  {
        "files":  [
            {
                "digests":  {
                    "sha256":  "b01c59ae0a76527503799aab109bd701e34f260d192722a8cf12c97a4e6d208c"
                },
                "note":  "obfuscated loader added to the pino copy; posts host identity to the C2 and spawns the stealer modules",
                "paths":  [
                    "lib/config.js"
                ],
                "source":  "PACKAGE_ARCHIVE"
            },
            {
                "digests":  {
                    "sha256":  "4e6c4e61a7019ab0affe9c2d20e36701b330ec357be205930355bac1464f9316"
                },
                "note":  "requires ./lib/config on line 6, so the payload runs on import",
                "paths":  [
                    "index.js"
                ],
                "source":  "PACKAGE_ARCHIVE"
            }
        ],
        "ips":  [
            "167.88.172.33"
        ],
        "urls":  [
            "http://167.88.172.33:8087/api/log"
        ]
    },
    "malicious-packages-origins":  [
        {
            "id":  "IN-MAL-2026-021119",
            "import_time":  "2026-10-08T03:50:29.181798954Z",
            "modified_time":  "2026-10-08T03:38:47Z",
            "sha256":  "2d460f6c739361d793fbc66b2aa32d1d9ab6fe0df4caefe13c590f40d05d5277",
            "source":  "amazon-inspector",
            "versions":  [
                "2.0.1"
            ]
        }
    ]
}
References
Credits

Affected packages

npm / hardhat-option

Package

Name
hardhat-option
View open source insights on deps.dev
Purl
pkg:npm/hardhat-option

Affected ranges

Affected versions

2.*
2.0.1

Database specific

cwes
[
    {
        "cweId":  "CWE-506",
        "description":  "The product contains code that appears to be malicious in nature.",
        "name":  "Embedded Malicious Code"
    }
]
indicators
{
    "evidence_files":  [
        {
            "path":  "lib/config.js",
            "sha256":  "b01c59ae0a76527503799aab109bd701e34f260d192722a8cf12c97a4e6d208c",
            "tlsh":  "61265f889244e03796cf1ac3bf0529ede57aa861e4cca30797d4be5cb9ac40bd4b5dd0"
        },
        {
            "path":  "package.json",
            "sha256":  "1e4d73a4b8f560ba835af847b248c85e0a7ae02253aa160504a5b5009f3cb746",
            "tlsh":  "5e017620deb88e2301ed25825c2a0603b6a18c175528fc2933dba12c0fad5fb41bf22d"
        }
    ],
    "package_integrity":  [
        {
            "filename":  "hardhat-option-2.0.1.tgz",
            "hashes":  {
                "sha1":  "1f82b713a392b01bd0b75c52654761c7866cef36",
                "sha512_sri":  "sha512-Xuhq5XHR/fIU8SmY4COyYjBbNHa5AA1QAJGj0gx013RxO919NrboN7DnYJqYGKgiRTeA4QYDg1sjgLA+7is6+A=="
            }
        }
    ]
}
source
"https://github.com/ossf/malicious-packages/blob/main/osv/malicious/npm/hardhat-option/MAL-2026-17660.json"