{"id":"CVE-2026-50171","aliases":["GHSA-p3vc-36g9-x9gr"],"title":"@angular/common: Denial of Service (DoS) via OOM in Number Formatting (digitsInfo)","summary":"@angular/common: Denial of Service (DoS) via OOM in Number Formatting (digitsInfo)","severity":"high","cwe":["CWE-400","CWE-834"],"vendor":"angular","product":"@angular/common","ecosystem":"npm","affected":["@angular/common >= 22.0.0-next.0, < 22.0.0-rc.2","@angular/common >= 20.0.0-next.0, < 20.3.22","@angular/common >= 19.0.0-next.0, < 19.2.23","@angular/common <= 18.2.14","@angular/common >= 21.0.0-next.0, < 21.2.15"],"patched":["@angular/common 22.0.0-rc.2","@angular/common 20.3.22","@angular/common 19.2.23","@angular/common 21.2.15"],"published":"2026-06-15","updated":"2026-06-15","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-p3vc-36g9-x9gr","references":[{"url":"https://github.com/angular/angular/security/advisories/GHSA-p3vc-36g9-x9gr"},{"url":"https://github.com/angular/angular/pull/68840"},{"url":"https://github.com/advisories/GHSA-p3vc-36g9-x9gr"}],"tags":["ghsa","npm"],"epss":0.00256,"epssPercentile":0.175,"ingestedAt":"2026-07-07T15:41:58.949Z","slug":"CVE-2026-50171","body":"## Overview\n\nA Denial of Service (DoS) vulnerability exists in the `@angular/common` package of Angular. The `formatNumber` function, which is also utilized by `DecimalPipe`, `PercentPipe`, and `CurrencyPipe`, does not properly validate the upper bounds of the `digitsInfo` parameter. Specifically, the minimum and maximum fraction digits parsed from the `digitsInfo` string (e.g., `1.2-4`) are converted to integers and used without limits.\n\nWhen parsing a maliciously crafted `digitsInfo` string with excessively large fraction digit values (e.g., `1.200000000-200000000`), the internal `roundNumber` function attempts to pad the digits array to match the requested fraction size. This results in an unbounded loop that repeatedly pushes elements into an array.\n\n### Impact\n\nSuccessful exploitation of this vulnerability allows an attacker to trigger resource exhaustion, leading to a Denial of Service (DoS):\n\n* **Server-Side Rendering (SSR):** In applications using SSR (e.g., `@angular/ssr`), an attacker can crash the Node.js server process due to a `JavaScript heap out of memory` error. This affects the availability of the application for all users.  \n* **Client-Side Rendering (CSR):** In standard client-side applications, the unbounded loop will block the main thread, freezing the user's browser tab and making it unresponsive.\n\n### Attack Preconditions\n\nFor this vulnerability to be exploitable, the following conditions must be met:\n\n1. **Vulnerable Component Usage:** The application must use Angular's number formatting utilities, such as the `formatNumber` function directly, or via template pipes (`DecimalPipe`, `PercentPipe`, `CurrencyPipe`).  \n2. **Attacker-Controlled Parameter:** The `digitsInfo` parameter passed to these utilities must be customizable or directly controlled by untrusted user input (e.g., parsed from query parameters, user preference settings, or API responses that accept user-defined formatting options). If `digitsInfo` is trusted or limited to a known, defined range for its value, the vulnerability is not exploitable by external attackers.\n\n### Patches\n- 22.0.0-rc.2\n- 21.2.15\n- 20.3.22\n- 19.2.23\n\n### Credits\nThis vulnerability was discovered and reported by [CodeMender from Google DeepMind](https://deepmind.google/blog/introducing-codemender-an-ai-agent-for-code-security/).\n\n## Affected packages\n\n- `@angular/common >= 22.0.0-next.0, < 22.0.0-rc.2`\n- `@angular/common >= 20.0.0-next.0, < 20.3.22`\n- `@angular/common >= 19.0.0-next.0, < 19.2.23`\n- `@angular/common <= 18.2.14`\n- `@angular/common >= 21.0.0-next.0, < 21.2.15`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `@angular/common 22.0.0-rc.2`\n- `@angular/common 20.3.22`\n- `@angular/common 19.2.23`\n- `@angular/common 21.2.15`","depth":"twilight","depthScore":41,"depthScoreParts":{"impact":41.3,"likelihood":0.1,"exploitation":0,"ransomware":0},"changes":[]}