{"id":"MAL-2026-17536","revision":"809d7eb150524c288cf4be9e639f4d7b","records":[{"revision":"809d7eb150524c288cf4be9e639f4d7b","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"MAL-2026-17536","aliases":[],"title":"Malicious code in @angulaar/cli (npm)","description":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (33d4a58c855f9b549d39f194483ee19730552bbb47a279f73237c8a403708d20)\nPackage name '@angulaar/cli' (double 'a') is a one-character edit of '@angular/cli'; README, LICENSE headers, and source files are copied verbatim from the real Angular CLI (Google LLC copyright, angular.dev license URLs, README pointing issues to github.com/angular/angular-cli). The manifest's dependencies list has been altered from the upstream package: real @angular/cli depends on '@modelcontextprotocol/sdk', while this package declares '@modelcontextprotocol/server': '2.0.0' and requires it from src/commands/mcp/cli.js and mcp-server.js. '@modelcontextprotocol/server' is not the official MCP package name, so npm install resolves and installs whatever bytes are published under that attacker-chosen name/version, executing any lifecycle scripts in that dependency on the installer's host and loading its code in-process on later `ng mcp` invocations. The lookalike package name, cloned source, and swapped MCP dependency together form a dependency-confusion delivery vector against developers who mistype the real @angular/cli name.\n","state":0,"publishedAt":"2026-10-05T03:31:30+00:00","modifiedAt":"2026-10-05T04:15:05.0547655+00:00","affected":[{"ecosystem":"npm","name":"@angulaar/cli","ranges":[],"versions":["22.2.1"],"rawVersionEvidence":null}],"metrics":[],"references":["https://www.npmjs.com/package/@angulaar/cli/v/22.2.1"],"sourceUrl":"https://osv.dev/vulnerability/MAL-2026-17536","license":"OSV · upstream source license applies","key":"osv:MAL-2026-17536","identifiers":["MAL-2026-17536"]},"retained":false,"historicalAffected":[]}],"coverage":[]}