Search

Find a vulnerability

Search criteria Use this form to refine search results.
Full-text search supports keyword queries with ranking and filtering.
You can combine vendor, product, and sources to narrow results.
Enable “Apply ordering” to sort by date instead of relevance.

    171 vulnerabilities

    CVE-2026-67579 (GCVE-0-2026-67579)

    Vulnerability from cvelistv5 – Published: 2026-08-12 20:04 – Updated: 2026-08-13 12:44
    VLAI
    Title
    Filter expression injection via forged keyset pagination cursor in Ash
    Summary
    Deserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer. Read actions with keyset pagination decode the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex using non_executable_binary_to_term/2 with [:safe]. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded %Ash.Query.Call{} expression survives and is spliced into the keyset filter as a comparison value in do_filters/4 and evaluated. Because the cursor bypasses the Ash.Expr macro, the runtime never applies the private?/public? gate that would otherwise reject it. On AshPostgres the injected fragment is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call. This issue affects ash: from 1.17.0 before 3.31.3.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-13 12:43 UTC
    CWE
    • CWE-502 - Deserialization of Untrusted Data
    • CWE-89 - Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ash-project ash Affected: 1.17.0 , < 3.31.3 (semver)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ash-project ash Affected: f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9 , < 91874dd5435bc0ffebd8a254acfa573b39b74520 (git)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-67579",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-13T12:43:59.286788Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-13T12:44:48.074Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ash-project/ash/security/advisories/GHSA-3gq3-9xm3-c8v3"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Page.Keyset\u0027"
              ],
              "packageName": "ash",
              "packageURL": "pkg:hex/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/page/keyset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:decode_values/2"
                },
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:do_filters/4"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "3.31.3",
                  "status": "affected",
                  "version": "1.17.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Page.Keyset\u0027"
              ],
              "packageName": "ash-project/ash",
              "packageURL": "pkg:github/ash-project/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/page/keyset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:decode_values/2"
                },
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:do_filters/4"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "91874dd5435bc0ffebd8a254acfa573b39b74520",
                  "status": "affected",
                  "version": "f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA read action must declare \u003ccode\u003ekeyset? true\u003c/code\u003e in its \u003ccode\u003epagination\u003c/code\u003e block, and the application must pass a client-supplied value as the \u003ccode\u003e:after\u003c/code\u003e or \u003ccode\u003e:before\u003c/code\u003e page option. The severity of a successful attack depends on the data layer: AshPostgres yields SQL injection, while the ETS and Simple data layers evaluate the injected expression in-process.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "A read action must declare `keyset? true` in its `pagination` block, and the application must pass a client-supplied value as the `:after` or `:before` page option. The severity of a successful attack depends on the data layer: AshPostgres yields SQL injection, while the ETS and Simple data layers evaluate the injected expression in-process."
                }
              ],
              "value": "A read action must declare keyset? true in its pagination block, and the application must pass a client-supplied value as the :after or :before page option. The severity of a successful attack depends on the data layer: AshPostgres yields SQL injection, while the ETS and Simple data layers evaluate the injected expression in-process."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "3.31.3",
                      "versionStartIncluding": "1.17.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Jisung Chae"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Zach Daniel"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDeserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer.\u003c/p\u003e\n\u003cp\u003eRead actions with keyset pagination decode the client-supplied \u003ccode\u003epage[:after]\u003c/code\u003e or \u003ccode\u003epage[:before]\u003c/code\u003e cursor in \u003ccode\u003edecode_values/2\u003c/code\u003e in \u003ccode\u003elib/ash/page/keyset.ex\u003c/code\u003e using \u003ccode\u003enon_executable_binary_to_term/2\u003c/code\u003e with \u003ccode\u003e[:safe]\u003c/code\u003e. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded \u003ccode\u003e%Ash.Query.Call{}\u003c/code\u003e expression survives and is spliced into the keyset filter as a comparison value in \u003ccode\u003edo_filters/4\u003c/code\u003e and evaluated. Because the cursor bypasses the \u003ccode\u003eAsh.Expr\u003c/code\u003e macro, the runtime never applies the \u003ccode\u003eprivate?\u003c/code\u003e/\u003ccode\u003epublic?\u003c/code\u003e gate that would otherwise reject it. On AshPostgres the injected \u003ccode\u003efragment\u003c/code\u003e is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash: from 1.17.0 before 3.31.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Deserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer.\n\nRead actions with keyset pagination decode the client-supplied `page[:after]` or `page[:before]` cursor in `decode_values/2` in `lib/ash/page/keyset.ex` using `non_executable_binary_to_term/2` with `[:safe]`. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded `%Ash.Query.Call{}` expression survives and is spliced into the keyset filter as a comparison value in `do_filters/4` and evaluated. Because the cursor bypasses the `Ash.Expr` macro, the runtime never applies the `private?`/`public?` gate that would otherwise reject it. On AshPostgres the injected `fragment` is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call.\n\nThis issue affects ash: from 1.17.0 before 3.31.3."
                }
              ],
              "value": "Deserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer.\n\nRead actions with keyset pagination decode the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex using non_executable_binary_to_term/2 with [:safe]. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded %Ash.Query.Call{} expression survives and is spliced into the keyset filter as a comparison value in do_filters/4 and evaluated. Because the cursor bypasses the Ash.Expr macro, the runtime never applies the private?/public? gate that would otherwise reject it. On AshPostgres the injected fragment is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call.\n\nThis issue affects ash: from 1.17.0 before 3.31.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-586",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-586 Object Injection"
                }
              ]
            },
            {
              "capecId": "CAPEC-66",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-66 SQL Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 7.5,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-502",
                  "description": "CWE-502 Deserialization of Untrusted Data",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            },
            {
              "descriptions": [
                {
                  "cweId": "CWE-89",
                  "description": "CWE-89 Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-12T20:04:42.256Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ash-project/ash/security/advisories/GHSA-3gq3-9xm3-c8v3"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-67579.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-67579"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ash-project/ash/commit/91874dd5435bc0ffebd8a254acfa573b39b74520"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Filter expression injection via forged keyset pagination cursor in Ash"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-67579",
        "datePublished": "2026-08-12T20:04:42.256Z",
        "dateReserved": "2026-08-09T16:45:01.833Z",
        "dateUpdated": "2026-08-13T12:44:48.074Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-64941 (GCVE-0-2026-64941)

    Vulnerability from cvelistv5 – Published: 2026-08-10 11:05 – Updated: 2026-08-10 13:00
    VLAI
    Title
    Open redirect in Phoenix.LiveView.validate_local_url!/2 via ASCII tab, LF and CR
    Summary
    URL Redirection to Untrusted Site ('Open Redirect') vulnerability in phoenixframework phoenix_live_view allows an attacker to send a victim's browser to an origin of the attacker's choosing via a :to value containing ASCII tab, LF or CR. redirect/2 validates :to through the private validate_local_url!/2 in lib/phoenix_live_view.ex, which is intended to guarantee the target is a path within the application. It rejects a leading // and any backslash, but not ASCII tab, LF or CR. Browsers strip those three characters before parsing a URL, so a value such as /<TAB>/example.com passes validation as a path and is then resolved as the scheme-relative URL //example.com. The live navigation functions share the guard but are not affected, because the client expands their target against the current origin. push_patch/2 is also affected before 0.7.0, which is when that expansion was added. This issue affects phoenix_live_view: from 0.5.0 before 1.0.19, from 1.1.0-rc.0 before 1.1.33, and from 1.2.0-rc.0 before 1.2.9.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-10 13:00 UTC
    CWE
    • CWE-601 - URL Redirection to Untrusted Site ('Open Redirect')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    phoenixframework phoenix_live_view Affected: 0.5.0 , < 1.0.19 (semver)
    Affected: 1.1.0-rc.0 , < 1.1.33 (semver)
    Affected: 1.2.0-rc.0 , < 1.2.9 (semver)
        cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*
    Create a notification for this product.
    phoenixframework phoenix_live_view Affected: b20dba3f65a380b2e4868dae03397f13d2daa070 , < * (git)
        cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-64941",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-10T13:00:10.932600Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-10T13:00:33.543Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/phoenixframework/phoenix_live_view/security/advisories/GHSA-36m4-rm57-3prf"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Phoenix.LiveView\u0027"
              ],
              "packageName": "phoenix_live_view",
              "packageURL": "pkg:hex/phoenix_live_view",
              "product": "phoenix_live_view",
              "programFiles": [
                "lib/phoenix_live_view.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Phoenix.LiveView\u0027:redirect/2"
                },
                {
                  "name": "\u0027Elixir.Phoenix.LiveView\u0027:push_patch/2"
                }
              ],
              "repo": "https://github.com/phoenixframework/phoenix_live_view",
              "vendor": "phoenixframework",
              "versions": [
                {
                  "lessThan": "1.0.19",
                  "status": "affected",
                  "version": "0.5.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "1.1.33",
                  "status": "affected",
                  "version": "1.1.0-rc.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "1.2.9",
                  "status": "affected",
                  "version": "1.2.0-rc.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Phoenix.LiveView\u0027"
              ],
              "packageName": "phoenixframework/phoenix_live_view",
              "packageURL": "pkg:github/phoenixframework/phoenix_live_view",
              "product": "phoenix_live_view",
              "programFiles": [
                "lib/phoenix_live_view.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Phoenix.LiveView\u0027:redirect/2"
                },
                {
                  "name": "\u0027Elixir.Phoenix.LiveView\u0027:push_patch/2"
                }
              ],
              "repo": "https://github.com/phoenixframework/phoenix_live_view",
              "vendor": "phoenixframework",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "0b8c733133466912f81adecaea72b6712370242e",
                      "status": "unaffected"
                    },
                    {
                      "at": "1c164f83df0bb922dfff9c60d125da5b0cfd6619",
                      "status": "unaffected"
                    },
                    {
                      "at": "2068b304d71907064b159b6bc60c5ad85a876ecf",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "b20dba3f65a380b2e4868dae03397f13d2daa070",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe application must pass an externally influenced value as \u003ccode\u003e:to\u003c/code\u003e to \u003ccode\u003eredirect/2\u003c/code\u003e, or to \u003ccode\u003epush_patch/2\u003c/code\u003e before 0.7.0, for example a \u003ccode\u003ereturn_to\u003c/code\u003e parameter carried through sign-in or a navigation target taken from a \u003ccode\u003ehandle_event/3\u003c/code\u003e payload.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "The application must pass an externally influenced value as `:to` to `redirect/2`, or to `push_patch/2` before 0.7.0, for example a `return_to` parameter carried through sign-in or a navigation target taken from a `handle_event/3` payload."
                }
              ],
              "value": "The application must pass an externally influenced value as :to to redirect/2, or to push_patch/2 before 0.7.0, for example a return_to parameter carried through sign-in or a navigation target taken from a handle_event/3 payload."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.0.19",
                      "versionStartIncluding": "0.5.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.1.33",
                      "versionStartIncluding": "1.1.0-rc.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:phoenixframework:phoenix_live_view:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.2.9",
                      "versionStartIncluding": "1.2.0-rc.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Eurico Nicacio"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Steffen Deusch"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eURL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in phoenixframework phoenix_live_view allows an attacker to send a victim\u0027s browser to an origin of the attacker\u0027s choosing via a \u003ccode\u003e:to\u003c/code\u003e value containing ASCII tab, LF or CR.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eredirect/2\u003c/code\u003e validates \u003ccode\u003e:to\u003c/code\u003e through the private \u003ccode\u003evalidate_local_url!/2\u003c/code\u003e in \u003ccode\u003elib/phoenix_live_view.ex\u003c/code\u003e, which is intended to guarantee the target is a path within the application. It rejects a leading \u003ccode\u003e//\u003c/code\u003e and any backslash, but not ASCII tab, LF or CR. Browsers strip those three characters before parsing a URL, so a value such as \u003ccode\u003e/\u0026lt;TAB\u0026gt;/example.com\u003c/code\u003e passes validation as a path and is then resolved as the scheme-relative URL \u003ccode\u003e//example.com\u003c/code\u003e. The live navigation functions share the guard but are not affected, because the client expands their target against the current origin. \u003ccode\u003epush_patch/2\u003c/code\u003e is also affected before 0.7.0, which is when that expansion was added.\u003c/p\u003e\n\u003cp\u003eThis issue affects phoenix_live_view: from 0.5.0 before 1.0.19, from 1.1.0-rc.0 before 1.1.33, and from 1.2.0-rc.0 before 1.2.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in phoenixframework phoenix_live_view allows an attacker to send a victim\u0027s browser to an origin of the attacker\u0027s choosing via a `:to` value containing ASCII tab, LF or CR.\n\n`redirect/2` validates `:to` through the private `validate_local_url!/2` in `lib/phoenix_live_view.ex`, which is intended to guarantee the target is a path within the application. It rejects a leading `//` and any backslash, but not ASCII tab, LF or CR. Browsers strip those three characters before parsing a URL, so a value such as `/\u003cTAB\u003e/example.com` passes validation as a path and is then resolved as the scheme-relative URL `//example.com`. The live navigation functions share the guard but are not affected, because the client expands their target against the current origin. `push_patch/2` is also affected before 0.7.0, which is when that expansion was added.\n\nThis issue affects phoenix_live_view: from 0.5.0 before 1.0.19, from 1.1.0-rc.0 before 1.1.33, and from 1.2.0-rc.0 before 1.2.9."
                }
              ],
              "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in phoenixframework phoenix_live_view allows an attacker to send a victim\u0027s browser to an origin of the attacker\u0027s choosing via a :to value containing ASCII tab, LF or CR.\n\nredirect/2 validates :to through the private validate_local_url!/2 in lib/phoenix_live_view.ex, which is intended to guarantee the target is a path within the application. It rejects a leading // and any backslash, but not ASCII tab, LF or CR. Browsers strip those three characters before parsing a URL, so a value such as /\u003cTAB\u003e/example.com passes validation as a path and is then resolved as the scheme-relative URL //example.com. The live navigation functions share the guard but are not affected, because the client expands their target against the current origin. push_patch/2 is also affected before 0.7.0, which is when that expansion was added.\n\nThis issue affects phoenix_live_view: from 0.5.0 before 1.0.19, from 1.1.0-rc.0 before 1.1.33, and from 1.2.0-rc.0 before 1.2.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-3",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-3 Using Leading \u0027Ghost\u0027 Character Sequences to Bypass Input Filters"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-601",
                  "description": "CWE-601 URL Redirection to Untrusted Site (\u0027Open Redirect\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-10T11:05:14.571Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/phoenixframework/phoenix_live_view/security/advisories/GHSA-36m4-rm57-3prf"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-64941.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-64941"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/phoenixframework/phoenix_live_view/commit/0b8c733133466912f81adecaea72b6712370242e"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/phoenixframework/phoenix_live_view/commit/1c164f83df0bb922dfff9c60d125da5b0cfd6619"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/phoenixframework/phoenix_live_view/commit/2068b304d71907064b159b6bc60c5ad85a876ecf"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Open redirect in Phoenix.LiveView.validate_local_url!/2 via ASCII tab, LF and CR",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eReject any untrusted value containing ASCII tab, LF or CR before passing it as \u003ccode\u003e:to\u003c/code\u003e to \u003ccode\u003eredirect/2\u003c/code\u003e, or to \u003ccode\u003epush_patch/2\u003c/code\u003e before 0.7.0. Alternatively, map client-supplied navigation targets to a fixed set of known-good paths rather than forwarding the value.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Reject any untrusted value containing ASCII tab, LF or CR before passing it as `:to` to `redirect/2`, or to `push_patch/2` before 0.7.0. Alternatively, map client-supplied navigation targets to a fixed set of known-good paths rather than forwarding the value."
                }
              ],
              "value": "Reject any untrusted value containing ASCII tab, LF or CR before passing it as :to to redirect/2, or to push_patch/2 before 0.7.0. Alternatively, map client-supplied navigation targets to a fixed set of known-good paths rather than forwarding the value."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-64941",
        "datePublished": "2026-08-10T11:05:14.571Z",
        "dateReserved": "2026-08-09T16:30:01.572Z",
        "dateUpdated": "2026-08-10T13:00:33.543Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-70395 (GCVE-0-2026-70395)

    Vulnerability from cvelistv5 – Published: 2026-08-09 18:17 – Updated: 2026-08-10 18:23
    VLAI
    Title
    Predicate injection in manage_relationship belongs_to lookup discloses secret lookup keys in Ash
    Summary
    Improper Neutralization of Special Elements in Data Query Logic vulnerability in ash-project ash allows an attacker to forge a relationship to a record they cannot name, and to recover the secret value used to look it up. When manage_relationship is used with on_lookup: :relate on a belongs_to relationship, the client-supplied lookup value is passed to Ash.Query.filter/2 without being cast to the attribute type. A nested map submitted where a scalar is expected is therefore interpreted as a filter predicate rather than a literal, so a lookup for a specific record becomes a query for any record matching a condition. The same path omits Ash.Query.limit(1), leaving Ash.read_one/2 able to distinguish no match from one match from several, which turns comparison predicates into an oracle for the lookup value. Authorization is unaffected; the destination read policy still applies. This issue affects ash: from 1.52.0-rc.11 before 3.31.1.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-10 15:56 UTC
    CWE
    • CWE-943 - Improper Neutralization of Special Elements in Data Query Logic
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ash-project ash Affected: 1.52.0-rc.11 , < 3.31.1 (semver)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ash-project ash Affected: 571c138140e71cea24005189f45d7a63c8d2ed20 , < 09f42593035bceb0f6153dd7ee45cc49d108300a (git)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-70395",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-10T15:56:57.175785Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-10T18:23:15.009Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Actions.ManagedRelationships\u0027",
                "\u0027Elixir.Ash.Changeset\u0027"
              ],
              "packageName": "ash",
              "packageURL": "pkg:hex/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/actions/managed_relationships.ex",
                "lib/ash/changeset/changeset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Actions.ManagedRelationships\u0027:setup_managed_belongs_to_relationships/3"
                },
                {
                  "name": "\u0027Elixir.Ash.Changeset\u0027:manage_relationship/4"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "3.31.1",
                  "status": "affected",
                  "version": "1.52.0-rc.11",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Actions.ManagedRelationships\u0027",
                "\u0027Elixir.Ash.Changeset\u0027"
              ],
              "packageName": "ash-project/ash",
              "packageURL": "pkg:github/ash-project/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/actions/managed_relationships.ex",
                "lib/ash/changeset/changeset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Actions.ManagedRelationships\u0027:setup_managed_belongs_to_relationships/3"
                },
                {
                  "name": "\u0027Elixir.Ash.Changeset\u0027:manage_relationship/4"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "09f42593035bceb0f6153dd7ee45cc49d108300a",
                  "status": "affected",
                  "version": "571c138140e71cea24005189f45d7a63c8d2ed20",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA \u003ccode\u003ebelongs_to\u003c/code\u003e relationship must be managed with \u003ccode\u003emanage_relationship\u003c/code\u003e using \u003ccode\u003eon_lookup: :relate\u003c/code\u003e, and the lookup value must come from client input.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "A `belongs_to` relationship must be managed with `manage_relationship` using `on_lookup: :relate`, and the lookup value must come from client input."
                }
              ],
              "value": "A belongs_to relationship must be managed with manage_relationship using on_lookup: :relate, and the lookup value must come from client input."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "3.31.1",
                      "versionStartIncluding": "1.52.0-rc.11",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Jisung Chae"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Zach Daniel"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of Special Elements in Data Query Logic vulnerability in ash-project ash allows an attacker to forge a relationship to a record they cannot name, and to recover the secret value used to look it up.\u003c/p\u003e\n\u003cp\u003eWhen \u003ccode\u003emanage_relationship\u003c/code\u003e is used with \u003ccode\u003eon_lookup: :relate\u003c/code\u003e on a \u003ccode\u003ebelongs_to\u003c/code\u003e relationship, the client-supplied lookup value is passed to \u003ccode\u003eAsh.Query.filter/2\u003c/code\u003e without being cast to the attribute type. A nested map submitted where a scalar is expected is therefore interpreted as a filter predicate rather than a literal, so a lookup for a specific record becomes a query for any record matching a condition. The same path omits \u003ccode\u003eAsh.Query.limit(1)\u003c/code\u003e, leaving \u003ccode\u003eAsh.read_one/2\u003c/code\u003e able to distinguish no match from one match from several, which turns comparison predicates into an oracle for the lookup value. Authorization is unaffected; the destination read policy still applies.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash: from 1.52.0-rc.11 before 3.31.1.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Neutralization of Special Elements in Data Query Logic vulnerability in ash-project ash allows an attacker to forge a relationship to a record they cannot name, and to recover the secret value used to look it up.\n\nWhen `manage_relationship` is used with `on_lookup: :relate` on a `belongs_to` relationship, the client-supplied lookup value is passed to `Ash.Query.filter/2` without being cast to the attribute type. A nested map submitted where a scalar is expected is therefore interpreted as a filter predicate rather than a literal, so a lookup for a specific record becomes a query for any record matching a condition. The same path omits `Ash.Query.limit(1)`, leaving `Ash.read_one/2` able to distinguish no match from one match from several, which turns comparison predicates into an oracle for the lookup value. Authorization is unaffected; the destination read policy still applies.\n\nThis issue affects ash: from 1.52.0-rc.11 before 3.31.1."
                }
              ],
              "value": "Improper Neutralization of Special Elements in Data Query Logic vulnerability in ash-project ash allows an attacker to forge a relationship to a record they cannot name, and to recover the secret value used to look it up.\n\nWhen manage_relationship is used with on_lookup: :relate on a belongs_to relationship, the client-supplied lookup value is passed to Ash.Query.filter/2 without being cast to the attribute type. A nested map submitted where a scalar is expected is therefore interpreted as a filter predicate rather than a literal, so a lookup for a specific record becomes a query for any record matching a condition. The same path omits Ash.Query.limit(1), leaving Ash.read_one/2 able to distinguish no match from one match from several, which turns comparison predicates into an oracle for the lookup value. Authorization is unaffected; the destination read policy still applies.\n\nThis issue affects ash: from 1.52.0-rc.11 before 3.31.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-116",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-116 Excavation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-943",
                  "description": "CWE-943 Improper Neutralization of Special Elements in Data Query Logic",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-09T18:17:07.321Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "related",
                "vendor-advisory"
              ],
              "url": "https://github.com/ash-project/ash/security/advisories/GHSA-vvp6-3wv6-833j"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-70395.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-70395"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ash-project/ash/commit/09f42593035bceb0f6153dd7ee45cc49d108300a"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Predicate injection in manage_relationship belongs_to lookup discloses secret lookup keys in Ash"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-70395",
        "datePublished": "2026-08-09T18:17:07.321Z",
        "dateReserved": "2026-08-04T14:30:01.369Z",
        "dateUpdated": "2026-08-10T18:23:15.009Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-69659 (GCVE-0-2026-69659)

    Vulnerability from cvelistv5 – Published: 2026-08-09 18:01 – Updated: 2026-08-10 17:24
    VLAI
    Title
    Memory exhaustion via unbounded deserialization of keyset pagination cursors in Ash.Page.Keyset
    Summary
    Uncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor. Read actions with keyset pagination deserialize the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex, which base64-decodes the value and passes it to :erlang.binary_to_term/2 without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node. This issue affects ash: from 1.17.0 before 3.31.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-10 17:23 UTC
    CWE
    • CWE-502 - Deserialization of Untrusted Data
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ash-project ash Affected: 1.17.0 , < 3.31.1 (semver)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ash-project ash Affected: f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9 , < 1816b103af975221210478d61db20adcea700319 (git)
        cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-69659",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-10T17:23:22.371179Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-10T17:24:04.995Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ash-project/ash/security/advisories/GHSA-j35q-v8h8-7mwq"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Page.Keyset\u0027"
              ],
              "packageName": "ash",
              "packageURL": "pkg:hex/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/page/keyset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:decode_values/2"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "3.31.1",
                  "status": "affected",
                  "version": "1.17.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Ash.Page.Keyset\u0027"
              ],
              "packageName": "ash-project/ash",
              "packageURL": "pkg:github/ash-project/ash",
              "product": "ash",
              "programFiles": [
                "lib/ash/page/keyset.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ash.Page.Keyset\u0027:decode_values/2"
                }
              ],
              "repo": "https://github.com/ash-project/ash",
              "vendor": "ash-project",
              "versions": [
                {
                  "lessThan": "1816b103af975221210478d61db20adcea700319",
                  "status": "affected",
                  "version": "f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA read action must declare \u003ccode\u003ekeyset? true\u003c/code\u003e in its \u003ccode\u003epagination\u003c/code\u003e block, and the application must pass a client-supplied value as the \u003ccode\u003e:after\u003c/code\u003e or \u003ccode\u003e:before\u003c/code\u003e page option.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "A read action must declare `keyset? true` in its `pagination` block, and the application must pass a client-supplied value as the `:after` or `:before` page option."
                }
              ],
              "value": "A read action must declare keyset? true in its pagination block, and the application must pass a client-supplied value as the :after or :before page option."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "3.31.1",
                      "versionStartIncluding": "1.17.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Zach Daniel"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jisung Chae"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eUncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor.\u003c/p\u003e\n\u003cp\u003eRead actions with keyset pagination deserialize the client-supplied \u003ccode\u003epage[:after]\u003c/code\u003e or \u003ccode\u003epage[:before]\u003c/code\u003e cursor in \u003ccode\u003edecode_values/2\u003c/code\u003e in \u003ccode\u003elib/ash/page/keyset.ex\u003c/code\u003e, which base64-decodes the value and passes it to \u003ccode\u003e:erlang.binary_to_term/2\u003c/code\u003e without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash: from 1.17.0 before 3.31.1.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Uncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor.\n\nRead actions with keyset pagination deserialize the client-supplied `page[:after]` or `page[:before]` cursor in `decode_values/2` in `lib/ash/page/keyset.ex`, which base64-decodes the value and passes it to `:erlang.binary_to_term/2` without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node.\n\nThis issue affects ash: from 1.17.0 before 3.31.1."
                }
              ],
              "value": "Uncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor.\n\nRead actions with keyset pagination deserialize the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex, which base64-decodes the value and passes it to :erlang.binary_to_term/2 without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node.\n\nThis issue affects ash: from 1.17.0 before 3.31.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-586",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-586 Object Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 5.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-502",
                  "description": "CWE-502 Deserialization of Untrusted Data",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-09T18:01:32.896Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "related",
                "vendor-advisory"
              ],
              "url": "https://github.com/ash-project/ash/security/advisories/GHSA-j35q-v8h8-7mwq"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-69659.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-69659"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ash-project/ash/commit/1816b103af975221210478d61db20adcea700319"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Memory exhaustion via unbounded deserialization of keyset pagination cursors in Ash.Page.Keyset"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-69659",
        "datePublished": "2026-08-09T18:01:32.896Z",
        "dateReserved": "2026-08-06T11:00:01.574Z",
        "dateUpdated": "2026-08-10T17:24:04.995Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-67585 (GCVE-0-2026-67585)

    Vulnerability from cvelistv5 – Published: 2026-08-07 16:42 – Updated: 2026-08-07 18:12
    VLAI
    Title
    Atom Exhaustion via _entities Representation Keys in DivvyPayHQ absinthe_federation
    Summary
    Allocation of Resources Without Limits or Throttling vulnerability in DivvyPayHQ absinthe_federation allows an unauthenticated remote attacker to abort the Erlang VM via crafted _entities representation keys. Every key of every object in the representations argument of the federation-mandated _entities field is converted with String.to_atom/1 by convert_key/2 in lib/absinthe/federation/schema/entities_field.ex. representations is typed as the open-ended _Any scalar, so its keys bypass schema coercion and the attacker names them freely. Atoms are never garbage collected and the BEAM atom table is hard-capped (about 1,048,576 entries by default), so one request carrying tens of thousands of unique keys creates that many permanent atoms and a handful of such requests exhausts the table and aborts the node. The impact is confined to availability: no data is read or altered, and recovery requires restarting the application. This issue affects absinthe_federation: from 0.1.0 before 0.9.3.
    SSVC
    Exploitation: none Automatable: yes Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-07 18:12 UTC
    CWE
    • CWE-770 - Allocation of Resources Without Limits or Throttling
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    DivvyPayHQ absinthe_federation Affected: 0.1.0 , < 0.9.3 (semver)
        cpe:2.3:a:divvypayhq:absinthe_federation:*:*:*:*:*:*:*:*
    Create a notification for this product.
    DivvyPayHQ absinthe_federation Affected: 640a234a26b2d6fe5d9d21e00e5f4fce5645c0bf , < c3838cda2a7f65c4893291668c223b0d6acf4516 (git)
        cpe:2.3:a:divvypayhq:absinthe_federation:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-67585",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "yes"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-07T18:12:41.815038Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-07T18:12:59.050Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:divvypayhq:absinthe_federation:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027"
              ],
              "packageName": "absinthe_federation",
              "packageURL": "pkg:hex/absinthe_federation",
              "product": "absinthe_federation",
              "programFiles": [
                "lib/absinthe/federation/schema/entities_field.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:resolver/3"
                },
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:convert_keys_to_atom/2"
                },
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:convert_key/2"
                }
              ],
              "repo": "https://github.com/DivvyPayHQ/absinthe_federation",
              "vendor": "DivvyPayHQ",
              "versions": [
                {
                  "lessThan": "0.9.3",
                  "status": "affected",
                  "version": "0.1.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:divvypayhq:absinthe_federation:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027"
              ],
              "packageName": "DivvyPayHQ/absinthe_federation",
              "packageURL": "pkg:github/DivvyPayHQ/absinthe_federation",
              "product": "absinthe_federation",
              "programFiles": [
                "lib/absinthe/federation/schema/entities_field.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:resolver/3"
                },
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:convert_keys_to_atom/2"
                },
                {
                  "name": "\u0027Elixir.Absinthe.Federation.Schema.EntitiesField\u0027:convert_key/2"
                }
              ],
              "repo": "https://github.com/DivvyPayHQ/absinthe_federation",
              "vendor": "DivvyPayHQ",
              "versions": [
                {
                  "lessThan": "c3838cda2a7f65c4893291668c223b0d6acf4516",
                  "status": "affected",
                  "version": "640a234a26b2d6fe5d9d21e00e5f4fce5645c0bf",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:divvypayhq:absinthe_federation:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.9.3",
                      "versionStartIncluding": "0.1.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Doruk Gurleyen"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling vulnerability in DivvyPayHQ absinthe_federation allows an unauthenticated remote attacker to abort the Erlang VM via crafted \u003ccode\u003e_entities\u003c/code\u003e representation keys.\u003c/p\u003e\n\u003cp\u003eEvery key of every object in the \u003ccode\u003erepresentations\u003c/code\u003e argument of the federation-mandated \u003ccode\u003e_entities\u003c/code\u003e field is converted with \u003ccode\u003eString.to_atom/1\u003c/code\u003e by \u003ccode\u003econvert_key/2\u003c/code\u003e in \u003ccode\u003elib/absinthe/federation/schema/entities_field.ex\u003c/code\u003e. \u003ccode\u003erepresentations\u003c/code\u003e is typed as the open-ended \u003ccode\u003e_Any\u003c/code\u003e scalar, so its keys bypass schema coercion and the attacker names them freely. Atoms are never garbage collected and the BEAM atom table is hard-capped (about 1,048,576 entries by default), so one request carrying tens of thousands of unique keys creates that many permanent atoms and a handful of such requests exhausts the table and aborts the node. The impact is confined to availability: no data is read or altered, and recovery requires restarting the application.\u003c/p\u003e\n\u003cp\u003eThis issue affects absinthe_federation: from 0.1.0 before 0.9.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Allocation of Resources Without Limits or Throttling vulnerability in DivvyPayHQ absinthe_federation allows an unauthenticated remote attacker to abort the Erlang VM via crafted `_entities` representation keys.\n\nEvery key of every object in the `representations` argument of the federation-mandated `_entities` field is converted with `String.to_atom/1` by `convert_key/2` in `lib/absinthe/federation/schema/entities_field.ex`. `representations` is typed as the open-ended `_Any` scalar, so its keys bypass schema coercion and the attacker names them freely. Atoms are never garbage collected and the BEAM atom table is hard-capped (about 1,048,576 entries by default), so one request carrying tens of thousands of unique keys creates that many permanent atoms and a handful of such requests exhausts the table and aborts the node. The impact is confined to availability: no data is read or altered, and recovery requires restarting the application.\n\nThis issue affects absinthe_federation: from 0.1.0 before 0.9.3."
                }
              ],
              "value": "Allocation of Resources Without Limits or Throttling vulnerability in DivvyPayHQ absinthe_federation allows an unauthenticated remote attacker to abort the Erlang VM via crafted _entities representation keys.\n\nEvery key of every object in the representations argument of the federation-mandated _entities field is converted with String.to_atom/1 by convert_key/2 in lib/absinthe/federation/schema/entities_field.ex. representations is typed as the open-ended _Any scalar, so its keys bypass schema coercion and the attacker names them freely. Atoms are never garbage collected and the BEAM atom table is hard-capped (about 1,048,576 entries by default), so one request carrying tens of thousands of unique keys creates that many permanent atoms and a handful of such requests exhausts the table and aborts the node. The impact is confined to availability: no data is read or altered, and recovery requires restarting the application.\n\nThis issue affects absinthe_federation: from 0.1.0 before 0.9.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.7,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-770",
                  "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-07T16:42:22.653Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/DivvyPayHQ/absinthe_federation/security/advisories/GHSA-55hv-mwvr-phf3"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-67585.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-67585"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/DivvyPayHQ/absinthe_federation/commit/c3838cda2a7f65c4893291668c223b0d6acf4516"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Atom Exhaustion via _entities Representation Keys in DivvyPayHQ absinthe_federation"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-67585",
        "datePublished": "2026-08-07T16:42:22.653Z",
        "dateReserved": "2026-08-07T10:15:01.514Z",
        "dateUpdated": "2026-08-07T18:12:59.050Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66838 (GCVE-0-2026-66838)

    Vulnerability from cvelistv5 – Published: 2026-08-07 12:20 – Updated: 2026-08-07 15:12
    VLAI
    Title
    SQL injection via the :comment option in Postgrex.stream/4
    Summary
    Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') vulnerability in elixir-ecto postgrex allows SQL Injection via the :comment option of Postgrex.stream/4. An attacker who can influence that value can close the comment delimiter with */ and extend the streamed statement with their own clauses, which execute under the connection's role. Ecto exposes the same option through Ecto.Repo.stream/2. Postgrex appends the comment by concatenating it into the statement text sent in the Parse message, without escaping or rejecting */. The option is validated by comment_not_present!/1 at every other execution point; stream/4 never calls it. Because Parse accepts a single command, the injection is confined to the streamed statement and further statements cannot be chained. This issue affects postgrex: from 0.19.3 before 0.22.4.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-07 15:11 UTC
    CWE
    • CWE-89 - Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    elixir-ecto postgrex Affected: 0.19.3 , < 0.22.4 (semver)
        cpe:2.3:a:elixir-ecto:postgrex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    elixir-ecto postgrex Affected: 4971a2722fa72f8e1b54a2c403cad4c43916e36d , < * (git)
        cpe:2.3:a:elixir-ecto:postgrex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66838",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-07T15:11:28.060095Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-07T15:12:12.308Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/elixir-ecto/ecto/security/advisories/GHSA-3gww-3f36-2388"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:elixir-ecto:postgrex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Postgrex\u0027",
                "\u0027Elixir.Postgrex.Protocol\u0027"
              ],
              "packageName": "postgrex",
              "packageURL": "pkg:hex/postgrex",
              "product": "postgrex",
              "programFiles": [
                "lib/postgrex.ex",
                "lib/postgrex/protocol.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Postgrex\u0027:stream/4"
                },
                {
                  "name": "\u0027Elixir.Postgrex.Protocol\u0027:parse_describe_comment_msgs/3"
                }
              ],
              "repo": "https://github.com/elixir-ecto/postgrex",
              "vendor": "elixir-ecto",
              "versions": [
                {
                  "lessThan": "0.22.4",
                  "status": "affected",
                  "version": "0.19.3",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:elixir-ecto:postgrex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Postgrex\u0027",
                "\u0027Elixir.Postgrex.Protocol\u0027"
              ],
              "packageName": "elixir-ecto/postgrex",
              "packageURL": "pkg:github/elixir-ecto/postgrex",
              "product": "postgrex",
              "programFiles": [
                "lib/postgrex.ex",
                "lib/postgrex/protocol.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Postgrex\u0027:stream/4"
                },
                {
                  "name": "\u0027Elixir.Postgrex.Protocol\u0027:parse_describe_comment_msgs/3"
                }
              ],
              "repo": "https://github.com/elixir-ecto/postgrex",
              "vendor": "elixir-ecto",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "e1ecba618ddea4cee2556bd6ad9b6285e05f9d3c",
                      "status": "unaffected"
                    },
                    {
                      "at": "4011be852c99dc61ddb98cb01aa41e8775a0e3dd",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "4971a2722fa72f8e1b54a2c403cad4c43916e36d",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe application must pass a \u003ccode\u003e:comment\u003c/code\u003e derived from untrusted input to \u003ccode\u003ePostgrex.stream/4\u003c/code\u003e or \u003ccode\u003eEcto.Repo.stream/2\u003c/code\u003e. Applications that omit the option or pass only static values are unaffected.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "The application must pass a `:comment` derived from untrusted input to `Postgrex.stream/4` or `Ecto.Repo.stream/2`. Applications that omit the option or pass only static values are unaffected."
                }
              ],
              "value": "The application must pass a :comment derived from untrusted input to Postgrex.stream/4 or Ecto.Repo.stream/2. Applications that omit the option or pass only static values are unaffected."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:elixir-ecto:postgrex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.22.4",
                      "versionStartIncluding": "0.19.3",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Snehil Shah"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jos\u00e9 Valim"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027) vulnerability in elixir-ecto postgrex allows SQL Injection via the \u003ccode\u003e:comment\u003c/code\u003e option of \u003ccode\u003ePostgrex.stream/4\u003c/code\u003e. An attacker who can influence that value can close the comment delimiter with \u003ccode\u003e*/\u003c/code\u003e and extend the streamed statement with their own clauses, which execute under the connection\u0027s role. Ecto exposes the same option through \u003ccode\u003eEcto.Repo.stream/2\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePostgrex appends the comment by concatenating it into the statement text sent in the \u003ccode\u003eParse\u003c/code\u003e message, without escaping or rejecting \u003ccode\u003e*/\u003c/code\u003e. The option is validated by \u003ccode\u003ecomment_not_present!/1\u003c/code\u003e at every other execution point; \u003ccode\u003estream/4\u003c/code\u003e never calls it. Because \u003ccode\u003eParse\u003c/code\u003e accepts a single command, the injection is confined to the streamed statement and further statements cannot be chained.\u003c/p\u003e\n\u003cp\u003eThis issue affects postgrex: from 0.19.3 before 0.22.4.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027) vulnerability in elixir-ecto postgrex allows SQL Injection via the `:comment` option of `Postgrex.stream/4`. An attacker who can influence that value can close the comment delimiter with `*/` and extend the streamed statement with their own clauses, which execute under the connection\u0027s role. Ecto exposes the same option through `Ecto.Repo.stream/2`.\n\nPostgrex appends the comment by concatenating it into the statement text sent in the `Parse` message, without escaping or rejecting `*/`. The option is validated by `comment_not_present!/1` at every other execution point; `stream/4` never calls it. Because `Parse` accepts a single command, the injection is confined to the streamed statement and further statements cannot be chained.\n\nThis issue affects postgrex: from 0.19.3 before 0.22.4."
                }
              ],
              "value": "Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027) vulnerability in elixir-ecto postgrex allows SQL Injection via the :comment option of Postgrex.stream/4. An attacker who can influence that value can close the comment delimiter with */ and extend the streamed statement with their own clauses, which execute under the connection\u0027s role. Ecto exposes the same option through Ecto.Repo.stream/2.\n\nPostgrex appends the comment by concatenating it into the statement text sent in the Parse message, without escaping or rejecting */. The option is validated by comment_not_present!/1 at every other execution point; stream/4 never calls it. Because Parse accepts a single command, the injection is confined to the streamed statement and further statements cannot be chained.\n\nThis issue affects postgrex: from 0.19.3 before 0.22.4."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-66",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-66 SQL Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 5.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-89",
                  "description": "CWE-89 Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-07T12:20:02.376Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/elixir-ecto/ecto/security/advisories/GHSA-3gww-3f36-2388"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66838.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66838"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/elixir-ecto/postgrex/commit/e1ecba618ddea4cee2556bd6ad9b6285e05f9d3c"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/elixir-ecto/postgrex/commit/4011be852c99dc61ddb98cb01aa41e8775a0e3dd"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "SQL injection via the :comment option in Postgrex.stream/4",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eReject any \u003ccode\u003e:comment\u003c/code\u003e value containing \u003ccode\u003e*/\u003c/code\u003e or a null byte before passing it to \u003ccode\u003ePostgrex.stream/4\u003c/code\u003e or \u003ccode\u003eEcto.Repo.stream/2\u003c/code\u003e. Alternatively, build comments only from trusted values.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Reject any `:comment` value containing `*/` or a null byte before passing it to `Postgrex.stream/4` or `Ecto.Repo.stream/2`. Alternatively, build comments only from trusted values."
                }
              ],
              "value": "Reject any :comment value containing */ or a null byte before passing it to Postgrex.stream/4 or Ecto.Repo.stream/2. Alternatively, build comments only from trusted values."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66838",
        "datePublished": "2026-08-07T12:20:02.376Z",
        "dateReserved": "2026-08-06T14:00:01.865Z",
        "dateUpdated": "2026-08-07T15:12:12.308Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-68750 (GCVE-0-2026-68750)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:50 – Updated: 2026-08-06 15:41
    VLAI
    Title
    Quadratic sibling re-flattening in the html_sanitize_ex traversal engine allows CPU-exhaustion denial of service
    Summary
    Inefficient Algorithmic Complexity vulnerability in the traversal engine in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU and memory via a flat run of sibling elements in sanitized HTML. The list clause of HtmlSanitizeEx.Traverser.traverse/2 recurses on the tail of a sibling list and then evaluates List.flatten([head] ++ tail) over the already flattened result, so every one of n siblings copies and re-walks the entire remaining tail. The flattening is only needed for the rare case where scrub returns several replacement nodes for one node, but the cost is paid across the whole tail at every step, making traversal quadratic in sibling count. The traverser sits on every public entry point, so no particular scrubber or configuration is required and the payload needs only allowed tags. A 160 KB body of 20,000 sibling elements occupies a scheduler for roughly 1.7 seconds, and the cost grows faster than the body does. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:41 UTC
    CWE
    • CWE-407 - Inefficient Algorithmic Complexity
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.3 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 69ea11d61525c470b39b6860d024770d5573ff1f , < 9f5ccedbed230930813f992a1e6906fcf485981e (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-68750",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:41:21.489983Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:41:27.813Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Traverser\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/traverser.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Traverser\u0027:traverse/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:basic_html/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:markdown_html/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:strip_tags/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.3",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Traverser\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/traverser.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Traverser\u0027:traverse/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:basic_html/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:markdown_html/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:strip_tags/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "9f5ccedbed230930813f992a1e6906fcf485981e",
                  "status": "affected",
                  "version": "69ea11d61525c470b39b6860d024770d5573ff1f",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.3",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eInefficient Algorithmic Complexity vulnerability in the traversal engine in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU and memory via a flat run of sibling elements in sanitized HTML. The list clause of \u003ccode\u003eHtmlSanitizeEx.Traverser.traverse/2\u003c/code\u003e recurses on the tail of a sibling list and then evaluates \u003ccode\u003eList.flatten([head] ++ tail)\u003c/code\u003e over the already flattened result, so every one of \u003ccode\u003en\u003c/code\u003e siblings copies and re-walks the entire remaining tail. The flattening is only needed for the rare case where \u003ccode\u003escrub\u003c/code\u003e returns several replacement nodes for one node, but the cost is paid across the whole tail at every step, making traversal quadratic in sibling count.\u003c/p\u003e\n\u003cp\u003eThe traverser sits on every public entry point, so no particular scrubber or configuration is required and the payload needs only allowed tags. A 160 KB body of 20,000 sibling elements occupies a scheduler for roughly 1.7 seconds, and the cost grows faster than the body does.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Inefficient Algorithmic Complexity vulnerability in the traversal engine in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU and memory via a flat run of sibling elements in sanitized HTML. The list clause of `HtmlSanitizeEx.Traverser.traverse/2` recurses on the tail of a sibling list and then evaluates `List.flatten([head] ++ tail)` over the already flattened result, so every one of `n` siblings copies and re-walks the entire remaining tail. The flattening is only needed for the rare case where `scrub` returns several replacement nodes for one node, but the cost is paid across the whole tail at every step, making traversal quadratic in sibling count.\n\nThe traverser sits on every public entry point, so no particular scrubber or configuration is required and the payload needs only allowed tags. A 160 KB body of 20,000 sibling elements occupies a scheduler for roughly 1.7 seconds, and the cost grows faster than the body does.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
                }
              ],
              "value": "Inefficient Algorithmic Complexity vulnerability in the traversal engine in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU and memory via a flat run of sibling elements in sanitized HTML. The list clause of HtmlSanitizeEx.Traverser.traverse/2 recurses on the tail of a sibling list and then evaluates List.flatten([head] ++ tail) over the already flattened result, so every one of n siblings copies and re-walks the entire remaining tail. The flattening is only needed for the rare case where scrub returns several replacement nodes for one node, but the cost is paid across the whole tail at every step, making traversal quadratic in sibling count.\n\nThe traverser sits on every public entry point, so no particular scrubber or configuration is required and the payload needs only allowed tags. A 160 KB body of 20,000 sibling elements occupies a scheduler for roughly 1.7 seconds, and the cost grows faster than the body does.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 8.2,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-407",
                  "description": "CWE-407 Inefficient Algorithmic Complexity",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T14:50:20.284Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-463q-p2fr-mh9p"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-68750.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-68750"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/9f5ccedbed230930813f992a1e6906fcf485981e"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Quadratic sibling re-flattening in the html_sanitize_ex traversal engine allows CPU-exhaustion denial of service",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eCap the size of user-supplied HTML, and in particular the node count, before it reaches the sanitizer. The quadratic growth means the cap has to be small to be effective.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Cap the size of user-supplied HTML, and in particular the node count, before it reaches the sanitizer. The quadratic growth means the cap has to be small to be effective."
                }
              ],
              "value": "Cap the size of user-supplied HTML, and in particular the node count, before it reaches the sanitizer. The quadratic growth means the cap has to be small to be effective."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-68750",
        "datePublished": "2026-08-06T14:50:20.284Z",
        "dateReserved": "2026-07-31T13:23:00.355Z",
        "dateUpdated": "2026-08-06T15:41:27.813Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-68749 (GCVE-0-2026-68749)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:50 – Updated: 2026-08-06 15:44
    VLAI
    Title
    Quadratic regex backtracking in the html_sanitize_ex CSS scrubber allows CPU-exhaustion denial of service
    Summary
    Inefficient Regular Expression Complexity vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU via a long CSS declaration in sanitized HTML. The declaration regex in HtmlSanitizeEx.Scrubber.CSS.scrub/1 matches the property name with an unbounded greedy [-\w]+ followed by a mandatory :, so a long run of word characters not followed by a colon makes the engine give back one character at a time and retry the colon at every start offset. The work is quadratic in the length of the run, and no length cap is applied to the CSS handed to the scrubber. An 80 KB <style> body costs roughly 2.4 seconds of scheduler time, so a few concurrent requests saturate the BEAM scheduler pool and make the application unresponsive. The impact is CPU exhaustion only. Nothing is read, modified or disclosed. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:44 UTC
    CWE
    • CWE-1333 - Inefficient Regular Expression Complexity
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.3 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 21f90012eb21aa36f4e3701b7547e12faf0f3c8b , < 4f4bd9eb254881462c0461fbab74b29188c2c133 (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-68749",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:44:14.739175Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:44:22.358Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/css.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027:scrub/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.3",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/css.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027:scrub/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "4f4bd9eb254881462c0461fbab74b29188c2c133",
                  "status": "affected",
                  "version": "21f90012eb21aa36f4e3701b7547e12faf0f3c8b",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e, and custom scrubbers declared with \u003ccode\u003euse HtmlSanitizeEx, extend: :html5\u003c/code\u003e, route input into the CSS scrubber, by way of \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e element bodies and \u003ccode\u003estyle\u003c/code\u003e attributes. Applications calling \u003ccode\u003eHtmlSanitizeEx.Scrubber.CSS.scrub/1\u003c/code\u003e directly are also affected.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only `HtmlSanitizeEx.html5/1`, and custom scrubbers declared with `use HtmlSanitizeEx, extend: :html5`, route input into the CSS scrubber, by way of `\u003cstyle\u003e` element bodies and `style` attributes. Applications calling `HtmlSanitizeEx.Scrubber.CSS.scrub/1` directly are also affected."
                }
              ],
              "value": "Only HtmlSanitizeEx.html5/1, and custom scrubbers declared with use HtmlSanitizeEx, extend: :html5, route input into the CSS scrubber, by way of \u003cstyle\u003e element bodies and style attributes. Applications calling HtmlSanitizeEx.Scrubber.CSS.scrub/1 directly are also affected."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.3",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eInefficient Regular Expression Complexity vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU via a long CSS declaration in sanitized HTML. The declaration regex in \u003ccode\u003eHtmlSanitizeEx.Scrubber.CSS.scrub/1\u003c/code\u003e matches the property name with an unbounded greedy \u003ccode\u003e[-\\w]+\u003c/code\u003e followed by a mandatory \u003ccode\u003e:\u003c/code\u003e, so a long run of word characters not followed by a colon makes the engine give back one character at a time and retry the colon at every start offset. The work is quadratic in the length of the run, and no length cap is applied to the CSS handed to the scrubber. An 80 KB \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e body costs roughly 2.4 seconds of scheduler time, so a few concurrent requests saturate the BEAM scheduler pool and make the application unresponsive.\u003c/p\u003e\n\u003cp\u003eThe impact is CPU exhaustion only. Nothing is read, modified or disclosed.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Inefficient Regular Expression Complexity vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU via a long CSS declaration in sanitized HTML. The declaration regex in `HtmlSanitizeEx.Scrubber.CSS.scrub/1` matches the property name with an unbounded greedy `[-\\w]+` followed by a mandatory `:`, so a long run of word characters not followed by a colon makes the engine give back one character at a time and retry the colon at every start offset. The work is quadratic in the length of the run, and no length cap is applied to the CSS handed to the scrubber. An 80 KB `\u003cstyle\u003e` body costs roughly 2.4 seconds of scheduler time, so a few concurrent requests saturate the BEAM scheduler pool and make the application unresponsive.\n\nThe impact is CPU exhaustion only. Nothing is read, modified or disclosed.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
                }
              ],
              "value": "Inefficient Regular Expression Complexity vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to exhaust server CPU via a long CSS declaration in sanitized HTML. The declaration regex in HtmlSanitizeEx.Scrubber.CSS.scrub/1 matches the property name with an unbounded greedy [-\\w]+ followed by a mandatory :, so a long run of word characters not followed by a colon makes the engine give back one character at a time and retry the colon at every start offset. The work is quadratic in the length of the run, and no length cap is applied to the CSS handed to the scrubber. An 80 KB \u003cstyle\u003e body costs roughly 2.4 seconds of scheduler time, so a few concurrent requests saturate the BEAM scheduler pool and make the application unresponsive.\n\nThe impact is CPU exhaustion only. Nothing is read, modified or disclosed.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-492",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-492 Regular Expression Exponential Blowup"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 8.2,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-1333",
                  "description": "CWE-1333 Inefficient Regular Expression Complexity",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T14:50:12.593Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-4cx2-987x-rr2x"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-68749.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-68749"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/4f4bd9eb254881462c0461fbab74b29188c2c133"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Quadratic regex backtracking in the html_sanitize_ex CSS scrubber allows CPU-exhaustion denial of service",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSanitize with \u003ccode\u003ebasic_html/1\u003c/code\u003e, \u003ccode\u003emarkdown_html/1\u003c/code\u003e or \u003ccode\u003estrip_tags/1\u003c/code\u003e, none of which reach the CSS scrubber, or define a custom scrubber that allows neither \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e elements nor \u003ccode\u003estyle\u003c/code\u003e attributes.\u003c/p\u003e\n\u003cp\u003eCapping the size of user-supplied HTML before it reaches the sanitizer bounds the cost, though the quadratic growth means the cap has to be small to be effective.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Sanitize with `basic_html/1`, `markdown_html/1` or `strip_tags/1`, none of which reach the CSS scrubber, or define a custom scrubber that allows neither `\u003cstyle\u003e` elements nor `style` attributes.\n\nCapping the size of user-supplied HTML before it reaches the sanitizer bounds the cost, though the quadratic growth means the cap has to be small to be effective."
                }
              ],
              "value": "Sanitize with basic_html/1, markdown_html/1 or strip_tags/1, none of which reach the CSS scrubber, or define a custom scrubber that allows neither \u003cstyle\u003e elements nor style attributes.\n\nCapping the size of user-supplied HTML before it reaches the sanitizer bounds the cost, though the quadratic growth means the cap has to be small to be effective."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-68749",
        "datePublished": "2026-08-06T14:50:12.593Z",
        "dateReserved": "2026-07-31T13:23:00.355Z",
        "dateUpdated": "2026-08-06T15:44:22.358Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-68747 (GCVE-0-2026-68747)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:50 – Updated: 2026-08-06 15:43
    VLAI
    Title
    CSS sanitizer allowlist bypass in html_sanitize_ex via non-declaration input
    Summary
    Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to inject CSS at-rules, including an import of a remote stylesheet, into a page served to other users. HtmlSanitizeEx.Scrubber.CSS.scrub/1 applies its property and value allowlist through a Regex.replace over substrings matching a property: value declaration pattern, so input that does not match that pattern is never inspected and is copied to the output unchanged. @import url(//attacker.example/style.css); survives, while the same URL inside a background: url(...) declaration is removed. Element boundaries are resolved before the scrubber runs, so injected content does not escape the <style> element and no script executes. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.4.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:43 UTC
    CWE
    • CWE-74 - Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.4 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 21f90012eb21aa36f4e3701b7547e12faf0f3c8b , < 0b9f9ad63a7529d4f2c3c1134c371adc3e654308 (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-68747",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:43:31.189847Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:43:37.237Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/css.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027:scrub/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.4",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027",
                "\u0027Elixir.HtmlSanitizeEx\u0027"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/css.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.CSS\u0027:scrub/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "0b9f9ad63a7529d4f2c3c1134c371adc3e654308",
                  "status": "affected",
                  "version": "21f90012eb21aa36f4e3701b7547e12faf0f3c8b",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e, and custom scrubbers declared with \u003ccode\u003euse HtmlSanitizeEx, extend: :html5\u003c/code\u003e, permit \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e elements, and the sanitized output must be rendered to other users. Applications calling \u003ccode\u003eHtmlSanitizeEx.Scrubber.CSS.scrub/1\u003c/code\u003e directly are also affected.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only `HtmlSanitizeEx.html5/1`, and custom scrubbers declared with `use HtmlSanitizeEx, extend: :html5`, permit `\u003cstyle\u003e` elements, and the sanitized output must be rendered to other users. Applications calling `HtmlSanitizeEx.Scrubber.CSS.scrub/1` directly are also affected."
                }
              ],
              "value": "Only HtmlSanitizeEx.html5/1, and custom scrubbers declared with use HtmlSanitizeEx, extend: :html5, permit \u003cstyle\u003e elements, and the sanitized output must be rendered to other users. Applications calling HtmlSanitizeEx.Scrubber.CSS.scrub/1 directly are also affected."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.4",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of Special Elements in Output Used by a Downstream Component (\u0027Injection\u0027) vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to inject CSS at-rules, including an import of a remote stylesheet, into a page served to other users. \u003ccode\u003eHtmlSanitizeEx.Scrubber.CSS.scrub/1\u003c/code\u003e applies its property and value allowlist through a \u003ccode\u003eRegex.replace\u003c/code\u003e over substrings matching a \u003ccode\u003eproperty: value\u003c/code\u003e declaration pattern, so input that does not match that pattern is never inspected and is copied to the output unchanged. \u003ccode\u003e@import url(//attacker.example/style.css);\u003c/code\u003e survives, while the same URL inside a \u003ccode\u003ebackground: url(...)\u003c/code\u003e declaration is removed.\u003c/p\u003e\n\u003cp\u003eElement boundaries are resolved before the scrubber runs, so injected content does not escape the \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e element and no script executes.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.4.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Neutralization of Special Elements in Output Used by a Downstream Component (\u0027Injection\u0027) vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to inject CSS at-rules, including an import of a remote stylesheet, into a page served to other users. `HtmlSanitizeEx.Scrubber.CSS.scrub/1` applies its property and value allowlist through a `Regex.replace` over substrings matching a `property: value` declaration pattern, so input that does not match that pattern is never inspected and is copied to the output unchanged. `@import url(//attacker.example/style.css);` survives, while the same URL inside a `background: url(...)` declaration is removed.\n\nElement boundaries are resolved before the scrubber runs, so injected content does not escape the `\u003cstyle\u003e` element and no script executes.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.4."
                }
              ],
              "value": "Improper Neutralization of Special Elements in Output Used by a Downstream Component (\u0027Injection\u0027) vulnerability in the CSS scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to inject CSS at-rules, including an import of a remote stylesheet, into a page served to other users. HtmlSanitizeEx.Scrubber.CSS.scrub/1 applies its property and value allowlist through a Regex.replace over substrings matching a property: value declaration pattern, so input that does not match that pattern is never inspected and is copied to the output unchanged. @import url(//attacker.example/style.css); survives, while the same URL inside a background: url(...) declaration is removed.\n\nElement boundaries are resolved before the scrubber runs, so injected content does not escape the \u003cstyle\u003e element and no script executes.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.4."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-148",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-148 Content Spoofing"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 2.3,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-74",
                  "description": "CWE-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component (\u0027Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T15:08:58.171Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-87v2-pfhj-r5x7"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-68747.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-68747"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/0b9f9ad63a7529d4f2c3c1134c371adc3e654308"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "CSS sanitizer allowlist bypass in html_sanitize_ex via non-declaration input",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSanitize with \u003ccode\u003ebasic_html/1\u003c/code\u003e, \u003ccode\u003emarkdown_html/1\u003c/code\u003e or \u003ccode\u003estrip_tags/1\u003c/code\u003e, none of which allow \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e elements, or define a custom scrubber that omits it.\u003c/p\u003e\n\u003cp\u003eA Content-Security-Policy \u003ccode\u003estyle-src\u003c/code\u003e directive that permits no external stylesheet origins stops an injected \u003ccode\u003e@import\u003c/code\u003e from loading, though injected inline rules still apply.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Sanitize with `basic_html/1`, `markdown_html/1` or `strip_tags/1`, none of which allow `\u003cstyle\u003e` elements, or define a custom scrubber that omits it.\n\nA Content-Security-Policy `style-src` directive that permits no external stylesheet origins stops an injected `@import` from loading, though injected inline rules still apply."
                }
              ],
              "value": "Sanitize with basic_html/1, markdown_html/1 or strip_tags/1, none of which allow \u003cstyle\u003e elements, or define a custom scrubber that omits it.\n\nA Content-Security-Policy style-src directive that permits no external stylesheet origins stops an injected @import from loading, though injected inline rules still apply."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-68747",
        "datePublished": "2026-08-06T14:50:03.143Z",
        "dateReserved": "2026-07-31T13:23:00.355Z",
        "dateUpdated": "2026-08-06T15:43:37.237Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66829 (GCVE-0-2026-66829)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:49 – Updated: 2026-08-06 15:42
    VLAI
    Title
    html_sanitize_ex HTML5 scrubber keeps attacker-supplied meta refresh, allowing forced cross-origin redirection
    Summary
    URL Redirection to Untrusted Site ('Open Redirect') vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to force visitors of a page to navigate to a site of the attacker's choosing via a <meta http-equiv="refresh"> element in sanitized HTML. HtmlSanitizeEx.html5/1 keeps attacker-supplied <meta> elements in its output. A meta element acts on the whole document rather than on the fragment it was embedded in, so it can also declare document-wide directives such as Content-Security-Policy. This is not cross-site scripting. Browsers do not navigate a meta refresh to a javascript: URL, so the uppercase JAVASCRIPT: filter bypass yields no script execution and none was demonstrated. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:42 UTC
    CWE
    • CWE-601 - URL Redirection to Untrusted Site ('Open Redirect')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.3 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 8976d64ea0b77d26093a94a43ec48a3978e8d028 , < 9f7e38be51edc38f132dfe994f37af5cf5e0e76f (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66829",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:42:40.366099Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:42:46.200Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.3",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "9f7e38be51edc38f132dfe994f37af5cf5e0e76f",
                  "status": "affected",
                  "version": "8976d64ea0b77d26093a94a43ec48a3978e8d028",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e, and custom scrubbers declared with \u003ccode\u003euse HtmlSanitizeEx, extend: :html5\u003c/code\u003e, allow the \u003ccode\u003emeta\u003c/code\u003e element, and the sanitized output must be rendered to other users.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only `HtmlSanitizeEx.html5/1`, and custom scrubbers declared with `use HtmlSanitizeEx, extend: :html5`, allow the `meta` element, and the sanitized output must be rendered to other users."
                }
              ],
              "value": "Only HtmlSanitizeEx.html5/1, and custom scrubbers declared with use HtmlSanitizeEx, extend: :html5, allow the meta element, and the sanitized output must be rendered to other users."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.3",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eURL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to force visitors of a page to navigate to a site of the attacker\u0027s choosing via a \u003ccode\u003e\u0026lt;meta http-equiv=\"refresh\"\u0026gt;\u003c/code\u003e element in sanitized HTML. \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e keeps attacker-supplied \u003ccode\u003e\u0026lt;meta\u0026gt;\u003c/code\u003e elements in its output. A \u003ccode\u003emeta\u003c/code\u003e element acts on the whole document rather than on the fragment it was embedded in, so it can also declare document-wide directives such as \u003ccode\u003eContent-Security-Policy\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThis is not cross-site scripting. Browsers do not navigate a meta refresh to a \u003ccode\u003ejavascript:\u003c/code\u003e URL, so the uppercase \u003ccode\u003eJAVASCRIPT:\u003c/code\u003e filter bypass yields no script execution and none was demonstrated.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to force visitors of a page to navigate to a site of the attacker\u0027s choosing via a `\u003cmeta http-equiv=\"refresh\"\u003e` element in sanitized HTML. `HtmlSanitizeEx.html5/1` keeps attacker-supplied `\u003cmeta\u003e` elements in its output. A `meta` element acts on the whole document rather than on the fragment it was embedded in, so it can also declare document-wide directives such as `Content-Security-Policy`.\n\nThis is not cross-site scripting. Browsers do not navigate a meta refresh to a `javascript:` URL, so the uppercase `JAVASCRIPT:` filter bypass yields no script execution and none was demonstrated.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
                }
              ],
              "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to force visitors of a page to navigate to a site of the attacker\u0027s choosing via a \u003cmeta http-equiv=\"refresh\"\u003e element in sanitized HTML. HtmlSanitizeEx.html5/1 keeps attacker-supplied \u003cmeta\u003e elements in its output. A meta element acts on the whole document rather than on the fragment it was embedded in, so it can also declare document-wide directives such as Content-Security-Policy.\n\nThis is not cross-site scripting. Browsers do not navigate a meta refresh to a javascript: URL, so the uppercase JAVASCRIPT: filter bypass yields no script execution and none was demonstrated.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-154",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-154 Resource Location Spoofing"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 2.3,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-601",
                  "description": "CWE-601 URL Redirection to Untrusted Site (\u0027Open Redirect\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T14:49:23.468Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-2c6f-3j54-xpcr"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66829.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66829"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/9f7e38be51edc38f132dfe994f37af5cf5e0e76f"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "html_sanitize_ex HTML5 scrubber keeps attacker-supplied meta refresh, allowing forced cross-origin redirection",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSanitize with \u003ccode\u003ebasic_html/1\u003c/code\u003e, \u003ccode\u003emarkdown_html/1\u003c/code\u003e or \u003ccode\u003estrip_tags/1\u003c/code\u003e, none of which allow \u003ccode\u003emeta\u003c/code\u003e, or define a custom scrubber that omits it.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Sanitize with `basic_html/1`, `markdown_html/1` or `strip_tags/1`, none of which allow `meta`, or define a custom scrubber that omits it."
                }
              ],
              "value": "Sanitize with basic_html/1, markdown_html/1 or strip_tags/1, none of which allow meta, or define a custom scrubber that omits it."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66829",
        "datePublished": "2026-08-06T14:49:23.468Z",
        "dateReserved": "2026-08-06T08:15:02.719Z",
        "dateUpdated": "2026-08-06T15:42:46.200Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66370 (GCVE-0-2026-66370)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:49 – Updated: 2026-08-06 15:42
    VLAI
    Title
    html_sanitize_ex HTML5 scrubber keeps attacker-supplied form-association attributes, allowing form hijacking
    Summary
    URL Redirection to Untrusted Site ('Open Redirect') vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to retarget a form already on the rendering page and receive whatever the victim submits, including credentials, via the form and formaction attributes on an <input> element in sanitized HTML. HTML's form attribute associates an input with any form on the page by its id even when the input sits outside that form, and formaction on a submit control overrides the owning form's action. Neither attribute receives a scheme check, so an absolute cross-origin URL survives sanitizing. No script executes. The scrubber allows neither form nor button, so the attacker cannot introduce a form of their own and the rendering page must already contain a form carrying an id. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:42 UTC
    CWE
    • CWE-601 - URL Redirection to Untrusted Site ('Open Redirect')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.3 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 8976d64ea0b77d26093a94a43ec48a3978e8d028 , < a1e804ed997e780ea71d14393cf2f701330553a6 (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66370",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:42:03.803831Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:42:09.603Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.3",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "a1e804ed997e780ea71d14393cf2f701330553a6",
                  "status": "affected",
                  "version": "8976d64ea0b77d26093a94a43ec48a3978e8d028",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e, and custom scrubbers declared with \u003ccode\u003euse HtmlSanitizeEx, extend: :html5\u003c/code\u003e, allow the \u003ccode\u003einput\u003c/code\u003e element, and the sanitized output must be rendered to other users.\u003c/p\u003e\n\u003cp\u003eThe rendering page must also contain a form with an \u003ccode\u003eid\u003c/code\u003e, since that \u003ccode\u003eid\u003c/code\u003e is what the injected \u003ccode\u003eform\u003c/code\u003e attribute binds to.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only `HtmlSanitizeEx.html5/1`, and custom scrubbers declared with `use HtmlSanitizeEx, extend: :html5`, allow the `input` element, and the sanitized output must be rendered to other users.\n\nThe rendering page must also contain a form with an `id`, since that `id` is what the injected `form` attribute binds to."
                }
              ],
              "value": "Only HtmlSanitizeEx.html5/1, and custom scrubbers declared with use HtmlSanitizeEx, extend: :html5, allow the input element, and the sanitized output must be rendered to other users.\n\nThe rendering page must also contain a form with an id, since that id is what the injected form attribute binds to."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.3",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eURL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to retarget a form already on the rendering page and receive whatever the victim submits, including credentials, via the \u003ccode\u003eform\u003c/code\u003e and \u003ccode\u003eformaction\u003c/code\u003e attributes on an \u003ccode\u003e\u0026lt;input\u0026gt;\u003c/code\u003e element in sanitized HTML. HTML\u0027s \u003ccode\u003eform\u003c/code\u003e attribute associates an input with any form on the page by its \u003ccode\u003eid\u003c/code\u003e even when the input sits outside that form, and \u003ccode\u003eformaction\u003c/code\u003e on a submit control overrides the owning form\u0027s \u003ccode\u003eaction\u003c/code\u003e. Neither attribute receives a scheme check, so an absolute cross-origin URL survives sanitizing.\u003c/p\u003e\n\u003cp\u003eNo script executes. The scrubber allows neither \u003ccode\u003eform\u003c/code\u003e nor \u003ccode\u003ebutton\u003c/code\u003e, so the attacker cannot introduce a form of their own and the rendering page must already contain a form carrying an \u003ccode\u003eid\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to retarget a form already on the rendering page and receive whatever the victim submits, including credentials, via the `form` and `formaction` attributes on an `\u003cinput\u003e` element in sanitized HTML. HTML\u0027s `form` attribute associates an input with any form on the page by its `id` even when the input sits outside that form, and `formaction` on a submit control overrides the owning form\u0027s `action`. Neither attribute receives a scheme check, so an absolute cross-origin URL survives sanitizing.\n\nNo script executes. The scrubber allows neither `form` nor `button`, so the attacker cannot introduce a form of their own and the rendering page must already contain a form carrying an `id`.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
                }
              ],
              "value": "URL Redirection to Untrusted Site (\u0027Open Redirect\u0027) vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows an unauthenticated remote attacker to retarget a form already on the rendering page and receive whatever the victim submits, including credentials, via the form and formaction attributes on an \u003cinput\u003e element in sanitized HTML. HTML\u0027s form attribute associates an input with any form on the page by its id even when the input sits outside that form, and formaction on a submit control overrides the owning form\u0027s action. Neither attribute receives a scheme check, so an absolute cross-origin URL survives sanitizing.\n\nNo script executes. The scrubber allows neither form nor button, so the attacker cannot introduce a form of their own and the rendering page must already contain a form carrying an id.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-154",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-154 Resource Location Spoofing"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 4.8,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "LOW",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:N/VI:N/VA:N/SC:H/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-601",
                  "description": "CWE-601 URL Redirection to Untrusted Site (\u0027Open Redirect\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T14:49:15.841Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-w3f9-jjhw-wwvq"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66370.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66370"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/a1e804ed997e780ea71d14393cf2f701330553a6"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "html_sanitize_ex HTML5 scrubber keeps attacker-supplied form-association attributes, allowing form hijacking",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSanitize with \u003ccode\u003ebasic_html/1\u003c/code\u003e, \u003ccode\u003emarkdown_html/1\u003c/code\u003e or \u003ccode\u003estrip_tags/1\u003c/code\u003e, none of which allow \u003ccode\u003einput\u003c/code\u003e, or define a custom scrubber that omits it.\u003c/p\u003e\n\u003cp\u003eOmitting the \u003ccode\u003eid\u003c/code\u003e attribute from the page\u0027s own forms, or giving them values an attacker cannot predict, removes the anchor the injected \u003ccode\u003eform\u003c/code\u003e attribute needs.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Sanitize with `basic_html/1`, `markdown_html/1` or `strip_tags/1`, none of which allow `input`, or define a custom scrubber that omits it.\n\nOmitting the `id` attribute from the page\u0027s own forms, or giving them values an attacker cannot predict, removes the anchor the injected `form` attribute needs."
                }
              ],
              "value": "Sanitize with basic_html/1, markdown_html/1 or strip_tags/1, none of which allow input, or define a custom scrubber that omits it.\n\nOmitting the id attribute from the page\u0027s own forms, or giving them values an attacker cannot predict, removes the anchor the injected form attribute needs."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66370",
        "datePublished": "2026-08-06T14:49:15.841Z",
        "dateReserved": "2026-08-06T10:15:01.808Z",
        "dateUpdated": "2026-08-06T15:42:09.603Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66843 (GCVE-0-2026-66843)

    Vulnerability from cvelistv5 – Published: 2026-08-06 14:48 – Updated: 2026-08-06 15:40
    VLAI
    Title
    html_sanitize_ex HTML5 scrubber keeps attacker-supplied `<object>` elements, allowing untrusted content embedding
    Summary
    Inclusion of Functionality from Untrusted Control Sphere vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to load a document of their choosing into a trusted page via the data attribute of an <object> element in sanitized HTML. object is the one URI-bearing element in lib/html_sanitize_ex/scrubber/html5.ex never registered through allow_tag_with_uri_attributes/3, and its only guard is a prefix match on lowercase "javascript:", so mixed-case variants, data: URIs, protocol-relative URLs and same-origin paths all survive. This is not unconditional cross-site scripting. A javascript: URL does not execute through <object data> in current browsers, data: documents load in an opaque origin, and host-origin script execution additionally requires the application to serve attacker-controlled content from a same-origin path. This issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 15:40 UTC
    CWE
    • CWE-829 - Inclusion of Functionality from Untrusted Control Sphere
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    rrrene html_sanitize_ex Affected: 0.3.1 , < 1.5.3 (semver)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    rrrene html_sanitize_ex Affected: 8976d64ea0b77d26093a94a43ec48a3978e8d028 , < bec27fec4de99e40c68c4285a610e09e791a3eaf (git)
        cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66843",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T15:40:41.682905Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T15:40:50.570Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "html_sanitize_ex",
              "packageURL": "pkg:hex/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "1.5.3",
                  "status": "affected",
                  "version": "0.3.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.HtmlSanitizeEx.Scrubber.HTML5",
                "Elixir.HtmlSanitizeEx"
              ],
              "packageName": "rrrene/html_sanitize_ex",
              "packageURL": "pkg:github/rrrene/html_sanitize_ex",
              "product": "html_sanitize_ex",
              "programFiles": [
                "lib/html_sanitize_ex/scrubber/html5.ex",
                "lib/html_sanitize_ex.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:scrub_attribute/2"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx.Scrubber.HTML5\u0027:sanitize/1"
                },
                {
                  "name": "\u0027Elixir.HtmlSanitizeEx\u0027:html5/1"
                }
              ],
              "repo": "https://github.com/rrrene/html_sanitize_ex",
              "vendor": "rrrene",
              "versions": [
                {
                  "lessThan": "bec27fec4de99e40c68c4285a610e09e791a3eaf",
                  "status": "affected",
                  "version": "8976d64ea0b77d26093a94a43ec48a3978e8d028",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly \u003ccode\u003eHtmlSanitizeEx.html5/1\u003c/code\u003e, and custom scrubbers declared with \u003ccode\u003euse HtmlSanitizeEx, extend: :html5\u003c/code\u003e, allow the \u003ccode\u003eobject\u003c/code\u003e element, and the sanitized output must be rendered to other users.\u003c/p\u003e\n\u003cp\u003eScript execution in the host origin additionally requires the application to serve attacker-controlled HTML from a same-origin path, such as an uploads directory served as \u003ccode\u003etext/html\u003c/code\u003e.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only `HtmlSanitizeEx.html5/1`, and custom scrubbers declared with `use HtmlSanitizeEx, extend: :html5`, allow the `object` element, and the sanitized output must be rendered to other users.\n\nScript execution in the host origin additionally requires the application to serve attacker-controlled HTML from a same-origin path, such as an uploads directory served as `text/html`."
                }
              ],
              "value": "Only HtmlSanitizeEx.html5/1, and custom scrubbers declared with use HtmlSanitizeEx, extend: :html5, allow the object element, and the sanitized output must be rendered to other users.\n\nScript execution in the host origin additionally requires the application to serve attacker-controlled HTML from a same-origin path, such as an uploads directory served as text/html."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:rrrene:html_sanitize_ex:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.5.3",
                      "versionStartIncluding": "0.3.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ren\u00e9 F\u00f6hring"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eInclusion of Functionality from Untrusted Control Sphere vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to load a document of their choosing into a trusted page via the \u003ccode\u003edata\u003c/code\u003e attribute of an \u003ccode\u003e\u0026lt;object\u0026gt;\u003c/code\u003e element in sanitized HTML. \u003ccode\u003eobject\u003c/code\u003e is the one URI-bearing element in \u003ccode\u003elib/html_sanitize_ex/scrubber/html5.ex\u003c/code\u003e never registered through \u003ccode\u003eallow_tag_with_uri_attributes/3\u003c/code\u003e, and its only guard is a prefix match on lowercase \u003ccode\u003e\"javascript:\"\u003c/code\u003e, so mixed-case variants, \u003ccode\u003edata:\u003c/code\u003e URIs, protocol-relative URLs and same-origin paths all survive.\u003c/p\u003e\n\u003cp\u003eThis is not unconditional cross-site scripting. A \u003ccode\u003ejavascript:\u003c/code\u003e URL does not execute through \u003ccode\u003e\u0026lt;object data\u0026gt;\u003c/code\u003e in current browsers, \u003ccode\u003edata:\u003c/code\u003e documents load in an opaque origin, and host-origin script execution additionally requires the application to serve attacker-controlled content from a same-origin path.\u003c/p\u003e\n\u003cp\u003eThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Inclusion of Functionality from Untrusted Control Sphere vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to load a document of their choosing into a trusted page via the `data` attribute of an `\u003cobject\u003e` element in sanitized HTML. `object` is the one URI-bearing element in `lib/html_sanitize_ex/scrubber/html5.ex` never registered through `allow_tag_with_uri_attributes/3`, and its only guard is a prefix match on lowercase `\"javascript:\"`, so mixed-case variants, `data:` URIs, protocol-relative URLs and same-origin paths all survive.\n\nThis is not unconditional cross-site scripting. A `javascript:` URL does not execute through `\u003cobject data\u003e` in current browsers, `data:` documents load in an opaque origin, and host-origin script execution additionally requires the application to serve attacker-controlled content from a same-origin path.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
                }
              ],
              "value": "Inclusion of Functionality from Untrusted Control Sphere vulnerability in the HTML5 scrubber in rrrene html_sanitize_ex allows a remote attacker to load a document of their choosing into a trusted page via the data attribute of an \u003cobject\u003e element in sanitized HTML. object is the one URI-bearing element in lib/html_sanitize_ex/scrubber/html5.ex never registered through allow_tag_with_uri_attributes/3, and its only guard is a prefix match on lowercase \"javascript:\", so mixed-case variants, data: URIs, protocol-relative URLs and same-origin paths all survive.\n\nThis is not unconditional cross-site scripting. A javascript: URL does not execute through \u003cobject data\u003e in current browsers, data: documents load in an opaque origin, and host-origin script execution additionally requires the application to serve attacker-controlled content from a same-origin path.\n\nThis issue affects html_sanitize_ex: from 0.3.1 before 1.5.3."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-175",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-175 Code Inclusion"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 2.3,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "PASSIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-829",
                  "description": "CWE-829 Inclusion of Functionality from Untrusted Control Sphere",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-06T14:48:20.513Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/security/advisories/GHSA-xmm9-jc22-rcgj"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66843.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66843"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/rrrene/html_sanitize_ex/commit/bec27fec4de99e40c68c4285a610e09e791a3eaf"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "html_sanitize_ex HTML5 scrubber keeps attacker-supplied `\u003cobject\u003e` elements, allowing untrusted content embedding",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSanitize with \u003ccode\u003ebasic_html/1\u003c/code\u003e, \u003ccode\u003emarkdown_html/1\u003c/code\u003e or \u003ccode\u003estrip_tags/1\u003c/code\u003e, none of which allow \u003ccode\u003eobject\u003c/code\u003e, or define a custom scrubber that omits it.\u003c/p\u003e\n\u003cp\u003eA Content-Security-Policy of \u003ccode\u003eobject-src \u0027none\u0027\u003c/code\u003e blocks an injected \u003ccode\u003e\u0026lt;object\u0026gt;\u003c/code\u003e from loading, and hosting user uploads on a separate origin removes the escalation path.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Sanitize with `basic_html/1`, `markdown_html/1` or `strip_tags/1`, none of which allow `object`, or define a custom scrubber that omits it.\n\nA Content-Security-Policy of `object-src \u0027none\u0027` blocks an injected `\u003cobject\u003e` from loading, and hosting user uploads on a separate origin removes the escalation path."
                }
              ],
              "value": "Sanitize with basic_html/1, markdown_html/1 or strip_tags/1, none of which allow object, or define a custom scrubber that omits it.\n\nA Content-Security-Policy of object-src \u0027none\u0027 blocks an injected \u003cobject\u003e from loading, and hosting user uploads on a separate origin removes the escalation path."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66843",
        "datePublished": "2026-08-06T14:48:20.513Z",
        "dateReserved": "2026-08-06T09:00:01.259Z",
        "dateUpdated": "2026-08-06T15:40:50.570Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66885 (GCVE-0-2026-66885)

    Vulnerability from cvelistv5 – Published: 2026-08-05 19:44 – Updated: 2026-08-06 13:09
    VLAI
    Title
    Livebook Teams identity callback lacks state binding, allowing login CSRF
    Summary
    Cross-Site Request Forgery (CSRF) vulnerability in livebook-dev livebook allows an attacker to authenticate a victim's browser session under the attacker's own Livebook Teams identity. When Livebook is configured to use Livebook Teams for identity, Livebook.ZTA.LivebookTeams.handle_request/4 in lib/livebook/zta/livebook_teams.ex handles the OAuth-style callback carrying a teams_identity marker and a code parameter. The clause exchanges that code for an access token and writes the token into the browser session without verifying any value that ties the callback to the browser session that started the login. No state or nonce is generated when the flow is initiated: Livebook.Teams.Requests.create_auth_request/1 in lib/livebook/teams/requests.ex sends an empty request body, so no per-attempt value is ever registered, and the callback clause has nothing to compare against. An attacker who holds membership in the same Livebook Teams organisation as the target instance can therefore begin the login flow themselves, retain the resulting authorization code without redeeming it, and induce a victim to open a crafted URL carrying that code. The victim's browser completes the exchange and the resulting session is bound to the attacker's identity rather than the victim's. The victim is not required to hold any particular privilege, and no credential belonging to the victim is involved. The vulnerability does not allow the attacker to authenticate as the victim. The consequence is that a user believes they are working in their own authenticated session while they are in fact operating as another identity. Work performed in that session is attributed to the attacker's account, and secrets, uploaded data, or notebook results the victim produces are exposed to the attacker rather than kept in the victim's own account. The authorization code must be redeemed within a short window after the login flow begins, which constrains the timing of the attack but not its feasibility. This issue affects livebook: from 0.15.0 before 0.18.7 and from 0.19.0 before 0.19.9.
    SSVC
    Exploitation: none Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 13:09 UTC
    CWE
    • CWE-352 - Cross-Site Request Forgery (CSRF)
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    livebook-dev livebook Affected: 0.15.0 , < 0.18.7 (semver)
    Affected: 0.19.0 , < 0.19.9 (semver)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 0.15.0 , < 0.18.7 (other)
    Affected: 0.19.0 , < 0.19.9 (other)
    Affected: 0.15.0-cuda12 , < 0.18.7-cuda12 (other)
    Affected: 0.19.0-cuda12 , < 0.19.9-cuda12 (other)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 4380a411920531223088267ed1c0ad21f96ef660 , < * (git)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66885",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T13:09:14.330707Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T13:09:29.359Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.Livebook.Teams.Requests"
              ],
              "packageName": "livebook",
              "packageURL": "pkg:hex/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook/teams/requests.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:handle_request/4"
                },
                {
                  "name": "\u0027Elixir.Livebook.Teams.Requests\u0027:create_auth_request/1"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.15.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.Livebook.Teams.Requests"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:oci/livebook?repository_url=ghcr.io%2Flivebook-dev",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook/teams/requests.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:handle_request/4"
                },
                {
                  "name": "\u0027Elixir.Livebook.Teams.Requests\u0027:create_auth_request/1"
                }
              ],
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.15.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.18.7-cuda12",
                  "status": "affected",
                  "version": "0.15.0-cuda12",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9-cuda12",
                  "status": "affected",
                  "version": "0.19.0-cuda12",
                  "versionType": "other"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.Livebook.Teams.Requests"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:github/livebook-dev/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook/teams/requests.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:handle_request/4"
                },
                {
                  "name": "\u0027Elixir.Livebook.Teams.Requests\u0027:create_auth_request/1"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "21c16168263275541a6e076d0c31852c40e09a18",
                      "status": "unaffected"
                    },
                    {
                      "at": "33a052daa386c4ce08a9c39a07fc90f353ff6a51",
                      "status": "unaffected"
                    },
                    {
                      "at": "6ed2e213e9d5a19a70d7fcad5a8d616622cd2084",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "4380a411920531223088267ed1c0ad21f96ef660",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.18.7",
                      "versionStartIncluding": "0.15.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.19.9",
                      "versionStartIncluding": "0.19.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Nguy\u1ec5n C\u00f4ng T\u00fa"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan K\u0142osko"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Hugo Bara\u00fana"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eCross-Site Request Forgery (CSRF) vulnerability in livebook-dev livebook allows an attacker to authenticate a victim\u0027s browser session under the attacker\u0027s own Livebook Teams identity.\u003c/p\u003e\n\u003cp\u003eWhen Livebook is configured to use Livebook Teams for identity, \u003ccode\u003eLivebook.ZTA.LivebookTeams.handle_request/4\u003c/code\u003e in \u003ccode\u003elib/livebook/zta/livebook_teams.ex\u003c/code\u003e handles the OAuth-style callback carrying a \u003ccode\u003eteams_identity\u003c/code\u003e marker and a \u003ccode\u003ecode\u003c/code\u003e parameter. The clause exchanges that code for an access token and writes the token into the browser session without verifying any value that ties the callback to the browser session that started the login. No \u003ccode\u003estate\u003c/code\u003e or nonce is generated when the flow is initiated: \u003ccode\u003eLivebook.Teams.Requests.create_auth_request/1\u003c/code\u003e in \u003ccode\u003elib/livebook/teams/requests.ex\u003c/code\u003e sends an empty request body, so no per-attempt value is ever registered, and the callback clause has nothing to compare against.\u003c/p\u003e\n\u003cp\u003eAn attacker who holds membership in the same Livebook Teams organisation as the target instance can therefore begin the login flow themselves, retain the resulting authorization code without redeeming it, and induce a victim to open a crafted URL carrying that code. The victim\u0027s browser completes the exchange and the resulting session is bound to the attacker\u0027s identity rather than the victim\u0027s. The victim is not required to hold any particular privilege, and no credential belonging to the victim is involved. The vulnerability does not allow the attacker to authenticate as the victim.\u003c/p\u003e\n\u003cp\u003eThe consequence is that a user believes they are working in their own authenticated session while they are in fact operating as another identity. Work performed in that session is attributed to the attacker\u0027s account, and secrets, uploaded data, or notebook results the victim produces are exposed to the attacker rather than kept in the victim\u0027s own account. The authorization code must be redeemed within a short window after the login flow begins, which constrains the timing of the attack but not its feasibility.\u003c/p\u003e\n\u003cp\u003eThis issue affects livebook: from 0.15.0 before 0.18.7 and from 0.19.0 before 0.19.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Cross-Site Request Forgery (CSRF) vulnerability in livebook-dev livebook allows an attacker to authenticate a victim\u0027s browser session under the attacker\u0027s own Livebook Teams identity.\n\nWhen Livebook is configured to use Livebook Teams for identity, `Livebook.ZTA.LivebookTeams.handle_request/4` in `lib/livebook/zta/livebook_teams.ex` handles the OAuth-style callback carrying a `teams_identity` marker and a `code` parameter. The clause exchanges that code for an access token and writes the token into the browser session without verifying any value that ties the callback to the browser session that started the login. No `state` or nonce is generated when the flow is initiated: `Livebook.Teams.Requests.create_auth_request/1` in `lib/livebook/teams/requests.ex` sends an empty request body, so no per-attempt value is ever registered, and the callback clause has nothing to compare against.\n\nAn attacker who holds membership in the same Livebook Teams organisation as the target instance can therefore begin the login flow themselves, retain the resulting authorization code without redeeming it, and induce a victim to open a crafted URL carrying that code. The victim\u0027s browser completes the exchange and the resulting session is bound to the attacker\u0027s identity rather than the victim\u0027s. The victim is not required to hold any particular privilege, and no credential belonging to the victim is involved. The vulnerability does not allow the attacker to authenticate as the victim.\n\nThe consequence is that a user believes they are working in their own authenticated session while they are in fact operating as another identity. Work performed in that session is attributed to the attacker\u0027s account, and secrets, uploaded data, or notebook results the victim produces are exposed to the attacker rather than kept in the victim\u0027s own account. The authorization code must be redeemed within a short window after the login flow begins, which constrains the timing of the attack but not its feasibility.\n\nThis issue affects livebook: from 0.15.0 before 0.18.7 and from 0.19.0 before 0.19.9."
                }
              ],
              "value": "Cross-Site Request Forgery (CSRF) vulnerability in livebook-dev livebook allows an attacker to authenticate a victim\u0027s browser session under the attacker\u0027s own Livebook Teams identity.\n\nWhen Livebook is configured to use Livebook Teams for identity, Livebook.ZTA.LivebookTeams.handle_request/4 in lib/livebook/zta/livebook_teams.ex handles the OAuth-style callback carrying a teams_identity marker and a code parameter. The clause exchanges that code for an access token and writes the token into the browser session without verifying any value that ties the callback to the browser session that started the login. No state or nonce is generated when the flow is initiated: Livebook.Teams.Requests.create_auth_request/1 in lib/livebook/teams/requests.ex sends an empty request body, so no per-attempt value is ever registered, and the callback clause has nothing to compare against.\n\nAn attacker who holds membership in the same Livebook Teams organisation as the target instance can therefore begin the login flow themselves, retain the resulting authorization code without redeeming it, and induce a victim to open a crafted URL carrying that code. The victim\u0027s browser completes the exchange and the resulting session is bound to the attacker\u0027s identity rather than the victim\u0027s. The victim is not required to hold any particular privilege, and no credential belonging to the victim is involved. The vulnerability does not allow the attacker to authenticate as the victim.\n\nThe consequence is that a user believes they are working in their own authenticated session while they are in fact operating as another identity. Work performed in that session is attributed to the attacker\u0027s account, and secrets, uploaded data, or notebook results the victim produces are exposed to the attacker rather than kept in the victim\u0027s own account. The authorization code must be redeemed within a short window after the login flow begins, which constrains the timing of the attack but not its feasibility.\n\nThis issue affects livebook: from 0.15.0 before 0.18.7 and from 0.19.0 before 0.19.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-62",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-62 Cross Site Request Forgery"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.8,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-352",
                  "description": "CWE-352 Cross-Site Request Forgery (CSRF)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-05T19:44:23.834Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-pvvw-28fw-c6fg"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66885.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66885"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/21c16168263275541a6e076d0c31852c40e09a18"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/33a052daa386c4ce08a9c39a07fc90f353ff6a51"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/6ed2e213e9d5a19a70d7fcad5a8d616622cd2084"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Livebook Teams identity callback lacks state binding, allowing login CSRF"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66885",
        "datePublished": "2026-08-05T19:44:23.834Z",
        "dateReserved": "2026-07-28T04:15:10.240Z",
        "dateUpdated": "2026-08-06T13:09:29.359Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66298 (GCVE-0-2026-66298)

    Vulnerability from cvelistv5 – Published: 2026-08-05 19:44 – Updated: 2026-08-06 13:08
    VLAI
    Title
    JS-view sandboxed output can synthesize keyboard events to trigger unconfirmed global shortcuts
    Summary
    Origin Validation Error vulnerability in livebook-dev livebook allows untrusted notebook output JavaScript to trigger session-wide keyboard shortcuts, including forced evaluation of all cells and runtime restart. Livebook's JS-view feature renders notebook-defined JavaScript inside a sandboxed, cross-origin iframe specifically because that JavaScript is untrusted. The trusted iframe shell in iframe/priv/static/iframe/v5.html forwards every keydown event fired in its own window to the parent page without consulting Event.isTrusted, so an event synthesized by the untrusted script through window.dispatchEvent is forwarded exactly as a genuine keystroke would be. The parent-side relay in assets/js/hooks/js_view.js reconstructs and re-dispatches it on the live page with no further validation, and because assets/js/hooks/session.js registers the global shortcut handler on the document in the capture phase, that handler acts on the replicated event regardless of how it was produced. Sandboxed output JavaScript can therefore drive Livebook's session-wide keyboard shortcuts. Two of them reach LivebookWeb.SessionLive and execute immediately with no confirmation: the shortcut for queueing full evaluation runs every cell in the notebook, and the shortcut for reconnecting the runtime disconnects and reconnects it, discarding in-memory state. A third shortcut deletes the focused cell behind a confirmation dialog that the user can permanently dismiss, after which it too executes silently. Forced full evaluation is the significant consequence, because it causes the notebook's own Elixir code to run without the user choosing to evaluate anything. A user who merely opens a notebook obtained from a third party, or reached from published documentation, can have its code executed on their runtime. Livebook also mirrors cell outputs to every connected client, so a malicious output triggers in a collaborator's browser as soon as it renders. This issue affects livebook: from 0.5.0 before 0.18.7 and from 0.19.0 before 0.19.9.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 13:08 UTC
    CWE
    • CWE-346 - Origin Validation Error
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    livebook-dev livebook Affected: 0.5.0 , < 0.18.7 (semver)
    Affected: 0.19.0 , < 0.19.9 (semver)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 0.5.0 , < 0.18.7 (other)
    Affected: 0.19.0 , < 0.19.9 (other)
    Affected: 0.5.0-cuda12 , < 0.18.7-cuda12 (other)
    Affected: 0.19.0-cuda12 , < 0.19.9-cuda12 (other)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 844242ba80a928d0d675416d312a58003cb7771b , < * (git)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66298",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T13:08:06.869367Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T13:08:23.940Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.SessionLive"
              ],
              "packageName": "livebook",
              "packageURL": "pkg:hex/livebook",
              "product": "livebook",
              "programFiles": [
                "iframe/priv/static/iframe/v5.html",
                "assets/js/hooks/js_view.js",
                "assets/js/hooks/session.js",
                "lib/livebook_web/live/session_live.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.SessionLive\u0027:handle_event/3"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.5.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.SessionLive"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:oci/livebook?repository_url=ghcr.io%2Flivebook-dev",
              "product": "livebook",
              "programFiles": [
                "iframe/priv/static/iframe/v5.html",
                "assets/js/hooks/js_view.js",
                "assets/js/hooks/session.js",
                "lib/livebook_web/live/session_live.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.SessionLive\u0027:handle_event/3"
                }
              ],
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.5.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.18.7-cuda12",
                  "status": "affected",
                  "version": "0.5.0-cuda12",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9-cuda12",
                  "status": "affected",
                  "version": "0.19.0-cuda12",
                  "versionType": "other"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.SessionLive"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:github/livebook-dev/livebook",
              "product": "livebook",
              "programFiles": [
                "iframe/priv/static/iframe/v5.html",
                "assets/js/hooks/js_view.js",
                "assets/js/hooks/session.js",
                "lib/livebook_web/live/session_live.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.SessionLive\u0027:handle_event/3"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "296318ffdfa6e5ed7b18ad8d5a5b2af90f3cd728",
                      "status": "unaffected"
                    },
                    {
                      "at": "a552ce8f99ad348ea37061394dc950a0cebdb33e",
                      "status": "unaffected"
                    },
                    {
                      "at": "5980e5c6b71036806b3bf54101eb1d6c0f50f19c",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "844242ba80a928d0d675416d312a58003cb7771b",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.18.7",
                      "versionStartIncluding": "0.5.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.19.9",
                      "versionStartIncluding": "0.19.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Nguy\u1ec5n C\u00f4ng T\u00fa"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan K\u0142osko"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOrigin Validation Error vulnerability in livebook-dev livebook allows untrusted notebook output JavaScript to trigger session-wide keyboard shortcuts, including forced evaluation of all cells and runtime restart.\u003c/p\u003e\n\u003cp\u003eLivebook\u0027s JS-view feature renders notebook-defined JavaScript inside a sandboxed, cross-origin iframe specifically because that JavaScript is untrusted. The trusted iframe shell in \u003ccode\u003eiframe/priv/static/iframe/v5.html\u003c/code\u003e forwards every \u003ccode\u003ekeydown\u003c/code\u003e event fired in its own window to the parent page without consulting \u003ccode\u003eEvent.isTrusted\u003c/code\u003e, so an event synthesized by the untrusted script through \u003ccode\u003ewindow.dispatchEvent\u003c/code\u003e is forwarded exactly as a genuine keystroke would be. The parent-side relay in \u003ccode\u003eassets/js/hooks/js_view.js\u003c/code\u003e reconstructs and re-dispatches it on the live page with no further validation, and because \u003ccode\u003eassets/js/hooks/session.js\u003c/code\u003e registers the global shortcut handler on the document in the capture phase, that handler acts on the replicated event regardless of how it was produced.\u003c/p\u003e\n\u003cp\u003eSandboxed output JavaScript can therefore drive Livebook\u0027s session-wide keyboard shortcuts. Two of them reach \u003ccode\u003eLivebookWeb.SessionLive\u003c/code\u003e and execute immediately with no confirmation: the shortcut for queueing full evaluation runs every cell in the notebook, and the shortcut for reconnecting the runtime disconnects and reconnects it, discarding in-memory state. A third shortcut deletes the focused cell behind a confirmation dialog that the user can permanently dismiss, after which it too executes silently.\u003c/p\u003e\n\u003cp\u003eForced full evaluation is the significant consequence, because it causes the notebook\u0027s own Elixir code to run without the user choosing to evaluate anything. A user who merely opens a notebook obtained from a third party, or reached from published documentation, can have its code executed on their runtime. Livebook also mirrors cell outputs to every connected client, so a malicious output triggers in a collaborator\u0027s browser as soon as it renders.\u003c/p\u003e\n\u003cp\u003eThis issue affects livebook: from 0.5.0 before 0.18.7 and from 0.19.0 before 0.19.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Origin Validation Error vulnerability in livebook-dev livebook allows untrusted notebook output JavaScript to trigger session-wide keyboard shortcuts, including forced evaluation of all cells and runtime restart.\n\nLivebook\u0027s JS-view feature renders notebook-defined JavaScript inside a sandboxed, cross-origin iframe specifically because that JavaScript is untrusted. The trusted iframe shell in `iframe/priv/static/iframe/v5.html` forwards every `keydown` event fired in its own window to the parent page without consulting `Event.isTrusted`, so an event synthesized by the untrusted script through `window.dispatchEvent` is forwarded exactly as a genuine keystroke would be. The parent-side relay in `assets/js/hooks/js_view.js` reconstructs and re-dispatches it on the live page with no further validation, and because `assets/js/hooks/session.js` registers the global shortcut handler on the document in the capture phase, that handler acts on the replicated event regardless of how it was produced.\n\nSandboxed output JavaScript can therefore drive Livebook\u0027s session-wide keyboard shortcuts. Two of them reach `LivebookWeb.SessionLive` and execute immediately with no confirmation: the shortcut for queueing full evaluation runs every cell in the notebook, and the shortcut for reconnecting the runtime disconnects and reconnects it, discarding in-memory state. A third shortcut deletes the focused cell behind a confirmation dialog that the user can permanently dismiss, after which it too executes silently.\n\nForced full evaluation is the significant consequence, because it causes the notebook\u0027s own Elixir code to run without the user choosing to evaluate anything. A user who merely opens a notebook obtained from a third party, or reached from published documentation, can have its code executed on their runtime. Livebook also mirrors cell outputs to every connected client, so a malicious output triggers in a collaborator\u0027s browser as soon as it renders.\n\nThis issue affects livebook: from 0.5.0 before 0.18.7 and from 0.19.0 before 0.19.9."
                }
              ],
              "value": "Origin Validation Error vulnerability in livebook-dev livebook allows untrusted notebook output JavaScript to trigger session-wide keyboard shortcuts, including forced evaluation of all cells and runtime restart.\n\nLivebook\u0027s JS-view feature renders notebook-defined JavaScript inside a sandboxed, cross-origin iframe specifically because that JavaScript is untrusted. The trusted iframe shell in iframe/priv/static/iframe/v5.html forwards every keydown event fired in its own window to the parent page without consulting Event.isTrusted, so an event synthesized by the untrusted script through window.dispatchEvent is forwarded exactly as a genuine keystroke would be. The parent-side relay in assets/js/hooks/js_view.js reconstructs and re-dispatches it on the live page with no further validation, and because assets/js/hooks/session.js registers the global shortcut handler on the document in the capture phase, that handler acts on the replicated event regardless of how it was produced.\n\nSandboxed output JavaScript can therefore drive Livebook\u0027s session-wide keyboard shortcuts. Two of them reach LivebookWeb.SessionLive and execute immediately with no confirmation: the shortcut for queueing full evaluation runs every cell in the notebook, and the shortcut for reconnecting the runtime disconnects and reconnects it, discarding in-memory state. A third shortcut deletes the focused cell behind a confirmation dialog that the user can permanently dismiss, after which it too executes silently.\n\nForced full evaluation is the significant consequence, because it causes the notebook\u0027s own Elixir code to run without the user choosing to evaluate anything. A user who merely opens a notebook obtained from a third party, or reached from published documentation, can have its code executed on their runtime. Livebook also mirrors cell outputs to every connected client, so a malicious output triggers in a collaborator\u0027s browser as soon as it renders.\n\nThis issue affects livebook: from 0.5.0 before 0.18.7 and from 0.19.0 before 0.19.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-160",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-160 Exploit Script-Based APIs"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 8.6,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-346",
                  "description": "CWE-346 Origin Validation Error",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-05T19:44:11.831Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-68c2-prqg-x62g"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66298.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66298"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/296318ffdfa6e5ed7b18ad8d5a5b2af90f3cd728"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/a552ce8f99ad348ea37061394dc950a0cebdb33e"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/5980e5c6b71036806b3bf54101eb1d6c0f50f19c"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "JS-view sandboxed output can synthesize keyboard events to trigger unconfirmed global shortcuts"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66298",
        "datePublished": "2026-08-05T19:44:11.831Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-08-06T13:08:23.940Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66297 (GCVE-0-2026-66297)

    Vulnerability from cvelistv5 – Published: 2026-08-05 19:43 – Updated: 2026-08-06 13:04
    VLAI
    Title
    Unescaped deployment environment variables in generated setup commands
    Summary
    Improper Neutralization of Special Elements used in an OS Command (OS Command Injection) vulnerability in livebook-dev livebook allows command injection into generated deployment setup commands. LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.docker_instructions/2 and LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.fly_instructions/4 in lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex interpolate deployment group environment variable values into the generated Docker and Fly.io setup commands without shell escaping. The values originate from the deployment group configuration and reach the sinks through Livebook.Hubs.Dockerfile.online_docker_info/3. Both sinks place the value inside a double-quoted shell word, so a value containing a command substitution such as $(...) or backticks is evaluated by the shell without any need to break out of the quoting, and a literal double quote terminates the quoted word and allows arbitrary further tokens. The generated command is displayed in the Livebook web interface with a copy button, so a user who copies it and runs it without reviewing it first executes the injected commands on their own machine, under their own account. An attacker requires privileges sufficient to set deployment group environment variables, while the resulting code execution occurs on the machine of whoever runs the generated command. The Kubernetes instructions are not affected, because they render the same values into a YAML manifest with escaping rather than into a shell command. This issue affects livebook: from 0.13.0 before 0.18.7 and from 0.19.0 before 0.19.9.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 13:04 UTC
    CWE
    • CWE-78 - Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    livebook-dev livebook Affected: 0.13.0 , < 0.18.7 (semver)
    Affected: 0.19.0 , < 0.19.9 (semver)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 0.13.0 , < 0.18.7 (other)
    Affected: 0.19.0 , < 0.19.9 (other)
    Affected: 0.13.0-cuda12 , < 0.18.7-cuda12 (other)
    Affected: 0.19.0-cuda12 , < 0.19.9-cuda12 (other)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 7cf4af5c10ec645f55a10f30e5661c54f6a6b319 , < * (git)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66297",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T13:04:06.826223Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T13:04:30.860Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-qpjc-w5mm-73mj"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent"
              ],
              "packageName": "livebook",
              "packageURL": "pkg:hex/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:docker_instructions/2"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:fly_instructions/4"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.13.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:oci/livebook?repository_url=ghcr.io%2Flivebook-dev",
              "product": "livebook",
              "programFiles": [
                "lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:docker_instructions/2"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:fly_instructions/4"
                }
              ],
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.13.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.18.7-cuda12",
                  "status": "affected",
                  "version": "0.13.0-cuda12",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9-cuda12",
                  "status": "affected",
                  "version": "0.19.0-cuda12",
                  "versionType": "other"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:github/livebook-dev/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:docker_instructions/2"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent\u0027:fly_instructions/4"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "b2a8416d149043132fe5a14ed611e0fefc9dc9cd",
                      "status": "unaffected"
                    },
                    {
                      "at": "0c2487326bbb37cb1eb43bb2f76eb93ad9f8fd6b",
                      "status": "unaffected"
                    },
                    {
                      "at": "f8fe9c62cb8bfc1dd0ccda4ea4a57c5e91563c85",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "7cf4af5c10ec645f55a10f30e5661c54f6a6b319",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.18.7",
                      "versionStartIncluding": "0.13.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.19.9",
                      "versionStartIncluding": "0.19.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Nguy\u1ec5n C\u00f4ng T\u00fa"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan K\u0142osko"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of Special Elements used in an OS Command (OS Command Injection) vulnerability in livebook-dev livebook allows command injection into generated deployment setup commands.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eLivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.docker_instructions/2\u003c/code\u003e and \u003ccode\u003eLivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.fly_instructions/4\u003c/code\u003e in \u003ccode\u003elib/livebook_web/live/hub/teams/deployment_group_agent_component.ex\u003c/code\u003e interpolate deployment group environment variable values into the generated Docker and Fly.io setup commands without shell escaping. The values originate from the deployment group configuration and reach the sinks through \u003ccode\u003eLivebook.Hubs.Dockerfile.online_docker_info/3\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBoth sinks place the value inside a double-quoted shell word, so a value containing a command substitution such as \u003ccode\u003e$(...)\u003c/code\u003e or backticks is evaluated by the shell without any need to break out of the quoting, and a literal double quote terminates the quoted word and allows arbitrary further tokens. The generated command is displayed in the Livebook web interface with a copy button, so a user who copies it and runs it without reviewing it first executes the injected commands on their own machine, under their own account.\u003c/p\u003e\n\u003cp\u003eAn attacker requires privileges sufficient to set deployment group environment variables, while the resulting code execution occurs on the machine of whoever runs the generated command. The Kubernetes instructions are not affected, because they render the same values into a YAML manifest with escaping rather than into a shell command.\u003c/p\u003e\n\u003cp\u003eThis issue affects livebook: from 0.13.0 before 0.18.7 and from 0.19.0 before 0.19.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Neutralization of Special Elements used in an OS Command (OS Command Injection) vulnerability in livebook-dev livebook allows command injection into generated deployment setup commands.\n\n`LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.docker_instructions/2` and `LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.fly_instructions/4` in `lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex` interpolate deployment group environment variable values into the generated Docker and Fly.io setup commands without shell escaping. The values originate from the deployment group configuration and reach the sinks through `Livebook.Hubs.Dockerfile.online_docker_info/3`.\n\nBoth sinks place the value inside a double-quoted shell word, so a value containing a command substitution such as `$(...)` or backticks is evaluated by the shell without any need to break out of the quoting, and a literal double quote terminates the quoted word and allows arbitrary further tokens. The generated command is displayed in the Livebook web interface with a copy button, so a user who copies it and runs it without reviewing it first executes the injected commands on their own machine, under their own account.\n\nAn attacker requires privileges sufficient to set deployment group environment variables, while the resulting code execution occurs on the machine of whoever runs the generated command. The Kubernetes instructions are not affected, because they render the same values into a YAML manifest with escaping rather than into a shell command.\n\nThis issue affects livebook: from 0.13.0 before 0.18.7 and from 0.19.0 before 0.19.9."
                }
              ],
              "value": "Improper Neutralization of Special Elements used in an OS Command (OS Command Injection) vulnerability in livebook-dev livebook allows command injection into generated deployment setup commands.\n\nLivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.docker_instructions/2 and LivebookWeb.Hub.Teams.DeploymentGroupAgentComponent.fly_instructions/4 in lib/livebook_web/live/hub/teams/deployment_group_agent_component.ex interpolate deployment group environment variable values into the generated Docker and Fly.io setup commands without shell escaping. The values originate from the deployment group configuration and reach the sinks through Livebook.Hubs.Dockerfile.online_docker_info/3.\n\nBoth sinks place the value inside a double-quoted shell word, so a value containing a command substitution such as $(...) or backticks is evaluated by the shell without any need to break out of the quoting, and a literal double quote terminates the quoted word and allows arbitrary further tokens. The generated command is displayed in the Livebook web interface with a copy button, so a user who copies it and runs it without reviewing it first executes the injected commands on their own machine, under their own account.\n\nAn attacker requires privileges sufficient to set deployment group environment variables, while the resulting code execution occurs on the machine of whoever runs the generated command. The Kubernetes instructions are not affected, because they render the same values into a YAML manifest with escaping rather than into a shell command.\n\nThis issue affects livebook: from 0.13.0 before 0.18.7 and from 0.19.0 before 0.19.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-88",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-88 OS Command Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 5,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "HIGH",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "HIGH",
                "subConfidentialityImpact": "HIGH",
                "subIntegrityImpact": "HIGH",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:A/VC:N/VI:N/VA:N/SC:H/SI:H/SA:H",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-78",
                  "description": "CWE-78 Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-05T19:43:58.068Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-qpjc-w5mm-73mj"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66297.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66297"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/b2a8416d149043132fe5a14ed611e0fefc9dc9cd"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/0c2487326bbb37cb1eb43bb2f76eb93ad9f8fd6b"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/f8fe9c62cb8bfc1dd0ccda4ea4a57c5e91563c85"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Unescaped deployment environment variables in generated setup commands"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66297",
        "datePublished": "2026-08-05T19:43:58.068Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-08-06T13:04:30.860Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66881 (GCVE-0-2026-66881)

    Vulnerability from cvelistv5 – Published: 2026-08-05 19:43 – Updated: 2026-08-06 13:03
    VLAI
    Title
    Path traversal in imported file_entries name allows arbitrary file write via URL-type entry download
    Summary
    Relative Path Traversal vulnerability in livebook-dev livebook allows an attacker-authored notebook to write a file with attacker-controlled content to an arbitrary path. A .livemd notebook can declare file_entries metadata, each entry carrying a name. Every path that creates a file entry through the user interface validates that name with Livebook.Notebook.validate_file_entry_name/2, which requires a flat filename of alphanumerics, dashes, underscores and dots, ending in an extension. The import path does not: Livebook.LiveMarkdown.Import.file_entry_metadata_to_attrs/1 in lib/livebook/live_markdown/import.ex takes the name verbatim from the notebook source. For a URL-type file entry, Livebook.Session.file_entry_cache_file/2 in lib/livebook/session.ex resolves that name beneath the session's temporary directory without checking that the result stays inside it, and Livebook.FileSystem.Utils.resolve_unix_like_path/2 collapses parent-directory segments while clamping only at the filesystem root. When the entry's content is requested and no cached copy exists, Livebook fetches the entry's URL and writes the response body to the resolved path, creating parent directories as needed. The attacker therefore controls both the destination and the contents of the written file, which may land anywhere the Livebook process can write. The same missing containment check is present in Livebook.Session.to_attachment_file_entry/2. A victim who opens an attacker-supplied notebook and causes the entry to be fetched triggers the write within their own authenticated session; the attacker needs no account on the target instance. URL-type entries are also not placed under notebook stamping quarantine on import, so no warning is shown. This issue affects livebook: from 0.11.0 before 0.18.7 and from 0.19.0 before 0.19.9.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 13:03 UTC
    CWE
    • CWE-23 - Relative Path Traversal
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    livebook-dev livebook Affected: 0.11.0 , < 0.18.7 (semver)
    Affected: 0.19.0 , < 0.19.9 (semver)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 0.11.0 , < 0.18.7 (other)
    Affected: 0.19.0 , < 0.19.9 (other)
    Affected: 0.11.0-cuda12 , < 0.18.7-cuda12 (other)
    Affected: 0.19.0-cuda12 , < 0.19.9-cuda12 (other)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: c02eb984f80a543c7a52b1d882c76f56aa5be743 , < * (git)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66881",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T13:03:23.099180Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T13:03:45.814Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-r4h8-2xpq-v48g"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.LiveMarkdown.Import",
                "Elixir.Livebook.Session",
                "Elixir.Livebook.FileSystem.Utils"
              ],
              "packageName": "livebook",
              "packageURL": "pkg:hex/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/live_markdown/import.ex",
                "lib/livebook/session.ex",
                "lib/livebook/file_system/utils.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.LiveMarkdown.Import\u0027:file_entry_metadata_to_attrs/1"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:file_entry_cache_file/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:to_attachment_file_entry/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.FileSystem.Utils\u0027:resolve_unix_like_path/2"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.11.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.LiveMarkdown.Import",
                "Elixir.Livebook.Session",
                "Elixir.Livebook.FileSystem.Utils"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:oci/livebook?repository_url=ghcr.io%2Flivebook-dev",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/live_markdown/import.ex",
                "lib/livebook/session.ex",
                "lib/livebook/file_system/utils.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.LiveMarkdown.Import\u0027:file_entry_metadata_to_attrs/1"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:file_entry_cache_file/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:to_attachment_file_entry/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.FileSystem.Utils\u0027:resolve_unix_like_path/2"
                }
              ],
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.18.7",
                  "status": "affected",
                  "version": "0.11.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.0",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.18.7-cuda12",
                  "status": "affected",
                  "version": "0.11.0-cuda12",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9-cuda12",
                  "status": "affected",
                  "version": "0.19.0-cuda12",
                  "versionType": "other"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.LiveMarkdown.Import",
                "Elixir.Livebook.Session",
                "Elixir.Livebook.FileSystem.Utils"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:github/livebook-dev/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/live_markdown/import.ex",
                "lib/livebook/session.ex",
                "lib/livebook/file_system/utils.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.LiveMarkdown.Import\u0027:file_entry_metadata_to_attrs/1"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:file_entry_cache_file/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Session\u0027:to_attachment_file_entry/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.FileSystem.Utils\u0027:resolve_unix_like_path/2"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "1443dd23df6e7b9203b6797f0695a807aeb81dde",
                      "status": "unaffected"
                    },
                    {
                      "at": "acf4cb8c0c79b89c795b180f061be7de2d8b5aa9",
                      "status": "unaffected"
                    },
                    {
                      "at": "50f86982ebf36c22abeb379b55ec0f2859c83bb9",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "c02eb984f80a543c7a52b1d882c76f56aa5be743",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.18.7",
                      "versionStartIncluding": "0.11.0",
                      "vulnerable": true
                    },
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.19.9",
                      "versionStartIncluding": "0.19.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Nguy\u1ec5n C\u00f4ng T\u00fa"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan K\u0142osko"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eRelative Path Traversal vulnerability in livebook-dev livebook allows an attacker-authored notebook to write a file with attacker-controlled content to an arbitrary path.\u003c/p\u003e\n\u003cp\u003eA \u003ccode\u003e.livemd\u003c/code\u003e notebook can declare \u003ccode\u003efile_entries\u003c/code\u003e metadata, each entry carrying a \u003ccode\u003ename\u003c/code\u003e. Every path that creates a file entry through the user interface validates that name with \u003ccode\u003eLivebook.Notebook.validate_file_entry_name/2\u003c/code\u003e, which requires a flat filename of alphanumerics, dashes, underscores and dots, ending in an extension. The import path does not: \u003ccode\u003eLivebook.LiveMarkdown.Import.file_entry_metadata_to_attrs/1\u003c/code\u003e in \u003ccode\u003elib/livebook/live_markdown/import.ex\u003c/code\u003e takes the name verbatim from the notebook source.\u003c/p\u003e\n\u003cp\u003eFor a URL-type file entry, \u003ccode\u003eLivebook.Session.file_entry_cache_file/2\u003c/code\u003e in \u003ccode\u003elib/livebook/session.ex\u003c/code\u003e resolves that name beneath the session\u0027s temporary directory without checking that the result stays inside it, and \u003ccode\u003eLivebook.FileSystem.Utils.resolve_unix_like_path/2\u003c/code\u003e collapses parent-directory segments while clamping only at the filesystem root. When the entry\u0027s content is requested and no cached copy exists, Livebook fetches the entry\u0027s URL and writes the response body to the resolved path, creating parent directories as needed. The attacker therefore controls both the destination and the contents of the written file, which may land anywhere the Livebook process can write. The same missing containment check is present in \u003ccode\u003eLivebook.Session.to_attachment_file_entry/2\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eA victim who opens an attacker-supplied notebook and causes the entry to be fetched triggers the write within their own authenticated session; the attacker needs no account on the target instance. URL-type entries are also not placed under notebook stamping quarantine on import, so no warning is shown.\u003c/p\u003e\n\u003cp\u003eThis issue affects livebook: from 0.11.0 before 0.18.7 and from 0.19.0 before 0.19.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Relative Path Traversal vulnerability in livebook-dev livebook allows an attacker-authored notebook to write a file with attacker-controlled content to an arbitrary path.\n\nA `.livemd` notebook can declare `file_entries` metadata, each entry carrying a `name`. Every path that creates a file entry through the user interface validates that name with `Livebook.Notebook.validate_file_entry_name/2`, which requires a flat filename of alphanumerics, dashes, underscores and dots, ending in an extension. The import path does not: `Livebook.LiveMarkdown.Import.file_entry_metadata_to_attrs/1` in `lib/livebook/live_markdown/import.ex` takes the name verbatim from the notebook source.\n\nFor a URL-type file entry, `Livebook.Session.file_entry_cache_file/2` in `lib/livebook/session.ex` resolves that name beneath the session\u0027s temporary directory without checking that the result stays inside it, and `Livebook.FileSystem.Utils.resolve_unix_like_path/2` collapses parent-directory segments while clamping only at the filesystem root. When the entry\u0027s content is requested and no cached copy exists, Livebook fetches the entry\u0027s URL and writes the response body to the resolved path, creating parent directories as needed. The attacker therefore controls both the destination and the contents of the written file, which may land anywhere the Livebook process can write. The same missing containment check is present in `Livebook.Session.to_attachment_file_entry/2`.\n\nA victim who opens an attacker-supplied notebook and causes the entry to be fetched triggers the write within their own authenticated session; the attacker needs no account on the target instance. URL-type entries are also not placed under notebook stamping quarantine on import, so no warning is shown.\n\nThis issue affects livebook: from 0.11.0 before 0.18.7 and from 0.19.0 before 0.19.9."
                }
              ],
              "value": "Relative Path Traversal vulnerability in livebook-dev livebook allows an attacker-authored notebook to write a file with attacker-controlled content to an arbitrary path.\n\nA .livemd notebook can declare file_entries metadata, each entry carrying a name. Every path that creates a file entry through the user interface validates that name with Livebook.Notebook.validate_file_entry_name/2, which requires a flat filename of alphanumerics, dashes, underscores and dots, ending in an extension. The import path does not: Livebook.LiveMarkdown.Import.file_entry_metadata_to_attrs/1 in lib/livebook/live_markdown/import.ex takes the name verbatim from the notebook source.\n\nFor a URL-type file entry, Livebook.Session.file_entry_cache_file/2 in lib/livebook/session.ex resolves that name beneath the session\u0027s temporary directory without checking that the result stays inside it, and Livebook.FileSystem.Utils.resolve_unix_like_path/2 collapses parent-directory segments while clamping only at the filesystem root. When the entry\u0027s content is requested and no cached copy exists, Livebook fetches the entry\u0027s URL and writes the response body to the resolved path, creating parent directories as needed. The attacker therefore controls both the destination and the contents of the written file, which may land anywhere the Livebook process can write. The same missing containment check is present in Livebook.Session.to_attachment_file_entry/2.\n\nA victim who opens an attacker-supplied notebook and causes the entry to be fetched triggers the write within their own authenticated session; the attacker needs no account on the target instance. URL-type entries are also not placed under notebook stamping quarantine on import, so no warning is shown.\n\nThis issue affects livebook: from 0.11.0 before 0.18.7 and from 0.19.0 before 0.19.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-76",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-76 Manipulating Web Input to File System Calls"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 7,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "LOW",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-23",
                  "description": "CWE-23 Relative Path Traversal",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-05T19:43:48.812Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-r4h8-2xpq-v48g"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66881.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66881"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/1443dd23df6e7b9203b6797f0695a807aeb81dde"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/acf4cb8c0c79b89c795b180f061be7de2d8b5aa9"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/50f86982ebf36c22abeb379b55ec0f2859c83bb9"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Path traversal in imported file_entries name allows arbitrary file write via URL-type entry download"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66881",
        "datePublished": "2026-08-05T19:43:48.812Z",
        "dateReserved": "2026-07-28T04:15:10.239Z",
        "dateUpdated": "2026-08-06T13:03:45.814Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-68746 (GCVE-0-2026-68746)

    Vulnerability from cvelistv5 – Published: 2026-08-05 19:43 – Updated: 2026-08-06 14:48
    VLAI
    Title
    Livebook Teams identity check fails open when the deployment group is unresolvable, allowing unauthenticated access
    Summary
    Not Failing Securely ('Failing Open') vulnerability in livebook-dev livebook allows an unauthenticated network client to obtain full access to a Livebook server that enforces identity through Livebook Teams. A Livebook Agent or App Server connected to Livebook Teams caches the identifier of the deployment group it belongs to, and resolves that identifier against a locally cached list of deployment groups on every request in order to decide whether Teams identity enforcement is active. Livebook.Hubs.TeamClient.handle_call/3 in lib/livebook/hubs/team_client.ex does not distinguish a deployment group that could not be resolved from one that was resolved with identity enforcement switched off: the clause matches only the case where a group was found with enforcement enabled, and falls through to a catch-all that reports enforcement as switched off for everything else. The two neighbouring functions that decide user and application access resolve the same identifier and treat the same unresolved result as a denial. When the identity status is reported as switched off, Livebook.ZTA.LivebookTeams.authenticate/3 in lib/livebook/zta/livebook_teams.ex returns empty identity metadata and allows the request to continue instead of halting it. LivebookWeb.UserPlug.build_current_user/3 merges that empty metadata into a newly built user, whose access type defaults to full access, and LivebookWeb.AuthPlug.authorized?/1 grants access to any user holding full access. The cached identifier becomes unresolvable when the deployment group it refers to is deleted while the agent is not connected to receive the change, most concretely when a deployment group is deleted during the window in which an agent is disconnected or reconnecting. The client removes the group from its cached list without clearing the identifier that refers to it. Any client able to reach the affected server over the network is then granted the same access as a fully privileged member of the organisation, including the ability to read notebooks and configured secrets, execute code on the server's runtime, and disrupt its operation. This issue affects livebook: from 0.19.7 before 0.19.9.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-06 14:45 UTC
    CWE
    • CWE-636 - Not Failing Securely ('Failing Open')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    livebook-dev livebook Affected: 0.19.7 , < 0.19.9 (semver)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: 0.19.7 , < 0.19.9 (other)
    Affected: 0.19.7-cuda12 , < 0.19.9-cuda12 (other)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    livebook-dev livebook Affected: fc2c87c6b0276705281842acbe17142d1ac4d555 , < * (git)
        cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-68746",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-06T14:45:09.939122Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-06T14:48:46.790Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.Hubs.TeamClient",
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.LivebookWeb.AuthPlug"
              ],
              "packageName": "livebook",
              "packageURL": "pkg:hex/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/hubs/team_client.ex",
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook_web/plugs/auth_plug.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:handle_call/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:remove_deployment_group/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:fetch_entry/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:authenticate/3"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.AuthPlug\u0027:authorized?/1"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.7",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.Hubs.TeamClient",
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.LivebookWeb.AuthPlug"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:oci/livebook?repository_url=ghcr.io%2Flivebook-dev",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/hubs/team_client.ex",
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook_web/plugs/auth_plug.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:handle_call/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:remove_deployment_group/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:fetch_entry/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:authenticate/3"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.AuthPlug\u0027:authorized?/1"
                }
              ],
              "vendor": "livebook-dev",
              "versions": [
                {
                  "lessThan": "0.19.9",
                  "status": "affected",
                  "version": "0.19.7",
                  "versionType": "other"
                },
                {
                  "lessThan": "0.19.9-cuda12",
                  "status": "affected",
                  "version": "0.19.7-cuda12",
                  "versionType": "other"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Livebook.Hubs.TeamClient",
                "Elixir.Livebook.ZTA.LivebookTeams",
                "Elixir.LivebookWeb.AuthPlug"
              ],
              "packageName": "livebook-dev/livebook",
              "packageURL": "pkg:github/livebook-dev/livebook",
              "product": "livebook",
              "programFiles": [
                "lib/livebook/hubs/team_client.ex",
                "lib/livebook/zta/livebook_teams.ex",
                "lib/livebook_web/plugs/auth_plug.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:handle_call/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:remove_deployment_group/2"
                },
                {
                  "name": "\u0027Elixir.Livebook.Hubs.TeamClient\u0027:fetch_entry/3"
                },
                {
                  "name": "\u0027Elixir.Livebook.ZTA.LivebookTeams\u0027:authenticate/3"
                },
                {
                  "name": "\u0027Elixir.LivebookWeb.AuthPlug\u0027:authorized?/1"
                }
              ],
              "repo": "https://github.com/livebook-dev/livebook",
              "vendor": "livebook-dev",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "d374e90647edbb00286bfee9182c0161d29a8e07",
                      "status": "unaffected"
                    },
                    {
                      "at": "d6d0dfa746b172540442852f74de4a9deacc433b",
                      "status": "unaffected"
                    },
                    {
                      "at": "2d3a2c710c880abd24a2bc888d3cf5239d98cf72",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "fc2c87c6b0276705281842acbe17142d1ac4d555",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThis vulnerability affects Livebook servers that enforce identity through Livebook Teams. Servers not connected to Livebook Teams, or connected without a deployment group, are not affected.\u003c/p\u003e\n\u003cp\u003eLivebook Teams has also been changed to reject deletion of a deployment group while agents belonging to it are connected, which removes the most direct route into the vulnerable state. A connected agent may still reach an unresolvable cached deployment group as a result of connection failures or network errors.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "This vulnerability affects Livebook servers that enforce identity through Livebook Teams. Servers not connected to Livebook Teams, or connected without a deployment group, are not affected.\n\nLivebook Teams has also been changed to reject deletion of a deployment group while agents belonging to it are connected, which removes the most direct route into the vulnerable state. A connected agent may still reach an unresolvable cached deployment group as a result of connection failures or network errors."
                }
              ],
              "value": "This vulnerability affects Livebook servers that enforce identity through Livebook Teams. Servers not connected to Livebook Teams, or connected without a deployment group, are not affected.\n\nLivebook Teams has also been changed to reject deletion of a deployment group while agents belonging to it are connected, which removes the most direct route into the vulnerable state. A connected agent may still reach an unresolvable cached deployment group as a result of connection failures or network errors."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:livebook-dev:livebook:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "0.19.9",
                      "versionStartIncluding": "0.19.7",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Nguy\u1ec5n C\u00f4ng T\u00fa"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan K\u0142osko"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jos\u00e9 Valim"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Hugo Bara\u00fana"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eNot Failing Securely (\u0027Failing Open\u0027) vulnerability in livebook-dev livebook allows an unauthenticated network client to obtain full access to a Livebook server that enforces identity through Livebook Teams.\u003c/p\u003e\n\u003cp\u003eA Livebook Agent or App Server connected to Livebook Teams caches the identifier of the deployment group it belongs to, and resolves that identifier against a locally cached list of deployment groups on every request in order to decide whether Teams identity enforcement is active. \u003ccode\u003eLivebook.Hubs.TeamClient.handle_call/3\u003c/code\u003e in \u003ccode\u003elib/livebook/hubs/team_client.ex\u003c/code\u003e does not distinguish a deployment group that could not be resolved from one that was resolved with identity enforcement switched off: the clause matches only the case where a group was found with enforcement enabled, and falls through to a catch-all that reports enforcement as switched off for everything else. The two neighbouring functions that decide user and application access resolve the same identifier and treat the same unresolved result as a denial.\u003c/p\u003e\n\u003cp\u003eWhen the identity status is reported as switched off, \u003ccode\u003eLivebook.ZTA.LivebookTeams.authenticate/3\u003c/code\u003e in \u003ccode\u003elib/livebook/zta/livebook_teams.ex\u003c/code\u003e returns empty identity metadata and allows the request to continue instead of halting it. \u003ccode\u003eLivebookWeb.UserPlug.build_current_user/3\u003c/code\u003e merges that empty metadata into a newly built user, whose access type defaults to full access, and \u003ccode\u003eLivebookWeb.AuthPlug.authorized?/1\u003c/code\u003e grants access to any user holding full access.\u003c/p\u003e\n\u003cp\u003eThe cached identifier becomes unresolvable when the deployment group it refers to is deleted while the agent is not connected to receive the change, most concretely when a deployment group is deleted during the window in which an agent is disconnected or reconnecting. The client removes the group from its cached list without clearing the identifier that refers to it. Any client able to reach the affected server over the network is then granted the same access as a fully privileged member of the organisation, including the ability to read notebooks and configured secrets, execute code on the server\u0027s runtime, and disrupt its operation.\u003c/p\u003e\n\u003cp\u003eThis issue affects livebook: from 0.19.7 before 0.19.9.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Not Failing Securely (\u0027Failing Open\u0027) vulnerability in livebook-dev livebook allows an unauthenticated network client to obtain full access to a Livebook server that enforces identity through Livebook Teams.\n\nA Livebook Agent or App Server connected to Livebook Teams caches the identifier of the deployment group it belongs to, and resolves that identifier against a locally cached list of deployment groups on every request in order to decide whether Teams identity enforcement is active. `Livebook.Hubs.TeamClient.handle_call/3` in `lib/livebook/hubs/team_client.ex` does not distinguish a deployment group that could not be resolved from one that was resolved with identity enforcement switched off: the clause matches only the case where a group was found with enforcement enabled, and falls through to a catch-all that reports enforcement as switched off for everything else. The two neighbouring functions that decide user and application access resolve the same identifier and treat the same unresolved result as a denial.\n\nWhen the identity status is reported as switched off, `Livebook.ZTA.LivebookTeams.authenticate/3` in `lib/livebook/zta/livebook_teams.ex` returns empty identity metadata and allows the request to continue instead of halting it. `LivebookWeb.UserPlug.build_current_user/3` merges that empty metadata into a newly built user, whose access type defaults to full access, and `LivebookWeb.AuthPlug.authorized?/1` grants access to any user holding full access.\n\nThe cached identifier becomes unresolvable when the deployment group it refers to is deleted while the agent is not connected to receive the change, most concretely when a deployment group is deleted during the window in which an agent is disconnected or reconnecting. The client removes the group from its cached list without clearing the identifier that refers to it. Any client able to reach the affected server over the network is then granted the same access as a fully privileged member of the organisation, including the ability to read notebooks and configured secrets, execute code on the server\u0027s runtime, and disrupt its operation.\n\nThis issue affects livebook: from 0.19.7 before 0.19.9."
                }
              ],
              "value": "Not Failing Securely (\u0027Failing Open\u0027) vulnerability in livebook-dev livebook allows an unauthenticated network client to obtain full access to a Livebook server that enforces identity through Livebook Teams.\n\nA Livebook Agent or App Server connected to Livebook Teams caches the identifier of the deployment group it belongs to, and resolves that identifier against a locally cached list of deployment groups on every request in order to decide whether Teams identity enforcement is active. Livebook.Hubs.TeamClient.handle_call/3 in lib/livebook/hubs/team_client.ex does not distinguish a deployment group that could not be resolved from one that was resolved with identity enforcement switched off: the clause matches only the case where a group was found with enforcement enabled, and falls through to a catch-all that reports enforcement as switched off for everything else. The two neighbouring functions that decide user and application access resolve the same identifier and treat the same unresolved result as a denial.\n\nWhen the identity status is reported as switched off, Livebook.ZTA.LivebookTeams.authenticate/3 in lib/livebook/zta/livebook_teams.ex returns empty identity metadata and allows the request to continue instead of halting it. LivebookWeb.UserPlug.build_current_user/3 merges that empty metadata into a newly built user, whose access type defaults to full access, and LivebookWeb.AuthPlug.authorized?/1 grants access to any user holding full access.\n\nThe cached identifier becomes unresolvable when the deployment group it refers to is deleted while the agent is not connected to receive the change, most concretely when a deployment group is deleted during the window in which an agent is disconnected or reconnecting. The client removes the group from its cached list without clearing the identifier that refers to it. Any client able to reach the affected server over the network is then granted the same access as a fully privileged member of the organisation, including the ability to read notebooks and configured secrets, execute code on the server\u0027s runtime, and disrupt its operation.\n\nThis issue affects livebook: from 0.19.7 before 0.19.9."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-115",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-115 Authentication Bypass"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 7.7,
                "baseSeverity": "HIGH",
                "privilegesRequired": "LOW",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-636",
                  "description": "CWE-636 Not Failing Securely (\u0027Failing Open\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-05T19:43:38.188Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/livebook-dev/livebook/security/advisories/GHSA-74j5-6grg-g6wj"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-68746.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-68746"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/d374e90647edbb00286bfee9182c0161d29a8e07"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/d6d0dfa746b172540442852f74de4a9deacc433b"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/livebook-dev/livebook/commit/2d3a2c710c880abd24a2bc888d3cf5239d98cf72"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Livebook Teams identity check fails open when the deployment group is unresolvable, allowing unauthenticated access"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-68746",
        "datePublished": "2026-08-05T19:43:38.188Z",
        "dateReserved": "2026-07-31T13:23:00.354Z",
        "dateUpdated": "2026-08-06T14:48:46.790Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66883 (GCVE-0-2026-66883)

    Vulnerability from cvelistv5 – Published: 2026-08-04 11:46 – Updated: 2026-08-04 12:27
    VLAI
    Title
    Oidcc.Plug.Authorize user agent session binding inert due to case-sensitive header lookup
    Summary
    Improper Handling of Case Sensitivity vulnerability in Erlang Ecosystem Foundation oidcc_plug (Oidcc.Plug.Authorize module) renders the user agent session binding inert, removing a defense in depth control against replay of a stolen session. This vulnerability is associated with program files lib/oidcc/plug/authorize.ex and lib/oidcc/plug/authorization_callback.ex, and program routines Oidcc.Plug.Authorize.call/2 and Oidcc.Plug.AuthorizationCallback.call/2. Oidcc.Plug.Authorize.call/2 reads the initiating client's user agent with get_req_header(conn, "User-Agent"). Plug lowercases incoming header names, but get_req_header/2 matches the supplied key exactly and performs no normalization of its own, so the mixed-case lookup always returns an empty list and nil is written into the session. On the callback side, Oidcc.Plug.AuthorizationCallback treats a stored nil user agent as nothing to compare and returns :ok without inspecting the request. The two behaviours combine so that the check passes unconditionally on every request, including for deployments that explicitly opted in with check_useragent: true, and an authorization callback can be completed from a different user agent than the one that initiated the flow without detection. The check fails open silently, with no error and no log entry, so a deployment cannot tell the binding is absent. The impact is limited to defense in depth. The inert check does not by itself allow an attacker to complete an authorization flow; it removes one layer that would otherwise hinder use of a stolen or leaked session, such as an exfiltrated session cookie replayed from a different client. The CSRF/state, nonce, and PKCE checks are unaffected and continue to function. Deployments that never enabled check_useragent are not affected in practice, since they never expected the binding. The corresponding lookup in Oidcc.Plug.AuthorizationCallback correctly uses the lowercase key and is not affected. This issue affects oidcc_plug: from 0.1.0-alpha.3 before 0.5.0.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-04 12:27 UTC
    CWE
    • CWE-178 - Improper Handling of Case Sensitivity
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    Erlang Ecosystem Foundation oidcc_plug Affected: 0.1.0-alpha.3 , < 0.5.0 (semver)
        cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*
    Create a notification for this product.
    Erlang Ecosystem Foundation oidcc_plug Affected: 0a75fb139d8e2686d1b75e0d48962323d2181673 , < f15e52c5750aaba701104b10ed96cfac063bd557 (git)
        cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66883",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-04T12:27:16.535019Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-04T12:27:58.024Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-w5r8-m75h-98fc"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oidcc.Plug.Authorize",
                "Elixir.Oidcc.Plug.AuthorizationCallback"
              ],
              "packageName": "oidcc_plug",
              "packageURL": "pkg:hex/oidcc_plug",
              "product": "oidcc_plug",
              "programFiles": [
                "lib/oidcc/plug/authorize.ex",
                "lib/oidcc/plug/authorization_callback.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oidcc.Plug.Authorize\u0027:call/2"
                },
                {
                  "name": "\u0027Elixir.Oidcc.Plug.AuthorizationCallback\u0027:call/2"
                }
              ],
              "repo": "https://github.com/erlef/oidcc_plug",
              "vendor": "Erlang Ecosystem Foundation",
              "versions": [
                {
                  "lessThan": "0.5.0",
                  "status": "affected",
                  "version": "0.1.0-alpha.3",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oidcc.Plug.Authorize",
                "Elixir.Oidcc.Plug.AuthorizationCallback"
              ],
              "packageName": "erlef/oidcc_plug",
              "packageURL": "pkg:github/erlef/oidcc_plug",
              "product": "oidcc_plug",
              "programFiles": [
                "lib/oidcc/plug/authorize.ex",
                "lib/oidcc/plug/authorization_callback.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oidcc.Plug.Authorize\u0027:call/2"
                },
                {
                  "name": "\u0027Elixir.Oidcc.Plug.AuthorizationCallback\u0027:call/2"
                }
              ],
              "repo": "https://github.com/erlef/oidcc_plug",
              "vendor": "Erlang Ecosystem Foundation",
              "versions": [
                {
                  "lessThan": "f15e52c5750aaba701104b10ed96cfac063bd557",
                  "status": "affected",
                  "version": "0a75fb139d8e2686d1b75e0d48962323d2181673",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*",
                      "versionEndExcluding": "0.5.0",
                      "versionStartIncluding": "0.1.0-alpha.3",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Mathias Polligkeit"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Mathias Polligkeit"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Handling of Case Sensitivity vulnerability in Erlang Ecosystem Foundation oidcc_plug (\u003ccode\u003eOidcc.Plug.Authorize\u003c/code\u003e module) renders the user agent session binding inert, removing a defense in depth control against replay of a stolen session.\u003c/p\u003e\n\u003cp\u003eThis vulnerability is associated with program files \u003ccode\u003elib/oidcc/plug/authorize.ex\u003c/code\u003e and \u003ccode\u003elib/oidcc/plug/authorization_callback.ex\u003c/code\u003e, and program routines \u003ccode\u003eOidcc.Plug.Authorize.call/2\u003c/code\u003e and \u003ccode\u003eOidcc.Plug.AuthorizationCallback.call/2\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eOidcc.Plug.Authorize.call/2\u003c/code\u003e reads the initiating client\u0027s user agent with \u003ccode\u003eget_req_header(conn, \"User-Agent\")\u003c/code\u003e. Plug lowercases incoming header names, but \u003ccode\u003eget_req_header/2\u003c/code\u003e matches the supplied key exactly and performs no normalization of its own, so the mixed-case lookup always returns an empty list and \u003ccode\u003enil\u003c/code\u003e is written into the session. On the callback side, \u003ccode\u003eOidcc.Plug.AuthorizationCallback\u003c/code\u003e treats a stored \u003ccode\u003enil\u003c/code\u003e user agent as nothing to compare and returns \u003ccode\u003e:ok\u003c/code\u003e without inspecting the request. The two behaviours combine so that the check passes unconditionally on every request, including for deployments that explicitly opted in with \u003ccode\u003echeck_useragent: true\u003c/code\u003e, and an authorization callback can be completed from a different user agent than the one that initiated the flow without detection. The check fails open silently, with no error and no log entry, so a deployment cannot tell the binding is absent.\u003c/p\u003e\n\u003cp\u003eThe impact is limited to defense in depth. The inert check does not by itself allow an attacker to complete an authorization flow; it removes one layer that would otherwise hinder use of a stolen or leaked session, such as an exfiltrated session cookie replayed from a different client. The CSRF/state, nonce, and PKCE checks are unaffected and continue to function. Deployments that never enabled \u003ccode\u003echeck_useragent\u003c/code\u003e are not affected in practice, since they never expected the binding. The corresponding lookup in \u003ccode\u003eOidcc.Plug.AuthorizationCallback\u003c/code\u003e correctly uses the lowercase key and is not affected.\u003c/p\u003e\n\u003cp\u003eThis issue affects oidcc_plug: from 0.1.0-alpha.3 before 0.5.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Handling of Case Sensitivity vulnerability in Erlang Ecosystem Foundation oidcc_plug (`Oidcc.Plug.Authorize` module) renders the user agent session binding inert, removing a defense in depth control against replay of a stolen session.\n\nThis vulnerability is associated with program files `lib/oidcc/plug/authorize.ex` and `lib/oidcc/plug/authorization_callback.ex`, and program routines `Oidcc.Plug.Authorize.call/2` and `Oidcc.Plug.AuthorizationCallback.call/2`.\n\n`Oidcc.Plug.Authorize.call/2` reads the initiating client\u0027s user agent with `get_req_header(conn, \"User-Agent\")`. Plug lowercases incoming header names, but `get_req_header/2` matches the supplied key exactly and performs no normalization of its own, so the mixed-case lookup always returns an empty list and `nil` is written into the session. On the callback side, `Oidcc.Plug.AuthorizationCallback` treats a stored `nil` user agent as nothing to compare and returns `:ok` without inspecting the request. The two behaviours combine so that the check passes unconditionally on every request, including for deployments that explicitly opted in with `check_useragent: true`, and an authorization callback can be completed from a different user agent than the one that initiated the flow without detection. The check fails open silently, with no error and no log entry, so a deployment cannot tell the binding is absent.\n\nThe impact is limited to defense in depth. The inert check does not by itself allow an attacker to complete an authorization flow; it removes one layer that would otherwise hinder use of a stolen or leaked session, such as an exfiltrated session cookie replayed from a different client. The CSRF/state, nonce, and PKCE checks are unaffected and continue to function. Deployments that never enabled `check_useragent` are not affected in practice, since they never expected the binding. The corresponding lookup in `Oidcc.Plug.AuthorizationCallback` correctly uses the lowercase key and is not affected.\n\nThis issue affects oidcc_plug: from 0.1.0-alpha.3 before 0.5.0."
                }
              ],
              "value": "Improper Handling of Case Sensitivity vulnerability in Erlang Ecosystem Foundation oidcc_plug (Oidcc.Plug.Authorize module) renders the user agent session binding inert, removing a defense in depth control against replay of a stolen session.\n\nThis vulnerability is associated with program files lib/oidcc/plug/authorize.ex and lib/oidcc/plug/authorization_callback.ex, and program routines Oidcc.Plug.Authorize.call/2 and Oidcc.Plug.AuthorizationCallback.call/2.\n\nOidcc.Plug.Authorize.call/2 reads the initiating client\u0027s user agent with get_req_header(conn, \"User-Agent\"). Plug lowercases incoming header names, but get_req_header/2 matches the supplied key exactly and performs no normalization of its own, so the mixed-case lookup always returns an empty list and nil is written into the session. On the callback side, Oidcc.Plug.AuthorizationCallback treats a stored nil user agent as nothing to compare and returns :ok without inspecting the request. The two behaviours combine so that the check passes unconditionally on every request, including for deployments that explicitly opted in with check_useragent: true, and an authorization callback can be completed from a different user agent than the one that initiated the flow without detection. The check fails open silently, with no error and no log entry, so a deployment cannot tell the binding is absent.\n\nThe impact is limited to defense in depth. The inert check does not by itself allow an attacker to complete an authorization flow; it removes one layer that would otherwise hinder use of a stolen or leaked session, such as an exfiltrated session cookie replayed from a different client. The CSRF/state, nonce, and PKCE checks are unaffected and continue to function. Deployments that never enabled check_useragent are not affected in practice, since they never expected the binding. The corresponding lookup in Oidcc.Plug.AuthorizationCallback correctly uses the lowercase key and is not affected.\n\nThis issue affects oidcc_plug: from 0.1.0-alpha.3 before 0.5.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-60",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "HIGH",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 6.3,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-178",
                  "description": "CWE-178 Improper Handling of Case Sensitivity",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-04T11:46:05.191Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-w5r8-m75h-98fc"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66883.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66883"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/erlef/oidcc_plug/commit/f15e52c5750aaba701104b10ed96cfac063bd557"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Oidcc.Plug.Authorize user agent session binding inert due to case-sensitive header lookup"
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66883",
        "datePublished": "2026-08-04T11:46:05.191Z",
        "dateReserved": "2026-07-28T04:15:10.240Z",
        "dateUpdated": "2026-08-04T12:27:58.024Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66884 (GCVE-0-2026-66884)

    Vulnerability from cvelistv5 – Published: 2026-08-04 11:45 – Updated: 2026-08-04 12:40
    VLAI
    Title
    Oidcc.Plug.AuthorizationCallback accepts callbacks with no authorize session or no state parameter, defeating CSRF protection
    Summary
    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.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-04 12:37 UTC
    CWE
    • CWE-352 - Cross-Site Request Forgery (CSRF)
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    Erlang Ecosystem Foundation oidcc_plug Affected: 0.2.0-beta.1 , < 0.5.0 (semver)
        cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*
    Create a notification for this product.
    Erlang Ecosystem Foundation oidcc_plug Affected: e577ae73b9080693442916043a22d8f05491dd93 , < 97d75afc57826dca31989b47d6e2a3c136039917 (git)
        cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66884",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-04T12:37:09.321822Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-04T12:40:41.232Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-fg66-w5gp-22cr"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oidcc.Plug.AuthorizationCallback"
              ],
              "packageName": "oidcc_plug",
              "packageURL": "pkg:hex/oidcc_plug",
              "product": "oidcc_plug",
              "programFiles": [
                "lib/oidcc/plug/authorization_callback.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oidcc.Plug.AuthorizationCallback\u0027:call/2"
                }
              ],
              "repo": "https://github.com/erlef/oidcc_plug",
              "vendor": "Erlang Ecosystem Foundation",
              "versions": [
                {
                  "lessThan": "0.5.0",
                  "status": "affected",
                  "version": "0.2.0-beta.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oidcc.Plug.AuthorizationCallback"
              ],
              "packageName": "erlef/oidcc_plug",
              "packageURL": "pkg:github/erlef/oidcc_plug",
              "product": "oidcc_plug",
              "programFiles": [
                "lib/oidcc/plug/authorization_callback.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oidcc.Plug.AuthorizationCallback\u0027:call/2"
                }
              ],
              "repo": "https://github.com/erlef/oidcc_plug",
              "vendor": "Erlang Ecosystem Foundation",
              "versions": [
                {
                  "lessThan": "97d75afc57826dca31989b47d6e2a3c136039917",
                  "status": "affected",
                  "version": "e577ae73b9080693442916043a22d8f05491dd93",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:erlef:oidcc_plug:*:*:*:*:*:erlang:*:*",
                      "versionEndExcluding": "0.5.0",
                      "versionStartIncluding": "0.2.0-beta.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Mathias Polligkeit"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Mathias Polligkeit"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eCross-Site Request Forgery vulnerability in Erlang Ecosystem Foundation oidcc_plug (\u003ccode\u003eOidcc.Plug.AuthorizationCallback\u003c/code\u003e module) allows an attacker to make a victim\u0027s browser complete an authorization flow the victim never initiated.\u003c/p\u003e\n\u003cp\u003eThis vulnerability is associated with program file \u003ccode\u003elib/oidcc/plug/authorization_callback.ex\u003c/code\u003e and program routine \u003ccode\u003eOidcc.Plug.AuthorizationCallback.call/2\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eA callback request that carries no \u003ccode\u003eOidcc.Plug.Authorize\u003c/code\u003e session is processed with every security check disabled rather than being rejected. \u003ccode\u003ecall/2\u003c/code\u003e substitutes permissive defaults for the absent session, and each downstream check treats its value as nothing to compare and returns \u003ccode\u003e:ok\u003c/code\u003e, so the nonce, state, PKCE, peer IP and user agent checks are all skipped. A separate clause of \u003ccode\u003echeck_state/2\u003c/code\u003e also accepts a state-less request when a verifier is present.\u003c/p\u003e\n\u003cp\u003eAn attacker obtains an authorization code for their own provider account, then induces the victim to visit the callback endpoint with that code and no \u003ccode\u003estate\u003c/code\u003e parameter. The application signs the victim in as the attacker, so the victim\u0027s subsequent actions occur in the attacker\u0027s 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\u0027s account becoming linked to the victim\u0027s.\u003c/p\u003e\n\u003cp\u003eThe 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. \u003ccode\u003eOidcc.Plug.Authorize\u003c/code\u003e always sends a \u003ccode\u003estate\u003c/code\u003e parameter, which an authorization server must echo, so no legitimate callback lacks one.\u003c/p\u003e\n\u003cp\u003eThis issue affects oidcc_plug: from 0.2.0-beta.1 before 0.5.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Cross-Site Request Forgery vulnerability in Erlang Ecosystem Foundation oidcc_plug (`Oidcc.Plug.AuthorizationCallback` module) allows an attacker to make a victim\u0027s 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\u0027s subsequent actions occur in the attacker\u0027s 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\u0027s account becoming linked to the victim\u0027s.\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."
                }
              ],
              "value": "Cross-Site Request Forgery vulnerability in Erlang Ecosystem Foundation oidcc_plug (Oidcc.Plug.AuthorizationCallback module) allows an attacker to make a victim\u0027s 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\u0027s subsequent actions occur in the attacker\u0027s 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\u0027s account becoming linked to the victim\u0027s.\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."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-62",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-62 Cross Site Request Forgery"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "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",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-352",
                  "description": "CWE-352 Cross-Site Request Forgery (CSRF)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-04T11:45:49.464Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/erlef/oidcc_plug/security/advisories/GHSA-fg66-w5gp-22cr"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66884.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66884"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/erlef/oidcc_plug/commit/97d75afc57826dca31989b47d6e2a3c136039917"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Oidcc.Plug.AuthorizationCallback accepts callbacks with no authorize session or no state parameter, defeating CSRF protection",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eInsert a plug before \u003ccode\u003eOidcc.Plug.AuthorizationCallback\u003c/code\u003e that rejects the request when either the \u003ccode\u003eOidcc.Plug.Authorize\u003c/code\u003e session or the \u003ccode\u003estate\u003c/code\u003e query parameter is missing. This restores the binding the callback fails to enforce and does not require modifying the library.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Insert a plug before `Oidcc.Plug.AuthorizationCallback` that rejects the request when either the `Oidcc.Plug.Authorize` session or the `state` query parameter is missing. This restores the binding the callback fails to enforce and does not require modifying the library."
                }
              ],
              "value": "Insert a plug before Oidcc.Plug.AuthorizationCallback that rejects the request when either the Oidcc.Plug.Authorize session or the state query parameter is missing. This restores the binding the callback fails to enforce and does not require modifying the library."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66884",
        "datePublished": "2026-08-04T11:45:49.464Z",
        "dateReserved": "2026-07-28T04:15:10.240Z",
        "dateUpdated": "2026-08-04T12:40:41.232Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66296 (GCVE-0-2026-66296)

    Vulnerability from cvelistv5 – Published: 2026-08-03 19:04 – Updated: 2026-08-03 19:50
    VLAI
    Title
    Reflected XSS in oaskit's default HTML error handler
    Summary
    Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in lud oaskit allows reflected cross-site scripting via the default HTML error handler. Oaskit.ErrorHandler.Default.format_reason/4 and Oaskit.ErrorHandler.Default.reason_to_html/1 in lib/oaskit/error_handler/default.ex render request-validation failures as an HTML page whenever the request's Accept header contains html, interpolating request-controlled strings into that page without HTML escaping. The unescaped values are object keys taken from a request body or from an object or deepObject query parameter, which appear in the JSON Schema error's instance path when a schema rejects them (for example under additionalProperties: false), and the raw Content-Type header, reflected in unsupported-media-type errors when it fails to parse. Because browsers send Accept: text/html on ordinary top-level navigation, a crafted GET link is sufficient to trigger the error page; no form submission, custom Content-Type, or attacker-controlled script on the victim's side is required. A payload such as filter[</code></h2><script>alert(document.domain)</script>]=x terminates the enclosing markup and the injected script executes in the origin of the application using oaskit, giving it access to that origin's cookies, session, and same-origin responses. Both HTML error rendering and the vulnerable handler are enabled by default: Oaskit.Plugs.ValidateRequest defaults :html_errors to true and :error_handler to Oaskit.ErrorHandler.Default, so applications following the documented usage are affected without any opt-in. This issue affects oaskit: from 0.1.0 before 0.14.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-03 19:50 UTC
    CWE
    • CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    lud oaskit Affected: 0.1.0 , < 0.14.1 (semver)
        cpe:2.3:a:lud:oaskit:*:*:*:*:*:elixir:*:*
    Create a notification for this product.
    lud oaskit Affected: 552de8ca0ff60617bea58bcafa451892d61a161c , < b70c6b2eaf0b11bdd0bbb21b8a87dbb3d46918a1 (git)
        cpe:2.3:a:lud:oaskit:*:*:*:*:*:elixir:*:*
    Create a notification for this product.
    Date Public
    2026-07-05 00:00
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-66296",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-03T19:50:03.665445Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-03T19:50:27.860Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/lud/oaskit/security/advisories/GHSA-h7xw-x8wr-xpcc"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:lud:oaskit:*:*:*:*:*:elixir:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oaskit.ErrorHandler.Default"
              ],
              "packageName": "oaskit",
              "packageURL": "pkg:hex/oaskit",
              "product": "oaskit",
              "programFiles": [
                "lib/oaskit/error_handler/default.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oaskit.ErrorHandler.Default\u0027:format_reason/4"
                },
                {
                  "name": "\u0027Elixir.Oaskit.ErrorHandler.Default\u0027:reason_to_html/1"
                }
              ],
              "repo": "https://github.com/lud/oaskit",
              "vendor": "lud",
              "versions": [
                {
                  "lessThan": "0.14.1",
                  "status": "affected",
                  "version": "0.1.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:lud:oaskit:*:*:*:*:*:elixir:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Oaskit.ErrorHandler.Default"
              ],
              "packageName": "lud/oaskit",
              "packageURL": "pkg:github/lud/oaskit",
              "product": "oaskit",
              "programFiles": [
                "lib/oaskit/error_handler/default.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Oaskit.ErrorHandler.Default\u0027:format_reason/4"
                },
                {
                  "name": "\u0027Elixir.Oaskit.ErrorHandler.Default\u0027:reason_to_html/1"
                }
              ],
              "repo": "https://github.com/lud/oaskit",
              "vendor": "lud",
              "versions": [
                {
                  "lessThan": "b70c6b2eaf0b11bdd0bbb21b8a87dbb3d46918a1",
                  "status": "affected",
                  "version": "552de8ca0ff60617bea58bcafa451892d61a161c",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:lud:oaskit:*:*:*:*:*:elixir:*:*",
                      "versionEndExcluding": "0.14.1",
                      "versionStartIncluding": "0.1.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Ludovic Dem"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Ludovic Dem"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "datePublic": "2026-07-05T00:00:00.000Z",
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of Input During Web Page Generation (XSS) vulnerability in lud oaskit allows reflected cross-site scripting via the default HTML error handler.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eOaskit.ErrorHandler.Default.format_reason/4\u003c/code\u003e and \u003ccode\u003eOaskit.ErrorHandler.Default.reason_to_html/1\u003c/code\u003e in \u003ccode\u003elib/oaskit/error_handler/default.ex\u003c/code\u003e render request-validation failures as an HTML page whenever the request\u0027s \u003ccode\u003eAccept\u003c/code\u003e header contains \u003ccode\u003ehtml\u003c/code\u003e, interpolating request-controlled strings into that page without HTML escaping. The unescaped values are object keys taken from a request body or from an object or \u003ccode\u003edeepObject\u003c/code\u003e query parameter, which appear in the JSON Schema error\u0027s instance path when a schema rejects them (for example under \u003ccode\u003eadditionalProperties: false\u003c/code\u003e), and the raw \u003ccode\u003eContent-Type\u003c/code\u003e header, reflected in unsupported-media-type errors when it fails to parse.\u003c/p\u003e\n\u003cp\u003eBecause browsers send \u003ccode\u003eAccept: text/html\u003c/code\u003e on ordinary top-level navigation, a crafted GET link is sufficient to trigger the error page; no form submission, custom \u003ccode\u003eContent-Type\u003c/code\u003e, or attacker-controlled script on the victim\u0027s side is required. A payload such as \u003ccode\u003efilter[\u0026lt;/code\u0026gt;\u0026lt;/h2\u0026gt;\u0026lt;script\u0026gt;alert(document.domain)\u0026lt;/script\u0026gt;]=x\u003c/code\u003e terminates the enclosing markup and the injected script executes in the origin of the application using oaskit, giving it access to that origin\u0027s cookies, session, and same-origin responses.\u003c/p\u003e\n\u003cp\u003eBoth HTML error rendering and the vulnerable handler are enabled by default: \u003ccode\u003eOaskit.Plugs.ValidateRequest\u003c/code\u003e defaults \u003ccode\u003e:html_errors\u003c/code\u003e to \u003ccode\u003etrue\u003c/code\u003e and \u003ccode\u003e:error_handler\u003c/code\u003e to \u003ccode\u003eOaskit.ErrorHandler.Default\u003c/code\u003e, so applications following the documented usage are affected without any opt-in.\u003c/p\u003e\n\u003cp\u003eThis issue affects oaskit: from 0.1.0 before 0.14.1.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in lud oaskit allows reflected cross-site scripting via the default HTML error handler.\n\n`Oaskit.ErrorHandler.Default.format_reason/4` and `Oaskit.ErrorHandler.Default.reason_to_html/1` in `lib/oaskit/error_handler/default.ex` render request-validation failures as an HTML page whenever the request\u0027s `Accept` header contains `html`, interpolating request-controlled strings into that page without HTML escaping. The unescaped values are object keys taken from a request body or from an object or `deepObject` query parameter, which appear in the JSON Schema error\u0027s instance path when a schema rejects them (for example under `additionalProperties: false`), and the raw `Content-Type` header, reflected in unsupported-media-type errors when it fails to parse.\n\nBecause browsers send `Accept: text/html` on ordinary top-level navigation, a crafted GET link is sufficient to trigger the error page; no form submission, custom `Content-Type`, or attacker-controlled script on the victim\u0027s side is required. A payload such as `filter[\u003c/code\u003e\u003c/h2\u003e\u003cscript\u003ealert(document.domain)\u003c/script\u003e]=x` terminates the enclosing markup and the injected script executes in the origin of the application using oaskit, giving it access to that origin\u0027s cookies, session, and same-origin responses.\n\nBoth HTML error rendering and the vulnerable handler are enabled by default: `Oaskit.Plugs.ValidateRequest` defaults `:html_errors` to `true` and `:error_handler` to `Oaskit.ErrorHandler.Default`, so applications following the documented usage are affected without any opt-in.\n\nThis issue affects oaskit: from 0.1.0 before 0.14.1."
                }
              ],
              "value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in lud oaskit allows reflected cross-site scripting via the default HTML error handler.\n\nOaskit.ErrorHandler.Default.format_reason/4 and Oaskit.ErrorHandler.Default.reason_to_html/1 in lib/oaskit/error_handler/default.ex render request-validation failures as an HTML page whenever the request\u0027s Accept header contains html, interpolating request-controlled strings into that page without HTML escaping. The unescaped values are object keys taken from a request body or from an object or deepObject query parameter, which appear in the JSON Schema error\u0027s instance path when a schema rejects them (for example under additionalProperties: false), and the raw Content-Type header, reflected in unsupported-media-type errors when it fails to parse.\n\nBecause browsers send Accept: text/html on ordinary top-level navigation, a crafted GET link is sufficient to trigger the error page; no form submission, custom Content-Type, or attacker-controlled script on the victim\u0027s side is required. A payload such as filter[\u003c/code\u003e\u003c/h2\u003e\u003cscript\u003ealert(document.domain)\u003c/script\u003e]=x terminates the enclosing markup and the injected script executes in the origin of the application using oaskit, giving it access to that origin\u0027s cookies, session, and same-origin responses.\n\nBoth HTML error rendering and the vulnerable handler are enabled by default: Oaskit.Plugs.ValidateRequest defaults :html_errors to true and :error_handler to Oaskit.ErrorHandler.Default, so applications following the documented usage are affected without any opt-in.\n\nThis issue affects oaskit: from 0.1.0 before 0.14.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-591",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-591 Reflected XSS"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 5.1,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "ACTIVE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-79",
                  "description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-03T19:04:30.556Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/lud/oaskit/security/advisories/GHSA-h7xw-x8wr-xpcc"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66296.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66296"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/lud/oaskit/commit/b70c6b2eaf0b11bdd0bbb21b8a87dbb3d46918a1"
            }
          ],
          "source": {
            "discovery": "INTERNAL"
          },
          "title": "Reflected XSS in oaskit\u0027s default HTML error handler",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDisable HTML error rendering so that validation failures are returned as JSON only:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-elixir\"\u003eplug Oaskit.Plugs.ValidateRequest, html_errors: false\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis prevents the vulnerable HTML page from being rendered at all, on any oaskit version. Alternatively, configure a custom \u003ccode\u003e:error_handler\u003c/code\u003e that does not emit HTML built from request-derived values.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Disable HTML error rendering so that validation failures are returned as JSON only:\n\n```elixir\nplug Oaskit.Plugs.ValidateRequest, html_errors: false\n```\n\nThis prevents the vulnerable HTML page from being rendered at all, on any oaskit version. Alternatively, configure a custom `:error_handler` that does not emit HTML built from request-derived values."
                }
              ],
              "value": "Disable HTML error rendering so that validation failures are returned as JSON only:\n\nplug Oaskit.Plugs.ValidateRequest, html_errors: false\n\nThis prevents the vulnerable HTML page from being rendered at all, on any oaskit version. Alternatively, configure a custom :error_handler that does not emit HTML built from request-derived values."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66296",
        "datePublished": "2026-08-03T19:04:30.556Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-08-03T19:50:27.860Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-55734 (GCVE-0-2026-55734)

    Vulnerability from cvelistv5 – Published: 2026-08-01 18:46 – Updated: 2026-08-03 16:49
    VLAI
    Title
    guardian atom exhaustion in Guardian.Permissions.encode_permissions!/1
    Summary
    Allocation of Resources Without Limits or Throttling vulnerability in ueberauth guardian (Guardian.Permissions module) allows a denial of service via BEAM atom-table exhaustion. This vulnerability is associated with program file lib/guardian/permissions.ex and program routines 'Elixir.Guardian.Permissions':encode_permissions!/1, 'Elixir.Guardian.Permissions':encode_permissions_into_claims!/2, 'Elixir.Guardian.Permissions':do_encode_permissions!/2. The Guardian.Permissions mixin installs a public encode_permissions!/1 function on every module that does use Guardian.Permissions. For each key of the supplied map, encode_permissions!/1 calls String.to_atom(to_string(k)) before any validation runs. The integer-value clause of do_encode_permissions!/2 then short-circuits straight to encoding without validating the key against the configured permission set, so a key with an integer value is interned as a fresh atom with no exception raised. Atoms are never garbage collected and the BEAM atom table is a fixed-size resource (default roughly 1,048,576 entries), so each unique attacker-chosen key permanently consumes one slot. An attacker who can influence a permission map that reaches encode_permissions!/1 (for example a permissions map read from a request body and passed into token issuance via encode_permissions_into_claims!/2) can mint an unbounded number of atoms and exhaust the atom table, crashing the entire BEAM node and every service running on it. The sibling decode_permissions/1 is not affected because it skips keys absent from the configured permission set. This issue affects guardian: from 2.0.0 before 2.4.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-03 16:49 UTC
    CWE
    • CWE-770 - Allocation of Resources Without Limits or Throttling
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ueberauth guardian Affected: 2.0.0 , < 2.4.1 (semver)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ueberauth guardian Affected: b7a6128ca4d0ffb7f7df5219dd982304ff9d6802 , < 8d4efbfc352d30f5fcfc75a4d69a795b0e472724 (git)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-55734",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-03T16:49:36.457207Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-03T16:49:59.913Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-9qx2-v587-q3gg"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Permissions\u0027"
              ],
              "packageName": "guardian",
              "packageURL": "pkg:hex/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/permissions.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:encode_permissions!/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:encode_permissions_into_claims!/2"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:do_encode_permissions!/2"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2.4.1",
                  "status": "affected",
                  "version": "2.0.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Permissions\u0027"
              ],
              "packageName": "ueberauth/guardian",
              "packageURL": "pkg:github/ueberauth/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/permissions.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:encode_permissions!/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:encode_permissions_into_claims!/2"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions\u0027:do_encode_permissions!/2"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "8d4efbfc352d30f5fcfc75a4d69a795b0e472724",
                  "status": "affected",
                  "version": "b7a6128ca4d0ffb7f7df5219dd982304ff9d6802",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThis vulnerability is only exploitable in applications that use \u003ctt\u003eGuardian.Permissions\u003c/tt\u003e (via \u003ctt\u003euse Guardian.Permissions\u003c/tt\u003e) and route attacker-influenced data into \u003ctt\u003eencode_permissions!/1\u003c/tt\u003e or \u003ctt\u003eencode_permissions_into_claims!/2\u003c/tt\u003e, for example by reading a permissions map from a request body and passing it into token issuance.\u003c/p\u003e"
                }
              ],
              "value": "This vulnerability is only exploitable in applications that use Guardian.Permissions (via use Guardian.Permissions) and route attacker-influenced data into encode_permissions!/1 or encode_permissions_into_claims!/2, for example by reading a permissions map from a request body and passing it into token issuance."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.4.1",
                      "versionStartIncluding": "2.0.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Yordis Prieto"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling vulnerability in ueberauth guardian (\u003ctt\u003eGuardian.Permissions\u003c/tt\u003e module) allows a denial of service via BEAM atom-table exhaustion.\u003c/p\u003e\u003cp\u003eThis vulnerability is associated with program file \u003ctt\u003elib/guardian/permissions.ex\u003c/tt\u003e and program routines \u003ctt\u003e\u0027Elixir.Guardian.Permissions\u0027:encode_permissions!/1\u003c/tt\u003e, \u003ctt\u003e\u0027Elixir.Guardian.Permissions\u0027:encode_permissions_into_claims!/2\u003c/tt\u003e, \u003ctt\u003e\u0027Elixir.Guardian.Permissions\u0027:do_encode_permissions!/2\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThe \u003ctt\u003eGuardian.Permissions\u003c/tt\u003e mixin installs a public \u003ctt\u003eencode_permissions!/1\u003c/tt\u003e function on every module that does \u003ctt\u003euse Guardian.Permissions\u003c/tt\u003e. For each key of the supplied map, \u003ctt\u003eencode_permissions!/1\u003c/tt\u003e calls \u003ctt\u003eString.to_atom(to_string(k))\u003c/tt\u003e before any validation runs. The integer-value clause of \u003ctt\u003edo_encode_permissions!/2\u003c/tt\u003e then short-circuits straight to encoding without validating the key against the configured permission set, so a key with an integer value is interned as a fresh atom with no exception raised. Atoms are never garbage collected and the BEAM atom table is a fixed-size resource (default roughly 1,048,576 entries), so each unique attacker-chosen key permanently consumes one slot. An attacker who can influence a permission map that reaches \u003ctt\u003eencode_permissions!/1\u003c/tt\u003e (for example a permissions map read from a request body and passed into token issuance via \u003ctt\u003eencode_permissions_into_claims!/2\u003c/tt\u003e) can mint an unbounded number of atoms and exhaust the atom table, crashing the entire BEAM node and every service running on it. The sibling \u003ctt\u003edecode_permissions/1\u003c/tt\u003e is not affected because it skips keys absent from the configured permission set.\u003c/p\u003e\u003cp\u003eThis issue affects guardian: from 2.0.0 before 2.4.1.\u003c/p\u003e"
                }
              ],
              "value": "Allocation of Resources Without Limits or Throttling vulnerability in ueberauth guardian (Guardian.Permissions module) allows a denial of service via BEAM atom-table exhaustion.\n\nThis vulnerability is associated with program file lib/guardian/permissions.ex and program routines \u0027Elixir.Guardian.Permissions\u0027:encode_permissions!/1, \u0027Elixir.Guardian.Permissions\u0027:encode_permissions_into_claims!/2, \u0027Elixir.Guardian.Permissions\u0027:do_encode_permissions!/2.\n\nThe Guardian.Permissions mixin installs a public encode_permissions!/1 function on every module that does use Guardian.Permissions. For each key of the supplied map, encode_permissions!/1 calls String.to_atom(to_string(k)) before any validation runs. The integer-value clause of do_encode_permissions!/2 then short-circuits straight to encoding without validating the key against the configured permission set, so a key with an integer value is interned as a fresh atom with no exception raised. Atoms are never garbage collected and the BEAM atom table is a fixed-size resource (default roughly 1,048,576 entries), so each unique attacker-chosen key permanently consumes one slot. An attacker who can influence a permission map that reaches encode_permissions!/1 (for example a permissions map read from a request body and passed into token issuance via encode_permissions_into_claims!/2) can mint an unbounded number of atoms and exhaust the atom table, crashing the entire BEAM node and every service running on it. The sibling decode_permissions/1 is not affected because it skips keys absent from the configured permission set.\n\nThis issue affects guardian: from 2.0.0 before 2.4.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "HIGH",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-770",
                  "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-01T18:46:24.291Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-9qx2-v587-q3gg"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-55734.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-55734"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ueberauth/guardian/commit/8d4efbfc352d30f5fcfc75a4d69a795b0e472724"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "guardian atom exhaustion in Guardian.Permissions.encode_permissions!/1",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eBefore calling \u003ctt\u003eencode_permissions!/1\u003c/tt\u003e or \u003ctt\u003eencode_permissions_into_claims!/2\u003c/tt\u003e, filter the permission map so that only keys belonging to the configured permission set are passed in, discarding any unknown keys. Avoid passing attacker-influenced permission maps into these functions.\u003c/p\u003e"
                }
              ],
              "value": "Before calling encode_permissions!/1 or encode_permissions_into_claims!/2, filter the permission map so that only keys belonging to the configured permission set are passed in, discarding any unknown keys. Avoid passing attacker-influenced permission maps into these functions."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-55734",
        "datePublished": "2026-08-01T18:46:24.291Z",
        "dateReserved": "2026-06-17T10:44:34.365Z",
        "dateUpdated": "2026-08-03T16:49:59.913Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-55733 (GCVE-0-2026-55733)

    Vulnerability from cvelistv5 – Published: 2026-08-01 18:46 – Updated: 2026-08-03 16:50
    VLAI
    Title
    Atom-table exhaustion denial of service in Guardian permissions AtomEncoding via unbounded atom creation
    Summary
    Allocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-controlled binary input. Guardian.Permissions.AtomEncoding encodes permission scopes by passing arbitrary binaries to String.to_atom/1. When encode/3 in lib/guardian/permissions/atom_encoding.ex is called with a list, each binary entry is handled by the encode_value/3 binary clause, which calls String.to_atom(value) with no allow-list check. The perm_set argument (the application's small, finite set of legitimate permission names) is discarded, so any external string flows straight into atom creation. This encoder is selected with use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding and reached through the imported encode/3 entry point. String.to_atom/1 creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that funnels attacker-influenced permission scopes (from a request body, a JWT claim, or other external input) into encode/3 therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node with system_limit, taking down every application running on it. The default encoder is Guardian.Permissions.BitwiseEncoding, which is not affected. This issue affects guardian: from 2.0.0 before 2.4.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-03 16:50 UTC
    CWE
    • CWE-770 - Allocation of Resources Without Limits or Throttling
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ueberauth guardian Affected: 2.0.0 , < 2.4.1 (semver)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ueberauth guardian Affected: b7a6128ca4d0ffb7f7df5219dd982304ff9d6802 , < 9cd268557846aa4c3ad53566c08f2c190ee5513f (git)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-55733",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-03T16:50:27.758398Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-03T16:50:53.942Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-fjr5-7xrc-hmpj"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027"
              ],
              "packageName": "guardian",
              "packageURL": "pkg:hex/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/permissions/atom_encoding.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027:encode/3"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027:encode_value/3"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2.4.1",
                  "status": "affected",
                  "version": "2.0.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027"
              ],
              "packageName": "ueberauth/guardian",
              "packageURL": "pkg:github/ueberauth/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/permissions/atom_encoding.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027:encode/3"
                },
                {
                  "name": "\u0027Elixir.Guardian.Permissions.AtomEncoding\u0027:encode_value/3"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "9cd268557846aa4c3ad53566c08f2c190ee5513f",
                  "status": "affected",
                  "version": "b7a6128ca4d0ffb7f7df5219dd982304ff9d6802",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly applications that opt into the non-default \u003ctt\u003eGuardian.Permissions.AtomEncoding\u003c/tt\u003e encoder (via \u003ctt\u003euse Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding\u003c/tt\u003e) and pass attacker-influenced permission scopes into its \u003ctt\u003eencode/3\u003c/tt\u003e entry point are exploitable. The default \u003ctt\u003eGuardian.Permissions.BitwiseEncoding\u003c/tt\u003e encoder and the \u003ctt\u003eGuardian.Permissions.TextEncoding\u003c/tt\u003e encoder do not create atoms and are not affected.\u003c/p\u003e"
                }
              ],
              "value": "Only applications that opt into the non-default Guardian.Permissions.AtomEncoding encoder (via use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding) and pass attacker-influenced permission scopes into its encode/3 entry point are exploitable. The default Guardian.Permissions.BitwiseEncoding encoder and the Guardian.Permissions.TextEncoding encoder do not create atoms and are not affected."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.4.1",
                      "versionStartIncluding": "2.0.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Yordis Prieto"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-controlled binary input.\u003c/p\u003e\u003cp\u003e\u003ctt\u003eGuardian.Permissions.AtomEncoding\u003c/tt\u003e encodes permission scopes by passing arbitrary binaries to \u003ctt\u003eString.to_atom/1\u003c/tt\u003e. When \u003ctt\u003eencode/3\u003c/tt\u003e in \u003ctt\u003elib/guardian/permissions/atom_encoding.ex\u003c/tt\u003e is called with a list, each binary entry is handled by the \u003ctt\u003eencode_value/3\u003c/tt\u003e binary clause, which calls \u003ctt\u003eString.to_atom(value)\u003c/tt\u003e with no allow-list check. The \u003ctt\u003eperm_set\u003c/tt\u003e argument (the application\u0027s small, finite set of legitimate permission names) is discarded, so any external string flows straight into atom creation. This encoder is selected with \u003ctt\u003euse Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding\u003c/tt\u003e and reached through the imported \u003ctt\u003eencode/3\u003c/tt\u003e entry point.\u003c/p\u003e\u003cp\u003e\u003ctt\u003eString.to_atom/1\u003c/tt\u003e creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that funnels attacker-influenced permission scopes (from a request body, a JWT claim, or other external input) into \u003ctt\u003eencode/3\u003c/tt\u003e therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node with \u003ctt\u003esystem_limit\u003c/tt\u003e, taking down every application running on it.\u003c/p\u003e\u003cp\u003eThe default encoder is \u003ctt\u003eGuardian.Permissions.BitwiseEncoding\u003c/tt\u003e, which is not affected.\u003c/p\u003e\u003cp\u003eThis issue affects guardian: from 2.0.0 before 2.4.1.\u003c/p\u003e"
                }
              ],
              "value": "Allocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-controlled binary input.\n\nGuardian.Permissions.AtomEncoding encodes permission scopes by passing arbitrary binaries to String.to_atom/1. When encode/3 in lib/guardian/permissions/atom_encoding.ex is called with a list, each binary entry is handled by the encode_value/3 binary clause, which calls String.to_atom(value) with no allow-list check. The perm_set argument (the application\u0027s small, finite set of legitimate permission names) is discarded, so any external string flows straight into atom creation. This encoder is selected with use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding and reached through the imported encode/3 entry point.\n\nString.to_atom/1 creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that funnels attacker-influenced permission scopes (from a request body, a JWT claim, or other external input) into encode/3 therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node with system_limit, taking down every application running on it.\n\nThe default encoder is Guardian.Permissions.BitwiseEncoding, which is not affected.\n\nThis issue affects guardian: from 2.0.0 before 2.4.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "HIGH",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-770",
                  "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-01T18:46:12.113Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-fjr5-7xrc-hmpj"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-55733.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-55733"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ueberauth/guardian/commit/9cd268557846aa4c3ad53566c08f2c190ee5513f"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Atom-table exhaustion denial of service in Guardian permissions AtomEncoding via unbounded atom creation",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSwitch the permission encoder to the default \u003ctt\u003eGuardian.Permissions.BitwiseEncoding\u003c/tt\u003e or to \u003ctt\u003eGuardian.Permissions.TextEncoding\u003c/tt\u003e, neither of which creates atoms. Alternatively, validate every permission value against the configured \u003ctt\u003eperm_set\u003c/tt\u003e allowlist (rejecting unknown values) before passing it to \u003ctt\u003eencode/3\u003c/tt\u003e.\u003c/p\u003e"
                }
              ],
              "value": "Switch the permission encoder to the default Guardian.Permissions.BitwiseEncoding or to Guardian.Permissions.TextEncoding, neither of which creates atoms. Alternatively, validate every permission value against the configured perm_set allowlist (rejecting unknown values) before passing it to encode/3."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-55733",
        "datePublished": "2026-08-01T18:46:12.113Z",
        "dateReserved": "2026-06-17T10:44:34.365Z",
        "dateUpdated": "2026-08-03T16:50:53.942Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-54894 (GCVE-0-2026-54894)

    Vulnerability from cvelistv5 – Published: 2026-08-01 18:46 – Updated: 2026-08-03 17:49
    VLAI
    Title
    Atom-table exhaustion denial of service in Guardian via unbounded atom creation from binary keys
    Summary
    Allocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-influenced binary input. Guardian.Plug.Keys derives connection and session namespace keys by passing arbitrary binaries to String.to_atom/1. base_key/1 in lib/guardian/plug/keys.ex converts any binary into the atom :"guardian_<input>", and the derived helpers claims_key/1, resource_key/1, and token_key/1 create a second atom on top of that. key_from_other/1 likewise converts a regex-captured binary through String.to_atom/1. The public specs advertise String.t() as a valid argument, so passing a string is documented usage, and higher-level entry points such as Guardian.Plug.current_token(conn, key: key) thread the caller-supplied key straight into these functions. String.to_atom/1 creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that routes attacker-influenced data (a tenant identifier, header, or other request input) into a Guardian key therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node, taking down every application running on it. This issue affects guardian: from 0.1.0 before 2.4.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-03 17:49 UTC
    CWE
    • CWE-770 - Allocation of Resources Without Limits or Throttling
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ueberauth guardian Affected: 0.1.0 , < 2.4.1 (semver)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ueberauth guardian Affected: 7126fa433afc2563fcac0c9aa35193965f8fd5f8 , < 2952657e42e6341a67e6aaad09d8f0b40ae917cb (git)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-54894",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-03T17:49:32.217048Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-03T17:49:54.220Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-xqch-c77q-rgh5"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Plug.Keys\u0027"
              ],
              "packageName": "guardian",
              "packageURL": "pkg:hex/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/plug/keys.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:base_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:claims_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:resource_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:token_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:key_from_other/1"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2.4.1",
                  "status": "affected",
                  "version": "0.1.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian.Plug.Keys\u0027"
              ],
              "packageName": "ueberauth/guardian",
              "packageURL": "pkg:github/ueberauth/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian/plug/keys.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:base_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:claims_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:resource_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:token_key/1"
                },
                {
                  "name": "\u0027Elixir.Guardian.Plug.Keys\u0027:key_from_other/1"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2952657e42e6341a67e6aaad09d8f0b40ae917cb",
                  "status": "affected",
                  "version": "7126fa433afc2563fcac0c9aa35193965f8fd5f8",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly applications that derive a Guardian key (the conn/session namespace) from attacker-influenced data are exploitable. This is the case when a caller-supplied value such as a tenant identifier, request header, or other request input is passed as the \u003ctt\u003e:key\u003c/tt\u003e option to entry points like \u003ctt\u003eGuardian.Plug.current_token/2\u003c/tt\u003e. Applications that use a static namespace (the default \u003ctt\u003e:default\u003c/tt\u003e key or hardcoded atoms) are not affected.\u003c/p\u003e"
                }
              ],
              "value": "Only applications that derive a Guardian key (the conn/session namespace) from attacker-influenced data are exploitable. This is the case when a caller-supplied value such as a tenant identifier, request header, or other request input is passed as the :key option to entry points like Guardian.Plug.current_token/2. Applications that use a static namespace (the default :default key or hardcoded atoms) are not affected."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.4.1",
                      "versionStartIncluding": "0.1.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Yordis Prieto"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-influenced binary input.\u003c/p\u003e\u003cp\u003e\u003ctt\u003eGuardian.Plug.Keys\u003c/tt\u003e derives connection and session namespace keys by passing arbitrary binaries to \u003ctt\u003eString.to_atom/1\u003c/tt\u003e. \u003ctt\u003ebase_key/1\u003c/tt\u003e in \u003ctt\u003elib/guardian/plug/keys.ex\u003c/tt\u003e converts any binary into the atom \u003ctt\u003e:\"guardian_\u0026lt;input\u0026gt;\"\u003c/tt\u003e, and the derived helpers \u003ctt\u003eclaims_key/1\u003c/tt\u003e, \u003ctt\u003eresource_key/1\u003c/tt\u003e, and \u003ctt\u003etoken_key/1\u003c/tt\u003e create a second atom on top of that. \u003ctt\u003ekey_from_other/1\u003c/tt\u003e likewise converts a regex-captured binary through \u003ctt\u003eString.to_atom/1\u003c/tt\u003e. The public specs advertise \u003ctt\u003eString.t()\u003c/tt\u003e as a valid argument, so passing a string is documented usage, and higher-level entry points such as \u003ctt\u003eGuardian.Plug.current_token(conn, key: key)\u003c/tt\u003e thread the caller-supplied key straight into these functions.\u003c/p\u003e\u003cp\u003e\u003ctt\u003eString.to_atom/1\u003c/tt\u003e creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that routes attacker-influenced data (a tenant identifier, header, or other request input) into a Guardian key therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node, taking down every application running on it.\u003c/p\u003e\u003cp\u003eThis issue affects guardian: from 0.1.0 before 2.4.1.\u003c/p\u003e"
                }
              ],
              "value": "Allocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-influenced binary input.\n\nGuardian.Plug.Keys derives connection and session namespace keys by passing arbitrary binaries to String.to_atom/1. base_key/1 in lib/guardian/plug/keys.ex converts any binary into the atom :\"guardian_\u003cinput\u003e\", and the derived helpers claims_key/1, resource_key/1, and token_key/1 create a second atom on top of that. key_from_other/1 likewise converts a regex-captured binary through String.to_atom/1. The public specs advertise String.t() as a valid argument, so passing a string is documented usage, and higher-level entry points such as Guardian.Plug.current_token(conn, key: key) thread the caller-supplied key straight into these functions.\n\nString.to_atom/1 creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that routes attacker-influenced data (a tenant identifier, header, or other request input) into a Guardian key therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node, taking down every application running on it.\n\nThis issue affects guardian: from 0.1.0 before 2.4.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "HIGH",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-770",
                  "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-01T18:46:05.861Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-xqch-c77q-rgh5"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-54894.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-54894"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ueberauth/guardian/commit/2952657e42e6341a67e6aaad09d8f0b40ae917cb"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Atom-table exhaustion denial of service in Guardian via unbounded atom creation from binary keys",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDo not derive Guardian keys from untrusted input. Use a fixed, hardcoded set of namespace keys, or validate the value against a bounded allowlist of known keys, before passing it as the \u003ctt\u003e:key\u003c/tt\u003e option.\u003c/p\u003e"
                }
              ],
              "value": "Do not derive Guardian keys from untrusted input. Use a fixed, hardcoded set of namespace keys, or validate the value against a bounded allowlist of known keys, before passing it as the :key option."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-54894",
        "datePublished": "2026-08-01T18:46:05.861Z",
        "dateReserved": "2026-06-16T10:47:13.915Z",
        "dateUpdated": "2026-08-03T17:49:54.220Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-55735 (GCVE-0-2026-55735)

    Vulnerability from cvelistv5 – Published: 2026-08-01 18:46 – Updated: 2026-08-03 19:30
    VLAI
    Title
    Guardian.revoke/3 acts on unverified token claims, allowing forged-token session revocation
    Summary
    Improper Verification of Cryptographic Signature in ueberauth guardian allows an unauthenticated attacker to revoke a victim's session with a forged token. Guardian.revoke/3 in lib/guardian.ex decodes the supplied token with peek/1, which performs no signature verification (it only base64-decodes the JWT header and payload). The resulting unverified claims are forwarded directly to the configured token module's revoke callback and the implementation's on_revoke callback, a state-mutating sink. The sibling operations refresh/2 and exchange/4 both call decode_and_verify first, so the signature is checked before anything acts on the claims; revoke/3 is the only state-mutating path that acts on claims without verifying the signature. An attacker who knows or guesses a victim's identifying claim values (jti, sub) can forge a JWT carrying those claims, sign it with an arbitrary key, and submit it to any endpoint that funnels a caller-supplied token into Guardian.revoke/3 (the standard logout / session-revocation pattern). When the token module mutates state keyed by the claims (whitelist deletion or blacklist insertion, for example a GuardianDb-style store), the victim's legitimate session is evicted. This is an unauthenticated session-revocation denial of service; the attacker never needs the signing secret. This issue affects guardian: from 1.0.0 before 2.4.1.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-08-03 19:29 UTC
    CWE
    • CWE-347 - Improper Verification of Cryptographic Signature
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ueberauth guardian Affected: 1.0.0 , < 2.4.1 (semver)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ueberauth guardian Affected: d65227145f72b290106c06cecbe42728fbf05fe2 , < 2bd7a8c29770d423d855c0a4965caa6c3e486901 (git)
        cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-55735",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-08-03T19:29:43.841542Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-08-03T19:30:07.608Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-7975-hp3r-5qhv"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian\u0027"
              ],
              "packageName": "guardian",
              "packageURL": "pkg:hex/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian\u0027:revoke/3"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2.4.1",
                  "status": "affected",
                  "version": "1.0.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Guardian\u0027"
              ],
              "packageName": "ueberauth/guardian",
              "packageURL": "pkg:github/ueberauth/guardian",
              "product": "guardian",
              "programFiles": [
                "lib/guardian.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Guardian\u0027:revoke/3"
                }
              ],
              "repo": "https://github.com/ueberauth/guardian",
              "vendor": "ueberauth",
              "versions": [
                {
                  "lessThan": "2bd7a8c29770d423d855c0a4965caa6c3e486901",
                  "status": "affected",
                  "version": "d65227145f72b290106c06cecbe42728fbf05fe2",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe application must route a caller-supplied token into \u003ctt\u003eGuardian.revoke/3\u003c/tt\u003e (for example a logout or session-revocation endpoint) and use a token module whose \u003ctt\u003erevoke\u003c/tt\u003e / \u003ctt\u003eon_revoke\u003c/tt\u003e callback mutates state keyed by the token claims (a whitelist that deletes by \u003ctt\u003ejti\u003c/tt\u003e or a blacklist that inserts by \u003ctt\u003ejti\u003c/tt\u003e, such as a GuardianDb-style store). With the default no-op \u003ctt\u003eon_revoke\u003c/tt\u003e callback, no session state is changed and the issue is not exploitable.\u003c/p\u003e"
                }
              ],
              "value": "The application must route a caller-supplied token into Guardian.revoke/3 (for example a logout or session-revocation endpoint) and use a token module whose revoke / on_revoke callback mutates state keyed by the token claims (a whitelist that deletes by jti or a blacklist that inserts by jti, such as a GuardianDb-style store). With the default no-op on_revoke callback, no session state is changed and the issue is not exploitable."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.4.1",
                      "versionStartIncluding": "1.0.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ]
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Yordis Prieto"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Verification of Cryptographic Signature in ueberauth guardian allows an unauthenticated attacker to revoke a victim\u0027s session with a forged token.\u003c/p\u003e\u003cp\u003e\u003ctt\u003eGuardian.revoke/3\u003c/tt\u003e in \u003ctt\u003elib/guardian.ex\u003c/tt\u003e decodes the supplied token with \u003ctt\u003epeek/1\u003c/tt\u003e, which performs no signature verification (it only base64-decodes the JWT header and payload). The resulting unverified claims are forwarded directly to the configured token module\u0027s \u003ctt\u003erevoke\u003c/tt\u003e callback and the implementation\u0027s \u003ctt\u003eon_revoke\u003c/tt\u003e callback, a state-mutating sink. The sibling operations \u003ctt\u003erefresh/2\u003c/tt\u003e and \u003ctt\u003eexchange/4\u003c/tt\u003e both call \u003ctt\u003edecode_and_verify\u003c/tt\u003e first, so the signature is checked before anything acts on the claims; \u003ctt\u003erevoke/3\u003c/tt\u003e is the only state-mutating path that acts on claims without verifying the signature.\u003c/p\u003e\u003cp\u003eAn attacker who knows or guesses a victim\u0027s identifying claim values (\u003ctt\u003ejti\u003c/tt\u003e, \u003ctt\u003esub\u003c/tt\u003e) can forge a JWT carrying those claims, sign it with an arbitrary key, and submit it to any endpoint that funnels a caller-supplied token into \u003ctt\u003eGuardian.revoke/3\u003c/tt\u003e (the standard logout / session-revocation pattern). When the token module mutates state keyed by the claims (whitelist deletion or blacklist insertion, for example a GuardianDb-style store), the victim\u0027s legitimate session is evicted. This is an unauthenticated session-revocation denial of service; the attacker never needs the signing secret.\u003c/p\u003e\u003cp\u003eThis issue affects guardian: from 1.0.0 before 2.4.1.\u003c/p\u003e"
                }
              ],
              "value": "Improper Verification of Cryptographic Signature in ueberauth guardian allows an unauthenticated attacker to revoke a victim\u0027s session with a forged token.\n\nGuardian.revoke/3 in lib/guardian.ex decodes the supplied token with peek/1, which performs no signature verification (it only base64-decodes the JWT header and payload). The resulting unverified claims are forwarded directly to the configured token module\u0027s revoke callback and the implementation\u0027s on_revoke callback, a state-mutating sink. The sibling operations refresh/2 and exchange/4 both call decode_and_verify first, so the signature is checked before anything acts on the claims; revoke/3 is the only state-mutating path that acts on claims without verifying the signature.\n\nAn attacker who knows or guesses a victim\u0027s identifying claim values (jti, sub) can forge a JWT carrying those claims, sign it with an arbitrary key, and submit it to any endpoint that funnels a caller-supplied token into Guardian.revoke/3 (the standard logout / session-revocation pattern). When the token module mutates state keyed by the claims (whitelist deletion or blacklist insertion, for example a GuardianDb-style store), the victim\u0027s legitimate session is evicted. This is an unauthenticated session-revocation denial of service; the attacker never needs the signing secret.\n\nThis issue affects guardian: from 1.0.0 before 2.4.1."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-475",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-475 Signature Spoofing by Improper Validation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 8.2,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "HIGH",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-347",
                  "description": "CWE-347 Improper Verification of Cryptographic Signature",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-01T18:46:05.234Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ueberauth/guardian/security/advisories/GHSA-7975-hp3r-5qhv"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-55735.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-55735"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ueberauth/guardian/commit/2bd7a8c29770d423d855c0a4965caa6c3e486901"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Guardian.revoke/3 acts on unverified token claims, allowing forged-token session revocation",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eVerify the token before revoking it: call \u003ctt\u003edecode_and_verify\u003c/tt\u003e (or a verify-without-expiry variant, so already-expired tokens remain revocable) on the caller-supplied token and pass only tokens whose signature validates into \u003ctt\u003eGuardian.revoke/3\u003c/tt\u003e. Reject tokens with an invalid signature at the application boundary.\u003c/p\u003e"
                }
              ],
              "value": "Verify the token before revoking it: call decode_and_verify (or a verify-without-expiry variant, so already-expired tokens remain revocable) on the caller-supplied token and pass only tokens whose signature validates into Guardian.revoke/3. Reject tokens with an invalid signature at the application boundary."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-55735",
        "datePublished": "2026-08-01T18:46:05.234Z",
        "dateReserved": "2026-06-17T10:44:34.365Z",
        "dateUpdated": "2026-08-03T19:30:07.608Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-65636 (GCVE-0-2026-65636)

    Vulnerability from cvelistv5 – Published: 2026-07-31 13:29 – Updated: 2026-08-01 04:18
    VLAI
    Title
    YAML injection via unescaped newlines in ymlr document comments
    Summary
    Improper Neutralization of CRLF Sequences vulnerability in ufirstgroup ymlr (Elixir.Ymlr module) allows attackers to inject arbitrary content into generated YAML documents through document comments. Ymlr.document!/2 interpolates each caller-supplied comment string into the output behind a single # prefix without validating it or escaping line breaks. Because a YAML comment is terminated by a line break, the first carriage return or line feed in the comment string ends the comment context and everything after it is emitted at column 0 of the document body. An attacker who controls text that the host application passes as a comment can forge top-level mapping keys, override values the application itself set, and emit --- or ... markers that split the output into additional documents. Downstream consumers of the generated YAML, such as configuration loaders, deployment manifests, CI pipelines and data importers, parse the injected content as legitimate data. The same clause backs Ymlr.document/2, Ymlr.documents!/2 and Ymlr.documents/2, so every document encoding entry point is affected. This vulnerability is associated with program files lib/ymlr.ex and program routines 'Elixir.Ymlr':document!/2, 'Elixir.Ymlr':documents!/2. This issue affects ymlr from 0.0.1 before 5.1.6.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-31 14:28 UTC
    CWE
    • CWE-93 - Improper Neutralization of CRLF Sequences ('CRLF Injection')
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ufirstgroup ymlr Affected: 0.0.1 , < 5.1.6 (semver)
        cpe:2.3:a:ufirstgroup:ymlr:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ufirstgroup ymlr Affected: 0c11a86de83825e91c27cecaccb03f36416d8fe0 , < 42a0bf8b2af44b0e7c42d0b7044c8588ca5866dc (git)
        cpe:2.3:a:ufirstgroup:ymlr:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-65636",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-31T14:28:31.525792Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-31T14:28:44.562Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ufirstgroup:ymlr:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Ymlr"
              ],
              "packageName": "ymlr",
              "packageURL": "pkg:hex/ymlr",
              "product": "ymlr",
              "programFiles": [
                "lib/ymlr.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ymlr\u0027:document!/2"
                },
                {
                  "name": "\u0027Elixir.Ymlr\u0027:documents!/2"
                }
              ],
              "repo": "https://github.com/ufirstgroup/ymlr",
              "vendor": "ufirstgroup",
              "versions": [
                {
                  "lessThan": "5.1.6",
                  "status": "affected",
                  "version": "0.0.1",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ufirstgroup:ymlr:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Ymlr"
              ],
              "packageName": "ufirstgroup/ymlr",
              "packageURL": "pkg:github/ufirstgroup/ymlr",
              "product": "ymlr",
              "programFiles": [
                "lib/ymlr.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Ymlr\u0027:document!/2"
                },
                {
                  "name": "\u0027Elixir.Ymlr\u0027:documents!/2"
                }
              ],
              "repo": "https://github.com/ufirstgroup/ymlr",
              "vendor": "ufirstgroup",
              "versions": [
                {
                  "lessThan": "42a0bf8b2af44b0e7c42d0b7044c8588ca5866dc",
                  "status": "affected",
                  "version": "0c11a86de83825e91c27cecaccb03f36416d8fe0",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA deployment is vulnerable when the host application places attacker-controlled text in the comment position of a document, that is, as the first element of the \u003ctt\u003e{comment, data}\u003c/tt\u003e tuple passed to \u003ctt\u003eYmlr.document!/2\u003c/tt\u003e, \u003ctt\u003eYmlr.document/2\u003c/tt\u003e, \u003ctt\u003eYmlr.documents!/2\u003c/tt\u003e or \u003ctt\u003eYmlr.documents/2\u003c/tt\u003e. Callers that encode data without comments, or that use only static comment strings, are not exploitable.\u003c/p\u003e"
                }
              ],
              "value": "A deployment is vulnerable when the host application places attacker-controlled text in the comment position of a document, that is, as the first element of the {comment, data} tuple passed to Ymlr.document!/2, Ymlr.document/2, Ymlr.documents!/2 or Ymlr.documents/2. Callers that encode data without comments, or that use only static comment strings, are not exploitable."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ufirstgroup:ymlr:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "5.1.6",
                      "versionStartIncluding": "0.0.1",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Michael Ruoss"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Neutralization of CRLF Sequences vulnerability in ufirstgroup ymlr (\u003ctt\u003eElixir.Ymlr\u003c/tt\u003e module) allows attackers to inject arbitrary content into generated YAML documents through document comments. \u003ctt\u003eYmlr.document!/2\u003c/tt\u003e interpolates each caller-supplied comment string into the output behind a single \u003ctt\u003e#\u003c/tt\u003e prefix without validating it or escaping line breaks. Because a YAML comment is terminated by a line break, the first carriage return or line feed in the comment string ends the comment context and everything after it is emitted at column 0 of the document body.\u003c/p\u003e\u003cp\u003eAn attacker who controls text that the host application passes as a comment can forge top-level mapping keys, override values the application itself set, and emit \u003ctt\u003e---\u003c/tt\u003e or \u003ctt\u003e...\u003c/tt\u003e markers that split the output into additional documents. Downstream consumers of the generated YAML, such as configuration loaders, deployment manifests, CI pipelines and data importers, parse the injected content as legitimate data. The same clause backs \u003ctt\u003eYmlr.document/2\u003c/tt\u003e, \u003ctt\u003eYmlr.documents!/2\u003c/tt\u003e and \u003ctt\u003eYmlr.documents/2\u003c/tt\u003e, so every document encoding entry point is affected.\u003c/p\u003e\u003cp\u003eThis vulnerability is associated with program files \u003ctt\u003elib/ymlr.ex\u003c/tt\u003e and program routines \u003ctt\u003e\u0027Elixir.Ymlr\u0027:document!/2\u003c/tt\u003e, \u003ctt\u003e\u0027Elixir.Ymlr\u0027:documents!/2\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThis issue affects ymlr from 0.0.1 before 5.1.6.\u003c/p\u003e"
                }
              ],
              "value": "Improper Neutralization of CRLF Sequences vulnerability in ufirstgroup ymlr (Elixir.Ymlr module) allows attackers to inject arbitrary content into generated YAML documents through document comments. Ymlr.document!/2 interpolates each caller-supplied comment string into the output behind a single # prefix without validating it or escaping line breaks. Because a YAML comment is terminated by a line break, the first carriage return or line feed in the comment string ends the comment context and everything after it is emitted at column 0 of the document body.\n\nAn attacker who controls text that the host application passes as a comment can forge top-level mapping keys, override values the application itself set, and emit --- or ... markers that split the output into additional documents. Downstream consumers of the generated YAML, such as configuration loaders, deployment manifests, CI pipelines and data importers, parse the injected content as legitimate data. The same clause backs Ymlr.document/2, Ymlr.documents!/2 and Ymlr.documents/2, so every document encoding entry point is affected.\n\nThis vulnerability is associated with program files lib/ymlr.ex and program routines \u0027Elixir.Ymlr\u0027:document!/2, \u0027Elixir.Ymlr\u0027:documents!/2.\n\nThis issue affects ymlr from 0.0.1 before 5.1.6."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-15",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-15 Command Delimiters"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-93",
                  "description": "CWE-93 Improper Neutralization of CRLF Sequences (\u0027CRLF Injection\u0027)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-08-01T04:18:38.726Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/ufirstgroup/ymlr/security/advisories/GHSA-p8qx-7cp9-v6c9"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-65636.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-65636"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ufirstgroup/ymlr/commit/7e53061fb2809b787fba0373c46b78e253c83adc"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ufirstgroup/ymlr/commit/42a0bf8b2af44b0e7c42d0b7044c8588ca5866dc"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "YAML injection via unescaped newlines in ymlr document comments",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSplit any untrusted comment string on line breaks and pass the resulting list as the comment element of the \u003ctt\u003e{comment, data}\u003c/tt\u003e tuple. Ymlr prefixes every list element with its own \u003ctt\u003e#\u003c/tt\u003e marker, so no line can leave the comment context. Alternatively, reject comment strings that contain carriage return or line feed characters, or keep untrusted text out of comments entirely and place it in the encoded data instead, where the encoder quotes it.\u003c/p\u003e"
                }
              ],
              "value": "Split any untrusted comment string on line breaks and pass the resulting list as the comment element of the {comment, data} tuple. Ymlr prefixes every list element with its own # marker, so no line can leave the comment context. Alternatively, reject comment strings that contain carriage return or line feed characters, or keep untrusted text out of comments entirely and place it in the encoded data instead, where the encoder quotes it."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-65636",
        "datePublished": "2026-07-31T13:29:31.198Z",
        "dateReserved": "2026-07-22T13:58:26.233Z",
        "dateUpdated": "2026-08-01T04:18:38.726Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-53431 (GCVE-0-2026-53431)

    Vulnerability from cvelistv5 – Published: 2026-07-30 14:17 – Updated: 2026-07-31 04:20
    VLAI
    Title
    Boruta accepts expired JWT client assertions due to missing exp claim validation
    Summary
    Authentication Bypass by Capture-replay vulnerability in malach-it Boruta allows an attacker who has obtained a previously valid JWT client assertion to authenticate as the issuing OAuth client after the assertion has expired. Boruta accepts JWT-based client authentication (client_secret_jwt and private_key_jwt token endpoint authentication methods) but never enforces that the assertion's exp claim is in the future. The pre-check helper Boruta.Oauth.Request.Base.check_expiration/1 in lib/boruta/oauth/request/base.ex only verifies that an exp claim is present (it pattern-matches on the existence of the key and returns success), and the Joken token configuration used for signature verification, Boruta.Oauth.Authorization.Client.Token.token_config/0 in lib/boruta/oauth/authorization/client.ex, returns an empty map, so Joken's default exp claim validator is not engaged either. Any attacker who obtains a validly-signed client assertion (for example through logs, reverse proxies, browser tooling, or other observability surfaces) can replay it indefinitely to authenticate as the client and obtain access tokens with that client's privileges. This issue affects boruta: from 2.3.0 before 2.3.7.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-30 16:12 UTC
    CWE
    • CWE-294 - Authentication Bypass by Capture-replay
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    malach-it boruta Affected: 2.3.0 , < 2.3.7 (semver)
        cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*
    Create a notification for this product.
    malach-it boruta Affected: 5bfbe1c5443bffe71cf1bf954bbdff61327d9a83 , < * (git)
        cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-53431",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-30T16:12:55.290055Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-30T16:13:22.708Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-xjv8-vmh5-xhf6"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Boruta.Oauth.Request.Base\u0027",
                "\u0027Elixir.Boruta.Oauth.Authorization.Client.Token\u0027"
              ],
              "packageName": "boruta",
              "packageURL": "pkg:hex/boruta",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/oauth/request/base.ex",
                "lib/boruta/oauth/authorization/client.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:fetch_client_authentication/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:check_expiration/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Authorization.Client.Token\u0027:token_config/0"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "lessThan": "2.3.7",
                  "status": "affected",
                  "version": "2.3.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Boruta.Oauth.Request.Base\u0027",
                "\u0027Elixir.Boruta.Oauth.Authorization.Client.Token\u0027"
              ],
              "packageName": "malach-it/boruta_auth",
              "packageURL": "pkg:github/malach-it/boruta_auth",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/oauth/request/base.ex",
                "lib/boruta/oauth/authorization/client.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:fetch_client_authentication/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:check_expiration/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Authorization.Client.Token\u0027:token_config/0"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "5204f88f9b2cdd9637a755337ed5f99185be5474",
                      "status": "unaffected"
                    },
                    {
                      "at": "69363432aa36760fc5438e4e17115d0f7c1b925a",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "5bfbe1c5443bffe71cf1bf954bbdff61327d9a83",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe attack requires that the Boruta deployment has provisioned at least one OAuth client configured to authenticate via JWT client assertions (\u003ctt\u003eclient_secret_jwt\u003c/tt\u003e or \u003ctt\u003eprivate_key_jwt\u003c/tt\u003e token endpoint authentication methods). Deployments that authenticate clients only via \u003ctt\u003eclient_secret_basic\u003c/tt\u003e or \u003ctt\u003eclient_secret_post\u003c/tt\u003e are not exposed.\u003c/p\u003e"
                }
              ],
              "value": "The attack requires that the Boruta deployment has provisioned at least one OAuth client configured to authenticate via JWT client assertions (client_secret_jwt or private_key_jwt token endpoint authentication methods). Deployments that authenticate clients only via client_secret_basic or client_secret_post are not exposed."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.3.7",
                      "versionStartIncluding": "2.3.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAuthentication Bypass by Capture-replay vulnerability in malach-it Boruta allows an attacker who has obtained a previously valid JWT client assertion to authenticate as the issuing OAuth client after the assertion has expired.\u003c/p\u003e\u003cp\u003eBoruta accepts JWT-based client authentication (\u003ctt\u003eclient_secret_jwt\u003c/tt\u003e and \u003ctt\u003eprivate_key_jwt\u003c/tt\u003e token endpoint authentication methods) but never enforces that the assertion\u0027s \u003ctt\u003eexp\u003c/tt\u003e claim is in the future. The pre-check helper \u003ctt\u003e\u0027Elixir.Boruta.Oauth.Request.Base\u0027:check_expiration/1\u003c/tt\u003e in \u003ctt\u003elib/boruta/oauth/request/base.ex\u003c/tt\u003e only verifies that an \u003ctt\u003eexp\u003c/tt\u003e claim is present (it pattern-matches on the existence of the key and returns success), and the Joken token configuration used for signature verification, \u003ctt\u003e\u0027Elixir.Boruta.Oauth.Authorization.Client.Token\u0027:token_config/0\u003c/tt\u003e in \u003ctt\u003elib/boruta/oauth/authorization/client.ex\u003c/tt\u003e, returns an empty map, so Joken\u0027s default \u003ctt\u003eexp\u003c/tt\u003e claim validator is not engaged either. Any attacker who obtains a validly-signed client assertion (for example through logs, reverse proxies, browser tooling, or other observability surfaces) can replay it indefinitely to authenticate as the client and obtain access tokens with that client\u0027s privileges.\u003c/p\u003e\u003cp\u003eThis issue affects boruta: from 2.3.0 before 2.3.7.\u003c/p\u003e"
                }
              ],
              "value": "Authentication Bypass by Capture-replay vulnerability in malach-it Boruta allows an attacker who has obtained a previously valid JWT client assertion to authenticate as the issuing OAuth client after the assertion has expired.\n\nBoruta accepts JWT-based client authentication (client_secret_jwt and private_key_jwt token endpoint authentication methods) but never enforces that the assertion\u0027s exp claim is in the future. The pre-check helper Boruta.Oauth.Request.Base.check_expiration/1 in lib/boruta/oauth/request/base.ex only verifies that an exp claim is present (it pattern-matches on the existence of the key and returns success), and the Joken token configuration used for signature verification, Boruta.Oauth.Authorization.Client.Token.token_config/0 in lib/boruta/oauth/authorization/client.ex, returns an empty map, so Joken\u0027s default exp claim validator is not engaged either. Any attacker who obtains a validly-signed client assertion (for example through logs, reverse proxies, browser tooling, or other observability surfaces) can replay it indefinitely to authenticate as the client and obtain access tokens with that client\u0027s privileges.\n\nThis issue affects boruta: from 2.3.0 before 2.3.7."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-60",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 9.1,
                "baseSeverity": "CRITICAL",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-294",
                  "description": "CWE-294 Authentication Bypass by Capture-replay",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-07-31T04:20:43.209Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-xjv8-vmh5-xhf6"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-53431.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-53431"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/5204f88f9b2cdd9637a755337ed5f99185be5474"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/69363432aa36760fc5438e4e17115d0f7c1b925a"
            }
          ],
          "source": {
            "discovery": "INTERNAL"
          },
          "title": "Boruta accepts expired JWT client assertions due to missing exp claim validation",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eRestrict the use of JWT-based client authentication (\u003ctt\u003eclient_secret_jwt\u003c/tt\u003e and \u003ctt\u003eprivate_key_jwt\u003c/tt\u003e) to highly trusted clients, and prefer non-JWT client authentication methods (\u003ctt\u003eclient_secret_basic\u003c/tt\u003e or \u003ctt\u003eclient_secret_post\u003c/tt\u003e) where possible. Where JWT client authentication must remain enabled, issue short-lived client assertions and protect them from exposure in application logs, fronting proxies, browser tooling, and observability systems to reduce the window for replay.\u003c/p\u003e"
                }
              ],
              "value": "Restrict the use of JWT-based client authentication (client_secret_jwt and private_key_jwt) to highly trusted clients, and prefer non-JWT client authentication methods (client_secret_basic or client_secret_post) where possible. Where JWT client authentication must remain enabled, issue short-lived client assertions and protect them from exposure in application logs, fronting proxies, browser tooling, and observability systems to reduce the window for replay."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-53431",
        "datePublished": "2026-07-30T14:17:27.909Z",
        "dateReserved": "2026-06-09T11:01:47.529Z",
        "dateUpdated": "2026-07-31T04:20:43.209Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-65635 (GCVE-0-2026-65635)

    Vulnerability from cvelistv5 – Published: 2026-07-30 14:17 – Updated: 2026-07-31 04:20
    VLAI
    Title
    Boruta dynamic client registration allows creation of over-privileged OAuth clients
    Summary
    Improper Isolation or Compartmentalization vulnerability in malach-it boruta (Elixir.Boruta.Openid module) allows attackers to register OpenID Connect clients with administrative privileges through the dynamic client registration entry point. Boruta.Openid.register_client/3 forwards caller-supplied registration parameters to the administrative client creation path without a public/admin field-level allowlist, so an unauthenticated registrant can set security-sensitive attributes including supported grant types, authorized scopes, PKCE enforcement, public refresh and revocation behavior, token lifetimes, and signing settings. The library does not distinguish between metadata a public registrant is allowed to set and administrative controls that should require operator approval. This vulnerability is associated with program files lib/boruta/openid.ex and program routines 'Elixir.Boruta.Openid':register_client/3, 'Elixir.Boruta.Openid':parse_registration_params/2. This issue affects boruta from 2.3.0 before 2.3.7.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-30 16:13 UTC
    CWE
    • CWE-653 - Improper Isolation or Compartmentalization
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    malach-it boruta Affected: 2.3.0 , < 2.3.7 (semver)
        cpe:2.3:a:malach-it:boruta:*:*:*:*:*:*:*:*
    Create a notification for this product.
    malach-it boruta Affected: 85481b706636fe68a43d0b8d3275e2afc7f7fee1 , < * (git)
        cpe:2.3:a:malach-it:boruta:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-65635",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-30T16:13:41.629153Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-30T16:13:59.649Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-w869-fcf2-68vp"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Boruta.Openid"
              ],
              "packageName": "boruta",
              "packageURL": "pkg:hex/boruta",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/openid.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:register_client/3"
                },
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "lessThan": "2.3.7",
                  "status": "affected",
                  "version": "2.3.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "Elixir.Boruta.Openid"
              ],
              "packageName": "malach-it/boruta_auth",
              "packageURL": "pkg:github/malach-it/boruta_auth",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/openid.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:register_client/3"
                },
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "82584c854a332482232fd25301ab12a835f9f643",
                      "status": "unaffected"
                    },
                    {
                      "at": "95619a1beaff68fa766cca9b388e7c780d182525",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "85481b706636fe68a43d0b8d3275e2afc7f7fee1",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eA deployment is vulnerable when the host application exposes \u003ctt\u003eBoruta.Openid.register_client/3\u003c/tt\u003e on a network endpoint without requiring a trusted initial access token and without a strict server-side allowlist that prevents caller-supplied administrative attributes from reaching the underlying changeset. The standard controller generator does not install a dynamic client registration route, so deployments that never call \u003ctt\u003eBoruta.Openid.register_client/3\u003c/tt\u003e from a public endpoint are not exploitable.\u003c/p\u003e"
                }
              ],
              "value": "A deployment is vulnerable when the host application exposes Boruta.Openid.register_client/3 on a network endpoint without requiring a trusted initial access token and without a strict server-side allowlist that prevents caller-supplied administrative attributes from reaching the underlying changeset. The standard controller generator does not install a dynamic client registration route, so deployments that never call Boruta.Openid.register_client/3 from a public endpoint are not exploitable."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:malach-it:boruta:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.3.7",
                      "versionStartIncluding": "2.3.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eImproper Isolation or Compartmentalization vulnerability in malach-it boruta (\u003ctt\u003eElixir.Boruta.Openid\u003c/tt\u003e module) allows attackers to register OpenID Connect clients with administrative privileges through the dynamic client registration entry point. \u003ctt\u003eBoruta.Openid.register_client/3\u003c/tt\u003e forwards caller-supplied registration parameters to the administrative client creation path without a public/admin field-level allowlist, so an unauthenticated registrant can set security-sensitive attributes including supported grant types, authorized scopes, PKCE enforcement, public refresh and revocation behavior, token lifetimes, and signing settings. The library does not distinguish between metadata a public registrant is allowed to set and administrative controls that should require operator approval.\u003c/p\u003e\u003cp\u003eThis vulnerability is associated with program files \u003ctt\u003elib/boruta/openid.ex\u003c/tt\u003e and program routines \u003ctt\u003e\u0027Elixir.Boruta.Openid\u0027:register_client/3\u003c/tt\u003e, \u003ctt\u003e\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThis issue affects boruta from 2.3.0 before 2.3.7.\u003c/p\u003e"
                }
              ],
              "value": "Improper Isolation or Compartmentalization vulnerability in malach-it boruta (Elixir.Boruta.Openid module) allows attackers to register OpenID Connect clients with administrative privileges through the dynamic client registration entry point. Boruta.Openid.register_client/3 forwards caller-supplied registration parameters to the administrative client creation path without a public/admin field-level allowlist, so an unauthenticated registrant can set security-sensitive attributes including supported grant types, authorized scopes, PKCE enforcement, public refresh and revocation behavior, token lifetimes, and signing settings. The library does not distinguish between metadata a public registrant is allowed to set and administrative controls that should require operator approval.\n\nThis vulnerability is associated with program files lib/boruta/openid.ex and program routines \u0027Elixir.Boruta.Openid\u0027:register_client/3, \u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2.\n\nThis issue affects boruta from 2.3.0 before 2.3.7."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-1",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-1 Accessing Functionality Not Properly Constrained by ACLs"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 8.3,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:H/VA:L/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "LOW",
                "vulnConfidentialityImpact": "LOW",
                "vulnIntegrityImpact": "HIGH"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-653",
                  "description": "CWE-653 Improper Isolation or Compartmentalization",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-07-31T04:20:15.914Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-w869-fcf2-68vp"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-65635.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-65635"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/82584c854a332482232fd25301ab12a835f9f643"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/95619a1beaff68fa766cca9b388e7c780d182525"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Boruta dynamic client registration allows creation of over-privileged OAuth clients",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDisable the dynamic client registration route or restrict it to authenticated administrators. If dynamic registration must remain available to untrusted callers, do not forward the request parameters to \u003ctt\u003eBoruta.Openid.register_client/3\u003c/tt\u003e directly. Instead, construct a new parameter map in the host application that contains only the standards-defined public metadata (such as redirect URIs, client name, logo, and contacts) and overwrite every administrative attribute (supported grant types, authorized scopes, PKCE flag, public refresh and revocation flags, token lifetimes, signing settings, token endpoint authentication method) with values from a fixed least-privilege server-side profile before calling the function.\u003c/p\u003e"
                }
              ],
              "value": "Disable the dynamic client registration route or restrict it to authenticated administrators. If dynamic registration must remain available to untrusted callers, do not forward the request parameters to Boruta.Openid.register_client/3 directly. Instead, construct a new parameter map in the host application that contains only the standards-defined public metadata (such as redirect URIs, client name, logo, and contacts) and overwrite every administrative attribute (supported grant types, authorized scopes, PKCE flag, public refresh and revocation flags, token lifetimes, signing settings, token endpoint authentication method) with values from a fixed least-privilege server-side profile before calling the function."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-65635",
        "datePublished": "2026-07-30T14:17:02.942Z",
        "dateReserved": "2026-07-22T13:58:26.233Z",
        "dateUpdated": "2026-07-31T04:20:15.914Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-54885 (GCVE-0-2026-54885)

    Vulnerability from cvelistv5 – Published: 2026-07-30 14:16 – Updated: 2026-07-31 04:20
    VLAI
    Title
    Server-side request forgery in Boruta OAuth request_uri and OpenID jwks_uri fetching
    Summary
    Server-Side Request Forgery vulnerability in malach-it Boruta allows an unauthenticated remote attacker to cause the OAuth/OpenID authorization server to issue outbound HTTP requests to attacker-chosen URIs, including internal services and cloud metadata endpoints. Three code paths fetch remote URIs supplied by the requester without sufficient validation of the target. Boruta.Oauth.Request.Base.fetch_unsigned_request/1 in lib/boruta/oauth/request/base.ex dereferences the OAuth request_uri parameter from the authorization request via Finch.build(:get, request_uri) |> Finch.request(OpenIDHttpClient). Boruta.Openid.parse_registration_params/2 in lib/boruta/openid.ex dereferences the jwks_uri supplied in an OpenID Connect dynamic client registration request. Boruta.Ecto.Clients.refresh_jwk_from_jwks_uri/1 in lib/boruta/adapters/ecto/clients.ex later refreshes the stored jwks_uri for an existing client. In all three paths the only validation is that the URI parses with a scheme (and one of the two request_uri clauses does not even restrict the scheme to http or https). The implementations do not require HTTPS, do not enforce a host or IP allowlist, do not reject loopback, private, link-local, or other non-public ranges after DNS resolution, do not cap response size, and do not constrain redirects. An attacker can therefore steer the server's HTTP client at arbitrary network targets reachable from the Boruta host. This issue affects boruta: from 2.3.2 before 2.3.7.
    SSVC
    Exploitation: poc Automatable: no Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-30 16:14 UTC
    CWE
    • CWE-918 - Server-Side Request Forgery (SSRF)
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    malach-it boruta Affected: 2.3.2 , < 2.3.7 (semver)
        cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*
    Create a notification for this product.
    malach-it boruta Affected: 15455b86206e0370eabd64c1856a5c996b436455 , < * (git)
        cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-54885",
                    "options": [
                      {
                        "Exploitation": "poc"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-30T16:14:18.216537Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-30T16:14:32.431Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "references": [
              {
                "tags": [
                  "exploit"
                ],
                "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-5q9h-vf5j-fr2g"
              }
            ],
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Boruta.Oauth.Request.Base\u0027",
                "\u0027Elixir.Boruta.Openid\u0027",
                "\u0027Elixir.Boruta.Ecto.Clients\u0027"
              ],
              "packageName": "boruta",
              "packageURL": "pkg:hex/boruta",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/oauth/request/base.ex",
                "lib/boruta/openid.ex",
                "lib/boruta/adapters/ecto/clients.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:fetch_unsigned_request/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2"
                },
                {
                  "name": "\u0027Elixir.Boruta.Ecto.Clients\u0027:refresh_jwk_from_jwks_uri/1"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "lessThan": "2.3.7",
                  "status": "affected",
                  "version": "2.3.2",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Boruta.Oauth.Request.Base\u0027",
                "\u0027Elixir.Boruta.Openid\u0027",
                "\u0027Elixir.Boruta.Ecto.Clients\u0027"
              ],
              "packageName": "malach-it/boruta_auth",
              "packageURL": "pkg:github/malach-it/boruta_auth",
              "product": "boruta",
              "programFiles": [
                "lib/boruta/oauth/request/base.ex",
                "lib/boruta/openid.ex",
                "lib/boruta/adapters/ecto/clients.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Boruta.Oauth.Request.Base\u0027:fetch_unsigned_request/1"
                },
                {
                  "name": "\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2"
                },
                {
                  "name": "\u0027Elixir.Boruta.Ecto.Clients\u0027:refresh_jwk_from_jwks_uri/1"
                }
              ],
              "repo": "https://github.com/malach-it/boruta_auth",
              "vendor": "malach-it",
              "versions": [
                {
                  "changes": [
                    {
                      "at": "001e3dc5c259e67c6f907e98867eda4141c96d0d",
                      "status": "unaffected"
                    },
                    {
                      "at": "95fb10b78129355e475681f324c9a01ef0af2be5",
                      "status": "unaffected"
                    }
                  ],
                  "lessThan": "*",
                  "status": "affected",
                  "version": "15455b86206e0370eabd64c1856a5c996b436455",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:malach-it:boruta_auth:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.3.7",
                      "versionStartIncluding": "2.3.2",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Pascal Knoth"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eServer-Side Request Forgery vulnerability in malach-it Boruta allows an unauthenticated remote attacker to cause the OAuth/OpenID authorization server to issue outbound HTTP requests to attacker-chosen URIs, including internal services and cloud metadata endpoints.\u003c/p\u003e\u003cp\u003eThree code paths fetch remote URIs supplied by the requester without sufficient validation of the target. \u003ctt\u003e\u0027Elixir.Boruta.Oauth.Request.Base\u0027:fetch_unsigned_request/1\u003c/tt\u003e in \u003ctt\u003elib/boruta/oauth/request/base.ex\u003c/tt\u003e dereferences the OAuth \u003ctt\u003erequest_uri\u003c/tt\u003e parameter from the authorization request via \u003ctt\u003eFinch.build(:get, request_uri) |\u0026gt; Finch.request(OpenIDHttpClient)\u003c/tt\u003e. \u003ctt\u003e\u0027Elixir.Boruta.Openid\u0027:parse_registration_params/2\u003c/tt\u003e in \u003ctt\u003elib/boruta/openid.ex\u003c/tt\u003e dereferences the \u003ctt\u003ejwks_uri\u003c/tt\u003e supplied in an OpenID Connect dynamic client registration request. \u003ctt\u003e\u0027Elixir.Boruta.Ecto.Clients\u0027:refresh_jwk_from_jwks_uri/1\u003c/tt\u003e in \u003ctt\u003elib/boruta/adapters/ecto/clients.ex\u003c/tt\u003e later refreshes the stored \u003ctt\u003ejwks_uri\u003c/tt\u003e for an existing client. In all three paths the only validation is that the URI parses with a scheme (and one of the two \u003ctt\u003erequest_uri\u003c/tt\u003e clauses does not even restrict the scheme to \u003ctt\u003ehttp\u003c/tt\u003e or \u003ctt\u003ehttps\u003c/tt\u003e). The implementations do not require HTTPS, do not enforce a host or IP allowlist, do not reject loopback, private, link-local, or other non-public ranges after DNS resolution, do not cap response size, and do not constrain redirects. An attacker can therefore steer the server\u0027s HTTP client at arbitrary network targets reachable from the Boruta host.\u003c/p\u003e\u003cp\u003eThis issue affects boruta: from 2.3.2 before 2.3.7.\u003c/p\u003e"
                }
              ],
              "value": "Server-Side Request Forgery vulnerability in malach-it Boruta allows an unauthenticated remote attacker to cause the OAuth/OpenID authorization server to issue outbound HTTP requests to attacker-chosen URIs, including internal services and cloud metadata endpoints.\n\nThree code paths fetch remote URIs supplied by the requester without sufficient validation of the target. Boruta.Oauth.Request.Base.fetch_unsigned_request/1 in lib/boruta/oauth/request/base.ex dereferences the OAuth request_uri parameter from the authorization request via Finch.build(:get, request_uri) |\u003e Finch.request(OpenIDHttpClient). Boruta.Openid.parse_registration_params/2 in lib/boruta/openid.ex dereferences the jwks_uri supplied in an OpenID Connect dynamic client registration request. Boruta.Ecto.Clients.refresh_jwk_from_jwks_uri/1 in lib/boruta/adapters/ecto/clients.ex later refreshes the stored jwks_uri for an existing client. In all three paths the only validation is that the URI parses with a scheme (and one of the two request_uri clauses does not even restrict the scheme to http or https). The implementations do not require HTTPS, do not enforce a host or IP allowlist, do not reject loopback, private, link-local, or other non-public ranges after DNS resolution, do not cap response size, and do not constrain redirects. An attacker can therefore steer the server\u0027s HTTP client at arbitrary network targets reachable from the Boruta host.\n\nThis issue affects boruta: from 2.3.2 before 2.3.7."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-664",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-664 Server Side Request Forgery"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "NONE",
                "attackVector": "NETWORK",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "NONE"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-918",
                  "description": "CWE-918 Server-Side Request Forgery (SSRF)",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-07-31T04:20:03.434Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/malach-it/boruta_auth/security/advisories/GHSA-5q9h-vf5j-fr2g"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-54885.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-54885"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/001e3dc5c259e67c6f907e98867eda4141c96d0d"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/malach-it/boruta_auth/commit/95fb10b78129355e475681f324c9a01ef0af2be5"
            }
          ],
          "source": {
            "discovery": "INTERNAL"
          },
          "title": "Server-side request forgery in Boruta OAuth request_uri and OpenID jwks_uri fetching",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eRestrict the network egress of the Boruta host so that the OAuth/OpenID authorization server cannot reach loopback, private, link-local, multicast, or cloud metadata addresses. Where possible, disable application routes for OAuth \u003ctt\u003erequest_uri\u003c/tt\u003e dereferencing and OpenID Connect dynamic client registration, or restrict OpenID Connect dynamic client registration to trusted callers, until a patched release is deployed.\u003c/p\u003e"
                }
              ],
              "value": "Restrict the network egress of the Boruta host so that the OAuth/OpenID authorization server cannot reach loopback, private, link-local, multicast, or cloud metadata addresses. Where possible, disable application routes for OAuth request_uri dereferencing and OpenID Connect dynamic client registration, or restrict OpenID Connect dynamic client registration to trusted callers, until a patched release is deployed."
            }
          ],
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-54885",
        "datePublished": "2026-07-30T14:16:43.631Z",
        "dateReserved": "2026-06-16T10:47:13.914Z",
        "dateUpdated": "2026-07-31T04:20:03.434Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-59247 (GCVE-0-2026-59247)

    Vulnerability from cvelistv5 – Published: 2026-07-29 14:24 – Updated: 2026-07-30 04:15
    VLAI
    Title
    Insufficient verification of Hex package metadata in Gleam
    Summary
    Insufficient Verification of Data Authenticity vulnerability in Gleam allows an adversary in the middle to substitute forged Hex package contents during dependency resolution. During dependency resolution Gleam fetches package metadata from the signature-verified Hex repository, which covers each release's dependency requirements and SHA-256 outer_checksum. After resolving versions, gleam_cli::dependencies::lookup_package makes a second request to the unsigned Hex API through gleam_core::hex::get_package_release and records the outer_checksum and dependency names from that JSON response into manifest.toml, instead of the values from the verified repository metadata. The Hex repository signature does not cover the API response. An adversary in the middle who can intercept TLS with a certificate trusted by the Gleam process (for example a TLS-inspecting proxy using a CA in the operating system trust store or added through GLEAM_CACERTS_PATH), and who can modify both the API release response and the corresponding repository tarball, can supply a package archive with a matching forged checksum without the Hex repository signing key. Gleam verifies the forged tarball against the forged checksum, accepts it, and extracts it as a dependency source, resulting in loss of integrity of the downloaded package contents. Only projects that resolve or update Hex dependencies are affected, which happens when the manifest is missing, a dependency is added or updated, or dependency requirements change. Builds that reuse an unchanged, known-good manifest.toml continue to verify tarballs against its pinned checksum. This issue affects gleam: from 0.18.0 before 1.18.0.
    SSVC
    Exploitation: none Automatable: no Technical Impact: total
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-29 15:03 UTC
    CWE
    • CWE-345 - Insufficient Verification of Data Authenticity
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    gleam-lang gleam Affected: 0.18.0 , < 1.18.0 (semver)
        cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*
    Create a notification for this product.
    gleam-lang gleam Affected: 0.18.0 , < 1.18.0 (semver)
    Affected: 8447b78cc844ff4aec44eea23dbd68d1fea11f11 , < c9c0d48c123c8abae6db8dd61b25ccb427ed3d35 (git)
        cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*
    Create a notification for this product.
    gleam-lang gleam Affected: v0.18.0-elixir , < v1.18.0-elixir (other)
    Affected: v0.18.0-elixir-slim , < v1.18.0-elixir-slim (other)
    Affected: v0.18.0-elixir-alpine , < v1.18.0-elixir-alpine (other)
    Affected: v0.18.0-erlang , < v1.18.0-erlang (other)
    Affected: v0.18.0-erlang-slim , < v1.18.0-erlang-slim (other)
    Affected: v0.18.0-erlang-alpine , < v1.18.0-erlang-alpine (other)
    Affected: v0.18.0-node , < v1.18.0-node (other)
    Affected: v0.18.0-node-slim , < v1.18.0-node-slim (other)
    Affected: v0.18.0-node-alpine , < v1.18.0-node-alpine (other)
    Affected: v1.6.0-scratch , < v1.18.0-scratch (other)
        cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-59247",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "no"
                      },
                      {
                        "Technical Impact": "total"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-29T15:03:54.127187Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-29T15:09:39.613Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://gleam.run",
              "cpes": [
                "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "gleam_cli::dependencies",
                "gleam_cli::dependencies::dependency_manager"
              ],
              "packageName": "gleam.run/gleam",
              "packageURL": "pkg:sid/gleam.run/gleam",
              "product": "gleam",
              "programFiles": [
                "compiler-cli/src/dependencies.rs",
                "compiler-cli/src/dependencies/dependency_manager.rs"
              ],
              "programRoutines": [
                {
                  "name": "gleam_cli::dependencies::lookup_package"
                },
                {
                  "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
                }
              ],
              "repo": "https://github.com/gleam-lang/gleam",
              "vendor": "gleam-lang",
              "versions": [
                {
                  "lessThan": "1.18.0",
                  "status": "affected",
                  "version": "0.18.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "gleam_cli::dependencies",
                "gleam_cli::dependencies::dependency_manager"
              ],
              "packageName": "gleam-lang/gleam",
              "packageURL": "pkg:github/gleam-lang/gleam",
              "product": "gleam",
              "programFiles": [
                "compiler-cli/src/dependencies.rs",
                "compiler-cli/src/dependencies/dependency_manager.rs"
              ],
              "programRoutines": [
                {
                  "name": "gleam_cli::dependencies::lookup_package"
                },
                {
                  "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
                }
              ],
              "repo": "https://github.com/gleam-lang/gleam",
              "vendor": "gleam-lang",
              "versions": [
                {
                  "lessThan": "1.18.0",
                  "status": "affected",
                  "version": "0.18.0",
                  "versionType": "semver"
                },
                {
                  "lessThan": "c9c0d48c123c8abae6db8dd61b25ccb427ed3d35",
                  "status": "affected",
                  "version": "8447b78cc844ff4aec44eea23dbd68d1fea11f11",
                  "versionType": "git"
                }
              ]
            },
            {
              "collectionURL": "https://ghcr.io",
              "cpes": [
                "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "gleam_cli::dependencies",
                "gleam_cli::dependencies::dependency_manager"
              ],
              "packageName": "gleam-lang/gleam",
              "packageURL": "pkg:oci/gleam?repository_url=ghcr.io/gleam-lang",
              "product": "gleam",
              "programFiles": [
                "compiler-cli/src/dependencies.rs",
                "compiler-cli/src/dependencies/dependency_manager.rs"
              ],
              "programRoutines": [
                {
                  "name": "gleam_cli::dependencies::lookup_package"
                },
                {
                  "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
                }
              ],
              "vendor": "gleam-lang",
              "versions": [
                {
                  "lessThan": "v1.18.0-elixir",
                  "status": "affected",
                  "version": "v0.18.0-elixir",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-elixir-slim",
                  "status": "affected",
                  "version": "v0.18.0-elixir-slim",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-elixir-alpine",
                  "status": "affected",
                  "version": "v0.18.0-elixir-alpine",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-erlang",
                  "status": "affected",
                  "version": "v0.18.0-erlang",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-erlang-slim",
                  "status": "affected",
                  "version": "v0.18.0-erlang-slim",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-erlang-alpine",
                  "status": "affected",
                  "version": "v0.18.0-erlang-alpine",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-node",
                  "status": "affected",
                  "version": "v0.18.0-node",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-node-slim",
                  "status": "affected",
                  "version": "v0.18.0-node-slim",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-node-alpine",
                  "status": "affected",
                  "version": "v0.18.0-node-alpine",
                  "versionType": "other"
                },
                {
                  "lessThan": "v1.18.0-scratch",
                  "status": "affected",
                  "version": "v1.6.0-scratch",
                  "versionType": "other"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.18.0",
                      "versionStartIncluding": "0.18.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "John Downey"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "John Downey"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "Louis Pilfold"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "Insufficient Verification of Data Authenticity vulnerability in Gleam allows an adversary in the middle to substitute forged Hex package contents during dependency resolution.\u003cp\u003eDuring dependency resolution Gleam fetches package metadata from the signature-verified Hex repository, which covers each release\u0027s dependency requirements and SHA-256 \u003ctt\u003eouter_checksum\u003c/tt\u003e. After resolving versions, \u003ctt\u003egleam_cli::dependencies::lookup_package\u003c/tt\u003e makes a second request to the unsigned Hex API through \u003ctt\u003egleam_core::hex::get_package_release\u003c/tt\u003e and records the \u003ctt\u003eouter_checksum\u003c/tt\u003e and dependency names from that JSON response into \u003ctt\u003emanifest.toml\u003c/tt\u003e, instead of the values from the verified repository metadata. The Hex repository signature does not cover the API response.\u003c/p\u003e\u003cp\u003eAn adversary in the middle who can intercept TLS with a certificate trusted by the Gleam process (for example a TLS-inspecting proxy using a CA in the operating system trust store or added through \u003ctt\u003eGLEAM_CACERTS_PATH\u003c/tt\u003e), and who can modify both the API release response and the corresponding repository tarball, can supply a package archive with a matching forged checksum without the Hex repository signing key. Gleam verifies the forged tarball against the forged checksum, accepts it, and extracts it as a dependency source, resulting in loss of integrity of the downloaded package contents.\u003c/p\u003e\u003cp\u003eOnly projects that resolve or update Hex dependencies are affected, which happens when the manifest is missing, a dependency is added or updated, or dependency requirements change. Builds that reuse an unchanged, known-good \u003ctt\u003emanifest.toml\u003c/tt\u003e continue to verify tarballs against its pinned checksum. This issue affects gleam: from 0.18.0 before 1.18.0.\u003c/p\u003e"
                }
              ],
              "value": "Insufficient Verification of Data Authenticity vulnerability in Gleam allows an adversary in the middle to substitute forged Hex package contents during dependency resolution.\n\nDuring dependency resolution Gleam fetches package metadata from the signature-verified Hex repository, which covers each release\u0027s dependency requirements and SHA-256 outer_checksum. After resolving versions, gleam_cli::dependencies::lookup_package makes a second request to the unsigned Hex API through gleam_core::hex::get_package_release and records the outer_checksum and dependency names from that JSON response into manifest.toml, instead of the values from the verified repository metadata. The Hex repository signature does not cover the API response.\n\nAn adversary in the middle who can intercept TLS with a certificate trusted by the Gleam process (for example a TLS-inspecting proxy using a CA in the operating system trust store or added through GLEAM_CACERTS_PATH), and who can modify both the API release response and the corresponding repository tarball, can supply a package archive with a matching forged checksum without the Hex repository signing key. Gleam verifies the forged tarball against the forged checksum, accepts it, and extracts it as a dependency source, resulting in loss of integrity of the downloaded package contents.\n\nOnly projects that resolve or update Hex dependencies are affected, which happens when the manifest is missing, a dependency is added or updated, or dependency requirements change. Builds that reuse an unchanged, known-good manifest.toml continue to verify tarballs against its pinned checksum. This issue affects gleam: from 0.18.0 before 1.18.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-94",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-94 Adversary in the Middle (AiTM)"
                }
              ]
            },
            {
              "capecId": "CAPEC-185",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-185 Malicious Software Download"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "NETWORK",
                "baseScore": 7.6,
                "baseSeverity": "HIGH",
                "privilegesRequired": "NONE",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "NONE",
                "userInteraction": "PASSIVE",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "HIGH",
                "vulnIntegrityImpact": "HIGH"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-345",
                  "description": "CWE-345 Insufficient Verification of Data Authenticity",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-07-30T04:15:30.182Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/gleam-lang/gleam/security/advisories/GHSA-4vvc-458m-r82g"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-59247.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-59247"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/gleam-lang/gleam/commit/c9c0d48c123c8abae6db8dd61b25ccb427ed3d35"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://github.com/hexpm/specifications/blob/main/registry-v2.md"
            }
          ],
          "source": {
            "discovery": "INTERNAL"
          },
          "title": "Insufficient verification of Hex package metadata in Gleam",
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-59247",
        "datePublished": "2026-07-29T14:24:55.499Z",
        "dateReserved": "2026-07-04T04:24:03.652Z",
        "dateUpdated": "2026-07-30T04:15:30.182Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-65624 (GCVE-0-2026-65624)

    Vulnerability from cvelistv5 – Published: 2026-07-28 10:01 – Updated: 2026-07-29 04:17
    VLAI
    Title
    Cowboy HTTP/1.1 max_headers Bypass via Duplicate Header Names Enables Memory Exhaustion
    Summary
    Allocation of Resources Without Limits or Throttling vulnerability in ninenines cowboy allows an unauthenticated remote attacker to exhaust connection process memory over HTTP/1.1. The HTTP/1.1 handler in cowboy_http enforces the max_headers limit by counting the number of distinct header names in a map (maps:size(Headers)). When a request contains multiple header lines with the same name, the values are concatenated into a single ever-growing binary stored under that one map key (", " for regular headers, "; " for cookies), so the map size stays at one and the max_headers cap (default 100) is never reached. Because no accumulator bounds the total number of header lines or the total byte size of the header block (only per-line max_header_name_length and max_header_value_length apply), an unauthenticated client can send an arbitrary number of header lines with the same name and grow the connection process's binary memory to arbitrary size within the request window. The impact per connection is bounded by request_timeout (default 5 seconds, not reset by header data), and by max_heap_size when set (the offending connection process is killed once its heap grows past the limit). When max_heap_size is left at the default (unset), sustained abuse can drive the Erlang VM into out-of-memory conditions. This issue affects cowboy from 2.0.0-pre.4 before 2.18.0.
    SSVC
    Exploitation: none Automatable: yes Technical Impact: partial
    CISA Coordinator · CISA-ADP (v2.0.3)
    Decision recorded 2026-07-28 12:38 UTC
    CWE
    • CWE-770 - Allocation of Resources Without Limits or Throttling
    Assigner
    EEF
    Impacted products
    Vendor Product Version
    ninenines cowboy Affected: 2.0.0-pre.4 , < 2.18.0 (semver)
        cpe:2.3:a:ninenines:cowboy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    ninenines cowboy Affected: 309780a9fda145c262a47ac7811ffd50a0271c5b , < 3a34d8c1cfd94326466aa16a9017236691dc9c55 (git)
        cpe:2.3:a:ninenines:cowboy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "adp": [
          {
            "metrics": [
              {
                "other": {
                  "content": {
                    "id": "CVE-2026-65624",
                    "options": [
                      {
                        "Exploitation": "none"
                      },
                      {
                        "Automatable": "yes"
                      },
                      {
                        "Technical Impact": "partial"
                      }
                    ],
                    "role": "CISA Coordinator",
                    "timestamp": "2026-07-28T12:38:53.899266Z",
                    "version": "2.0.3"
                  },
                  "type": "ssvc"
                }
              }
            ],
            "providerMetadata": {
              "dateUpdated": "2026-07-28T12:39:27.067Z",
              "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
              "shortName": "CISA-ADP"
            },
            "title": "CISA ADP Vulnrichment"
          }
        ],
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:ninenines:cowboy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "cowboy_http"
              ],
              "packageName": "cowboy",
              "packageURL": "pkg:hex/cowboy",
              "product": "cowboy",
              "programFiles": [
                "src/cowboy_http.erl"
              ],
              "programRoutines": [
                {
                  "name": "cowboy_http:parse_header/3"
                },
                {
                  "name": "cowboy_http:parse_hd_value/6"
                }
              ],
              "repo": "https://github.com/ninenines/cowboy",
              "vendor": "ninenines",
              "versions": [
                {
                  "lessThan": "2.18.0",
                  "status": "affected",
                  "version": "2.0.0-pre.4",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:ninenines:cowboy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "cowboy_http"
              ],
              "packageName": "ninenines/cowboy",
              "packageURL": "pkg:github/ninenines/cowboy",
              "product": "cowboy",
              "programFiles": [
                "src/cowboy_http.erl"
              ],
              "programRoutines": [
                {
                  "name": "cowboy_http:parse_header/3"
                },
                {
                  "name": "cowboy_http:parse_hd_value/6"
                }
              ],
              "repo": "https://github.com/ninenines/cowboy",
              "vendor": "ninenines",
              "versions": [
                {
                  "lessThan": "3a34d8c1cfd94326466aa16a9017236691dc9c55",
                  "status": "affected",
                  "version": "309780a9fda145c262a47ac7811ffd50a0271c5b",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:ninenines:cowboy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "2.18.0",
                      "versionStartIncluding": "2.0.0-pre.4",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Qiyi Deng / Wuhan University"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Min Shi / Wuhan University"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Yongkang Xiao / Wuhan University"
            },
            {
              "lang": "en",
              "type": "finder",
              "value": "Jing Chen / Wuhan University"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Lo\u00efc Hoguin"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling vulnerability in ninenines cowboy allows an unauthenticated remote attacker to exhaust connection process memory over HTTP/1.1.\u003c/p\u003e\u003cp\u003eThe HTTP/1.1 handler in \u003ctt\u003ecowboy_http\u003c/tt\u003e enforces the \u003ctt\u003emax_headers\u003c/tt\u003e limit by counting the number of distinct header names in a map (\u003ctt\u003emaps:size(Headers)\u003c/tt\u003e). When a request contains multiple header lines with the same name, the values are concatenated into a single ever-growing binary stored under that one map key (\u003ctt\u003e\", \"\u003c/tt\u003e for regular headers, \u003ctt\u003e\"; \"\u003c/tt\u003e for cookies), so the map size stays at one and the \u003ctt\u003emax_headers\u003c/tt\u003e cap (default 100) is never reached. Because no accumulator bounds the total number of header lines or the total byte size of the header block (only per-line \u003ctt\u003emax_header_name_length\u003c/tt\u003e and \u003ctt\u003emax_header_value_length\u003c/tt\u003e apply), an unauthenticated client can send an arbitrary number of header lines with the same name and grow the connection process\u0027s binary memory to arbitrary size within the request window.\u003c/p\u003e\u003cp\u003eThe impact per connection is bounded by \u003ctt\u003erequest_timeout\u003c/tt\u003e (default 5 seconds, not reset by header data), and by \u003ctt\u003emax_heap_size\u003c/tt\u003e when set (the offending connection process is killed once its heap grows past the limit). When \u003ctt\u003emax_heap_size\u003c/tt\u003e is left at the default (unset), sustained abuse can drive the Erlang VM into out-of-memory conditions.\u003c/p\u003e\u003cp\u003eThis issue affects cowboy from 2.0.0-pre.4 before 2.18.0.\u003c/p\u003e"
                }
              ],
              "value": "Allocation of Resources Without Limits or Throttling vulnerability in ninenines cowboy allows an unauthenticated remote attacker to exhaust connection process memory over HTTP/1.1.\n\nThe HTTP/1.1 handler in cowboy_http enforces the max_headers limit by counting the number of distinct header names in a map (maps:size(Headers)). When a request contains multiple header lines with the same name, the values are concatenated into a single ever-growing binary stored under that one map key (\", \" for regular headers, \"; \" for cookies), so the map size stays at one and the max_headers cap (default 100) is never reached. Because no accumulator bounds the total number of header lines or the total byte size of the header block (only per-line max_header_name_length and max_header_value_length apply), an unauthenticated client can send an arbitrary number of header lines with the same name and grow the connection process\u0027s binary memory to arbitrary size within the request window.\n\nThe impact per connection is bounded by request_timeout (default 5 seconds, not reset by header data), and by max_heap_size when set (the offending connection process is killed once its heap grows past the limit). When max_heap_size is left at the default (unset), sustained abuse can drive the Erlang VM into out-of-memory conditions.\n\nThis issue affects cowboy from 2.0.0-pre.4 before 2.18.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-130",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-130 Excessive Allocation"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "attackVector": "NETWORK",
                "baseScore": 6.9,
                "baseSeverity": "MEDIUM",
                "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N",
                "version": "4.0"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-770",
                  "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-07-29T04:17:22.788Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "related",
                "third-party-advisory"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-65624.html"
            },
            {
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-65624"
            },
            {
              "tags": [
                "patch"
              ],
              "url": "https://github.com/ninenines/cowboy/commit/3a34d8c1cfd94326466aa16a9017236691dc9c55"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Cowboy HTTP/1.1 max_headers Bypass via Duplicate Header Names Enables Memory Exhaustion",
          "x_generator": {
            "engine": "cvelib 1.8.0"
          }
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-65624",
        "datePublished": "2026-07-28T10:01:01.811Z",
        "dateReserved": "2026-07-22T13:55:59.401Z",
        "dateUpdated": "2026-07-29T04:17:22.788Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }