Skip to main content

XS::Parse::Infix EUVDEUVD-2026-88344

| CVE-2026-85644 HIGH
Access of Resource Using Incompatible Type (Type Confusion) (CWE-843)
2026-09-28 CPANSec GHSA-ch9g-92vf-wwhv
7.5
CVSS 3.1 · Vendor: CPANSec
View

Attack ChainAIDerived

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

  1. Access
    Supply crafted number/string via decoded input (JSON)
  2. Delivery
    App passes list to list-associative infix operator
  3. Exploit
    SvRV guard treats value as arrayref
  4. Execution
    Interpreter dereferences attacker-chosen address
  5. Impact
    Segfault (DoS) or arbitrary memory read as SVs

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Type safety enforcement
MITRE ATT&CK

1 technique across 1 tactic: Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires a consuming Perl application (using XS::Parse::Infix 0.40-0.49) that invokes a list-associative infix operator - such as zip from Syntax::Operator::Zip - on a list constructed from attacker-influenceable data, typically decoded external input like a JSON array. The attacker must be able to place a value where an array reference is expected: a bare IV/NV number reliably triggers a segfault (DoS), while a specially crafted string with byte 12 set to 0x0b (SVt_PVAV) bypasses the accidental croak and drives a controlled dereference. Limiting factors: this is a library flaw with no standalone attack surface - it is only reachable if the application feeds untrusted data into such an operator, so real-world exposure depends heavily on downstream usage; there is no authentication or user-interaction requirement inherent to the flaw itself.

Impact

This is a CWE-843 type-confusion / memory-safety flaw in the XS::Parse::Infix Perl module (versions 0.40-0.49), where a list-associative infix operator's generated wrapper validates array-reference arguments with SvRV() instead of SvROK(), so the reference guard never actually confirms the SV holds a reference. The vendor CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, 7.5) scores only availability impact (segfault/DoS), but the description goes further: an attacker-crafted string with byte 12 = 0x0b bypasses the accidental croak and is then treated as an AV head, with AvARRAY read from bytes 16-23 and its entries pushed onto the Perl stack as live SVs - a controlled-dereference primitive that plausibly enables information disclosure and possibly worse. The signals largely agree on real but bounded risk: EPSS is very low (0.18%, 7th percentile), there is NO CISA KEV listing (not actively exploited), and no wide-scale exploitation is expected, but a working proof-of-concept IS embedded in the advisory (the Syntax::Operator::Zip zip(@args) example), so the barrier to triggering at least a crash is trivial. The key caveat: exploitation is entirely conditional on a downstream application passing attacker-influenceable, decoded input (e.g. from JSON) into a list-associative infix operator - this is a library-level flaw whose real-world reachability depends on how consuming applications use it, so AV:N/PR:N describes the theoretical path rather than a guaranteed remote-unauthenticated hit against every install.

Exploit ScenarioDerived

An application decodes untrusted input (for example a JSON array from an API request) and passes the resulting list to a list-associative infix operator such as zip from Syntax::Operator::Zip. An attacker supplies a bare number (or a crafted string with byte 12 = 0x0b) where an array reference is expected; the flawed SvRV()-based guard treats the value as an array reference and dereferences an attacker-influenced address, causing a segmentation fault or, with a crafted string, reading arbitrary memory as live SVs. A proof-of-concept exists in the advisory (my @args = ([1], 2); zip(@args);).

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 30, 2026

Type confusion in XS::Parse::Infix versions 0.40 through 0.49 - the Perl XS module distributed as part of XS-Parse-Keyword - lets an attacker who can influence a list handed to a list-associative infix operator (for example the zip operator from Syntax::Operator::Zip) make the interpreter dereference an address of the attacker's choosing. Supplying a bare number where an array reference is expected reliably segfaults the process (denial of service), while a crafted string carrying 0x0b at byte 12 slips past the faulty reference guard and is treated as an AV head, so bytes 16-23 are used as AvARRAY and its entries are pushed onto the Perl stack as live SVs, yielding a limited out-of-bounds read / information-disclosure primitive. Publicly available exploit code exists (a minimal zip-based proof-of-concept is described by the reporter), but there is no confirmed active exploitation (no CISA KEV listing) and EPSS is low at 0.18% (7th percentile); this is a library flaw with no standalone attack surface, so real-world risk depends entirely on whether a consuming application passes untrusted, attacker-influenced data into such an operator.

RemediationAI

Vendor-released patch: XS-Parse-Keyword 0.50 (which contains XS::Parse::Infix 0.50); upgrade the distribution from any 0.40-0.49 release to 0.50 or later, and rebuild/reinstall any downstream modules that generate wrappers from it, since the fixed code is emitted into those generated wrappers (rollback is not advisable - the 0.49 diff shows the SvRV()/SvROK() guard change in src/infix.c). If an immediate upgrade is impossible, the effective compensating control is application-level input validation at the boundary where untrusted data reaches a list-associative operator: never pass a decoded structure straight into operators such as zip from Syntax::Operator::Zip, and instead enforce an explicit schema that rejects any element that is not a genuine ARRAY reference (a reftype/ref() check on every element) before the call, accepting the trade-off that a validation mistake reintroduces the type confusion and that such checks add per-call overhead. Wrapping or normalising scalars into arrayrefs before invocation also removes the mixed list, but this changes application semantics for callers that legitimately pass scalars and must be reviewed. Running the affected interpreter under a process supervisor with automatic restart, in a low-privilege per-request worker (for example a forking PSGI/Plack server or container with a minimal user and seccomp/ASLR enabled), limits the blast radius of the guaranteed segfault path and makes the crafted-string information disclosure harder to reach - but it does not eliminate the memory-safety flaw and should be considered only a stop-gap. Perl-level taint mode or JSON-with-strict-schema decoding cannot by itself distinguish a suitably crafted string, so no purely input-scanning mitigation should be treated as complete. Patch status: a vendor-released fix (0.50) is available; there is no evidence in the supplied data of any fixed 0.40-0.49 branch release.

Affected ProductsAI

XS::Parse::Infix versions from 0.40 through 0.49 inclusive are affected; the module is packaged within the PEVANS XS-Parse-Keyword distribution for Perl, and the fix is shipped in XS-Parse-Keyword 0.50 (see the release changes at https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/changes and the source diff at https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/diff/PEVANS/XS-Parse-Keyword-0.49#src/infix.c). Because the flaw lives in generated XS wrapper code, any downstream Perl module or application that declares a list-associative infix operator with the affected versions inherits it - the zip operator from Syntax::Operator::Zip is the concrete example used in the proof-of-concept. No machine-readable CPE identifiers were included in the supplied data, so no CPE strings can be quoted; the version range above is the authoritative affected set. Advisory and analysis material is available via CPANSec (osv-style oss-security thread at https://seclists.org/oss-sec/2026/q3/973), the Openwall mirror at http://www.openwall.com/lists/oss-security/2026/09/28/14, and EUVD entry EUVD-2026-88344, with the NVD record at https://nvd.nist.gov/vuln/detail/CVE-2026-85644.

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 bug is a CWE-843 type-confusion / memory-safety defect inside code generated by XS::Parse::Infix, which builds XS wrapper functions for user-declared infix operators. For a list-associative operator the generated wrapper must confirm that each argument is an array reference before treating it as an AV, but it performs that check with SvRV() instead of SvROK(). In Perl's SV internals SvRV() simply reads the union's referent pointer slot; that slot only holds a valid referent once SvROK(sv) is true. For an IV or NV scalar the same union slot holds the numeric value itself, so SvRV() hands back the caller's number as a pointer, and the subsequent SvTYPE() macro dereferences that pointer at byte offset 12. Because a typical process number is not a mapped address, this normally ends in a segmentation fault. The accidental protection for ordinary strings is that byte 12 of a string SV's body is rarely SVt_PVAV (0x0b); an attacker-crafted string that places 0x0b at that offset passes the guard, after which the buffer is treated as an AV head, AvARRAY is read from bytes 16-23, and the pointers found there are pushed as live SVs onto the Perl stack - a controlled dereference that the independent assessment rates as limited confidentiality impact (C:L) combined with high availability impact (A:H). The assessed vector is CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H, i.e. remotely reachable with no privileges or user interaction required by the flaw itself, while the CVE record's 7.5 score reflects only the availability component. No CPE strings were supplied in the intelligence feed, so the exact affected component set must be inferred from the distribution/version metadata rather than an authoritative CPE list.

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 (CPANSec) PRIMARY 7.5 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 8.2 HIGH

Untrusted decoded input reaching the operator gives AV:N/AC:L/PR:N/UI:N; reliable crash yields A:H and the controlled-dereference read primitive warrants at least C:L.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:H/SC:N/SI:N/SA:N
SUSE 8.1 HIGH
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
Red Hat 7.5 HIGH

Primary rating from Vendor (CPANSec).

CVSS VectorVendor: CPANSec

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

Lifecycle Timeline

3
CVSS changed
Sep 30, 2026 - 20:53 NVD
7.5 (HIGH)
CVE Published
Sep 28, 2026 - 16:09 cve.org
UNKNOWN (no severity yet)
CVE Published
Sep 28, 2026 - 16:09 cve.org
HIGH 7.5

DescriptionCVE.org

XS::Parse::Infix versions from 0.40 through 0.49 for Perl treat a number as an array reference.

The wrapper function XS::Parse::Infix generates for a list-associative infix operator checks whether arguments are array references, but it tests using SvRV() rather than SvROK(). SvRV() reads a union slot that only holds a referent once SvROK(sv) is true, so the guard never validates that it is a reference. For an IV or NV that slot holds the number itself, SvRV() returns the caller's value and SvTYPE() dereferences it at offset 12. This will generally result in a segmentation fault.

An application that hands the wrapper a list built from decoded input (for example, from JSON) lets whoever supplies a number in that list choose the address that the interpreter dereferences.

An ordinary string's byte 12 is rarely SVt_PVAV so the guard croaks by luck, but an attacker-crafted string carrying 0x0b there passes, and the buffer is then used as an AV head, with AvARRAY taken from bytes 16-23 and its entries pushed onto the Perl stack as live SVs.

A simple proof-of-concept uses the zip operator:

use Syntax::Operator::Zip 'zip';

my @args = ([1], 2); zip(@args);

Executive ViewAI

Why It Matters

A type-confusion vulnerability in the Perl module XS::Parse::Infix (versions 0.40 through 0.49, shipped within XS-Parse-Keyword) can crash Perl applications that process attacker-influenced lists through list-associative infix operators such as the zip operator, causing denial of service, and can expose a limited out-of-bounds read of process memory. Publicly available exploit code exists. Because no vendor patch is available, organizations running affected Perl services that accept external input into these operators should prioritize identification and interim mitigations to protect availability and limit information disclosure.

Business Impact: Medium
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations include downgrading XS::Parse::Infix to a version earlier than 0.40 where feasible, avoiding use of list-associative infix operators (e.g., Syntax::Operator::Zip) on untrusted lists, validating that list arguments are genuine array references and rejecting bare numbers or crafted strings containing 0x0b at byte 12, and monitoring for process segfaults or unexpected out-of-bounds reads.

Threat Intelligence Overview

EPSS Score
0.2%
Top 93% exploitable
Prevalence
Low
niche CPAN XS module for custom Perl infix operators, limited deployment
Data Quality
4 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 HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
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
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
Medium
Technical Impact
Partial

Priority Score

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

Attack Technique

Memory corruption occurs when a program writes data beyond the boundaries of allocated memory regions or accesses memory in unintended ways, violating the integrity of the process's address space.

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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

Vendor StatusVendor

SUSE

Severity: Important
Product Status
openSUSE Tumbleweed Fixed
SUSE Linux Enterprise Server 16.0 Affected
SUSE Linux Enterprise Server 16.1 Affected
SUSE Linux Enterprise Server for SAP applications 16.0 Affected
SUSE Linux Enterprise Server for SAP applications 16.1 Affected

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