VYPR
High severityOSV Advisory· Published Jan 5, 2026· Updated Mar 5, 2026

MCP TypeScript SDK UriTemplate Exploded Array Pattern ReDoS

CVE-2026-0621

Description

Anthropic's MCP TypeScript SDK versions up to and including 1.25.1 contain a regular expression denial of service (ReDoS) vulnerability in the UriTemplate class when processing RFC 6570 exploded array patterns. The dynamically generated regular expression used during URI matching contains nested quantifiers that can trigger catastrophic backtracking on specially crafted inputs, resulting in excessive CPU consumption. An attacker can exploit this by supplying a malicious URI that causes the Node.js process to become unresponsive, leading to a denial of service.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
@modelcontextprotocol/sdknpm
< 1.25.21.25.2

Affected products

1

Patches

1
b392f02ffcf3

fix: prevent ReDoS in UriTemplate regex patterns (v1.x backport) (#1365)

4 files changed · +32 5
  • package.json+1 1 modified
    @@ -1,6 +1,6 @@
     {
         "name": "@modelcontextprotocol/sdk",
    -    "version": "1.25.1",
    +    "version": "1.25.2",
         "description": "Model Context Protocol implementation for TypeScript",
         "license": "MIT",
         "author": "Anthropic, PBC (https://anthropic.com)",
    
  • package-lock.json+2 2 modified
    @@ -1,12 +1,12 @@
     {
         "name": "@modelcontextprotocol/sdk",
    -    "version": "1.25.1",
    +    "version": "1.25.2",
         "lockfileVersion": 3,
         "requires": true,
         "packages": {
             "": {
                 "name": "@modelcontextprotocol/sdk",
    -            "version": "1.25.1",
    +            "version": "1.25.2",
                 "license": "MIT",
                 "dependencies": {
                     "@hono/node-server": "^1.19.7",
    
  • src/shared/uriTemplate.ts+2 2 modified
    @@ -225,7 +225,7 @@ export class UriTemplate {
     
             switch (part.operator) {
                 case '':
    -                pattern = part.exploded ? '([^/]+(?:,[^/]+)*)' : '([^/,]+)';
    +                pattern = part.exploded ? '([^/,]+(?:,[^/,]+)*)' : '([^/,]+)';
                     break;
                 case '+':
                 case '#':
    @@ -235,7 +235,7 @@ export class UriTemplate {
                     pattern = '\\.([^/,]+)';
                     break;
                 case '/':
    -                pattern = '/' + (part.exploded ? '([^/]+(?:,[^/]+)*)' : '([^/,]+)');
    +                pattern = '/' + (part.exploded ? '([^/,]+(?:,[^/,]+)*)' : '([^/,]+)');
                     break;
                 default:
                     pattern = '([^/]+)';
    
  • test/shared/uriTemplate.test.ts+27 0 modified
    @@ -284,5 +284,32 @@ describe('UriTemplate', () => {
                 vars[longName] = 'value';
                 expect(() => template.expand(vars)).not.toThrow();
             });
    +
    +        it('should not be vulnerable to ReDoS with exploded path patterns', () => {
    +            // Test for ReDoS vulnerability (CVE-2026-0621)
    +            // See: https://github.com/modelcontextprotocol/typescript-sdk/issues/965
    +            const template = new UriTemplate('{/id*}');
    +            const maliciousPayload = '/' + ','.repeat(50);
    +
    +            const startTime = Date.now();
    +            template.match(maliciousPayload);
    +            const elapsed = Date.now() - startTime;
    +
    +            // Should complete in under 100ms, not hang for seconds
    +            expect(elapsed).toBeLessThan(100);
    +        });
    +
    +        it('should not be vulnerable to ReDoS with exploded simple patterns', () => {
    +            // Test for ReDoS vulnerability with simple exploded operator
    +            const template = new UriTemplate('{id*}');
    +            const maliciousPayload = ','.repeat(50);
    +
    +            const startTime = Date.now();
    +            template.match(maliciousPayload);
    +            const elapsed = Date.now() - startTime;
    +
    +            // Should complete in under 100ms, not hang for seconds
    +            expect(elapsed).toBeLessThan(100);
    +        });
         });
     });
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

7

News mentions

0

No linked articles in our index yet.