Skip to main content

Perl Imager CVE-2026-93019

| EUVDEUVD-2026-82927 CRITICAL
Unsigned to Signed Conversion Error (CWE-196)
2026-09-18 9b29abf9-4ab0-4765-b253-1875cd9b441e
9.1
CVSS 3.1 · Vendor: 9b29abf9-4ab0-4765-b253-1875cd9b441e
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Craft TGA with colourmaplength ≥ 32768
  2. Delivery
    Submit file to app using Imager->read()
  3. Exploit
    Signed-short length becomes negative, cast to size_t
  4. Execution
    mymalloc requests near-SIZE_MAX, allocation fails
  5. Persist
    Allocator calls exit(3), process terminates
  6. Impact
    Denial of service

Vulnerability Assessment

Weakness
CWE
Exploitation Conditions

Requires that the target application parse an attacker-supplied TGA image through Imager (Imager->read() with type 'tga' or content auto-detection) using a version before 1.036. No authentication, user interaction, or non-default configuration is needed on the Imager side - any code path that feeds untrusted image bytes to Imager is vulnerable. The key limiting factor is deployment context: exploitation only matters where Imager processes untrusted/uploaded files. The impact is amplified because the exit(3) is uncatchable - Perl eval/Try::Tiny cannot trap it - so a single malicious file kills the worker/process. No RCE or data exposure results.

Impact

The vendor CVSS of 9.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H) overstates real risk: the described defect is a signed-short integer signedness error (CWE-196) in tga_palette_read() that produces a near-SIZE_MAX allocation, which fails and triggers Imager's allocator to call exit(3). This is a pure availability/denial-of-service issue - the process terminates uncatchably. There is NO confidentiality impact, so the vendor's C:H is unjustified; the true impact is A:H only, which drops the score to ~7.5. The Tags field ('Information Disclosure') and the vendor C:H conflict directly with the description, which shows only an uncatchable exit - verify with vendor, but the code evidence (allocator exit path, patch clamping colourmapusable) confirms DoS, not data leak. SSVC signals are moderate: Exploitation=poc, Automatable=yes, Technical Impact=partial - consistent with a reliable but non-catastrophic DoS. A proof-of-concept test file (testimg/badcmlen.tga) ships in the fixing commit, so working trigger data is public, but there is no CISA KEV listing and no EPSS score in the input, indicating no evidence of widespread active exploitation. Net: a genuine, trivially-reproducible DoS worth patching promptly where Imager parses untrusted images, but not a critical RCE/disclosure despite the 9.1 headline.

Exploit ScenarioDerived

An attacker uploads or otherwise supplies a crafted TGA file with a colour-map length field of 32768+ to a Perl web service or batch process that parses images via Imager->read(). When Imager unpacks the length into a signed short it becomes negative, is cast to size_t, and requests a near-SIZE_MAX buffer; the allocation fails and Imager's mymalloc calls exit(3), killing the process uncatchably (an eval/try block cannot recover). A public POC test asset (badcmlen.tga) exists in the fix commit, making reproduction trivial.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
No patch listed yet 0.6% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 18, 2026

An attacker-supplied Truevision TGA image can force the Perl Imager module (versions before 1.036) to kill the entire hosting process: a colour map length of 32768 or more is read into a signed short, becomes negative, is cast to size_t, and turned into a near-SIZE_MAX allocation request that fails and makes Imager's allocator call exit(3). Exploitation requires only that the application pass untrusted image bytes to Imager->read() with TGA handling (explicit type 'tga' or auto-detection) - the CVSS vector is PR:N, so no authentication is needed, and the exit(3) is uncatchable, meaning Perl eval and Try::Tiny handlers cannot trap it and a single malicious file terminates the worker, request handler, or CLI process. Publicly available exploit code exists per the SSVC assessment (exploitation: poc), but the input does not record confirmed active exploitation (CISA KEV); the vendor CVSS of 9.1 (C:H/I:N/A:H) is overstated, since the independently assessed vector is C:N/I:N/A:H - this is a pure denial-of-service condition with no code execution, memory corruption, or data disclosure.

RemediationAI

Vendor-released patch: upgrade to Imager 1.036 or later (TONYC/Imager-1.036, https://metacpan.org/release/TONYC/Imager-1.036/changes), which contains commit 74ed50e0625f9f51054e595bb4a8da92c1e0d571 and is tracked by advisory GHSA-p4vw-rc54-p2c2; verify the deployed version with 'perl -MImager -e "print $Imager::VERSION"' after upgrading. If the upgrade cannot be applied immediately, the most effective compensating control is to stop feeding TGA data to the vulnerable decoder: restrict reads to known-safe formats by passing an explicit allow-list such as Imager->read(file => $f, type => 'png') or the module's 'types' option so auto-detection cannot select the TGA loader - the trade-off is that legitimate TGA assets will no longer be processed. A second option is to pre-screen uploads and reject any file whose TGA header bytes at offsets 5-6 (little-endian colour map length) exceed 255, since valid TGA colour maps are limited to 256 entries and the crashing condition requires 32768 or more - this is cheap and specific, but relies on your own parser being as strict as the patched decoder and will drop files with anomalously large (though legal-format) padding fields. Running Imager parsing in disposable worker processes supervised by a restart policy (for example a pool with per-request timeouts and automatic respawn) limits blast radius but does not prevent the crash itself. Note that a general RLIMIT_AS or memory cap is not a reliable mitigation here, because the failure path calls exit(3) before or regardless of whether the allocation is capped, and because exit(3) cannot be caught by eval, Try::Tiny, or similar in-process handlers.

Affected ProductsAI

Affected is the Imager CPAN distribution for Perl maintained by Tony Cook (TONYC), all versions before 1.036, on every platform where the module is built; the vulnerable code path is the TGA loader in tga.c reached through Imager->read(). The EUVD identifier EUVD-2026-82927 tracks the same issue as CVE-2026-93019. Downstream exposure is determined by the embedding application rather than by Imager itself: Perl CGI/PSGI web applications, thumbnail or conversion services, upload scanners, and any CLI tool that accepts attacker-supplied image files and allows TGA input (explicit type => 'tga' or automatic format detection) are affected, while installations that only ever decode trusted, vendor-generated images are not. No CPE strings were provided in the source data, so exact product coverage must be confirmed against the vendor advisory GHSA-p4vw-rc54-p2c2 and the 1.036 changelog on MetaCPAN; the upstream patch and changelog entries are at https://github.com/tonycoz/imager/commit/74ed50e0625f9f51054e595bb4a8da92c1e0d571.patch, https://github.com/tonycoz/imager/security/advisories/GHSA-p4vw-rc54-p2c2, and https://metacpan.org/release/TONYC/Imager-1.036/changes, with disclosure discussion at https://seclists.org/oss-sec/2026/q3/828 and http://www.openwall.com/lists/oss-security/2026/09/18/9.

Affects your stack

Find out whether the stacks and servers you run are on an affected version.

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw is a signedness bug (CWE-196, unsigned-to-signed conversion error) inside the TGA decoder of Imager for Perl, specifically tga_palette_read() in tga.c. The TGA header stores the colour map length as a two-byte little-endian field, which the decoder unpacked into a 'short int' struct member; any value of 32768 (0x8000) or above therefore became negative. That negative value was passed into mymalloc(), which takes a size_t, so the sign extension produced a request near SIZE_MAX, the allocation failed, and Imager's allocator handler responded by calling exit(3) rather than raising a trappable Perl exception. The upstream fix (commit 74ed50e0625f9f51054e595bb4a8da92c1e0d571, released in Imager 1.036) changes colourmaporigin, colourmaplength, x_origin and y_origin to unsigned types, passes colourmaporigin into tga_palette_read(), rejects an origin above 255 with an error, and clamps the usable palette to at most 256 entries (colourmapusable = 256 - colourmaporigin), silently discarding anything beyond entry 256 instead of attempting the doomed allocation. Note that the supplied tag 'Information Disclosure' is inconsistent with both the description and the independent assessment, which find availability impact only.

Know when Perl gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (9b29abf9-4ab0-4765-b253-1875cd9b441e) PRIMARY 9.1 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
vuln.today AI 7.5 HIGH

Untrusted TGA reachable remotely via image upload (AV:N/AC:L/PR:N/UI:N); impact is an uncatchable process exit, so A:H with C:N/I:N - no confidentiality or integrity effect.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (9b29abf9-4ab0-4765-b253-1875cd9b441e).

CVSS VectorVendor: 9b29abf9-4ab0-4765-b253-1875cd9b441e

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
High

Lifecycle Timeline

2
CVE Published
Sep 18, 2026 - 14:19 cve.org
CRITICAL 9.1
CVE Published
Sep 18, 2026 - 14:19 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

Imager versions before 1.036 for Perl exit the process reading a TGA with a colour map length of 32768 or more in tga_palette_read.

The reader unpacks the two-byte colour map length into a signed short, so a length of 32768 or more becomes negative. tga_palette_read() casts that value to size_t and asks mymalloc() for a size near SIZE_MAX. The allocation fails and Imager's allocator calls exit(3).

Reading an attacker-supplied file through Imager->read() triggers an uncatchable exit.

Technical POC Analysis

CWE-196, Unsigned to Signed Conversion Error, as assigned by the advisory.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Perl Imager versions before 1.036 are affected by an unauthenticated denial-of-service flaw when processing malicious TGA images, and a single file can terminate the hosting process without being caught by normal Perl exception handling. Publicly available exploit code exists, and no vendor-released patch has been identified, so any service that passes untrusted image bytes to Imager with TGA support or auto-detection can experience repeated availability disruptions. Leadership should treat this as an availability-risk issue and direct teams to contain exposure in internet-facing and multi-tenant image-processing workflows first.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis; interim mitigations include disabling TGA processing and auto-detection in Imager, rejecting or re-encoding untrusted TGA images before parsing, enforcing file-type allowlists and colour-map length checks, running image processing in isolated low-privilege, restartable workers or containers with resource limits, and monitoring for process exits.

Threat Intelligence Overview

EPSS Score
0.6%
Top 52% exploitable
Prevalence
Low
Perl CPAN image library; used by Perl web/batch apps, niche footprint
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.6%
Patch available No
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

47
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Perl

View all
CVE-2012-6329 HIGH POC
7.5 Jan 04

The _compile function in Maketext.pm in the Locale::Maketext implementation in Perl before 5.17.7 does not properly hand

CVE-2017-12814 CRITICAL POC
9.8 Sep 28

Stack-based buffer overflow in the CPerlHost::Add method in win32/perlhost.h in Perl before 5.24.3-RC1 and 5.26.x before

CVE-2015-8608 CRITICAL POC
9.8 Feb 07

The VDir::MapPathA and VDir::MapPathW functions in Perl 5.22 allow remote attackers to cause a denial of service (out-of

CVE-2018-18314 CRITICAL POC
9.8 Dec 07

Perl before 5.26.3 has a buffer overflow via a crafted regular expression that triggers invalid write operations. Rated

CVE-2018-18312 CRITICAL POC
9.8 Dec 05

Perl before 5.26.3 and 5.28.0 before 5.28.1 has a buffer overflow via a crafted regular expression that triggers invalid

CVE-2018-18313 CRITICAL POC
9.1 Dec 07

Perl before 5.26.3 has a buffer over-read via a crafted regular expression that triggers disclosure of sensitive informa

CVE-2016-2381 HIGH
7.5 Apr 08

Perl might allow context-dependent attackers to bypass the taint protection mechanism in a child process via duplicate e

CVE-2023-31484 HIGH POC
8.1 Apr 29

CPAN.pm before 2.35 does not verify TLS certificates when downloading distributions over HTTPS. Rated high severity (CVS

CVE-2016-6185 HIGH POC
7.8 Aug 02

The XSLoader::load method in XSLoader in Perl does not properly locate .so files when called in a string eval, which mig

CVE-2018-12015 HIGH POC
7.5 Jun 07

In Perl through 5.26.2, the Archive::Tar module allows remote attackers to bypass a directory-traversal protection mecha

CVE-2020-10543 HIGH
8.2 Jun 05

Perl before 5.30.3 on 32-bit platforms allows a heap-based buffer overflow because nested regular expression quantifiers

CVE-2015-8853 HIGH
7.5 May 25

The (1) S_reghop3, (2) S_reghop4, and (3) S_reghopmaybe3 functions in regexec.c in Perl before 5.24.0 allow context-depe

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy