Tag: high

  • GHSA-f9j6-8p6x-r9j6: SD JWT JS: Tampered disclosures silently dropped instead of rejected

    • Severity: HIGH
    • CVE: CVE-2026-62374
    • Ecosystems: npm, npm
    • Packages: @sd-jwt/decode, @sd-jwt/core

    ## Summary

    When one Disclosure in an SD-JWT presentation is tampered so its digest no longer matches the Issuer-signed `_sd` array, `@sd-jwt/decode` 0.19.0 does **not** reject the presentation. It silently drops the unmatched Disclosure and returns a **reduced claim set**, reporting success. The Issuer signature is untouched and valid.

    This is a downgrade/omission primitive. A malicious or curious **holder** can present a tampered Disclosure and have the relying party receive *fewer* claims than the credential carries, with no error surfaced. Where the relying party does **not** enforce key binding, an **in-transit (on-path) attacker** can achieve the same by mangling one Disclosure’s bytes; where key binding **is** enforced, on-path tampering instead breaks the holder’s KB-JWT `sd_hash` binding (so it is rejected), and the downgrade is then exercisable by the key-bound holder — confirmed end-to-end with KB required.

    Two distinct tampering inputs converge on the same silent-drop sink:

    1. **Genuinely non-decodable Disclosure** (broken base64url -> bytes that are not valid UTF-8, e.g. an injected `0xF2` lead byte). RFC 9901 §7.1 step 3 / §4.2.1 require rejection. `@sd-jwt/decode` instead **lossy-decodes** it: the `TextDecoder`/`Buffer` path substitutes U+FFFD (REPLACEMENT CHARACTER) for the invalid byte and recovers a syntactically valid disclosure (the `salt` gains a U+FFFD, claim `family_name` = `”Smith”`). The recovered Disclosure then hashes to a digest **absent** from…

    Source: GitHub Security Advisories · 2026-11-02

  • GHSA-8fmv-6rg5-5924: Kubeflow Pipelines: Pipeline archive upload allows decompression bomb to exhaust server memory

    • Severity: HIGH
    • CVE: CVE-2026-118761
    • Ecosystems: go, go
    • Packages: github.com/kubeflow/pipelines, github.com/kubeflow/pipelines

    ## Summary

    The Kubeflow Pipelines API server decompresses uploaded pipeline archives without adequately bounding expanded data in affected versions. A small ZIP or gzip-compressed tar archive can consume disproportionately large amounts of memory while the server locates or reads the pipeline file, potentially exhausting API-server resources and interrupting service.

    Multipart pipeline and pipeline-version upload processing decompresses the archive before namespace authorization, so a caller who can reach those endpoints does not need a successful pipeline-create authorization decision to trigger the issue. External authentication and network controls can restrict reachability. URL-import handlers authorize before fetching and decompressing a remote archive.

    The amount of expansion needed to exhaust memory depends on deployment resource limits and concurrent activity; no particular archive is guaranteed to crash every deployment.

    ## Remediation

    Upgrade the API server to **[Kubeflow Pipelines 2.18.0](https://github.com/kubeflow/pipelines/releases/tag/2.18.0)**. Versions through 2.17.3 are affected; the first affected release has not been established.

    [PR #14171](https://github.com/kubeflow/pipelines/pull/14171) bounds compressed input and extracted pipeline data. [PR #14186](https://github.com/kubeflow/pipelines/pull/14186) strengthens the total tar traversal budget, including metadata and skipped entries. The 2.18 release also includes configurable upload and specificat…

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-wg5q-x4j9-qm54: Kubeflow Pipelines: Run-log endpoint permits unauthorized access to pod logs

    • Severity: HIGH
    • CVE: CVE-2026-118759
    • Ecosystems: go, go
    • Packages: github.com/kubeflow/pipelines, github.com/kubeflow/pipelines

    ## Summary

    The Kubeflow Pipelines API server’s `GET /apis/v1alpha1/runs/{run_id}/nodes/{node_id}/log` handler retrieves logs without authorizing the caller against the selected run. A caller who can reach the backend and knows a victim run ID and a suitable pod or node identifier can read live or archived logs using the API server’s permissions.

    For live logs, the vulnerable handler also accepts the supplied node ID as a pod name in the run’s namespace without verifying that the pod belongs to the run. Depending on the API server’s pod-log permissions, a known run ID can therefore permit reading the `main` container logs of an unrelated pod in that namespace. Logs may contain sensitive workload data or credentials.

    The affected handler does not authenticate the request itself. An external authentication gate or network policy can restrict reachability; public ingress exposure and unauthenticated enumeration of run IDs are not assumed.

    ## Remediation

    Upgrade the API server to **[Kubeflow Pipelines 2.18.0](https://github.com/kubeflow/pipelines/releases/tag/2.18.0)**. Versions through 2.17.3 are affected; the first affected release has not been established.

    [PR #13684](https://github.com/kubeflow/pipelines/pull/13684) authorizes the caller with the `readLog` verb before retrieving live or archived logs. For live logs, it also verifies that the pod’s `pipeline/runid` label matches the requested run. Custom Kubernetes roles must grant `readLog` on `runs` in the `pipelines.ku…

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-5849-834g-hvw5: pypdf has possible infinite loop when hitting EOF in standard xref table during trailer search

    • Severity: HIGH
    • CVE: CVE-2026-119203
    • Ecosystems: pip
    • Packages: pypdf

    ### Impact

    An attacker who uses this vulnerability can craft a PDF which leads to an infinite loop. This requires opening an incomplete file without a `trailer`.

    ### Patches

    This has been fixed in [pypdf==6.21.4](https://github.com/py-pdf/pypdf/releases/tag/6.21.4).

    ### Workarounds

    If you cannot upgrade yet, consider applying the changes from PR [#4289](https://github.com/py-pdf/pypdf/pull/4289).

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-cggf-277g-3q54: pypdf has possible large memory usage when parsing page tree

    • Severity: HIGH
    • CVE: CVE-2026-119204
    • Ecosystems: pip
    • Packages: pypdf

    ### Impact

    An attacker who uses this vulnerability can craft a PDF which leads to large memory usage. This requires parsing the page tree with many shared resources.

    ### Patches

    This has been fixed in [pypdf==6.21.4](https://github.com/py-pdf/pypdf/releases/tag/6.21.4).

    ### Workarounds

    If you cannot upgrade yet, consider applying the changes from PR [#4290](https://github.com/py-pdf/pypdf/pull/4290).

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-mfr5-77xh-9j7h: pypdf has possible infinite loop when cloning dictionaries

    • Severity: HIGH
    • CVE: CVE-2026-119205
    • Ecosystems: pip
    • Packages: pypdf

    ### Impact

    An attacker who uses this vulnerability can craft a PDF which leads to an infinite loop. This requires cloning/duplicating a `DictionaryObject`.

    ### Patches

    This has been fixed in [pypdf==6.21.4](https://github.com/py-pdf/pypdf/releases/tag/6.21.4).

    ### Workarounds

    If you cannot upgrade yet, consider applying the changes from PR [#4288](https://github.com/py-pdf/pypdf/pull/4288).

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-4528-x5fx-h6hg: joi: quadratic-time split in `string().email({ multiple: true })` allows denial of service

    • Severity: HIGH
    • CVE: CVE-2026-118772
    • Ecosystems: npm, npm, npm
    • Packages: joi, @hapi/joi, joi

    ### Summary

    `Joi.string().email({ multiple: true })` takes quadratic time to split a value that contains a long run of whitespace. One request with 100 KB of spaces blocks the Node.js event loop for several seconds, which causes a denial of service.

    ### Details

    When the `multiple` option is set, the `email` rule splits the value into addresses with a regular expression that removes whitespace on each side of the separator:

    “`js
    const regex = new RegExp(`\\s*[${options.separator ? escapeRegex(options.separator) : ‘,’}]\\s*`);
    // …
    const emails = options.multiple ? value.split(regex) : [value];
    “`

    `String.prototype.split` tries a match at each position of the value. At each position inside a whitespace run, the leading `\s*` reads the rest of the run, does not find a separator, and backtracks through all of it. A run of `n` whitespace characters without a separator therefore costs `n²` steps. This applies to the default separator and to all custom `separator` values.

    The fix lets the leading whitespace match start only at the beginning of a whitespace run, so the split is linear:

    “`js
    const regex = new RegExp(`(?:(?

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-8494-f6mr-cjpv: @hapi/content: quadratic-time parsing of Content-Disposition parameters allows denial of service

    • Severity: HIGH
    • CVE: CVE-2026-119202
    • Ecosystems: npm, npm
    • Packages: @hapi/content, content

    ### Summary

    `Content.disposition()` takes quadratic time when a `Content-Disposition` parameter contains a long token without `=`. One unauthenticated multipart request can block the Node.js event loop for several minutes.

    ### Details

    `Content.disposition()` reads the parameters with a global regular expression in `String.prototype.replace()`:

    “`js
    /([^\=\*\s]+)(\*)?\s*\=\s*(?:([^;’”\s]+\'[\w-]*\'[^;\s]+)|(?:\”([^”]*)\”)|([^;\s]*))/g
    “`

    The parameter name part `([^\=\*\s]+)` has no anchor. When a run of name characters has no `=` after it, the match attempt reads the full run and fails. The global scan then starts again at the next character and reads the remaining run again. The total time is proportional to the square of the run length.

    `@hapi/pez` calls `Content.disposition()` on the header of every part in a `multipart/form-data` body. In hapi, this occurs on each route with `payload.multipart` enabled, before the route handler and before any validation. The only size limit is the route `payload.maxBytes`, which is 1 MB by default.

    The fix adds an alternative that matches the full run of name characters when no `=` follows it. The scan then continues after the run, and the callback ignores this match. A match attempt that starts later in the same run always fails in the same way, so the parse result does not change. The parse time is now linear.

    “`js
    /([^\=\*\s]+)(\*)?\s*\=\s*(?:([^;’”\s]+\'[\w-]*\'[^;\s]+)|(?:\”([^”]*)\”)|([^;\s]*))|[^\=\*\s]+/g
    “`

    Every rel…

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-c73q-w75p-j82v: Authlib RFC 7592 examples omit registration-access-token client binding

    • Severity: HIGH
    • CVE: CVE-2026-116672
    • Ecosystems: pip
    • Packages: Authlib

    ## Description

    ### Summary

    RFC 7592 (OAuth 2.0 Dynamic Client Registration Management Protocol) lets a previously registered client read, update, or delete its own registration, authenticated by a `registration_access_token` issued specifically to that client at registration time. The entire security model of this protocol depends on the server verifying that the token presented in the request actually belongs to the client identified in the request, not merely that the token is valid for some client.

    Authlib’s `ClientConfigurationEndpoint` implements the control flow correctly in structure, calling `authenticate_token`, then `authenticate_client`, then `check_permission`, and treats all three as abstract methods that “Developers MUST implement in subclass.” The problem is that the documented example implementations for these methods, taken together exactly as written, never perform the one check that matters: binding the authenticated token to the specific client being accessed. A developer who implements these methods by following the provided examples ends up with a complete authorization bypass on this endpoint.

    ### Details

    `authenticate_client`’s documented example (`authlib/oauth2/rfc7592/endpoint.py`):

    “`python
    def authenticate_client(self, request):
    “””Read a client from the request payload.
    Developers MUST implement this method in subclass::

    def authenticate_client(self, request):
    client_id = request.payload.data.get(“client_id”)
    return Client.get(client…

    Source: GitHub Security Advisories · 2026-10-30

  • GHSA-42gh-23hr-vphw: pypdf has possible long runtimes when retrieving page labels

    • Severity: HIGH
    • CVE: CVE-2026-119206
    • Ecosystems: pip
    • Packages: pypdf

    ### Impact

    An attacker who uses this vulnerability can craft a PDF which leads to large runtimes. This requires retrieving the page labels of a file.

    ### Patches

    This has been fixed in [pypdf==6.21.3](https://github.com/py-pdf/pypdf/releases/tag/6.21.3).

    ### Workarounds

    If you cannot upgrade yet, consider applying the changes from PR [#4251](https://github.com/py-pdf/pypdf/pull/4251).

    Source: GitHub Security Advisories · 2026-10-30