{"id":"GHSA-vf6f-mfc3-9548","revision":null,"records":[{"revision":"ec25d6e1340a49db993a2cbf612228ce","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-14066","aliases":["GHSA-vf6f-mfc3-9548"],"title":"Malicious code in akamaijs-sensorv1 (npm)","description":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (9524ba80283c25fe34b7a9630fc0f65ac8cf112e33a50aa4cbaac19239fcc267)\nThe package advertises itself as an Akamai Bot Manager sensor generator, but its main entry conceals its real behavior. index.js contains a comment composed of invisible Unicode tag / variation-selector code points (U+FE00-U+FE0F and U+E0100-U+E01EF). sync-metrics.js reads the package's own index.js, decodes those invisible characters back into bytes, and executes the resulting string via new Function('require', batch)(require) — a hidden dynamic-eval sink that runs whenever a consumer invokes the exported sensor() API. sensor() additionally fetches a hardcoded public Google Calendar ICS feed (calendar.google.com/calendar/ical/hev4229%40gmail.com/public/basic.ics), parses the newest event's DESCRIPTION field for a URL (accepting plain text, href, or base64-encoded forms), rewrites it to end in /generate, issues a GET to that URL, and returns the response as JSON to the caller. The network destination the installer's process contacts is therefore controlled by whoever owns the hev4229@gmail.com calendar and can be changed at any time by editing a calendar event, with no pinning, signing, or authentication of the retrieved URL. The invisible-character steganography, hidden eval, calendar-based dead-drop C2, and Akamai-lure package name together form a covert remote-code / attacker-controlled-redirector channel.\n","state":0,"publishedAt":"2026-08-15T17:41:47+00:00","modifiedAt":"2026-09-24T09:30:10.9216461+00:00","affected":[{"ecosystem":"npm","name":"akamaijs-sensorv1","ranges":[],"versions":["3.0.0"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/akamaijs-sensorv1/v/3.0.0","https://github.com/ossf/malicious-packages/blob/051ffb7fdada8b093b7eecdc4cac6f65797fedc7/osv/malicious/npm/require-i18next/MAL-2026-14052.json","https://github.com/ossf/malicious-packages/blob/6ac84d47e42a3fc364be5668e5e9dd4ae5a11cf8/osv/malicious/npm/require-i18next/MAL-2026-14052.json","https://github.com/advisories/GHSA-vf6f-mfc3-9548"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-14066","license":"OSV · upstream source license applies","key":"osv:MAL-2026-14066","identifiers":["MAL-2026-14066","GHSA-vf6f-mfc3-9548"]},"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-12T16:19:13.9264037+00:00","complete":true,"records":1779,"lastAttemptAt":"2026-11-12T16:19:13.9264037+00:00","lastSuccessAt":"2026-11-12T16:19:14.0947214+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:19:14.0947234+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-64752486c567b55b31fb0d7225f5222bcd0019564ac0ac5f0649e242c7b19299-c64cc013e4ac327a566ebd7919181330aa5f66a956ac80541b59e61c9511ffa7","complete":true,"records":424746,"lastAttemptAt":"2026-11-12T16:16:35.996916+00:00","lastSuccessAt":"2026-11-12T16:16:35.9151725+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:16:35.996916+00:00","snapshotPublishedAt":"2026-11-12T15:27:51+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-0dd173dcc5624b0cb371f5065d625c0e","complete":true,"records":13774,"lastAttemptAt":"2026-11-12T16:19:53.6740078+00:00","lastSuccessAt":"2026-11-12T15:19:09.202+00:00","error":null,"lastVerifiedAt":"2026-11-12T15:19:09.202+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13827,"expectedIdentifiers":13827,"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-12T16:19:13.9264037+00:00","complete":true,"records":1097,"lastAttemptAt":"2026-11-12T16:19:13.9264037+00:00","lastSuccessAt":"2026-11-12T16:19:14.0955675+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:19:14.0955686+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-a5ed1749d4ca44a88777468d4cc63180","complete":false,"records":13774,"lastAttemptAt":"2026-11-12T16:19:52.8290148+00:00","lastSuccessAt":"2026-11-12T16:19:52.825+00:00","error":"200 identifier lookups failed; latest failures include HttpError (HTTP 503). Other identifiers were checked independently.","lastVerifiedAt":"2026-11-12T16:19:52.825+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13613,"expectedIdentifiers":13827,"failedIdentifiers":200},{"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-3562b6c78fd1bd0f0b55daf66a0926ae24f65e462df7f6d928caad458fc696bf","complete":true,"records":9947,"lastAttemptAt":"2026-11-12T16:19:13.8670149+00:00","lastSuccessAt":"2026-11-11T04:27:43.6877707+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:19:13.8670149+00:00","snapshotPublishedAt":"2026-11-11T03:32: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-456002455e0ab94bb92c95476d4e6d175c104cd594749982afd96c893728ecbc","complete":true,"records":2010,"lastAttemptAt":"2026-11-12T16:16:36.067884+00:00","lastSuccessAt":"2026-11-11T02:36:58.1276999+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:16:36.067884+00:00","snapshotPublishedAt":"2026-11-11T01:17:51+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-0d57668ba92a2918d0664e89ea91d467f8e6a2bc6330923eb883b74ac42a14ec","complete":true,"records":3125,"lastAttemptAt":"2026-11-12T16:19:13.8796609+00:00","lastSuccessAt":"2026-11-12T15:18:36.6112732+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:19:13.8796609+00:00","snapshotPublishedAt":"2026-11-12T14:48:37+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-52c66146e031660a8644f273fd9c179a9dcf81527193679df32e91c1c2afbb7b","complete":true,"records":231703,"lastAttemptAt":"2026-11-12T16:19:13.7355834+00:00","lastSuccessAt":"2026-11-12T16:19:12.0625446+00:00","error":null,"lastVerifiedAt":"2026-11-12T16:19:13.7355834+00:00","snapshotPublishedAt":"2026-11-12T15:33:24+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}