A malicious print job overflows an integer in HP's Linux driver and drops you into the print spooler's shoes
CVE-2026-14544 is an integer overflow in hpcups, the HPLIP filter binary that CUPS invokes when a print job is routed to an HP printer. A crafted print payload wraps a size calculation, corrupts heap memory, and — with enough work — yields arbitrary code execution *inside the print filter process*. Affected: HPLIP as shipped on RHEL 8, 9, and 10 (RHEL 6/7 unaffected, no upstream patch as of 2026-07-09). This is explicitly an incomplete fix for CVE-2026-8631, so the researcher clearly still has the file open.
The vendor's 9.8 (AV:N/AC:L/PR:N/UI:N) is a paper score. It assumes any attacker on the network can send a print job — which is only true if IPP/631 is reachable *and* the queue accepts jobs from unauthenticated peers. On a hardened enterprise fleet, CUPS binds to localhost, print servers sit inside the LAN, and the blast radius on success is the unprivileged lp account — not root, not domain, not tenant. This is a MEDIUM in practice, not a 9.8.
5 steps from start to impact.
Reach a CUPS listener that will accept the job
cupsd listens only on localhost. Enterprise print servers typically restrict Allow lines to internal subnets. Public exposure is a misconfiguration, not the norm.- Network path to cupsd on 631/tcp or an accepting IPP endpoint
- Queue configured to accept jobs from the attacker's source
- CUPS defaults to localhost-only on RHEL
- Firewalls block 631/tcp at the edge on 99%+ of enterprises
- Print servers require domain-authenticated submission in most AD environments
port:631 show low public exposure. GreyNoise has no dedicated tag as of disclosure. Network scanners (Nessus, Qualys) flag exposed CUPS in existing plugins.Submit a crafted job routed to an HP queue
hpcups, so the target queue must be backed by an HP printer driver. Attacker submits via ipptool, raw IPP POST, or curl. Non-HP queues do not exercise the vulnerable code path.- Queue exists that invokes
hpcupsas its filter - Attacker can submit a job to that queue
- Sites using PostScript / PPD-generic drivers are unaffected
- Environments standardized on non-HP hardware never load hpcups
/var/log/cups/access_log) records the submission; auditd on hpcups exec is trivial to add.Trigger the integer overflow in hpcups
- Crafted print stream that exercises the vulnerable size path
- Predictable heap layout in the filter process
- glibc heap hardening (tcache, safe-linking on RHEL 9/10)
- ASLR + non-executable heap
- Filter processes are short-lived — one-shot exploitation only
cupsd_t / hplip_t domain transitions and AVC denials on unexpected syscalls (execve, connect) from hpcups.Code execution as user lp
lp service account. lp cannot read /etc/shadow, cannot write to /etc/, and has no sudo entries in a sane build. From here the attacker needs a second local-privilege-escalation to reach root or valuable data.- Successful RCE from step 3
- Sufficient time before filter process exits
lpis a low-privilege account with no meaningful secondary access- SELinux
hplip_tconfines file/network reach - Ephemeral process — no persistence hook without another bug
hpcups. auditd on execve from uid=lp catches it immediately.Chain to a local privilege escalation
- Presence of a usable LPE on the host
- Time to execute before the filter process reaps
- Modern RHEL kernels are patched aggressively
- PAM/sudo hardening in enterprise images
The supporting signals.
| In-the-wild exploitation | None observed as of 2026-07-09. No incident vendor telemetry, no ransomware crew adoption. |
|---|---|
| KEV status | Not listed on CISA KEV. |
| EPSS | 0.00511 (~0.5%) — bottom quartile of predicted exploitation likelihood. |
| Public PoC | No public PoC at disclosure. The CVE-2026-8631 patch diff is the natural starting point for reversers. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8. AV:N is aspirational; realistic AV is AV:A or AV:L for the ≥99% of installs with cupsd bound to localhost. |
| Affected | HPLIP on RHEL 8, 9, 10. RHEL 6/7 unaffected. Fedora backports pending. Ubuntu/Debian tracking under their own trackers. |
| Fixed version | No upstream HPLIP fix released as of 2026-07-09. This is an incomplete fix for CVE-2026-8631 — a full patch is expected but not shipped. |
| Exposure data | Shodan port:631 country:US returns ~40k hosts globally, most behind auth or in labs. Meaningful enterprise-exposed CUPS printing is well under 1% of installs. |
| Disclosed | 2026-07-03 via Red Hat Bugzilla 2496772; NVD published 2026-07-06. |
| Root cause lineage | Follow-on to CVE-2026-8631 — same overflow, incomplete fix. Signals a class of size-validation bugs in hpcups. |
noisgate verdict.
The single decisive factor is the collapsed blast radius: successful exploitation lands the attacker in the unprivileged lp service account inside a short-lived filter process, not root and not a domain-relevant identity. Combined with cupsd defaulting to localhost binding and the vulnerable code path only firing on HP-backed queues, the real-world reachable population and post-exploit value are both far below what a 9.8 implies.
Why this verdict
- Reachability collapse: RHEL cupsd defaults bind to localhost. Attacker needs either an on-LAN foothold or a rare misconfigured public CUPS listener. This alone moves the practical AV from N to A/L on ≥99% of the fleet.
- Payload gating: The overflow only triggers when
hpcupsis the invoked filter. Sites with no HP printers or standardized on generic PostScript never load the vulnerable code — a wide swath of the affected RHEL population is not actually exploitable. - Blast radius floor: Success =
lpuser in a short-lived filter process.lphas no shadow read, no domain trust, no secret store access, no sudo. Without a second bug, this is a nuisance, not an incident. - Role multiplier: Print server / workstation / dev host — none are on the high-value-role catalog (no identity, hypervisor, PAM, backup, kernel-agent, or CI/CD role). The chain does not end in fleet compromise anywhere it lands, so the CRITICAL/HIGH floors from the deployment-role rule do not trigger.
- Signal state: EPSS 0.00511, no KEV, no public PoC, no in-the-wild reports. All independent signals agree with the downgrade.
- Counterweight — not lower: No upstream patch exists, this is an incomplete-fix follow-on (meaning researcher attention is active), and internal print servers are a common lateral-movement waypoint. That keeps it above LOW.
Why not higher?
HIGH would require either a plausible chain to root/domain without a second bug, or meaningful public-internet exposure. Neither holds: lp is a dead-end identity and CUPS-on-631 exposure to the internet is a small-single-digit percentage of installs. No KEV, no PoC, no active exploitation.
Why not lower?
LOW would ignore that this is an unauthenticated RCE primitive on a widely deployed Linux package with no patch shipped yet, and that it's the second bug in the same code path — researchers are looking. A committed insider or post-initial-access attacker on an internal print server absolutely can weaponize it as a lateral-movement stepping stone.
What to do — in priority order.
- Bind cupsd to localhost only where remote printing is not required — Edit
/etc/cups/cupsd.conf— removeListen *:631, keepListen localhost:631. Kills the network attack surface entirely on standalone hosts. No mitigation SLA at MEDIUM, but this is a 1-hour change with zero business impact on non-server hosts — do it this sprint. - Restrict IPP/631 at the network edge and between VLANs — Firewall 631/tcp inbound from untrusted networks and enforce east-west segmentation between user VLANs and print server VLANs. Prevents opportunistic lateral pivot. Target the 365-day noisgate remediation SLA for the segmentation project.
- Remove HPLIP where no HP hardware exists —
dnf remove hplip hplip-commonon hosts with no HP printer dependency. Eliminates the vulnerable code path entirely. Verify withrpm -q hplipreturningnot installed. - Enforce authenticated submission on shared print servers — Set
DefaultAuthType NegotiateorBasicin cupsd.conf and require Kerberos/AD auth on all queues. Turns AV:N into PR:L at minimum. - Confirm SELinux enforcing and hplip_t policy loaded —
getenforcemust returnEnforcing;semodule -l | grep hplipmust show the policy. SELinux confinement limits what a compromisedhpcupscan reach post-exploit. - Monitor for anomalous hpcups child processes and network connections — auditd rule:
-a always,exit -F arch=b64 -S execve -F auid=lp -k hpcups_child. Anyexecvefrom the filter process tosh,bash,curl,wget,ncis exploitation until proven otherwise.
- Patching alone — no upstream fix exists yet as of 2026-07-09; you cannot
dnf updateyour way out of this today. - Blocking outbound from print servers — the attacker's payload runs in-process; an interactive shell is not required for tampering or staging.
- Web WAF rules — IPP is not HTTP-application traffic; WAFs on 443 do not see or gate CUPS submissions.
- Disabling printer sharing in the GUI on workstations — does not remove HPLIP nor guarantee cupsd binding scope; verify via
cupsd.conf, not the desktop toggle.
Crowdsourced verification payload.
Run on each RHEL 8/9/10 host as root (needs to read cupsd.conf and query rpm). Invoke as sudo bash check-cve-2026-14544.sh. Exits 0 for PATCHED/NOT_APPLICABLE, 1 for VULNERABLE, 2 for UNKNOWN.
#!/usr/bin/env bash
# check-cve-2026-14544.sh — HPLIP hpcups integer overflow reassessment probe
# Usage: sudo bash check-cve-2026-14544.sh
set -u
STATUS="UNKNOWN"
REASON=""
# 1. Is HPLIP installed?
if ! rpm -q hplip >/dev/null 2>&1; then
echo "PATCHED (hplip not installed — not applicable)"
exit 0
fi
HPLIP_VER=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' hplip 2>/dev/null | head -n1)
RHEL_MAJOR=$(rpm -E %{rhel} 2>/dev/null)
# 2. Is cupsd listening beyond localhost?
CUPS_CONF="/etc/cups/cupsd.conf"
EXPOSED="no"
if [[ -r "$CUPS_CONF" ]]; then
if grep -Eq '^[[:space:]]*Listen[[:space:]]+(\*|0\.0\.0\.0|[^l#].*):631' "$CUPS_CONF" 2>/dev/null; then
EXPOSED="yes"
fi
if grep -Eq '^[[:space:]]*Port[[:space:]]+631' "$CUPS_CONF" 2>/dev/null; then
EXPOSED="yes"
fi
fi
# 3. Any HP-driven queues actually configured?
HP_QUEUES=0
if command -v lpstat >/dev/null 2>&1; then
HP_QUEUES=$(lpstat -v 2>/dev/null | grep -c -iE 'hp:|hpfax:|hplip')
fi
# 4. Check Red Hat errata — replace with your patched NVR once RH ships the fix
# Until then, any installed hplip on RHEL 8/9/10 is VULNERABLE by advisory.
case "$RHEL_MAJOR" in
8|9|10)
STATUS="VULNERABLE"
REASON="hplip $HPLIP_VER on RHEL $RHEL_MAJOR — no vendor patch as of 2026-07-09"
;;
6|7)
STATUS="PATCHED"
REASON="RHEL $RHEL_MAJOR not affected by CVE-2026-14544"
;;
*)
STATUS="UNKNOWN"
REASON="unrecognized RHEL major: $RHEL_MAJOR"
;;
esac
echo "$STATUS: $REASON"
echo " cups_listens_beyond_localhost=$EXPOSED"
echo " hp_queues_configured=$HP_QUEUES"
case "$STATUS" in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esac
If you remember one thing.
dnf remove hplip on every host that has no HP printer dependency, and confirm cupsd.conf binds to localhost on all non-print-server hosts. On dedicated print servers: enforce authenticated IPP and firewall 631/tcp to the internal print VLAN only. Because this is MEDIUM, there is no noisgate mitigation SLA — but the two changes above are hours of work with zero business risk, so do them this sprint anyway. The noisgate remediation SLA is ≤ 365 days: install the Red Hat HPLIP errata within that window once shipped, and re-run the script to confirm. If CISA adds this to KEV or a public PoC drops, the SLA collapses to *hours* — set a watch on the CVE ID and the CVE-2026-8631 patch tree.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.