{ "document": { "aggregate_severity": { "text": "high" }, "category": "csaf_security_advisory", "csaf_version": "2.0", "distribution": { "tlp": { "label": "WHITE", "url": "https://www.first.org/tlp/" } }, "lang": "en", "notes": [ { "category": "description", "text": "XS::Parse::Infix versions from 0.40 through 0.49 for Perl treat a number as an array reference.\n\nThe 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.\n\nAn 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.\n\nAn 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.\n\nA simple proof-of-concept uses the zip operator:\n\n use Syntax::Operator::Zip 'zip';\n\n my @args = ([1], 2);\n zip(@args);", "title": "Vulnerability Description" } ], "publisher": { "category": "other", "contact_details": "gdt@cpan.org", "name": "giterlizzi", "namespace": "https://github.com/giterlizzi/" }, "references": [ { "category": "self", "summary": "CPANSA-XS-Parse-Keyword-2026-85644 JSON", "url": "https://raw.githubusercontent.com/giterlizzi/perl-CPANSA-CSAF/develop/csaf/white/2026/cpansa-xs-parse-keyword-2026-85644.json" }, { "category": "external", "summary": "https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/changes", "url": "https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/changes" }, { "category": "external", "summary": "https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/diff/PEVANS/XS-Parse-Keyword-0.49#src/infix.c", "url": "https://metacpan.org/release/PEVANS/XS-Parse-Keyword-0.50/diff/PEVANS/XS-Parse-Keyword-0.49#src/infix.c" }, { "category": "external", "summary": "http://www.openwall.com/lists/oss-security/2026/09/28/14", "url": "http://www.openwall.com/lists/oss-security/2026/09/28/14" }, { "category": "external", "summary": "CVE-2026-85644 (NVD)", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-85644" } ], "title": "XS-Parse-Keyword vulnerability", "tracking": { "current_release_date": "2026-09-28T00:00:00", "generator": { "engine": { "name": "CSAF Perl Toolkit", "version": "0.26" } }, "id": "CPANSA-XS-Parse-Keyword-2026-85644", "initial_release_date": "2026-09-28T00:00:00", "revision_history": [ { "date": "2026-09-28T00:00:00", "number": "1", "summary": "First release" } ], "status": "final", "version": "1" } }, "product_tree": { "branches": [ { "branches": [ { "category": "product_version_range", "name": "vers:cpan/>=0.40|<=0.49", "product": { "name": "XS-Parse-Keyword greater than or equal 0.40 and less than or equal 0.49", "product_id": "CSAFPID-0001", "product_identification_helper": { "purl": "pkg:cpan/XS-Parse-Keyword" } } }, { "category": "product_version_range", "name": "vers:cpan/>0.49", "product": { "name": "XS-Parse-Keyword greater than 0.49", "product_id": "CSAFPID-0002", "product_identification_helper": { "purl": "pkg:cpan/XS-Parse-Keyword" } } } ], "category": "product_name", "name": "XS-Parse-Keyword" } ] }, "vulnerabilities": [ { "cve": "CVE-2026-85644", "cwe": { "id": "CWE-125", "name": "Out-of-bounds Read" }, "notes": [ { "category": "description", "text": "XS::Parse::Infix versions from 0.40 through 0.49 for Perl treat a number as an array reference.\n\nThe 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.\n\nAn 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.\n\nAn 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.\n\nA simple proof-of-concept uses the zip operator:\n\n use Syntax::Operator::Zip 'zip';\n\n my @args = ([1], 2);\n zip(@args);", "title": "Vulnerability Description" } ], "product_status": { "fixed": [ "CSAFPID-0002" ], "known_affected": [ "CSAFPID-0001" ] }, "scores": [ { "cvss_v3": { "baseScore": 7.5, "baseSeverity": "HIGH", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H", "version": "3.1" }, "products": [ "CSAFPID-0001" ] } ] } ] }