← Back to CVE Explorer

CVE-2026-59247

Full vulnerability record from the local CVENow database.

Description

Insufficient Verification of Data Authenticity vulnerability in Gleam allows an adversary in the middle to substitute forged Hex package contents during dependency resolution. During dependency resolution Gleam fetches package metadata from the signature-verified Hex repository, which covers each release's dependency requirements and SHA-256 outer_checksum. After resolving versions, gleam_cli::dependencies::lookup_package makes a second request to the unsigned Hex API through gleam_core::hex::get_package_release and records the outer_checksum and dependency names from that JSON response into manifest.toml, instead of the values from the verified repository metadata. The Hex repository signature does not cover the API response. An adversary in the middle who can intercept TLS with a certificate trusted by the Gleam process (for example a TLS-inspecting proxy using a CA in the operating system trust store or added through GLEAM_CACERTS_PATH), and who can modify both the API release response and the corresponding repository tarball, can supply a package archive with a matching forged checksum without the Hex repository signing key. Gleam verifies the forged tarball against the forged checksum, accepts it, and extracts it as a dependency source, resulting in loss of integrity of the downloaded package contents. Only projects that resolve or update Hex dependencies are affected, which happens when the manifest is missing, a dependency is added or updated, or dependency requirements change. Builds that reuse an unchanged, known-good manifest.toml continue to verify tarballs against its pinned checksum. This issue affects gleam: from 0.18.0 before 1.18.0.

Severity
HIGH
CVSS score
7.6 (v4.0)
Vulnerability status
Deferred
Source identifier
6b3ad84c-e1a6-4bf7-a703-f496b71e49db
Published
2026-07-29 15:16:26.780000
Last modified
2026-10-23 23:10:00.157000
View original CVE JSON
{
  "id": "CVE-2026-59247",
  "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
  "published": "2026-07-29T15:16:26.780",
  "lastModified": "2026-10-23T23:10:00.157",
  "vulnStatus": "Deferred",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Insufficient Verification of Data Authenticity vulnerability in Gleam allows an adversary in the middle to substitute forged Hex package contents during dependency resolution.\n\nDuring dependency resolution Gleam fetches package metadata from the signature-verified Hex repository, which covers each release's dependency requirements and SHA-256 outer_checksum. After resolving versions, gleam_cli::dependencies::lookup_package makes a second request to the unsigned Hex API through gleam_core::hex::get_package_release and records the outer_checksum and dependency names from that JSON response into manifest.toml, instead of the values from the verified repository metadata. The Hex repository signature does not cover the API response.\n\nAn adversary in the middle who can intercept TLS with a certificate trusted by the Gleam process (for example a TLS-inspecting proxy using a CA in the operating system trust store or added through GLEAM_CACERTS_PATH), and who can modify both the API release response and the corresponding repository tarball, can supply a package archive with a matching forged checksum without the Hex repository signing key. Gleam verifies the forged tarball against the forged checksum, accepts it, and extracts it as a dependency source, resulting in loss of integrity of the downloaded package contents.\n\nOnly projects that resolve or update Hex dependencies are affected, which happens when the manifest is missing, a dependency is added or updated, or dependency requirements change. Builds that reuse an unchanged, known-good manifest.toml continue to verify tarballs against its pinned checksum. This issue affects gleam: from 0.18.0 before 1.18.0."
    },
    {
      "lang": "es",
      "value": "Vulnerabilidad de verificación insuficiente de la autenticidad de los datos en Gleam permite a un adversario en el medio sustituir contenidos falsificados de paquetes Hex durante la resolución de dependencias.\n\nDurante la resolución de dependencias, Gleam obtiene metadatos del paquete del repositorio Hex verificado por firma, que cubre los requisitos de dependencia de cada lanzamiento y el outer_checksum SHA-256. Después de resolver las versiones, gleam_cli::dependencies::lookup_package realiza una segunda solicitud a la API Hex sin firmar a través de gleam_core::hex::get_package_release y registra el outer_checksum y los nombres de las dependencias de esa respuesta JSON en manifest.toml, en lugar de los valores de los metadatos del repositorio verificado. La firma del repositorio Hex no cubre la respuesta de la API.\n\nUn adversario en el medio que puede interceptar TLS con un certificado de confianza para el proceso Gleam (por ejemplo, un proxy de inspección de TLS que utiliza una CA en el almacén de confianza del sistema operativo o añadido a través de GLEAM_CACERTS_PATH), y que puede modificar tanto la respuesta de lanzamiento de la API como el tarball del repositorio correspondiente, puede suministrar un archivo de paquete con un checksum falsificado coincidente sin la clave de firma del repositorio Hex. Gleam verifica el tarball falsificado contra el checksum falsificado, lo acepta y lo extrae como fuente de dependencia, lo que resulta en la pérdida de integridad de los contenidos del paquete descargado.\n\nSolo los proyectos que resuelven o actualizan dependencias Hex se ven afectados, lo que ocurre cuando falta el manifiesto, se añade o actualiza una dependencia, o cambian los requisitos de dependencia. Las compilaciones que reutilizan un manifest.toml inalterado y conocido como bueno continúan verificando los tarballs contra su checksum fijado. Este problema afecta a gleam: desde 0.18.0 antes de 1.18.0."
    }
  ],
  "affected": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "affectedData": [
        {
          "vendor": "gleam-lang",
          "product": "gleam",
          "defaultStatus": "unaffected",
          "collectionURL": "https://gleam.run",
          "packageName": "gleam.run/gleam",
          "cpes": [
            "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
          ],
          "modules": [
            "gleam_cli::dependencies",
            "gleam_cli::dependencies::dependency_manager"
          ],
          "programFiles": [
            "compiler-cli/src/dependencies.rs",
            "compiler-cli/src/dependencies/dependency_manager.rs"
          ],
          "programRoutines": [
            {
              "name": "gleam_cli::dependencies::lookup_package"
            },
            {
              "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
            }
          ],
          "repo": "https://github.com/gleam-lang/gleam",
          "packageURL": "pkg:software-id/gleam.run/gleam",
          "versions": [
            {
              "version": "0.18.0",
              "lessThan": "1.18.0",
              "versionType": "semver",
              "status": "affected"
            }
          ]
        },
        {
          "vendor": "gleam-lang",
          "product": "gleam",
          "defaultStatus": "unaffected",
          "collectionURL": "https://github.com",
          "packageName": "gleam-lang/gleam",
          "cpes": [
            "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
          ],
          "modules": [
            "gleam_cli::dependencies",
            "gleam_cli::dependencies::dependency_manager"
          ],
          "programFiles": [
            "compiler-cli/src/dependencies.rs",
            "compiler-cli/src/dependencies/dependency_manager.rs"
          ],
          "programRoutines": [
            {
              "name": "gleam_cli::dependencies::lookup_package"
            },
            {
              "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
            }
          ],
          "repo": "https://github.com/gleam-lang/gleam",
          "packageURL": "pkg:github/gleam-lang/gleam",
          "versions": [
            {
              "version": "0.18.0",
              "lessThan": "1.18.0",
              "versionType": "semver",
              "status": "affected"
            },
            {
              "version": "8447b78cc844ff4aec44eea23dbd68d1fea11f11",
              "lessThan": "c9c0d48c123c8abae6db8dd61b25ccb427ed3d35",
              "versionType": "git",
              "status": "affected"
            }
          ]
        },
        {
          "vendor": "gleam-lang",
          "product": "gleam",
          "defaultStatus": "unaffected",
          "collectionURL": "https://ghcr.io",
          "packageName": "gleam-lang/gleam",
          "cpes": [
            "cpe:2.3:a:gleam-lang:gleam:*:*:*:*:*:*:*:*"
          ],
          "modules": [
            "gleam_cli::dependencies",
            "gleam_cli::dependencies::dependency_manager"
          ],
          "programFiles": [
            "compiler-cli/src/dependencies.rs",
            "compiler-cli/src/dependencies/dependency_manager.rs"
          ],
          "programRoutines": [
            {
              "name": "gleam_cli::dependencies::lookup_package"
            },
            {
              "name": "gleam_cli::dependencies::dependency_manager::DependencyManager::perform_version_resolution"
            }
          ],
          "packageURL": "pkg:oci/gleam?repository_url=ghcr.io/gleam-lang",
          "versions": [
            {
              "version": "v0.18.0-elixir",
              "lessThan": "v1.18.0-elixir",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-elixir-slim",
              "lessThan": "v1.18.0-elixir-slim",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-elixir-alpine",
              "lessThan": "v1.18.0-elixir-alpine",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-erlang",
              "lessThan": "v1.18.0-erlang",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-erlang-slim",
              "lessThan": "v1.18.0-erlang-slim",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-erlang-alpine",
              "lessThan": "v1.18.0-erlang-alpine",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-node",
              "lessThan": "v1.18.0-node",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-node-slim",
              "lessThan": "v1.18.0-node-slim",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v0.18.0-node-alpine",
              "lessThan": "v1.18.0-node-alpine",
              "versionType": "other",
              "status": "affected"
            },
            {
              "version": "v1.6.0-scratch",
              "lessThan": "v1.18.0-scratch",
              "versionType": "other",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV40": [
      {
        "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "type": "Secondary",
        "cvssData": {
          "version": "4.0",
          "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
          "baseScore": 7.6,
          "baseSeverity": "HIGH",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "attackRequirements": "PRESENT",
          "privilegesRequired": "NONE",
          "userInteraction": "PASSIVE",
          "vulnConfidentialityImpact": "HIGH",
          "vulnIntegrityImpact": "HIGH",
          "vulnAvailabilityImpact": "NONE",
          "subConfidentialityImpact": "NONE",
          "subIntegrityImpact": "NONE",
          "subAvailabilityImpact": "NONE",
          "exploitMaturity": "NOT_DEFINED",
          "confidentialityRequirement": "NOT_DEFINED",
          "integrityRequirement": "NOT_DEFINED",
          "availabilityRequirement": "NOT_DEFINED",
          "modifiedAttackVector": "NOT_DEFINED",
          "modifiedAttackComplexity": "NOT_DEFINED",
          "modifiedAttackRequirements": "NOT_DEFINED",
          "modifiedPrivilegesRequired": "NOT_DEFINED",
          "modifiedUserInteraction": "NOT_DEFINED",
          "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
          "modifiedVulnIntegrityImpact": "NOT_DEFINED",
          "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
          "modifiedSubConfidentialityImpact": "NOT_DEFINED",
          "modifiedSubIntegrityImpact": "NOT_DEFINED",
          "modifiedSubAvailabilityImpact": "NOT_DEFINED",
          "Safety": "NOT_DEFINED",
          "Automatable": "NOT_DEFINED",
          "Recovery": "NOT_DEFINED",
          "valueDensity": "NOT_DEFINED",
          "vulnerabilityResponseEffort": "NOT_DEFINED",
          "providerUrgency": "NOT_DEFINED"
        }
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-07-29T15:03:54.127187Z",
          "id": "CVE-2026-59247",
          "options": [
            {
              "exploitation": "none"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "total"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-345"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://cna.erlef.org/cves/CVE-2026-59247.html",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/gleam-lang/gleam/commit/c9c0d48c123c8abae6db8dd61b25ccb427ed3d35",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/gleam-lang/gleam/security/advisories/GHSA-4vvc-458m-r82g",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://github.com/hexpm/specifications/blob/main/registry-v2.md",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    },
    {
      "url": "https://osv.dev/vulnerability/EEF-CVE-2026-59247",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
    }
  ]
}