{"id":"MAL-2026-18184","revision":"e99f1d7467184b62838a5b8f90c44892","records":[{"revision":"e99f1d7467184b62838a5b8f90c44892","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-18184","aliases":[],"title":"Malicious code in formatting-subtitles (npm)","description":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (25577370189f57a5678b2f2c45e212abfc79a3675dc7d51581f633e78aba47a6)\npackage.json declares `preinstall: sh./prepare.js && exit 0`. prepare.js is shaped like JavaScript (ending with `console.log('hello world')`) but is executed by /bin/sh, which does not treat `/**... */` as a comment. Inside that block, sh evaluates two `$(...)` command substitutions: one issues a GET to the hardcoded collector https://webhook.site/9e8c8742-3102-4716-aa8b-e150e9e84fe7/stats_1, and the other downloads https://api.github.com/gists/da04f14c93acbe9a7aef827be0a2e91c, extracts a file via jq, writes it to disk as `x`, and runs it with `sh x`. On `npm install`, the installer host fetches and executes arbitrary, unpinned, attacker-controlled content from a mutable GitHub Gist, and the webhook.site beacon discloses the install (and curl-visible metadata such as public IP and user-agent) to the attacker. The JS-comment-wrapping of the shell payload is a deliberate cover story so prepare.js reads as a trivial hello-world when viewed as JavaScript.\n","state":0,"publishedAt":"2026-10-22T06:11:06+00:00","modifiedAt":"2026-10-22T06:45:04.766832+00:00","affected":[{"ecosystem":"npm","name":"formatting-subtitles","ranges":[],"versions":["1.0.2"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/formatting-subtitles/v/1.0.2"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-18184","license":"OSV · upstream source license applies","key":"osv:MAL-2026-18184","identifiers":["MAL-2026-18184"]},"retained":false,"historicalAffected":[]}],"coverage":[]}