https://github.com/hexpm/hex/releases/tag/v2.5.2 lists:
Bug fixes
---------

 * Fail with the download error instead of crashing in mix hex.package
   fetch when the version isn't in the registry but a copy of it is cached
* Fetch the docs of organization packages in mix.lock with mix
   hex.docs fetch. They were requested from an organization named
   after the repository, such as hexpm:myorg, and never found.
   Packages from other repositories are skipped with a warning
* Reject package and organization names that hex.pm doesn't accept
   and invalid versions in mix hex.docs. A version such as
   1.0.0/../../x on the command line or in mix.lock made mix hex.docs
   fetch write docs outside the docs directory

Security fixes
--------------

 * Trust only the CA certificates in cacerts_path (HEX_CACERTS_PATH)
   when it's set. Hex also accepted a server certificate chain that
   led to a CA in its bundled store, so every bundled CA could still
   authenticate Hex's servers (GHSA-rw8q-hg7m-cxgr, CVE-2026-103503)

 * Don't trust copies of CA certificates sent by the server. Hex
   accepted a server-sent certificate with the same public key as a CA
   in the CA store in place of that CA, so a server could send a copy
   of an expired CA certificate with a later expiry date
   (GHSA-rw8q-hg7m-cxgr, CVE-2026-103503)

 * Verify the registry checksum of the package tarball that mix
   hex.package fetch PACKAGE VERSION --output - writes to standard
   output, so a mirror can't substitute the package, and print the
   command's messages to standard error, so standard output only
   carries the tarball. Error responses and warnings from the mirror
   were printed to standard output before the tarball. With --output
   DIR the tarball is no longer written when its checksum doesn't
   match (GHSA-98jr-23pm-vj7c, CVE-2026-105280)

 * Keep applying the release-age cooldown to a package when its locked
   release is retired. Retiring a release takes the same package owner
   permission as publishing one, so retiring the locked release let a
   new release skip the cooldown. A locked release with a security
   advisory still lifts the cooldown for its package and for the
   direct dependencies of the locked release. When newer versions of a
   retired locked release are filtered by the cooldown, mix deps.get
   and mix deps.update say that the locked release is retired and show
   the command to update without the cooldown, and mix hex.outdated
   marks the update with (cooldown) and no longer exits with a
   non-zero status for it (GHSA-pqhp-5x9x-69h7, CVE-2026-105668)

 * Only lift the release-age cooldown for a locked package in the
   repository it's locked from. A locked package also lifted the
   cooldown for packages with the same name in other repositories,
   such as an organization repository and hexpm (GHSA-pqhp-5x9x-69h7,
   CVE-2026-105668)

 * Stop downloading a registry file, package, docs tarball or other
   file from a repository or mirror once it's larger than 16 MiB,
   including after decompressing a gzip-encoded response. A package
   mirror could make Hex use any amount of memory or disk before the
   registry signature or package checksum was checked. Responses with
   a status other than 200 are limited the same way on OTP 27.3.4.17,
   28.5.0.6, 29.0.6, 29.1 or later when they have a Content-Length
   header or chunked encoding, and are otherwise still read in full
   (GHSA-gf42-pg2f-63jp, CVE-2026-96618)

 * Stop decompressing a gzip-encoded API response once it's larger
   than 64 MiB. A small response could make Hex use any amount of
   memory (GHSA-gf42-pg2f-63jp, CVE-2026-96618)

 * Check a package against the registry checksum before writing it to
   the package cache and before unpacking a cached copy, including in
   offline mode and when fetching the package fails. A cached package
   that doesn't match the registry is removed instead of being
   unpacked (GHSA-gf42-pg2f-63jp, CVE-2026-96618)

 * Apply the 16 MiB compressed and 128 MiB uncompressed size limits
   for docs to mix hex.docs fetch and mix hex.docs offline
   (GHSA-gf42-pg2f-63jp, CVE-2026-96618)

 * Stop decompressing a registry file once its contents are larger
   than 16 MiB, before its signature is checked, and reject compressed
   Erlang terms in API responses. A mirror could send a small registry
   file, and an API server a small response, that decompressed to any
   size (GHSA-7c4r-cgf9-9jmq, CVE-2026-105274)

 * Skip package releases that give a dependency an application name
   other than a letter followed by letters, digits, _ and -, such as
   ../name, and warn about them when resolving
   dependencies. Resolution fails if no other release of the package
   fits the requirements. Hex used the application name as the
   dependency's directory, so such a release could make mix deps.get
   delete and replace a directory outside deps/ (GHSA-2vjj-c5hr-6xc3,
   CVE-2026-96612)

 * Escape terminal control characters in text from hex.pm and the
   registry before printing it, such as package descriptions and
   links, retirement messages, security advisories, search results and
   error messages. A package publisher could otherwise send escape
   sequences that clear the screen, rewrite earlier output or set the
   clipboard in terminals that support it. A dependency in the
   registry whose package or repository name isn't a valid name is now
   rejected (GHSA-fpmj-3cxg-p766, CVE-2026-81856)

The listed GHSA ids can be found on:
https://github.com/hexpm/hex/security/advisories

--
        -Alan Coopersmith-                 [email protected]
         Oracle Solaris Engineering - https://blogs.oracle.com/solaris

Reply via email to