← Back to CVE Explorer

CVE-2026-66884

Full vulnerability record from the local CVENow database.

Description

Cross-Site Request Forgery vulnerability in Erlang Ecosystem Foundation oidcc_plug (Oidcc.Plug.AuthorizationCallback module) allows an attacker to make a victim's browser complete an authorization flow the victim never initiated. This vulnerability is associated with program file lib/oidcc/plug/authorization_callback.ex and program routine Oidcc.Plug.AuthorizationCallback.call/2. A callback request that carries no Oidcc.Plug.Authorize session is processed with every security check disabled rather than being rejected. call/2 substitutes permissive defaults for the absent session, and each downstream check treats its value as nothing to compare and returns :ok, so the nonce, state, PKCE, peer IP and user agent checks are all skipped. A separate clause of check_state/2 also accepts a state-less request when a verifier is present. An attacker obtains an authorization code for their own provider account, then induces the victim to visit the callback endpoint with that code and no state parameter. The application signs the victim in as the attacker, so the victim's subsequent actions occur in the attacker's account where the attacker can read them. Applications reusing one callback for both signing in and linking a provider account are further exposed to account takeover, the attacker's account becoming linked to the victim's. The permissive fallback serves no conforming flow. Third-party-initiated login reaches a relying party at a separate login initiation endpoint and causes it to send a fresh authentication request, and this library implements no such endpoint. Oidcc.Plug.Authorize always sends a state parameter, which an authorization server must echo, so no legitimate callback lacks one. This issue affects oidcc_plug: from 0.2.0-beta.1 before 0.5.0.

Severity
LOW
CVSS score
2.1 (v4.0)
Vulnerability status
Awaiting Analysis
Source identifier
6b3ad84c-e1a6-4bf7-a703-f496b71e49db
Published
2026-08-04 12:16:36.373000
Last modified
2026-10-23 23:10:00.157000
View original CVE JSON
{
  "id": "CVE-2026-66884",
  "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
  "published": "2026-08-04T12:16:36.373",
  "lastModified": "2026-10-23T23:10:00.157",
  "vulnStatus": "Awaiting Analysis",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Cross-Site Request Forgery vulnerability in Erlang Ecosystem Foundation oidcc_plug (Oidcc.Plug.AuthorizationCallback module) allows an attacker to make a victim's browser complete an authorization flow the victim never initiated.\n\nThis vulnerability is associated with program file lib/oidcc/plug/authorization_callback.ex and program routine Oidcc.Plug.AuthorizationCallback.call/2.\n\nA callback request that carries no Oidcc.Plug.Authorize session is processed with every security check disabled rather than being rejected. call/2 substitutes permissive defaults for the absent session, and each downstream check treats its value as nothing to compare and returns :ok, so the nonce, state, PKCE, peer IP and user agent checks are all skipped. A separate clause of check_state/2 also accepts a state-less request when a verifier is present.\n\nAn attacker obtains an authorization code for their own provider account, then induces the victim to visit the callback endpoint with that code and no state parameter. The application signs the victim in as the attacker, so the victim's subsequent actions occur in the attacker's account where the attacker can read them. Applications reusing one callback for both signing in and linking a provider account are further exposed to account takeover, the attacker's account becoming linked to the victim's.\n\nThe permissive fallback serves no conforming flow. Third-party-initiated login reaches a relying party at a separate login initiation endpoint and causes it to send a fresh authentication request, and this library implements no such endpoint. Oidcc.Plug.Authorize always sends a state parameter, which an authorization server must echo, so no legitimate callback lacks one.\n\nThis issue affects oidcc_plug: from 0.2.0-beta.1 before 0.5.0."
    },
    {
      "lang": "es",
      "value": "Vulnerabilidad de falsificación de petición en sitios cruzados en Erlang Ecosystem Foundation oidcc_plug (módulo Oidcc.Plug.AuthorizationCallback) permite a un atacante hacer que el navegador de una víctima complete un flujo de autorización que la víctima nunca inició.\n\nEsta vulnerabilidad está asociada con el archivo de programa lib/oidcc/plug/authorization_callback.ex y la rutina de programa Oidcc.Plug.AuthorizationCallback.call/2.\n\nUna petición de devolución de llamada que no lleva ninguna sesión de Oidcc.Plug.Authorize se procesa con todas las verificaciones de seguridad deshabilitadas en lugar de ser rechazada. call/2 sustituye valores predeterminados permisivos para la sesión ausente, y cada verificación posterior trata su valor como nada que comparar y devuelve :ok, por lo que las verificaciones de nonce, estado, PKCE, IP del par y agente de usuario son todas omitidas. Una cláusula separada de check_state/2 también acepta una petición sin estado cuando un verificador está presente.\n\nUn atacante obtiene un código de autorización para su propia cuenta de proveedor, luego induce a la víctima a visitar el punto final de devolución de llamada con ese código y sin parámetro de estado. La aplicación inicia la sesión de la víctima como el atacante, por lo que las acciones posteriores de la víctima ocurren en la cuenta del atacante donde el atacante puede leerlas. Las aplicaciones que reutilizan una devolución de llamada tanto para iniciar sesión como para vincular una cuenta de proveedor están aún más expuestas a la toma de control de cuenta, quedando la cuenta del atacante vinculada a la víctima.\n\nLa alternativa permisiva no sirve a ningún flujo conforme. El inicio de sesión iniciado por terceros llega a una parte confiable en un punto final de inicio de sesión separado y hace que envíe una nueva petición de autenticación, y esta biblioteca no implementa tal punto final. Oidcc.Plug.Authorize siempre envía un parámetro de estado, que un servidor de autorización debe hacer eco, por lo que ninguna devolución de llamada legítima carece de uno.\n\nEste problema afecta a oidcc_plug: desde 0.2.0-beta.1 antes de 0.5.0."
    }
  ],
  "affected": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "affectedData": [
        {
          "vendor": "Erlang Ecosystem Foundation",
          "product": "oidcc_plug",
          "defaultStatus": "unaffected",
          "collectionURL": "https://repo.hex.pm",
          "packageName": "oidcc_plug",
          "cpes": [
            "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
          ],
          "modules": [
            "Elixir.Oidcc.Plug.AuthorizationCallback"
          ],
          "programFiles": [
            "lib/oidcc/plug/authorization_callback.ex"
          ],
          "programRoutines": [
            {
              "name": "'Elixir.Oidcc.Plug.AuthorizationCallback':call/2"
            }
          ],
          "repo": "https://github.com/erlef/oidcc_plug",
          "packageURL": "pkg:hex/oidcc_plug",
          "versions": [
            {
              "version": "0.2.0-beta.1",
              "lessThan": "0.5.0",
              "versionType": "semver",
              "status": "affected"
            }
          ]
        },
        {
          "vendor": "Erlang Ecosystem Foundation",
          "product": "oidcc_plug",
          "defaultStatus": "unaffected",
          "collectionURL": "https://github.com",
          "packageName": "erlef/oidcc_plug",
          "cpes": [
            "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
          ],
          "modules": [
            "Elixir.Oidcc.Plug.AuthorizationCallback"
          ],
          "programFiles": [
            "lib/oidcc/plug/authorization_callback.ex"
          ],
          "programRoutines": [
            {
              "name": "'Elixir.Oidcc.Plug.AuthorizationCallback':call/2"
            }
          ],
          "repo": "https://github.com/erlef/oidcc_plug",
          "packageURL": "pkg:github/erlef/oidcc_plug",
          "versions": [
            {
              "version": "e577ae73b9080693442916043a22d8f05491dd93",
              "lessThan": "97d75afc57826dca31989b47d6e2a3c136039917",
              "versionType": "git",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV40": [
      {
        "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "type": "Secondary",
        "cvssData": {
          "version": "4.0",
          "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
          "baseScore": 2.1,
          "baseSeverity": "LOW",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "attackRequirements": "PRESENT",
          "privilegesRequired": "NONE",
          "userInteraction": "ACTIVE",
          "vulnConfidentialityImpact": "LOW",
          "vulnIntegrityImpact": "LOW",
          "vulnAvailabilityImpact": "NONE",
          "subConfidentialityImpact": "NONE",
          "subIntegrityImpact": "NONE",
          "subAvailabilityImpact": "NONE",
          "exploitMaturity": "NOT_DEFINED",
          "confidentialityRequirement": "NOT_DEFINED",
          "integrityRequirement": "NOT_DEFINED",
          "availabilityRequirement": "NOT_DEFINED",
          "modifiedAttackVector": "NOT_DEFINED",
          "modifiedAttackComplexity": "NOT_DEFINED",
          "modifiedAttackRequirements": "NOT_DEFINED",
          "modifiedPrivilegesRequired": "NOT_DEFINED",
          "modifiedUserInteraction": "NOT_DEFINED",
          "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
          "modifiedVulnIntegrityImpact": "NOT_DEFINED",
          "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
          "modifiedSubConfidentialityImpact": "NOT_DEFINED",
          "modifiedSubIntegrityImpact": "NOT_DEFINED",
          "modifiedSubAvailabilityImpact": "NOT_DEFINED",
          "Safety": "NOT_DEFINED",
          "Automatable": "NOT_DEFINED",
          "Recovery": "NOT_DEFINED",
          "valueDensity": "NOT_DEFINED",
          "vulnerabilityResponseEffort": "NOT_DEFINED",
          "providerUrgency": "NOT_DEFINED"
        }
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-08-04T12:37:09.321822Z",
          "id": "CVE-2026-66884",
          "options": [
            {
              "exploitation": "poc"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "partial"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-352"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://cna.erlef.org/cves/CVE-2026-66884.html",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/erlef/oidcc_plug/commit/97d75afc57826dca31989b47d6e2a3c136039917",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-fg66-w5gp-22cr",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66884",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-fg66-w5gp-22cr",
      "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0"
    }
  ]
}