{"id":"MAL-2026-17879","revision":null,"records":[{"revision":"edf771d21d6243189e6e80dfabd1f7c3","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-17879","aliases":[],"title":"Malicious code in @flexmr/ui (npm)","description":"`@flexmr/ui@99.99.99` runs `node beacon.js preinstall`, `node beacon.js install`, and `node beacon.js postinstall` during installation. These lifecycle scripts send the package name, lifecycle event, a fixed token, and host identity details to `177.7.60.239:48080` and encode the hostname in a DNS query under `oob.recon.dev`, probing whether a build resolves the package from the public npm registry; it was published on 2026-10-13.\n\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (7ecabe1286807a163b250140c9973d326849393789d1e1bcdc4ba4422dc39532)\n@flexmr/ui@99.99.99 is a scope-squatting placeholder on public npm with package.json declaring preinstall, install, and postinstall all invoking `node beacon.js`, so the payload fires automatically on `npm install`. beacon.js collects os.hostname(), os.userInfo().username, process.cwd(), platform, node version, package name, and the lifecycle event, then transmits them via HTTP GET to the hardcoded bare-IP endpoint http://177.7.60.239:48080 and via a DNS lookup against the hardcoded callback domain oob.recon.dev. The 99.99.99 version is the standard dependency-confusion overshoot used to win resolution against an internal `@flexmr/ui`; any build that references that name will resolve this public package and execute the beacon. Publisher control of this scope slot additionally enables arbitrary future payloads to replace the current identity beacon.\n","state":0,"publishedAt":"2026-10-13T20:15:56+00:00","modifiedAt":"2026-10-16T07:15:08.2950172+00:00","affected":[{"ecosystem":"npm","name":"@flexmr/ui","ranges":[],"versions":["99.99.99"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/@flexmr/ui","https://www.npmjs.com/package/@flexmr/ui/v/99.99.99"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-17879","license":"OSV · upstream source license applies","key":"osv:MAL-2026-17879","identifiers":["MAL-2026-17879"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-09T11:02:29.3269367+00:00","complete":true,"records":1769,"lastAttemptAt":"2026-11-09T11:02:29.3269367+00:00","lastSuccessAt":"2026-11-09T11:02:35.5033455+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:35.5033494+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-24e6fde7b744113daefb8f6135035fb8a5c69c9617c9c0d40574a0376532ffd3-8a359c2c34b32e9d5ae6bfb0dfbe77525737d387cb73ffa1dc9d8560ac4a618d","complete":true,"records":421363,"lastAttemptAt":"2026-11-09T11:02:25.6637161+00:00","lastSuccessAt":"2026-11-09T11:02:25.604523+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:25.6637161+00:00","snapshotPublishedAt":"2026-11-09T10:27:35+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-776f160a8a4245ff82395b78f580cf00","complete":true,"records":13655,"lastAttemptAt":"2026-11-09T11:14:40.9797117+00:00","lastSuccessAt":"2026-11-09T11:14:40.976+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:14:40.976+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13707,"expectedIdentifiers":13707,"failedIdentifiers":0},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-09T11:02:29.3269367+00:00","complete":true,"records":1096,"lastAttemptAt":"2026-11-09T11:02:29.3269367+00:00","lastSuccessAt":"2026-11-09T11:02:35.5044085+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:35.5044088+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-4dc74a26d06148ffa8eb6751d602315d","complete":true,"records":13667,"lastAttemptAt":"2026-11-09T11:02:37.2248176+00:00","lastSuccessAt":"2026-11-09T10:04:35.272+00:00","error":null,"lastVerifiedAt":"2026-11-09T10:04:35.272+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13707,"expectedIdentifiers":13707,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-980593e6977a6d1b4fb1eed5a1ffe88a468736f89f0a06f710924ad59132c023","complete":true,"records":9914,"lastAttemptAt":"2026-11-09T11:02:28.1148102+00:00","lastSuccessAt":"2026-11-08T11:07:07.068788+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:28.1148102+00:00","snapshotPublishedAt":"2026-11-08T11:02:46+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-fde804134ecdda0ddd5ff5c26ee1fff5a6fa659311f7ef2e51c6ad54964db0e2","complete":true,"records":1971,"lastAttemptAt":"2026-11-09T11:02:27.3222548+00:00","lastSuccessAt":"2026-11-06T19:03:17.0399903+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:27.3222548+00:00","snapshotPublishedAt":"2026-11-06T18:17:57+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-747b24005f13ffe3f133ae77dfb12ae3145f2c7aed5cfebb91eb943ceb4daeb6","complete":true,"records":3060,"lastAttemptAt":"2026-11-09T11:02:28.9741191+00:00","lastSuccessAt":"2026-11-09T10:04:33.8957851+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:28.9741191+00:00","snapshotPublishedAt":"2026-11-09T10:03:05+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-e6e6ac3eaece246ff08884368fe1dc99d4d393571e77c126c8f4d38d66697688","complete":true,"records":231297,"lastAttemptAt":"2026-11-09T11:02:27.67422+00:00","lastSuccessAt":"2026-11-09T10:04:27.0059369+00:00","error":null,"lastVerifiedAt":"2026-11-09T11:02:27.67422+00:00","snapshotPublishedAt":"2026-11-09T09:33:10+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}