{"id":"MAL-2026-16388","revision":null,"records":[{"revision":"abf3b83fdcb04cb1bf9f7738b71c1eea","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-16388","aliases":[],"title":"Malicious code in nodetokyo (npm)","description":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (9ec0e3f7b963353d4d2928e12ca3898cce5100ed3e3537383faa9c7f9a93f203)\nThe package's declared main (launcher.js) executes launch() at module top level, so require('nodetokyo') automatically installs Python 3.12 (via winget or by downloading the python.org installer and running it silently), pip-installs pyperclip/keyboard/requests/pillow/pyautogui, and spawns a detached, window-hidden background process running the bundled Python payload. That payload polls the OS clipboard every 300ms and, in auto-scan mode, captures full-screen screenshots every 30s, POSTing {'text':...} and {'image': <base64>} to the hardcoded endpoint https://nodetokyo.vercel.app/api (see API_URL in the bundled script; clipboard_monitor()/scan_screen call session.post(API_URL,...)). The destination is not caller-configurable. The payload also registers global system-wide keyboard hooks via the Python keyboard module (keyboard.on_press with suppress=True; keyboard.add_hotkey('ctrl+c',...)) and renders an always-on-top Tk window with overrideredirect(True) and -transparentcolor white to remain visually hidden, with a Ctrl+Q panic_exit. Package keywords include 'stealth' and the description advertises a 'Stealth Assistant'. Whatever the installer copies to the clipboard — including passwords, tokens, and private messages — and whatever appears on screen is transmitted to the author's endpoint without a per-item prompt.\n","state":0,"publishedAt":"2026-09-22T18:06:25+00:00","modifiedAt":"2026-09-22T18:45:05.9528556+00:00","affected":[{"ecosystem":"npm","name":"nodetokyo","ranges":[],"versions":["1.0.8"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/nodetokyo/v/1.0.8"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-16388","license":"OSV · upstream source license applies","key":"osv:MAL-2026-16388","identifiers":["MAL-2026-16388"]},"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-12T22:18:31.2281733+00:00","complete":true,"records":1779,"lastAttemptAt":"2026-11-12T22:18:31.2281733+00:00","lastSuccessAt":"2026-11-12T22:18:31.3822045+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:31.3822092+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-16791b8f0b014c31f70da658b9fd545a9a3d610de41d0410119387c383ffb593","complete":true,"records":424878,"lastAttemptAt":"2026-11-12T22:16:26.3594216+00:00","lastSuccessAt":"2026-11-12T22:16:26.1871211+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:16:26.3594216+00:00","snapshotPublishedAt":"2026-11-12T21:27:47+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-20099423d0a548edb4e26b36193686ef","complete":true,"records":13783,"lastAttemptAt":"2026-11-12T22:19:06.2635939+00:00","lastSuccessAt":"2026-11-12T22:19:06.257+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:19:06.257+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13836,"expectedIdentifiers":13836,"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-12T22:18:31.2281733+00:00","complete":true,"records":1123,"lastAttemptAt":"2026-11-12T22:18:31.2281733+00:00","lastSuccessAt":"2026-11-12T22:18:31.3835782+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:31.3835785+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-f80f171c7ef543579f53e7923e9f8fb5","complete":false,"records":13780,"lastAttemptAt":"2026-11-12T22:18:56.7808041+00:00","lastSuccessAt":"2026-11-12T22:18:56.777+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:56.777+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13830,"expectedIdentifiers":13836,"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-0db4c534aaa8e6aa34cb4db66b1c3dbcd45a9d81a0f263fa9d438e08e81869b0","complete":true,"records":9952,"lastAttemptAt":"2026-11-12T22:18:26.2249729+00:00","lastSuccessAt":"2026-11-12T21:16:34.1869923+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:26.2249729+00:00","snapshotPublishedAt":"2026-11-12T21:03:11+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-4d60731753a2f72e455d1086e7203d0ef10843936dcc1cf2b45135e2caa204b0","complete":true,"records":2012,"lastAttemptAt":"2026-11-12T22:16:26.5281803+00:00","lastSuccessAt":"2026-11-12T18:16:50.7862525+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:16:26.5281803+00:00","snapshotPublishedAt":"2026-11-12T17:48:11+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-20d1a8ab073a1c13ab2143dbcadb34ebb8edf1e18e16482b448513662c3d1e12","complete":true,"records":3127,"lastAttemptAt":"2026-11-12T22:18:31.1830853+00:00","lastSuccessAt":"2026-11-12T22:18:31.0338213+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:31.1830853+00:00","snapshotPublishedAt":"2026-11-12T22:18:06+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-4f7217a2d9ebf21bab7a8bab59b4d3fa8bd423b2cd5df11e8f5760660ca322cb","complete":true,"records":231732,"lastAttemptAt":"2026-11-12T22:18:26.0782283+00:00","lastSuccessAt":"2026-11-12T22:18:24.5775428+00:00","error":null,"lastVerifiedAt":"2026-11-12T22:18:26.0782283+00:00","snapshotPublishedAt":"2026-11-12T21:48:11+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}