A one-byte overrun in a certificate-generation CLI that only fires when an admin feeds it a poisoned template file
GnuTLS ships certtool, a command-line utility administrators use to generate CSRs, self-signed certs, and private keys from human-editable template files. The bug is a classic off-by-one heap overflow (CWE-122) in the template parser: crafted input in a template can overrun a heap buffer by a single byte during processing. Affected versions are GnuTLS prior to 3.8.7 across the 3.7.x and 3.8.x lines; distro-backported fixes landed for RHEL 8/9, Debian bookworm, Ubuntu 22.04/24.04, and SUSE in the weeks following disclosure. The *library* side (libgnutls) — which is what web servers, VPNs, and email daemons actually link — is not affected; the flaw lives in the certtool binary's template code path only.
The vendor score of 6.5 MEDIUM with vector AV:N/AC:L/PR:N/UI:N is misleading. AV:N here is a scoring artifact: it implies remote reachability, but the only way this triggers is if someone runs certtool --generate-request --template <attacker-file> against a file they don't control. That is not a network vulnerability in any operational sense. Confidentiality impact is None, integrity and availability are Low, and there is no path to code execution demonstrated. Real-world severity is LOW — this is a hygiene patch, not a fire.
4 steps from start to impact.
Attacker crafts a malicious GnuTLS template file
dn/cn field values. No weaponized RCE exploit has surfaced.- Knowledge of the vulnerable field parser (public)
- GnuTLS < 3.8.7 on target
- A single-byte heap overrun rarely reaches useful control-flow hijack without a companion info-leak
- glibc heap hardening (tcache double-free checks, safe-linking) blunts one-byte overwrites
Delivery: get the file in front of certtool
certtool against it. Typical delivery vectors: a compromised internal CA workflow, a CI/CD job that generates CSRs from a git-tracked template, or social engineering an ops engineer.- An admin or pipeline that runs certtool on attacker-influenced input
- Write access to the template location or PR merge on the repo
- certtool is not run by unprivileged users or services on a schedule — it is an interactive admin tool
- CI pipelines that use it typically consume a *committed* template controlled by change review
- The library side (libgnutls) linked by nginx/apache/postfix/openvpn is not on this code path
Trigger the off-by-one during template parse
- Vulnerable certtool binary reached
- Modern glibc (2.32+) tcache and safe-linking mitigations
- Distro builds ship with FORTIFY_SOURCE=2, stack canaries, PIE, full RELRO
Impact ceiling: DoS or narrow integrity impact
- Successful trigger
- The process is short-lived; a crash is annoying, not damaging
- Output artifacts are typically reviewed before being loaded into a CA or trust store
The supporting signals.
| In-the-wild exploitation | None observed. Not tracked by CISA KEV, no vendor IR reports, no ransomware affiliate use. |
|---|---|
| Proof-of-concept | Crash reproducer posted to oss-security and referenced in the Red Hat bugzilla; no weaponized RCE exploit public. |
| EPSS | 0.0072 (~0.7%) — bottom quartile; FIRST models it as unlikely to be exploited in the next 30 days. |
| CISA KEV | Not listed. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L = 6.5 MEDIUM. AV:N is a scoring artifact — real attack vector is Local via crafted file. |
| Affected versions | GnuTLS < 3.8.7; all 3.7.x and 3.8.x builds before the fix. |
| Fixed versions | Upstream 3.8.7; RHEL 8/9 backports in gnutls-3.6.16-8.el8_10 / gnutls-3.7.6-24.el9_5; Debian bookworm 3.7.9-2+deb12u4; Ubuntu 24.04 3.8.3-1.1ubuntu3.3. |
| Exposure surface (Shodan/Censys) | Not measurable — certtool is a CLI, not a listening service. Library-linked daemons are not on the vulnerable code path. |
| Disclosed | 2025-07-10 via GnuTLS security list, credited to a Red Hat internal reporter. |
| Component role | Admin CLI (certtool). libgnutls — the library used by nginx, apache, exim, openvpn, cups — is unaffected. |
noisgate verdict.
The single most decisive factor is that the flaw lives in an admin CLI tool (certtool) invoked interactively against files the operator controls — not in the libgnutls library that daemons link. There is no network path, no privileged service surface, and the impact ceiling is a crash or corrupted CSR, not code execution.
Why this verdict
- Attack vector is Local, not Network. The CVSS
AV:Nis inherited from GnuTLS's general threat model; the actual trigger requires feeding certtool a file. Compounding downward pressure #1. - No service surface. certtool is not a daemon, not a listener, not spawned by any listening process. EDR won't see baseline invocations. Compounding downward pressure #2.
- Impact ceiling is DoS + narrow integrity. CVSS
C:N/I:L/A:L— no code execution demonstrated, no privilege change, no lateral movement primitive. Compounding downward pressure #3. - Role multiplier — typical role (admin workstation / CA operator laptop): chain succeeds only insofar as certtool crashes; blast radius = one shell session. No fleet impact.
- Role multiplier — high-value role (internal PKI / ADCS-equivalent operators): even here, the artifact is reviewed before being loaded into a trust store; the chain does not reach domain or fleet compromise. Floor does not lift above LOW.
- Role multiplier — CI/CD pipelines using certtool: template files are change-controlled in git; delivering a malicious template requires PR merge access, at which point the attacker already has more direct paths.
- libgnutls is not affected — the internet-facing daemons that matter (TLS termination, VPN, mail) are not exposed via this code path. Installed-base share of certtool being run against untrusted input is well under 1%.
Why not higher?
MEDIUM would require a plausible path to code execution or a service-side exposure. Neither exists: it's an off-by-one in an interactive CLI with hardened distro toolchains, and no researcher has demonstrated control-flow hijack in 12+ months since disclosure. HIGH would require a role multiplier landing in a domain-scale blast radius, which the certtool workflow does not provide.
Why not lower?
IGNORE is off the table because the flaw is real, upstream shipped a fix, and there is a non-zero (if contrived) integrity path via corrupted CSRs entering a CA workflow. It stays in the patch backlog under normal hygiene cadence rather than being fully waived.
What to do — in priority order.
- Roll GnuTLS to 3.8.7 (or distro backport) during the next regular patch window — No mitigation SLA applies at LOW — fold this into standard OS-package hygiene and land within the noisgate remediation window of 365 days. On RHEL/Ubuntu,
dnf update gnutls-utils/apt install gnutls-binis sufficient — no service restart required because the flaw is in the utility binary, not the library. - Restrict who can drop files into certtool template directories — If you have automation that invokes certtool from a shared path, tighten filesystem ACLs so only trusted operators/service accounts can write templates. Kills the delivery step regardless of patch state.
- Move CSR generation to reviewed pipelines — Templates consumed by CI/CD should live in a git repo with mandatory PR review and signed commits. This makes a malicious template functionally equivalent to a malicious code commit — same review gate applies.
- Alert on interactive certtool invocations outside expected admin sessions — EDR process-creation rule:
certtool --generate-*from a non-admin user or from a service account with no historical baseline. Low noise, high signal because certtool has very few legitimate callers.
- Blocking inbound network traffic — irrelevant; the CVSS
AV:Nscoring does not reflect an actual network path. - Restarting nginx/apache/postfix after upgrading
libgnutls— the library isn't the vulnerable code and the restart is a waste of change-window budget for this CVE. - WAF rules or TLS inspection — nothing traverses the wire in this bug.
- Rotating certificates — the flaw is in certificate *generation tooling*, not in the trust chain; rotation neither exposes nor mitigates.
Crowdsourced verification payload.
Run this on each Linux host that ships GnuTLS utilities (the gnutls-utils / gnutls-bin package). Invoke as ./check-cve-2025-32990.sh — no root required, it only reads package metadata. Outputs VULNERABLE, PATCHED, or UNKNOWN with an exit code (0/1/2).
#!/usr/bin/env bash
# noisgate check for CVE-2025-32990 (GnuTLS certtool off-by-one)
# Compares the installed gnutls-utils / gnutls-bin version against upstream 3.8.7
# and against known distro backports.
set -u
MIN_UPSTREAM="3.8.7"
ver_ge() {
# returns 0 if $1 >= $2 (semver-ish)
[ "$(printf '%s\n%s\n' "$2" "$1" | sort -V | head -n1)" = "$2" ]
}
if ! command -v certtool >/dev/null 2>&1; then
echo "UNKNOWN: certtool not installed on this host"
exit 2
fi
RAW="$(certtool --version 2>/dev/null | head -n1)"
VER="$(echo "$RAW" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)"
if [ -z "$VER" ]; then
echo "UNKNOWN: could not parse certtool version from: $RAW"
exit 2
fi
# Check distro-backport package versions where the upstream number is <3.8.7
# but the security fix is present.
PKG_VER=""
if command -v rpm >/dev/null 2>&1; then
PKG_VER="$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' gnutls-utils 2>/dev/null | head -n1)"
elif command -v dpkg-query >/dev/null 2>&1; then
PKG_VER="$(dpkg-query -W -f='${Version}\n' gnutls-bin 2>/dev/null | head -n1)"
fi
echo "certtool binary version: $VER"
echo "distro package version : ${PKG_VER:-n/a}"
# Known-good distro package versions (add as your fleet requires)
case "$PKG_VER" in
3.6.16-8.el8_10*|3.7.6-24.el9_5*|3.7.9-2+deb12u4*|3.8.3-1.1ubuntu3.3*)
echo "PATCHED: distro backport detected"
exit 0
;;
esac
if ver_ge "$VER" "$MIN_UPSTREAM"; then
echo "PATCHED: upstream >= $MIN_UPSTREAM"
exit 0
fi
echo "VULNERABLE: certtool $VER < $MIN_UPSTREAM and no known backport matched"
exit 1
If you remember one thing.
gnutls-utils / gnutls-bin from your distro's stable channel in the next quarterly window — that's the noisgate remediation SLA of ≤365 days for a LOW verdict, and there is no noisgate mitigation SLA because the impact ceiling is a crash or malformed CSR in an admin CLI. Do not burn a change window restarting TLS-terminating services (nginx/apache/postfix/openvpn) — libgnutls is not on the vulnerable code path. The only exception is if your internal PKI operators use certtool against templates sourced from ticket attachments or shared drives; in that case, tighten the template source-of-truth to a reviewed git repo and skip forward to patching within the next 30 days as a precaution.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.