{"id":"MAL-2026-12339","revision":"dc83aa95705840fa8f7ff46f5fa2cfd9","records":[{"revision":"dc83aa95705840fa8f7ff46f5fa2cfd9","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-12339","aliases":[],"title":"Malicious code in async-mutex-hook (npm)","description":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (624c93cbd007656467757c5504db29971b220bc36685eda2af6a1d1390715133)\nPackage is published under the name async-mutex-hook and self-describes as a Promise-based mutex library, but ships no mutex implementation. Its exported getPlugin function issues an HTTPS request to the hardcoded bare-IP endpoint https://46.183.25.232:45000/icons/108 and passes the response's `credits` field to `new Function('require','module','exports',...,'Promise', data.credits)`, executing attacker-controlled JavaScript with full Node.js privileges (require, process, Buffer, and shipped dependencies injected). The declared dependencies (@primno/dpapi for Windows DPAPI, better-sqlite3/sqlite3 for browser cookie and login databases, node-machine-id) are unrelated to any mutex functionality and are the standard building blocks for browser-credential and DPAPI theft, matching the capability the remote payload would need to invoke on the installer's host.\n","state":0,"publishedAt":"2026-08-05T12:47:07+00:00","modifiedAt":"2026-09-24T09:30:11.2994291+00:00","affected":[{"ecosystem":"npm","name":"async-mutex-hook","ranges":[],"versions":["2.1.0"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/async-mutex-hook/v/2.1.0"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-12339","license":"OSV · upstream source license applies","key":"osv:MAL-2026-12339","identifiers":["MAL-2026-12339"]},"retained":false,"historicalAffected":[]}],"coverage":[]}