MCP OAuth Consent-Layer Confused Deputy via Open Dynamic Client Registration
mcp-oauth-consent-dcr-abuse is a high severity check in the
ai category, written in python.
Its source is templates/ai/mcp/mcp-oauth-consent-dcr-abuse.py in
cert-x-gen-templates.
What it checks
Section titled “What it checks”ACTIVE check. Drives an MCP OAuth authorization server through open Dynamic Client Registration and observes, by behaviour, whether an attacker-registered redirect_uri receives an authorization code with NO re-consent - the consent-layer confused deputy. Distinct from token-audience and issuer-binding: this tests the consent + registration layer, not the token. Also checks RFC 9207 iss return and state binding.
Header
Section titled “Header”| Field | Value |
|---|---|
| Id | mcp-oauth-consent-dcr-abuse |
| Severity | high |
| Language | python |
| Category | ai |
| Author | Bugb Research |
| Template version | 1.0.0 |
| Confidence | 90 |
| CVSS | 8.2 |
| Weakness | CWE-441, CWE-601 |
| Tags | mcp, ai, agent, oauth, oauth-conformance, dynamic-client-registration, dcr, consent, confused-deputy, redirect-uri, rfc9207, rfc7591, authorization-server, behavioural, active, intrusive, cwe-441, cwe-601 |
| Target kind | http |
| Oracle | property |
References
Section titled “References”Declared in the header. cxg parses @references and then discards it, and
nothing at scan time reads it, so this is the only place the links a
template cites are surfaced.
- https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization
- https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration
- https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/security-considerations
- https://www.rfc-editor.org/rfc/rfc7591.html
- https://www.rfc-editor.org/rfc/rfc9207.html
- https://www.rfc-editor.org/rfc/rfc6749.html#section-10.6
- https://cwe.mitre.org/data/definitions/441.html
- https://cwe.mitre.org/data/definitions/601.html
Run it
Section titled “Run it”To see what the copy on your machine says about itself, and to confirm it is installed at all:
cxg template info mcp-oauth-consent-dcr-abuseThe id it prints is the one to pass anywhere a template is selected. See
cxg template for the rest of
the subcommand, Scan a target for running
a scan, and
A match is not a finding for how
to read what comes back.
Related
Section titled “Related”- Template catalog is the whole corpus.
- ai is the rest of this category.
- Templates by weakness class groups checks by the defect they look for.
- Contribute a template is the route from a check you needed and could not find to a merged one.

