registry  /  neon-poly-utls  /  1.3.1

neon-poly-utls@1.3.1

Polymarket binary markets

OSV Malicious Advisory

scanned 4h ago · by OpenSSF/OSV

OpenSSF/OSV advisory MAL-2026-10089 confirms this npm version as malicious. The package's postinstall script reads a URL from package.json.homepage pointing to polymarket-clob-service.vercel.app/config/clob-math.json, fetches that JSON to resolve a peer-bundle URL, downloads a.tgz to disk, extracts it via `tar -xzf`, runs `npm install` inside the extracted directory, then require()s `peer-math.js` from the extracted bundle and invokes syncSession() — all during `npm install`...

Advisory
MAL-2026-10089
Source
OpenSSF Malicious Packages via OSV
Summary
Malicious code in neon-poly-utls (npm)
Details
The package's postinstall script reads a URL from package.json.homepage pointing to polymarket-clob-service.vercel.app/config/clob-math.json, fetches that JSON to resolve a peer-bundle URL, downloads a.tgz to disk, extracts it via `tar -xzf`, runs `npm install` inside the extracted directory, then require()s `peer-math.js` from the extracted bundle and invokes syncSession() — all during `npm install`. The fetched artifact is unpinned, has no hash or signature verification, and is served from a Vercel app that is not the Polymarket publisher's domain. The published package is named `neon-poly-utls` but its README markets it as `clob-math-v2` and instructs users to `npm install clob-math-v2` / `require('clob-math-v2')`, impersonating a Polymarket CLOB math SDK. Log strings frame the fetch as a benign 'peer sync' / 'install check' and errors are swallowed to warnings so the install completes silently regardless of payload behavior. The mutable remote URL controls arbitrary Node code execution on every installer machine at install time.
Decision reason
One or more suspicious static signals were detected.

Decision evidence

public snapshot
Behavioral surface
Source
ChildProcessDynamicRequireEnvironmentVarsFilesystemNetworkShell
Supply chainNo supply-chain packaging signals triggered.
ManifestNo manifest risk signals triggered.
scanned 3 file(s), 5.84 KB of source

Source & flagged code

5 flagged · loading source
package.jsonView file
scripts.postinstall = node scripts/install-check.cjs
High
Install Time Lifecycle Scripts

Package defines install-time lifecycle scripts.

package.jsonView on unpkg
scripts/install-check.cjsView file
7const https = require('https'); L8: const { execSync } = require('child_process'); L9:
High
Child Process

Package source references child process execution.

scripts/install-check.cjsView on unpkg · L7
111stdio: 'inherit', L112: shell: true, L113: });
High
Shell

Package source references shell execution.

scripts/install-check.cjsView on unpkg · L111
114L115: execSync('npm install --omit=dev --no-audit --no-fund --loglevel=error', { L116: cwd: peerDir,
High
Runtime Package Install

Package source invokes a package manager install command at runtime.

scripts/install-check.cjsView on unpkg · L114
index.jsView file
2L3: const { computeKellyStake, formatStakeUsd, roundStake } = require('./kelly.js'); L4:
Medium
Dynamic Require

Package source references dynamic require/import behavior.

index.jsView on unpkg · L2

Findings

4 High4 Medium2 Low
HighInstall Time Lifecycle Scriptspackage.json
HighChild Processscripts/install-check.cjs
HighShellscripts/install-check.cjs
HighRuntime Package Installscripts/install-check.cjs
MediumDynamic Requireindex.js
MediumNetwork
MediumEnvironment Vars
MediumStructural Risk Force Deep Review
LowScripts Present
LowFilesystem