# Recent vulnerabilities from OSV Haskell λ

## [hsec-2026-0010](https://vulnerability.circl.lu/vuln/hsec-2026-0010)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0010.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0010.json"
      },
      "ecosystem_specific": {
        "affected_api": [
          {
            "module": "Web.JWT",
            "name": "decode"
          },
          {
            "module": "Web.JWT",
            "name": "decodeAndVerifySignature"
          }
        ]
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "jwt"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1.0"
            },
            {
              "fixed": "0.12.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:N/I:L/A:N/E:P/RL:W/RC:C/IR:H/MAV:N/MAC:H/MPR:N/MUI:N/MS:C/MC:N/MI:L/MA:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Improper parsing of fractional `NumericDate` from JWT `exp` claims\n\nSince its [initial commit][], package jwt uses [`Data.Scientific.coefficient`][scientific] to extract the fractional mantissa in a way that improperly *discards the exponent*. This can lead to incorrect parsing of the `exp` claim in JWT payload body.\n\nPoC:\n\n```haskell\ncabal repl --build-depends jwt==0.11.0\n\nimport Web.JWT\n:set -XOverloadedStrings\n\nlet signer = VerifyHMACSecret \"dummy-signing-symmetric-hmac-key.not-so-secret\"\nlet exploit = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhvbmVzdCBKb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNzkwMTY2Nzg2LCJleHAiOjE3OTAxNzAzODYuMDAwMX0.xQyl3rBYtVTxPL_VXSawSSmZkuF4MzOkzwdQGJFjE2o\"\n-- {\n--   \"sub\": \"1234567890\",\n--   \"name\": \"Honest Joe\",\n--   \"admin\": true,\n--   \"iat\": 1790166786,\n--   \"exp\": 1790170386.0001\n-- }\nλλ ➔ Just whoops = Web.JWT.decodeAndVerifySignature signer exploit\nλ\nλλ ➔ whoops\nVerified (JOSEHeader {typ = Just \"JWT\", cty = Nothing, alg = Just HS256, kid = Nothing}) (JWTClaimsSet {iss = Nothing, sub = Just 1234567890, aud = Nothing, exp = Just (NumericDate 17901703860001), nbf = Nothing, iat = Just (NumericDate 1790166786), jti = Nothing, unregisteredClaims = ClaimsMap {unClaimsMap = fromList [(\"admin\",Bool True),(\"name\",String \"Honest Joe\")]}}) (Signature \"xQyl3rBYtVTxPL_VXSawSSmZkuF4MzOkzwdQGJFjE2o\")\nλ\nλλ ➔ fmap secondsSinceEpoch . Web.JWT.iat . claims $ whoops\nJust 1790166786s\nλ\nλλ ➔ fmap secondsSinceEpoch . Web.JWT.exp . claims $ whoops\nJust 17901703860001s\n```\n\nThe encoded claim `exp = 1790170386.0001` is:\n1. Explicitly allowed by RFC 7519 [section 2][rfc-2] to contain fractional part (*\"... non-integer values can be represented.\"*);\n2. Decodes correctly as `2026-09-23T12:33:06.0001` (including in JS implementations on jwt.io & token.dev);\n3. Decodes incorrectly as `569252-05-30T12:40:01`  (== posix epoch `17901703860001`) by the `jwt` library.\n   ```\n   >>> import Data.Time.Format.ISO8601\n   >>> import Data.Time.Clock.POSIX\n   >>>\n   >>> iso8601Show $ posixSecondsToUTCTime 1790166786\n   \"2026-09-23T12:33:06Z\"\n   >>>\n   >>> iso8601Show $ posixSecondsToUTCTime 17901703860001\n   \"569252-05-30T12:40:01Z\"\n   ```\nThis happens because jwt's `instance FromJSON NumericDate` only extracts the parsed `coefficient` while ignoring [`base10Exponent`][scientific], which in this case becomes negative non-zero.\n\nSince the standard `exp` claim carries credential expiration time:\n\n>  ### [4.1.4][rfc-4.1.4].  \"exp\" (Expiration Time) Claim\n> \n>    The \"exp\" (expiration time) claim identifies the expiration time on\n>    or after which the JWT MUST NOT be accepted for processing.  The\n>    processing of the \"exp\" claim requires that the current date/time\n>    MUST be before the expiration date/time listed in the \"exp\" claim.\n\n— this parsing mistake of dropping the exponent can have security-relevant consequences, should an attacker be able to forge JWTs with fractional expiry dates and get them fed into software that uses the `jwt` library for consuming JWTs.\n\n[initial commit]: https://github.com/puffnfresh/haskell-jwt/commit/76567342c71f62f3f7554da8987579d90e532209\n[rfc-2]: https://www.rfc-editor.org/info/rfc7519/#section-2\n[rfc-4.1.4]: https://www.rfc-editor.org/info/rfc7519/#section-4.1.4\n[scientific]: https://hackage-content.haskell.org/package/scientific-0.3.8.1/docs/Data-Scientific.html#g:2\n",
  "id": "HSEC-2026-0010",
  "modified": "2026-09-29T14:22:37Z",
  "published": "2026-09-29T14:22:37Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://github.com/puffnfresh/haskell-jwt/issues/4"
    },
    {
      "type": "FIX",
      "url": "https://github.com/puffnfresh/haskell-jwt/pull/10"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Improper parsing of fractional NumericDate from JWT exp claims"
}
```

## [hsec-2026-0008](https://vulnerability.circl.lu/vuln/hsec-2026-0008)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0008.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "crypton-x509-validation"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.6.12"
            },
            {
              "fixed": "1.9.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0008.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "crypton-x509"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.7.6"
            },
            {
              "fixed": "1.9.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0008.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "x509-validation"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.4.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0008.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "x509"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.4.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-9648"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# crypton-x509-validation and crypton-x509 do not enforce X.509 Name Constraints\n\nThe `crypton-x509-validation` and `crypton-x509` libraries did not\nenforce the X.509 Name Constraints extension during certificate\nvalidation. The Name Constraints extension is a critical X.509\nextension that restricts the namespace (permitted and excluded\nsubtrees) for which a CA is authorized to issue certificates.\n\nWithout this enforcement, a TLS client would accept certificates with\nSubject Alternative Names (SANs) that fall outside the issuing CA's\npermitted subtrees. An attacker with access to a name-constrained\nsub-CA's private key could therefore issue certificates for domains\noutside the sub-CA's intended scope, enabling impersonation of\narbitrary domains and man-in-the-middle attacks on TLS connections.\n\nThe older `x509` and `x509-validation` packages are also affected but\nare no longer maintained and have no fix available.\n\nThis issue was fixed in `crypton-x509-validation-1.9.1` and\n`crypton-x509-1.9.1`.\n",
  "id": "HSEC-2026-0008",
  "modified": "2026-06-03T13:30:48Z",
  "published": "2026-06-03T13:30:48Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.kb.cert.org/vuls/id/862559"
    },
    {
      "type": "FIX",
      "url": "https://github.com/kazu-yamamoto/crypton-certificate/pull/30"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "crypton-x509-validation and crypton-x509 do not enforce X.509 Name Constraints"
}
```

## [hsec-2026-0007](https://vulnerability.circl.lu/vuln/hsec-2026-0007)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0007.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "aeson"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.12.0.0"
            },
            {
              "fixed": "2.2.5.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0007.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "text-iso8601"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            },
            {
              "fixed": "0.1.1.2"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Denial of Service and Memory Exhaustion in aeson\n\nA Denial of Service (DoS) and memory exhaustion vulnerability was identified in the `aeson` package. The vulnerability allows an attacker to exhaust server memory and crash the host process by supplying maliciously crafted JSON payloads.\n\nThe vulnerability exists in `aeson`'s `withBoundedScientific_` function (located in `src/Data/Aeson/Types/FromJSON.hs`). The exponent bounds check only rejects large positive exponents (`exp10 > 1024`) but fails to reject arbitrarily large negative exponents.\n\nWhen an attacker sends a JSON number with a massive negative exponent (e.g., `1e-999999999`), the value bypasses the check and flows into `realToFrac`, which computes `fromRational . toRational`. For such a large negative exponent, `toRational` produces a GMP Integer with approximately 1 billion decimal digits, causing immediate and severe memory exhaustion.\n\nAffected `FromJSON` instances:\n\n* `Fixed a` (including `Centi`, `Pico`, `Nano`, etc.)\n* `NominalDiffTime`\n* `DiffTime`\n\n## Resolution\n\nThe issue was resolved by introducing proper bounds checks:\n\n- `aeson` now applies an absolute bounds check to both positive and negative exponents (`abs exp10 > 1024`).\n\nThe fix first shipped in `aeson-2.3.0.0`, and have been backported to the previous release series as `aeson-2.2.5.1`.\n\nUsers are strongly advised to update to the patched versions:\n\n* `aeson-2.2.5.1` or later\n\n## Acknowledgements\n\nThe vulnerabilities were reported Nathan Walsh, and patched by Li-yao Xia.\n",
  "id": "HSEC-2026-0007",
  "modified": "2026-05-22T07:02:58Z",
  "published": "2026-05-22T07:02:58Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/haskell/aeson/commit/42775f45ff8dad934d44617f6f38ee874e1c9df1"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/aeson/commit/b6fb54b11ebf3e499685c4eeb2714ead522252cc"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Denial of Service and Memory Exhaustion in aeson"
}
```

## [hsec-2026-0006](https://vulnerability.circl.lu/vuln/hsec-2026-0006)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0006.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0006.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "Cabal"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "2.2"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Cabal deletes project source files during configure\n\nThe `checkDuplicateHeaders` function in `Distribution.Simple.Configure` removes\nheader files from the source directory when a header with the same name exists in\nboth the build directory and the source directory.\n\nThis behavior was introduced in commit `3a9830b` to resolve header precedence\nissues, as C compilers prefer relative includes over `-I` search paths. The\nworkaround uses `removeFile` on source directory files, which is destructive and\nshould not happen during a build process.\n\nWhile the current implementation does not follow symlinks explicitly, the\ndeletion of source files outside of the project  during a build operation is\npossible on Microsoft Windows.\n",
  "id": "HSEC-2026-0006",
  "modified": "2026-04-08T14:23:27Z",
  "published": "2026-04-08T14:23:27Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://github.com/haskell/cabal/issues/11176"
    },
    {
      "type": "INTRODUCED",
      "url": "https://github.com/haskell/cabal/commit/3a9830bbdabef2f1009a69957966b778c7c1a9ee"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Cabal deletes project source files during configure"
}
```

## [hsec-2026-0004](https://vulnerability.circl.lu/vuln/hsec-2026-0004)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0004.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0004.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "hackage-server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:L",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-40472"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Hackage package metadata stored XSS vulnerability\n\nUser-controlled metadata from `.cabal` files are rendered into HTML\n`href` attributes without proper sanitization, enabling stored\nCross-Site Scripting (XSS) attacks.  The specific fields affected\nare:\n\n- `homepage`\n- `bug-reports`\n- `source-repository.location`\n- `description` (Haddock hyperlinks)\n\nThe Haskell Security Response Team audited the entire corpus of\n**published** packages on `hackage.haskell.org`—all published\npackage versions but *not* candidates.  No exploitation attempts\nwere detected.\n\nTo fix the issue, *hackage-server* now inspects target URIs and only\nproduces a hyperlink when the URI has an approved scheme: `http`,\n`https`, and (only for some fields) `mailto`.\n\nThe fix has been [committed][commit] and deployed on\n`hackage.haskell.org`.  Other operations of *hackage-server*\ninstances should update as soon as possible to commit\n`2de3ae45082f8f3f29a41f6aff620d09d0e74058` or later.\n\n## Acknowledgements\n\n- **Joshua Rogers** (https://joshua.hu/) of AISLE\n  (https://aisle.com/) reported the issue to the Haskell Security\n  Response Team.\n- **Fraser Tweedale** implemented the fix.\n- **Gershom Bazerman** merged the fix and deployed it to\n  `hackage.haskell.org`.\n\n[commit]: https://github.com/haskell/hackage-server/commit/2de3ae45082f8f3f29a41f6aff620d09d0e74058\n",
  "id": "HSEC-2026-0004",
  "modified": "2026-03-28T16:05:12Z",
  "published": "2026-03-28T16:05:12Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/haskell/hackage-server/commit/2de3ae45082f8f3f29a41f6aff620d09d0e74058"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Hackage package metadata stored XSS vulnerability"
}
```

## [hsec-2026-0002](https://vulnerability.circl.lu/vuln/hsec-2026-0002)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2026/HSEC-2026-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2026/HSEC-2026-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "hackage-server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-40471"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Hackage CSRF vulnerability\n\n* Vulnerable File: `src/Distribution/Server/Features/Votes.hs` (example)\n* Impact: can forge requests through XSS\n\nhackage-server lacked Cross-Site Request Forgery (CSRF) protection\nacross its endpoints.  Scripts on foreign sites could trigger\nrequests to hackage server, possibly abusing latent credentials to\nupload packages or perform other administrative actions.  Some\nunauthenticated actions could also be abused (e.g. creating new user\naccounts).\n\nTo fix the issue, a new CSRF middleware checks all requests.\nRequests using HTTP methods other than `GET`, `HEAD` and `OPTIONS`\nare subject to a check of the [`Sec-Fetch-Site`\nheader][sec-fetch-site], which is [widely supported by modern\nbrowsers][caniuse-sec-fetch-site].  Cross-site requests are `403\nForbidden`.  Certain approved and expected non-browser user agents\n(e.g. `cabal-install/*`) are exempted from the check, as are\nrequests using token authentication (`Authorization: X-ApiKey ...`).\n\nThe fix has been [committed][commit] and deployed on\n`hackage.haskell.org`.\n\n## Acknowledgements\n\n- **Joshua Rogers** (https://joshua.hu/) of AISLE\n  (https://aisle.com/) reported the issue to the Haskell Security\n  Response Team.\n- **Spenser Janssen** implemented the fix, and **Fraser Tweedale**\n  reviewed it.\n- **Gershom Bazerman** merged the fix and deployed it to\n  `hackage.haskell.org`.\n\n[sec-fetch-site]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Sec-Fetch-Site\n[caniuse-sec-fetch-site]: https://caniuse.com/?search=sec-fetch-site\n[commit]: https://github.com/haskell/hackage-server/commit/2de3ae45082f8f3f29a41f6aff620d09d0e74058\n",
  "id": "HSEC-2026-0002",
  "modified": "2026-03-28T16:04:58Z",
  "published": "2026-03-28T16:04:58Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/haskell/hackage-server/commit/2de3ae45082f8f3f29a41f6aff620d09d0e74058"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Hackage CSRF vulnerability"
}
```

## [hsec-2024-0004](https://vulnerability.circl.lu/vuln/hsec-2024-0004)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0004.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0004.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "hackage-server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            },
            {
              "fixed": "0.6"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:L",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-40470"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Hackage package and doc upload stored XSS vulnerability\n\n*Author: Fraser Tweedale (Haskell SRT)*\n\n## Executive summary\n\nA **critical XSS vulnerability** affected *hackage-server* and\n`hackage.haskell.org`.  HTML and JavaScript files provided in source\npackages or via the documentation upload facility were served\n*as-is* on the main `hackage.haskell.org` domain.  As a consequence,\nwhen a user with latent HTTP credentials browses to the package\npages or documentation uploaded by a malicious package maintainer,\ntheir **session can be hijacked** to upload packages or\ndocumentation, amend maintainers or other package metadata, or\nperform any other action the user is authorised to do.\n\nThis issue was discovered and reported to the Haskell Security\nResponse Team (SRT) in June 2024.  Remediations were progressively\ndeveloped and deployed throughout 2025.  **The known issues have\nbeen fully mitigated on `hackage.haskell.org` as of January 2026.**\n\nThe mitigations involve serving user content from a sister domain.\nIn the case of `hackage.haskell.org`, this domain is\n`hackage-content.haskell.org`.\n\nOperators of other *hackage-server* instances should update to the\n`master` branch from the upstream repository\n(https://github.com/haskell/hackage-server; commit\n`9a1887607d9b8d1a3b8b02c990ee144c0d402b79` or later), and configure\nthe user content domain (new flag `--user-content-uri`).\n\n## Scope of the issue\n\n### Package documentation uploads\n\nAny Hackage user can upload documentation bundles for the packages\nthey own.  Typically those are prepared by Haddock, but they may be\ncustomised or modified.  Malicious code can be delivered in several\nways:\n\n- In JavaScript files loaded by an HTML page;\n- In `<script>` tags on an HTML page;\n- In action attributes (e.g. `onclick`) on an HTML page.\n\n### `quick-jump` JavaScript\n\nIn addition to the supplied HTML pages, parts of the uploaded\ndocumentation bundle are referenced from the main package page (and\ncandidate pages)—in particular, `quick-jump.min.js`, which\nimplements the \"quick jump\" feature, and the corresponding CSS file\n(CSS can also present an XSS risk).  These files are included by the\nfollowing templates:\n\n- `datafiles/templates/Html/package-page.html.st`\n- `datafiles/templates/Html/candidate-page.html.st`\n\nIt is loaded via a `<script>` tag:\n\n```html\n<script src=\"$doc.baseUrl$/quick-jump.min.js\" type=\"text/javascript\"></script>\n```\n\n### Source tarball browsing\n\nHTML content in the source package is served as `text/html` or\n`application/xhtml+xml`, depending on file extension.  The browser\nrenders the page and executes scripts without restriction.  The same\nscope of exploitation arises as for documentation uploads.\n\n\n## Impact\n\nMalicious scripts can use latent HTTP credentials in the browser to\nperform any action the user is authorised to do, **without user\ninteraction**.  This could include uploading new package versions,\nediting packaging metadata, adding new maintainers, and more.\n\nAdditionally, malicious scripts and HTML could present a counterfeit\nlogin form to the user, tricking the user into divulging their\ncredentials.  The script can then abuse the credentials in the same\nway as the latent credential scenario.\n\n- CVSS vector string: **CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:L**\n- CVSS score: **9.9 (Critical)**\n\n\n## Mitigations\n\nThis section describes the code and configuration changes to\nmitigate the issues.\n\n\n### User content domain\n\n*hackage-server* was updated to serve user-uploaded content from a\nseparate DNS domain.  This includes package documentation (excluding\nthe main package description) and source tarball browsing, for both\npublished and candidate packages.\n\nFor the relevant resources, requests on the main domain are\nredirected to the user content domain via an HTTP 301 (\"Moved\nPermanently\") response status.\n\nDoc and source tarballs uploaded prior to the deployment of these\nmitigations are exempted from the redirection, and remain accessible\nvia the main domain (this may be changed in the future).\n\nAlternative approaches considered:\n\n- Serving HTML from the source tarball with `Content-Type:\n  text/plain` would prevent the browser from interpreting them as\n  HTML and executing inline or referenced scripts.  But several\n  packages have custom doc bundles uploaded, offering a rich\n  documentation experience to their users.  Therefore, changing this\n  behaviour would surprise and probably disappoint many users.\n\n\n### quick-jump: reject unrecognised JavaScript and CSS\n\nA small number of versions of `quick-jump.min.js` and\n`quick-jump.css` have appeared in official releases of of the\nHaddock documentation builder program.  *hackage-server* matches the\nSHA-256 digests of the files in the doc bundle against the list of\n\"known good\" files.  If there is no match, *hackage-server* refuses\nto serve the file (403 Forbidden).\n\nThe digest lists are currently hard-coded; the initial values are\nmentioned at the end of this document.  The list needs to be updated\nwhenever the official Haddock quick-jump implementation changes.\n\nAlternative approaches considered:\n\n- Using [*Subresource Integrity (SRI)*][spec-SRI] to limit to\n  known-good hashes.  This would require the same amount of\n  development and maintenance overhead whilst depending on browser\n  implementation for enforcement.\n\n- Ignoring the quick-jump implementation from the doc bundle and\n  serving a single \"golden\" implementation for all packages.\n  Because quick-jump reads the generated `doc-index.json` this\n  approach ran the risk of breaking the feature on older (or newer)\n  uploads if the format of the file changes.  Formally specifying\n  the `doc-index.json` would allow the quick-jump feature to be\n  evolved and improved to bring benefits to all packages and reduce\n  security risks.\n\nThere was considerable debate between the digest allow-list and\n\"golden\" approaches.  The *hackage-server* maintainers had the final\nsay, and the SRT is satisfied that the chosen approach resolves the\nsecurity issues.\n\n[spec-SRI]: https://www.w3.org/TR/SRI/\n\n\n## Acknowledgements\n\n- **Zubin Duggal** reported the issue in documentation uploads.\n- **Duncan Coutts** noticed that the issue also affects source\n  tarball browsing.\n- **Gershom Bazerman** and **Janus Troelsen** implemented the\n  mitigations, and Gershom handled redeploys of the\n  `hackage.haskell.org` service.\n- **Fraser Tweedale** verified and analysed the issue, and\n  coordinated the security response.\n\n## Appendix A.1.  Known-good variants of `quick-jump.min.js`\n\nThis appendix records known variants of `quick-jump.min.js` from the\nGHC and Haddock repositories.  The commit ID, Git object (short) ID,\nand SHA-256 digests are noted.  The SHA-256 digests can be used with\nSubresource Integrity (SRI) or server-side checks to prevent\ndelivery or execution of unrecognised script content.\n\n### From `https://gitlab.haskell.org/ghc/haddock.git`—`master` branch\n\n```\ncommit: e99aefb50ca63e2dbcc95841efbb53cea90151d8 (Sep 23 2017)\nobject: c9f2b445b9\nsha256: e1da96b0d7ab3d72cfe3786def923c5af91ba331858852f1f43a1acfc5ee6966\n\ncommit: 8e88615a23a9f1980a55bd1b3ef9dcc938d95237 (Oct 10 2017)\nobject: cb24f8bdea\nsha256: a273a3ef19c21032afc5f65d1e09933146f183da906ca9d0b4c285095539e0e7\n\ncommit: b4982d87f41d9a4d3f6237bacfd819145723e35b (Oct 30 2017)\nobject: f22f8f2881\nsha256: 8aed621ac2b746751585cbe271631394cacc0e01cca4ef589e11b077b0acd291\n\ncommit: 93c1e6eb9e829a66ff213ec076d529ab008880b3 (Dec 16 2017)\nobject: bfdf04a372\nsha256: 4b10c18a7ad35f032e8cdc0d263716a93878bf06d998b1b66dccff06ceeee89d\n\ncommit: 59812a09eb69cbf12407206381f4c214987b1efd (Apr 3 2018)\nobject: c03e083607\nsha256: ce86bba43edb0534c0faa2d6d0f504877576c5271321e3fbd9638fd4667384a2\n\ncommit: a69311708493efe8524aed0e9d19365f79f2fab3 (Oct 24 2018)\nobject: 06c35c7454\nsha256: 548d676b3e5a52cbfef06d7424ec065c1f34c230407f9f5dc002c27a9666bec4\n```\n\n### From `https://gitlab.haskell.org/ghc/ghc.git`—`master` branch\n\nNote: all of the *objects* listed above also occur in the GHC repo,\nbut the commit history is different (as expected).\n\n```\ncommit: 7776566531e72c415f66dd3b13da9041c52076aa (Nov 13 2019)\nobject: 0b0eeb27d1\nsha256: 7ca43fc2058574846e032bc5493a0ad4568e4fa14fb58558fbf48d3bd6693e59\n\ncommit: 14e554cf682ae975ba356b07672c0f9d465e2a78 (May 24 2024)\nobject: 06c35c7454\nsha256: (seen already)\n```\n\n## Appendix A.2.  Known-good variants of `quick-jump.css`\n\nThis appendix records known variants of `quick-jump.css` from the\nGHC and Haddock repositories.  The commit ID, Git object (short) ID,\nand SHA-256 digests are noted.  The SHA-256 digests can be used with\nSubresource Integrity (SRI) or server-side checks to prevent\ndelivery or use of unrecognised CSS content.\n\n### From `https://gitlab.haskell.org/ghc/haddock.git`—`master` branch\n\n*No changes since integration of haddock into the ghc repo*.\n\n### From `https://gitlab.haskell.org/ghc/ghc.git`—`master` branch\n\n```\ncommit: 9511e587701349093cbe3ac7c00f13583820774f (Feb 7 2021)\nobject: cf10eee4\nsha256: 6bd159f6d7b1cfef1bd190f1f5eadcd15d35c6c567330d7465c3c35d5195bc6f\n\ncommit: 05ccce6e07731f9788a434d6e06f4cadeff3d6ba (Dec 8 2020)\nobject: d656f51c\nsha256: 6997c223e09b340f5f1bb970c930b458f768a0bbbe787cb87f181820a3d122b3\n\ncommit: fa5ec121e2a700137bab8bd48cc30b1e80f58fd4 (Feb 27 2019)\nobject: 8772809c\nsha256: 29fe483bd37ad3feba12f646e9661731127526f246c246b0011b384e11649dff\n\ncommit: fc069bf200f930c21f96ddbbec1d7c5c69f8ba72 (Jan 15 2018)\nobject: 468d8036\nsha256: 1d51573b72bc8a7b9b0dda3beffb7882db78d22a37840203f761e3969d915027\n\ncommit: 0997eb61803a37803ddb6cf7116eb9db1046b2ce (Oct 10 2017)\nobject: ede05042\nsha256: 59693ef3f0d793031b3af58b214af7884c0f63ce6db659ffd7432cf0aa852b51\n\ncommit: d41abb0f606bf5fdbdc0a7bd3758e0c30601b121 (Sep 23 2017)\nobject: b69903c3\nsha256: f95b8b12a8a13dd31add93527e1239fdff6997c7f2396e975e2e415db04b75fb\n```\n",
  "id": "HSEC-2024-0004",
  "modified": "2026-01-16T11:18:20Z",
  "published": "2026-01-16T11:18:20Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/haskell/hackage-server/commit/5a0dc3357b042502fcf684ed7e2464fde1407809"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/hackage-server/commit/33d9ea3de9a298b21b53ba23386af2742384e627"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/hackage-server/commit/354a7de3b7f21ad1346677df515d8e8ec75016e6"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Hackage package and doc upload stored XSS vulnerability"
}
```

## [hsec-2025-0007](https://vulnerability.circl.lu/vuln/hsec-2025-0007)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0007.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "cmark-gfm"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1.0"
            },
            {
              "fixed": "0.2.6"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2023-24824",
    "GHSA-66g8-4hjf-77xh"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# cmark-gfm: resource exhaustion due to quadratic complexity in parser\n\n*cmark-gfm* is GitHub's fork of *cmark*, a CommonMark parsing and\nrendering library and program in C.  A polynomial time complexity\nissue in cmark-gfm may lead to unbounded resource exhaustion and\nsubsequent denial of service, due to quadratic complexity issues\nwhen parsing text which leads with either large numbers of `>` or\n`-` characters.\n\nThe Haskell *cmark-gfm* package bundles the C sources and was\naffected by this issue.  This fix was released in the upstream C\npackage at version `0.29.0.gfm.10`.  Version `0.2.6` of the Haskell\npackage adopted the fix (moving from `0.29.0.gfm.6` to\n`0.29.0.gfm.13`).  Packages that depend on *cmark-gfm* should update\nto `0.2.6` or later.\n\nUsers unable to update should avoid processing data from untrusted\nsources or validate the input with other tools before using\n*cmark-gfm* to parse it.\n\nPandoc `< 2.10.1` depended on *cmark-gfm* and could be affected by\nthis issue.\n",
  "id": "HSEC-2025-0007",
  "modified": "2025-12-27T08:58:56Z",
  "published": "2025-12-27T08:58:56Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/kivikakk/cmark-gfm-hs/commit/1359b8740c6b29dde0ad8f816531112b32eb8cbe"
    },
    {
      "type": "FIX",
      "url": "https://github.com/github/cmark-gfm/commit/2300c1bd2c8226108885bf019655c4159cf26b59"
    },
    {
      "type": "ADVISORY",
      "url": "https://github.com/github/cmark-gfm/security/advisories/GHSA-66g8-4hjf-77xh"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-24824"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "cmark-gfm: resource exhaustion due to quadratic complexity in parser"
}
```

## [hsec-2025-0006](https://vulnerability.circl.lu/vuln/hsec-2025-0006)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0006.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0006.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "x509-store"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0006.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0006.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "crypton-x509-store"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.6.9"
            },
            {
              "fixed": "1.6.12"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Private key leak via inherited file descriptor\n\nThe X.509 key reading function `readKeyFile` opened a file\ndescriptor to the private key without setting the *close-on-exec*\nflag. If a child process is `exec`ed at the same time, it would\ninherit that file descriptor and could read the private key\nmaterial.\n\nImpact is limited to child processes that run untrusted code, but\nthat do not close inherited file descriptors. (For example, the\n`su(1)` command.)\n\nThis leak was fixed by setting the *close-on-exec* flag on\nunix-based systems.\n",
  "id": "HSEC-2025-0006",
  "modified": "2025-11-17T02:22:38Z",
  "published": "2025-11-17T02:22:38Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/kazu-yamamoto/crypton-certificate/commit/e353d450c381c9d6b903c4257927e0c89c97acb1"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Private key leak via inherited file descriptor"
}
```

## [hsec-2025-0005](https://vulnerability.circl.lu/vuln/hsec-2025-0005)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0005.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0005.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "cabal-install"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.0.0.0"
            },
            {
              "fixed": "3.4.0.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# `cabal-install` dependency confusion\n\nFor **cabal-install < 3.4.0.0** and where multiple repositories are\nconfigured, the resolver picks the highest available version across\nall repositories.  Where a package is only defined in a private\nrepository, this behaviour leads to a [*dependency confusion*][blog]\nsupply chain vulnerability.  If the private package name becomes\nknown, a malicious actor can claim the name in the public repository\nand publish a malicious version at a higher version number.\n\nDefault `cabal-install` configurations that only use the\n`hackage.haskell.org` repository are not affected.  Configurations\nthat use curated private repositories **exclusively** are also not\naffected.\n\n[blog]: https://frasertweedale.github.io/blog-fp/posts/2021-02-12-haskell-dependency-confusion.html\n\n\n## Mitigations\n\n*cabal-install* version **3.4.0.0** and higher provide an `override`\noption in the repository configuration.  It marks the associated\nrepository as canonical for all packages defined in that repository.\nNo other repositories will be considered.  For example:\n\n```\n-- For packages in repo.example.com,\n-- only versions in repo.example.com are considered\nactive-repositories:\n  , hackage.haskell.org\n  , repo.example.com:override\n```\n\nUsers and organisations using private repositories that contain\nprivate packages in addition to public repositories **MUST** use the\n`override` option to prevent dependency confusion attacks.\n\nAlternatively, projects and organisations can run a private instance\nof *hackage-server* and carefully curate and review its contents.\nUsing that instance exclusively defeats supply chain attacks\nincluding *dependency confusion*.  For *cabal-install < 3.4* and\nwhere using multiple repositories, this is the only effective\nmitigation against dependency confusion attacks.\n",
  "id": "HSEC-2025-0005",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://frasertweedale.github.io/blog-fp/posts/2021-02-12-haskell-dependency-confusion.html"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "cabal-install dependency confusion"
}
```

## [hsec-2025-0004](https://vulnerability.circl.lu/vuln/hsec-2025-0004)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0004.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0004.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "spacecookie"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.2.0.0"
            },
            {
              "fixed": "1.0.0.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Broken Path Sanitization in spacecookie Library\n\nThe spacecookie library exposes the functions `sanitizePath` and `sanitizeIfNotUrl` intended to\nremove `..` components from paths which can be used to prevent path traversal attacks. Due to\nerroneous comparison code, this elimination is not actually performed which has been remedied\nin version 1.0.0.3 by properly comparing using `equalFilePath`.\n\nAny user of those respective functions of any version of spacecookie should upgrade to 1.0.0.3\nor later. Note that the spacecookie server executable included in the same package is not affected\nby the problem since a separate check would reject any malicious path that gets by `sanitizePath`.\n",
  "id": "HSEC-2025-0004",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/sternenseemann/spacecookie/commit/2854a8a70833e7abdeeff3c02596a6f2a2f35c61"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Broken Path Sanitization in spacecookie Library"
}
```

## [hsec-2025-0003](https://vulnerability.circl.lu/vuln/hsec-2025-0003)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0003.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0003.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "xz-clib"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "5.6.3"
            },
            {
              "fixed": "5.8.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2025-31115"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Use after free in multithreaded lzma (.xz) decoder\n\nIn XZ Utils 5.3.3alpha to 5.8.0, the multithreaded .xz decoder in\nliblzma has a bug where invalid input can at least result in a crash\n(CVE-2025-31115). The effects include heap use after free and\nwriting to an address based on the null pointer plus an offset.\nApplications and libraries that use the `lzma_stream_decoder_mt`\nfunction are affected.\n\nThe Haskell *xz-clib* library vendors and builds the C\nimplementation.  The *xz* package does not use the multithreaded\ndecoder and is therefore unaffected.\n",
  "id": "HSEC-2025-0003",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ARTICLE",
      "url": "https://tukaani.org/xz/threaded-decoder-early-free.html"
    },
    {
      "type": "FIX",
      "url": "https://github.com/tukaani-project/xz/commit/d5a2ffe41bb77b918a8c96084885d4dbe4bf6480"
    },
    {
      "type": "FIX",
      "url": "https://github.com/hasufell/lzma-static/commit/e95fe96530568addfc83b771900025053e2c6951"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Use after free in multithreaded lzma (.xz) decoder"
}
```

## [hsec-2025-0002](https://vulnerability.circl.lu/vuln/hsec-2025-0002)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "cryptonite"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "crypton"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.31"
            },
            {
              "fixed": "1.0.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Double Public Key Signing Function Oracle Attack on Ed25519\n\nThe standard specification of Ed25519 message signing involves providing the\nalgorithm with a message and private key.\n\nThe function will use the private key to compute the public key and sign the message.\nSome libraries provide a variant of the message signing function that also takes\nthe pre-computed public key as an input parameter.\n\nLibraries that allow arbitrary public keys as inputs without checking if the\ninput public key corresponds to the input private key are vulnerable to the\nfollowing attack.\n\nBy using several public keys and messages, a malicious user with access to the\nsigning mechanism may build up insights into the private key parameters\nresulting in access to the private key.\n\nThis shortcoming means that an attacker could use the signing function as an\nOracle, perform crypto-analysis and ultimately get at secrets.\nFor example, an attacker who can’t access the private key but can access\nthe signing mechanism through an API call could use several public keys and\nmessages to gradually build up insights into private key parameters.\n",
  "id": "HSEC-2025-0002",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ARTICLE",
      "url": "https://web.archive.org/web/20250917120037/https://portswigger.net/daily-swig/dozens-of-cryptography-libraries-vulnerable-to-private-key-theft"
    },
    {
      "type": "ARTICLE",
      "url": "https://github.com/MystenLabs/ed25519-unsafe-libs"
    },
    {
      "type": "ADVISORY",
      "url": "https://github.com/advisories/GHSA-w5vr-6qhr-36cc"
    },
    {
      "type": "EVIDENCE",
      "url": "https://hackage.haskell.org/package/cryptonite-0.30/docs/src/Crypto.PubKey.Ed25519.html#sign"
    },
    {
      "type": "EVIDENCE",
      "url": "https://github.com/haskell-crypto/cryptonite/blob/cryptonite-v0.30/cbits/ed25519/ed25519.c#53"
    },
    {
      "type": "EVIDENCE",
      "url": "https://github.com/kazu-yamamoto/crypton/blob/48fb9df2de5ee752196724b081f4d3cdb57576ed/cbits/ed25519/ed25519.c#L53"
    },
    {
      "type": "FIX",
      "url": "https://github.com/kazu-yamamoto/crypton/pull/47"
    }
  ],
  "related": [
    "GHSA-w5vr-6qhr-36cc"
  ],
  "schema_version": "1.5.0",
  "summary": "Double Public Key Signing Function Oracle Attack on Ed25519"
}
```

## [hsec-2025-0001](https://vulnerability.circl.lu/vuln/hsec-2025-0001)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2025/HSEC-2025-0001.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2025/HSEC-2025-0001.json"
      },
      "package": {
        "ecosystem": "GHC",
        "name": "ghc"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "9.12.1"
            },
            {
              "fixed": "9.12.2"
            },
            {
              "introduced": "9.12.3"
            },
            {
              "fixed": "9.12.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Subword division operations may produce incorrect results\n\nArithmetic operations may produce incorrect results when compiled with optimizations.\nFor the most part, this bug only causes availability and data integrity issues.\nHowever, in some circumstances, it may result in other, more complicated security related flaws, such as buffer overflow conditions.\n",
  "id": "HSEC-2025-0001",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/25653"
    },
    {
      "type": "REPORT",
      "url": "https://discourse.haskell.org/t/psa-correctness-issue-in-ghc-9-12/11204"
    },
    {
      "type": "REPORT",
      "url": "https://discourse.haskell.org/t/critical-code-generation-bug-with-ghc-9-12-3/13505/2"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/13820"
    },
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/26711"
    },
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/26668"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Subword division operations may produce incorrect results"
}
```

## [hsec-2024-0009](https://vulnerability.circl.lu/vuln/hsec-2024-0009)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0009.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0009.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "biscuit-haskell"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.3.0.0"
            },
            {
              "fixed": "0.4.0.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:N/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2024-41949",
    "GHSA-rgqv-mwc3-c78m",
    "GHSA-47cq-pc2v-3rmp"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Public key confusion in third-party blocks\n\nThird-party blocks can be generated without transferring the whole token to the third-party authority. Instead, a `ThirdPartyBlock` request can be sent, providing only the necessary info to generate a third-party block and to sign it:\n\n- the public key of the previous block (used in the signature);\n- the public keys part of the token symbol table (for public key interning in datalog expressions).\n\nA third-party block request forged by a malicious user can trick the third-party authority into generating datalog trusting the wrong keypair.\n",
  "id": "HSEC-2024-0009",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://github.com/biscuit-auth/biscuit-haskell/security/advisories/GHSA-47cq-pc2v-3rmp"
    },
    {
      "type": "FIX",
      "url": "https://github.com/biscuit-auth/biscuit-haskell/pull/93"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Public key confusion in third-party blocks"
}
```

## [hsec-2024-0008](https://vulnerability.circl.lu/vuln/hsec-2024-0008)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0008.json"
      },
      "package": {
        "ecosystem": "GHC",
        "name": "ghc"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "9.2.1"
            },
            {
              "fixed": "9.6.6"
            },
            {
              "introduced": "9.8.1"
            },
            {
              "fixed": "9.8.3"
            },
            {
              "introduced": "9.10.1"
            },
            {
              "fixed": "9.10.2"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Sign extension error in the PPC64le FFI\n\nNumeric arguments of FFI call on the PPC64le backend may result in incorrect runtime values.\nFor the most part, this bug only causes availability and data integrity issues.\nHowever, in some circumstances, it may result in other, more complicated security related flaws, such as buffer overflow conditions.\n",
  "id": "HSEC-2024-0008",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/23034"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/12885"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Sign extension error in the PPC64le FFI"
}
```

## [hsec-2024-0007](https://vulnerability.circl.lu/vuln/hsec-2024-0007)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0007.json"
      },
      "package": {
        "ecosystem": "GHC",
        "name": "ghc"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "9.2.4"
            },
            {
              "fixed": "9.2.5"
            },
            {
              "introduced": "9.4.2"
            },
            {
              "fixed": "9.4.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Sign extension error in the AArch64 NCG\n\nArithmetic operations may result in incorrect runtime results on the native aarch64 backend.\nFor the most part, this bug only causes availability and data integrity issues.\nHowever, in some circumstances, it may result in other, more complicated security related flaws, such as buffer overflow conditions.\n",
  "id": "HSEC-2024-0007",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/22282"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/9152"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/9139"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Sign extension error in the AArch64 NCG"
}
```

## [hsec-2024-0006](https://vulnerability.circl.lu/vuln/hsec-2024-0006)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0006.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0006.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "base"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "4.15.0.0"
            },
            {
              "fixed": "4.15.1.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# `fromIntegral`: conversion error\n\n`fromIntegral` may result in coercion errors when used with optimization flags `-O1` or `-O2`\nin the following situation:\n\n- Converting negative `Int` to `Natural` does not throw an arithmetic underflow error\n- Converting large `Integer` greater than 2^64 to `Natural` overflow.\n\nFor the most part, these errors in and of themselves result only in availability and data integrity issues.\nHowever, in some circumstances, they may result in other, more complicated security related flaws, such as buffer overflow conditions.\n",
  "id": "HSEC-2024-0006",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/19345"
    },
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/20066"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4980"
    },
    {
      "type": "FIX",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6109"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "fromIntegral: conversion error"
}
```

## [hsec-2024-0003](https://vulnerability.circl.lu/vuln/hsec-2024-0003)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0003.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0003.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "process"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.0.0.0"
            },
            {
              "fixed": "1.6.23.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2024-3566"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# process: command injection via argument list on Windows\n\nThe *process* library on Windows is vulnerable to a command injection\nvulnerability, via `cmd.exe`'s interpretation of arguments.  Programs that\ninvoke batch files (`.bat`, `.cmd`) and pass arguments whose values are\naffected by program inputs may be affected.\n\nThis issue was discovered in many programming languages' Windows process\nexecution behaviour.  It was tracked by CERT/CC as **VU#123335** and a\ncoordinated disclosure was made on 2024-04-09 17:00 UTC.\n\nA fix was released in *process-1.6.19.0*.\n\n\n## Background\n\nUnlike POSIX systems, Windows does not have a mechanism for passing multiple\narguments.Command line parsing is up to individual programs.\n\nThe *process* library defines the `RawCommand` constructor for specifying an\nexecutable and its arguments:\n\n```haskell\ndata CmdSpec\n  = ShellCommand String\n  | RawCommand FilePath [String]\n```\n\nOn Windows, the `RawCommand` executable name and arguments are serialised into\na single *command line* string, with separate arguments quoted separately.\n*process* then invokes the Windows [`CreateProcess`][doc-CreateProcess]\nroutine with this command line string is given as the `lpCommandLine`\nargument.\n\n[doc-CreateProcess]: https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa\n\n\n## Issue\n\nWhen executing `.bat` or `.cmd` files, [`CreateProcess`][doc-CreateProcess]\nimplicitly spawns `cmd.exe`.  The `System.Process` command line construction\ndoes not escape characters with special meaning to `cmd.exe`.  As a\nconsequence, a command injection vulnerability arises when the following\nconditions are satisfied:\n\n- Program running on Windows\n- Program executes a `.bat` or `.cmd` file\n- The argument values include or are influenced by program input\n\n\n## Demonstration\n\nThe following batch file, `test.bat`, merely prints the executable name the\nfirst two arguments (as interpreted by `cmd.exe`):\n\n```\n@ECHO OFF\nECHO 0: %0\nECHO 1: %1\nECHO 2: %2\nPAUSE\n```\n\nThe following Haskell program executes `test.bat` with basic string arguments.\nThe output is as expected:\n\n```\nλ> readProcess \"test.bat\" [\"a\",\"b\"] [] >>= putStrLn\n0: \"test.bat\"\n1: \"a\"\n2: \"b\"\n```\n\nHowever, we can use a close quote and the `&` character to induce `cmd.exe` to\nexecute a program named in the argument:\n\n```\nλ> readProcess \"test.bat\" [\"\\\"&calc.exe\"] [] >>= putStrLn\n0: \"test.bat\"\n1: \"\\\"\n2:\n```\n\nIn addition to producing the above output, `calc.exe` is executed.\n\n\n## Mitigation\n\nThe lack of a general mechanism on Windows for safely conveying command line\narguments to programs increases the risk of this kind of security issue.  The\nfact that `cmd.exe` command line parsing is complex and poorly documented\nexacerbates this issue, and also heightens the risk that the fix is\nincomplete, or causes other issues.\n\nIf possible, avoid executing batch files where arguments include or are\ninfluenced by untrusted program inputs.  If it must be done, reject arguments\nthat include special characters including `&` and `\"`.\n\n\n## Fix versions\n\n*process* was modified to perform additional escaping and quoting\nwhen executing `.bat` and `.cmd` files on Windows (ignoring\ncharacter case).  The behaviour is unchanged in all other cases.\n\nThe fix was released in ***process-1.6.19.0***.  The following GHC\nreleases were the first in their series to include a fixed version\nof the *process* library:\n\n- **GHC 9.10.1-alpha3** (released 2024-04-15)\n- **GHC 9.8.3** (released 2024-10-20)\n- **GHC 9.6.5** (released 2024-04-16)\n\nSuch a change in semantics should normally result in a major version\nbump.  Because we expect very few (if any) users will be impacted by\nthe behavioural change, the GHC team made a pragmatic decision to\navoid the disruption that a major version bump would cause.\n\nA follow-up fix was released in ***process-1.6.23.0*** to handle batch\nscripts with paths ending in whitespace and periods and\nunescaped `%` expansions.\n\n\n## Acknowledgements\n\nSecurity researcher **RyotaK** discovered and responsibly disclosed\nthis vulnerability, coordinating the response across the many\naffected langauges and ecosystems.\n\nBen Gamari commited and released the fix, which was based on a\nproposal by Fraser Tweedale.  Fraser also improved the\n`System.Process` module documentation to better explain the Windows\nsemantics.\n\nSecurity researcher **Kainan Zhang** (@4xpl0r3r) discovered and\nresponsibly disclosing the issue in the first fix and the Rust\nSecurity Response WG coordinated the response.\n",
  "id": "HSEC-2024-0003",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ARTICLE",
      "url": "https://flatt.tech/research/posts/batbadbut-you-cant-securely-execute-commands-on-windows/"
    },
    {
      "type": "ADVISORY",
      "url": "https://kb.cert.org/vuls/id/123335"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/process/commit/3c419f9eeedac024c9dccce544e5a6fb587179a5"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/process/commit/951b02dd95559b1a26f2456bfb97cf740ea40934"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/process/commit/5fc91f5f36ed4479be2b95f04f264bb78ac8089d"
    }
  ],
  "related": [
    "CVE-2024-1874",
    "CVE-2024-24576",
    "CVE-2024-22423"
  ],
  "schema_version": "1.5.0",
  "summary": "process: command injection via argument list on Windows"
}
```

## [hsec-2024-0002](https://vulnerability.circl.lu/vuln/hsec-2024-0002)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "bzlib"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.4"
            },
            {
              "fixed": "0.5.2.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "bz2"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1.0.0"
            },
            {
              "fixed": "1.0.1.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0002.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0002.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "bzlib-conduit"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1.0.0"
            },
            {
              "fixed": "0.3.0.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2019-12900"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# out-of-bounds write when there are many bzip2 selectors\n\nA malicious bzip2 payload may produce a memory corruption\nresulting in a denial of service and/or remote code execution.\nNetwork services or command line utilities decompressing\nuntrusted bzip2 payloads are affected.\n\nNote that the exploitation of this bug relies on an undefined\nbehavior that appears to be handled safely by current compilers.\n\nThe Haskell libraires are vulnerable when they are built using\nthe bundled C library source code, which is the default\nin most cases.\n",
  "id": "HSEC-2024-0002",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "DISCUSSION",
      "url": "https://gnu.wildebeest.org/blog/mjw/2019/08/02/bzip2-and-the-cve-that-wasnt/"
    },
    {
      "type": "DISCUSSION",
      "url": "http://scary.beasts.org/security/CESA-2008-005.html"
    },
    {
      "type": "ADVISORY",
      "url": "https://access.redhat.com/security/cve/cve-2019-12900"
    },
    {
      "type": "FIX",
      "url": "https://sourceware.org/git/?p=bzip2.git;a=commit;h=7ed62bfb46e87a9e878712603469440e6882b184"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "out-of-bounds write when there are many bzip2 selectors"
}
```

## [hsec-2024-0001](https://vulnerability.circl.lu/vuln/hsec-2024-0001)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2024/HSEC-2024-0001.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2024/HSEC-2024-0001.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "keter"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.3.4"
            },
            {
              "fixed": "1.8.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Reflected XSS vulnerability in keter\n\nKeter is an app-server/reverse-proxy often used with webapps build on Yesod web-framework.\n\nIn the logic handling VHost dispatch, Keter was echoing back `Host` header value, unescaped,\nas part of an HTML error page. This constitutes a reflected-XSS vulnerability. Although\nnot readily exploitable directly from a browser (where `Host` header can't generally assume\narbitrary values), it may become such in presence of further weaknesses in components\nupstream of Keter in the http proxying chain. Therefore, AC:High in CVSS evaluation.\n",
  "id": "HSEC-2024-0001",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "FIX",
      "url": "https://github.com/snoyberg/keter/pull/246"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Reflected XSS vulnerability in keter"
}
```

## [hsec-2023-0015](https://vulnerability.circl.lu/vuln/hsec-2023-0015)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0015.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0015.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "cabal-install"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.24.0.0"
            },
            {
              "fixed": "3.10.2.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# cabal-install uses expired key policies\n\nA problem was recently discovered in `cabal-install`'s\nimplementation of the Hackage Security protocol that would allow an\nattacker who was in possession of a revoked private key and who\ncould perform a man-in-the-middle attack against Hackage to use the\nrevoked key to deliver malicious packages. At this time, this is\nonly a theoretical attack - no keys have been revoked. Release\n3.10.2.0 of `cabal-install` contains a fix for this bug, and we have\ncontacted distributors of older versions (such as Linux\ndistributions) with a patch that they can apply.\n\n## Background\n\nHackage Security is an implementation of [The Update Framework][],\nwhich is a design for a package repository that allows untrusted\nmirrors without undermining software supply-chain security. In\nparticular, Hackage Security cryptographically guarantees the\nfollowing properties:\n\n * Mirrors of Hackage cannot change the contents of packages. This\n   prevents the insertion of malicious code.\n\n * Mirrors cannot omit newer packages for more than a few days\n   without clients noticing. This ensures both that mirrors cannot\n   maliciously deny security updates, and that mistakes in their\n   configuration will be noticed.\n\nHackage has a [key policy file][] that delegates authority to a\nnumber of private keys for various purposes. Most of the keys are\nkept securely offline by trusted community members who annually\nre-sign the various files to indicate that they still have\nconfidence in Hackage's policies. However, to prevent clients from\nbeing denied updates, Hackage has an automated process that\nperiodically re-signs a timestamp file. This signature has a short\nexpiry. Additionally, a snapshot file contains signed hashes of the\nHackage index that is updated on each package upload. The timestamp\nand snapshot private keys are held in memory on the Hackage server.\nThese are called the operational keys. If an operational key is ever\ncompromised, then it will be revoked by having the Hackage root\nkeyholders sign a new key policy file. To prevent replay attacks,\nclients that connect to Hackage after this update will reject older\npolicy files, based on a monotonically increasing file version\nnumber.\n\nIf a client has not yet received the updated policy file (for\nexample, because they have a fresh install of `cabal-install` or\nbecause they have not run `cabal update` in some time), the built-in\nexpiration date in the file limits the window of exposure in which\nthe revoked operational keys would be expected. As long as the root\nkeys have not been compromised, the compromised operational keys can\nonly be used until the policy file expires. In addition to\ncompromising a Hackage operational key, an attacker would\nadditionally need to either compromise a Hackage mirror or perform a\nman-in-the-middle attack against the target in order to serve a\nmalicious or obsolete package index.\n\n[key policy file]: https://hackage.haskell.org/root.json\n[The Update Framework]: https://theupdateframework.io/\n\n## The Issue\n\nA bug in `cabal-install` caused it to skip the verification of the\nkey policy file's expiration timestamp. This means that users of\nolder, unpatched versions of `cabal-install` could be vulnerable to\na malicious mirror or man-in-the-middle attack against Hackage if\nthey have not connected to Hackage in a long time, even after the\npolicy file has expired.\n\nWe do not believe that it has been possible to exploit this\nvulnerability, because no operational keys have been revoked.\nHowever, in case key revocation occurs, we strongly advise all users\nof `cabal-install` to ensure that they have version 3.10.2.0 or\nnewer, which contain the fix.\n",
  "id": "HSEC-2023-0015",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://github.com/haskell/cabal/issues/8918#issuecomment-1521096581"
    },
    {
      "type": "FIX",
      "url": "https://github.com/haskell/cabal/commit/dcfdc9cffd74cade4e8cf3df37c5993413ffd30f"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "cabal-install uses expired key policies"
}
```

## [hsec-2023-0014](https://vulnerability.circl.lu/vuln/hsec-2023-0014)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0014.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0014.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "pandoc"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.13"
            },
            {
              "fixed": "3.1.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:C/C:N/I:H/A:L",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2023-35936",
    "GHSA-xj5q-fv23-575g"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Arbitrary file write is possible when using PDF output or --extract-media with untrusted input\n\nPandoc is susceptible to an arbitrary file write vulnerability, which can be triggered by providing a specially crafted image element in the input when generating files using the --extract-media option or outputting to PDF format. This vulnerability allows an attacker to create or overwrite arbitrary files on the system (depending on the privileges of the process running pandoc).\n\nThis vulnerability only affects systems that (a) pass untrusted user input to pandoc and (b) allow pandoc to be used to produce a PDF or with the --extract-media option.\n\nThe vulnerability is patched in pandoc 3.1.4.\n",
  "id": "HSEC-2023-0014",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://github.com/jgm/pandoc/security/advisories/GHSA-xj5q-fv23-575g"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Arbitrary file write is possible when using PDF output or --extract-media with untrusted input"
}
```

## [hsec-2023-0013](https://vulnerability.circl.lu/vuln/hsec-2023-0013)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0013.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0013.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "git-annex"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.20110401"
            },
            {
              "fixed": "5.20140919"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2014-6274"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# *git-annex* plaintext storage of embedded credentials on encrypted remotes\n\n*git-annex* had a bug in the **S3** and **Glacier** remotes where if\n`embedcreds=yes` was set, and the remote used `encryption=pubkey` or\n`encryption=hybrid`, the embedded AWS credentials were stored in the\nGit repository in (effectively) plaintext, not encrypted as they\nwere supposed to be.\n\nThat means that anyone who gets a copy of the Git repository can\nextract the AWS credentials from it.  Which would be bad.\n\nA remote with this problem cannot be enabled using `git annex\nenableremote`. Old versions of *git-annex* will fail with a GPG\nerror; the current version will fail with a pointer to this web\npage.\n\n## Remediation\n\nIf your repository has this problem, chose from one of these\napproaches to deal with it:\n\n1. Change your AWS credentials, so the ones stored in the clear in\n   git won't be used.\n\n   After changing the credentials, make sure you have a fixed\n   version of git-annex, and you can then re-embed the new creds\n   into the repository, encrypted this time, by setting the\n   `AWS_SECRET_ACCESS_KEY` and `AWS_ACCESS_KEY_ID` environment\n   variables, and running `git annex enableremote $remotename\n   embedcreds=yes`.\n\n2. Fix the problem and then remove the history of the *git-annex*\n   branch of the repository.\n\n   Make sure you have a fixed version of *git-annex*, and force\n   *git-annex* to rewrite the embedded creds, with encryption this\n   time, by setting by setting the `AWS_SECRET_ACCESS_KEY` and\n   `AWS_ACCESS_KEY_ID` environment variables, and running `git annex\n   enableremote $remotename embedcreds=yes`.\n\n   Then, to get rid of old versions of the *git-annex* branch that\n   still contains the creds in cleartext, you can use `git annex\n   forget`; note that it will remove other historical data too.\n\n   Keep in mind that this will not necessarily delete data from\n   clones you do not control.\n\n3. If you're sure that you're the only one who has access to the\n   repository, you could decide to leave it as-is.  It's no more\n   insecure than if you had used `encryption=shared` in the first\n   place when setting it up.\n",
  "id": "HSEC-2023-0013",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://git-annex.branchable.com/security/CVE-2014-6274/"
    },
    {
      "type": "ARTICLE",
      "url": "https://git-annex.branchable.com/upgrades/insecure_embedded_creds/"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "git-annex plaintext storage of embedded credentials on encrypted remotes"
}
```

## [hsec-2023-0012](https://vulnerability.circl.lu/vuln/hsec-2023-0012)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0012.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0012.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "git-annex"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.20110417"
            },
            {
              "fixed": "6.20160419"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# *git-annex* checksum exposure to encrypted special remotes\n\nA bug exposed the checksum of annexed files to encrypted special\nremotes, which are not supposed to have access to the checksum of\nthe un-encrypted file.  This only occurred when resuming uploads to\nthe encrypted special remote, so it is considered a low-severity\nsecurity hole.\n\nFor details, see commit `b890f3a53d936b5e40aa9acc5876cb98f18b9657`.\n\nNo CVE was assigned for this issue.\n\nFixed in *git-annex-6.20160419*.\n",
  "id": "HSEC-2023-0012",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://git-annex.branchable.com/security/checksum_exposure_to_encrypted_special_remotes/"
    },
    {
      "type": "FIX",
      "url": "http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=b890f3a53d936b5e40aa9acc5876cb98f18b9657"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "git-annex checksum exposure to encrypted special remotes"
}
```

## [hsec-2023-0011](https://vulnerability.circl.lu/vuln/hsec-2023-0011)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0011.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0011.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "git-annex"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.20110417"
            },
            {
              "fixed": "6.20180626"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2018-10859"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# *git-annex* GPG decryption attack via compromised remote\n\nA malicious server for a special remote could trick `git-annex` into\ndecrypting a file that was encrypted to the user's GPG key.  This\nattack could be used to expose encrypted data that was never stored\nin *git-annex*.  Daniel Dent discovered this attack in collaboration\nwith Joey Hess.\n\nTo perform this attack the attacker needs control of a server\nhosting an *encrypted* special remote used by the victim's\n*git-annex* repository.  The attacker uses `git annex addurl\n--relaxed` with an innocuous URL, and waits for the user's\n`git-annex` to download it, and upload an (encrypted) copy to the\nspecial remote they also control.  At some later point, when the\nuser downloads the content from the special remote, the attacker\ninstead sends them the content of the GPG-encrypted file that they\nwish to have decrypted in its place (which may have been exfiltrated\nfrom the victim's system via the attack described in\n**HSEC-2023-0010** / **CVE-2018-10857**, or acquired by other\nmeans).  Finally, the attacker drops their own copy of the original\ninnocuous URL, and waits for the victim `git-annex` to send them the\naccidentially decrypted file.\n\nThe issue was fixed by making `git-annex` refuse to download\nencrypted content from special remotes, unless it knows the hash of\nthe expected content.  When the attacker provides some other\nGPG-encrypted content, it will fail the hash check and be discarded.\n",
  "id": "HSEC-2023-0011",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://git-annex.branchable.com/security/CVE-2018-10857_and_CVE-2018-10859/"
    }
  ],
  "related": [
    "HSEC-2023-0010",
    "CVE-2018-10857"
  ],
  "schema_version": "1.5.0",
  "summary": "git-annex GPG decryption attack via compromised remote"
}
```

## [hsec-2023-0010](https://vulnerability.circl.lu/vuln/hsec-2023-0010)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0010.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0010.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "git-annex"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "6.20180626"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2018-10857"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# *git-annex* private data exfiltration to compromised remote\n\nSome uses of git-annex were vulnerable to a private data exposure\nand exfiltration attack. It could expose the content of files\nlocated outside the *git-annex* repository, or content from a\nprivate web server on localhost or the LAN.  Joey Hess discovered\nthis attack.\n\nTo perform this attack, the attacker needs to have control over one\nof the remotes of the victim's *git-annex* repository. For example,\nthey may provide a public *git-annex* repository that the victim\nclones. Or, equivalantly, the attacker could have read access to the\nvictim's *git-annex* repository or a repository it pushes to, and\nsome channel to get commits into it (e.g. pull requests).\n\nThese exploits are most likely to succeed when the victim is running\nthe `git-annex` assistant, or is periodically running `git annex\nsync --content`.\n\nTo perform the attack the attacker runs `git-annex addurl --relaxed\nfile:///etc/passwd` and commits this to the repository in some out\nof the way place.  After the victim's git repository receives that\nchange, `git-annex` follows the attacker-provided URL to the private\ndata, which it stores in the *git-annex* repository.  From there it\ntransfers the content to the remote *git-annex* repository that the\nattacker has access to.\n\nAs well as `file:///` URLs, the attacker can use URLs to private web\nservers.  The URL can also be one that the attacker controls, that\nredirects to a URL that is accessible to the victim system (and not\nnecessarily the compromised remote).\n\n## Fix\n\nThe issue was fixed by making `git-annex` refuse to follow\n`file:///` urls and URLs pointing to private/local IP addresses by\ndefault.  Two new configuration settings,\n`annex.security.allowed-url-schemes` and\n`annex.security.allowed-ip-addresses`, can relax this security\npolicy, and are intended for cases where the *git-annex* repository\nis kept private and so the attack does not apply.\n\n## Impact on external special remotes\n\nOne variant of this issue can exploit a vulnerable external special\nremote, and could not be prevented by `git-annex`.  (`git-annex`'s\nown built-in special remotes are not vulnerable to this attack.)\n\nIn this attack variant, the attacker guesses the hash of a file\nstored on the victim's private web server, and adds it to the\n`git-annex` repository.  The attacker also has control of the server\nhosting an encrypted special remote used by the victim's *git-annex*\nrepository.  They cause that server to redirect to the victim's web\nserver.  This allows the attacker to verify if the victim's web\nserver contains a file that the attacker already knows the content\nof, assuming they can guess the URL to it.\n\nDevelopers of external special remotes are encouraged to prevent\nthis attack by not following such HTTP redirects.\n",
  "id": "HSEC-2023-0010",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://git-annex.branchable.com/security/CVE-2018-10857_and_CVE-2018-10859/"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "git-annex private data exfiltration to compromised remote"
}
```

## [hsec-2023-0009](https://vulnerability.circl.lu/vuln/hsec-2023-0009)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0009.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0009.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "git-annex"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "6.20170818"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2017-12976"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# *git-annex* command injection via malicious SSH hostname\n\n*git-annex* was vulnerable to the same class of security hole as\ngit's **CVE-2017-1000117**. In several cases, `git-annex` parses a\nrepository URL, and uses it to generate a `ssh` command, with the\nhostname to ssh to coming from the URL. If the hostname it parses is\nsomething like `-eProxyCommand=evil`, this could result in arbitrary\nlocal code execution.\n\nSome details of URL parsing may prevent the exploit working in some\ncases.\n\nExploiting this would involve the attacker tricking the victim into\nadding a remote something like `ssh://-eProxyCommand=evil/blah`.\n\nOne possible avenue for an attacker that avoids exposing the URL to\nthe user is to use `initremote` with an SSH remote, so embedding the\nURL in the *git-annex* branch. Then the victim would enable it with\n`enableremote`.\n\nThis was fixed in version **6.20170818**. Now there's a `SshHost`\ntype that is not allowed to start with a dash, and every invocation\nof `git-annex` uses a function that takes a `SshHost`.\n",
  "id": "HSEC-2023-0009",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://git-annex.branchable.com/security/CVE-2017-12976/"
    },
    {
      "type": "FIX",
      "url": "http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=df11e54788b254efebb4898b474de11ae8d3b471"
    }
  ],
  "related": [
    "CVE-2017-9800",
    "CVE-2017-12836",
    "CVE-2017-1000116",
    "CVE-2017-1000117"
  ],
  "schema_version": "1.5.0",
  "summary": "git-annex command injection via malicious SSH hostname"
}
```

## [hsec-2023-0008](https://vulnerability.circl.lu/vuln/hsec-2023-0008)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0008.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0008.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "hledger-web"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.24"
            },
            {
              "fixed": "1.23"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2021-46888"
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# Stored XSS in *hledger-web*\n\nAn issue was discovered in *hledger-web* < 1.23. A Stored Cross-Site\nScripting (XSS) vulnerability exists in `toBloodhoundJson` that\nallows an attacker to execute JavaScript by encoding user-controlled\nvalues in a payload with base64 and parsing them with the `atob`\nfunction.\n\n*hledger-web* forms sanitise obvious JavaScript, but not obfuscated\nJavaScript (see [OWASP Filter Evasion Cheat Sheet][cheatsheet]).\nThis means *hledger-web* instances, especially anonymously-writable\nones like `demo.hledger.org`, could be loaded with malicious\nJavaScript to be executed by subsequent visitors.\n\n[cheatsheet]: https://owasp.org/www-community/xss-filter-evasion-cheatsheet\n\nReported by Gaspard Baye and Hamidullah Muslih.  Fix by Arsen\nArsenović.\n",
  "id": "HSEC-2023-0008",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://github.com/simonmichael/hledger/issues/1525"
    },
    {
      "type": "INTRODUCED",
      "url": "https://github.com/simonmichael/hledger/commit/ec51d28839b2910eea360b1b8c72904b51cf7821"
    },
    {
      "type": "EVIDENCE",
      "url": "https://www.youtube.com/watch?v=QnRO-VkfIic"
    },
    {
      "type": "FIX",
      "url": "https://github.com/simonmichael/hledger/pull/1663"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "Stored XSS in hledger-web"
}
```

## [hsec-2023-0007](https://vulnerability.circl.lu/vuln/hsec-2023-0007)

```json
{
  "affected": [
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0007.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "base"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "3.0.3.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "type": "CVSS_V3"
        }
      ]
    },
    {
      "database_specific": {
        "human_link": "https://github.com/haskell/security-advisories/tree/main/advisories/published/2023/HSEC-2023-0007.md",
        "osv": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export/2023/HSEC-2023-0007.json"
      },
      "package": {
        "ecosystem": "Hackage",
        "name": "toml-reader"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0.1.0.0"
            },
            {
              "fixed": "0.2.0.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ],
      "severity": [
        {
          "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "type": "CVSS_V3"
        }
      ]
    }
  ],
  "database_specific": {
    "home": "https://github.com/haskell/security-advisories",
    "osvs": "https://raw.githubusercontent.com/haskell/security-advisories/refs/heads/generated/osv-export",
    "repository": "https://github.com/haskell/security-advisories"
  },
  "details": "# `readFloat`: memory exhaustion with large exponent\n\n`Numeric.readFloat` takes time and memory linear in the size of the\nnumber _denoted_ by the input string.  In particular, processing a\nnumber expressed in scientific notation with a very large exponent\ncould cause a denial of service.  The slowdown is observable on a\nmodern machine running GHC 9.4.4:\n\n```\nghci> import qualified Numeric\nghci> Numeric.readFloat \"1e1000000\"    -- near instantaneous\n[(Infinity,\"\")]\nghci> Numeric.readFloat \"1e10000000\"   -- perceptible pause\n[(Infinity,\"\")]\nghci> Numeric.readFloat \"1e100000000\"  -- ~ 3 seconds\n[(Infinity,\"\")]\nghci> Numeric.readFloat \"1e1000000000\" -- ~ 35 seconds\n[(Infinity,\"\")]\n```\n\n## In *base*\n\n`Numeric.readFloat` is defined for all `RealFrac a => a`:\n\n```haskell\nreadFloat :: RealFrac a => ReadS a\n```\n\nThe `RealFrac` type class does not express any bounds on the size of\nvalues representable in the types for which instances exist, so\nbounds checking is not possible (in this *generic* function).\n`readFloat` uses to `Text.Read.Lex.numberToRational` which, among\nother things, calculates `10 ^ exponent`, which seems to take linear\ntime and memory.\n\n**Mitigation:** use `read`.  The `Read` instances for `Float` and\n`Double` perform bounds checks on the exponent, via\n`Text.Read.Lex.numberToRangedRational`.\n\n\n## In *toml-reader*\n\nThe issue was detected in *toml-reader* version 0.1.0.0, and\nmitigated in version 0.2.0.0 by immediately returning `Infinity`\nwhen the exponent is large enough that there's no reason to process\nit.\n",
  "id": "HSEC-2023-0007",
  "modified": "2025-11-14T14:45:34Z",
  "published": "2025-11-14T14:45:34Z",
  "references": [
    {
      "type": "REPORT",
      "url": "https://gitlab.haskell.org/ghc/ghc/-/issues/23538"
    },
    {
      "type": "REPORT",
      "url": "https://github.com/brandonchinn178/toml-reader/issues/8"
    },
    {
      "type": "FIX",
      "url": "https://github.com/brandonchinn178/toml-reader/pull/9"
    }
  ],
  "schema_version": "1.5.0",
  "summary": "readFloat: memory exhaustion with large exponent"
}
```
