Lucene search
+L

Amazon Linux 2 : perl-Text-CSV_XS (ALAS-2026-4048)

🗓️ 30 Oct 2026 00:00:00Reported by TenableType 
nessus
 nessus
🔗 www.tenable.com👁 2 Views

Memory exhaustion and quadratic CPU use in perl-Text-CSV_XS via malformed CSV input.

Related
Refs
Code
#%NASL_MIN_LEVEL 80900
##
# (C) Tenable, Inc.
#
# The descriptive text and package checks in this plugin were
# extracted from Amazon Linux 2 Security Advisory ALAS-2026-4048.
##

include('compat.inc');

if (description)
{
  script_id(374360);
  script_version("1.1");
  script_set_attribute(attribute:"plugin_modification_date", value:"2026/10/30");

  script_cve_id(
    "CVE-2026-110754",
    "CVE-2026-110755",
    "CVE-2026-110756",
    "CVE-2026-110757",
    "CVE-2026-110758",
    "CVE-2026-110759"
  );

  script_name(english:"Amazon Linux 2 : perl-Text-CSV_XS (ALAS-2026-4048)");

  script_set_attribute(attribute:"synopsis", value:
"The remote Amazon Linux 2 host is missing a security update.");
  script_set_attribute(attribute:"description", value:
"The version of perl-Text-CSV_XS installed on the remote host is prior to 1.00-3. It is, therefore, affected by multiple
vulnerabilities as referenced in the ALAS2-2026-4048 advisory.

    Text::CSV_XS versions before 1.65 for Perl leak the parsed fields of a record that fails to parse in
    getline.

    getline collects the fields of a record into a new array and returns a reference to it only when the parse
    succeeds. When the record has a syntax error, getline returns undef and never frees the array or the
    fields parsed before the error.

    A long-running process parsing untrusted CSV retains every malformed record it is sent, so repeated
    malformed input exhausts its memory. (CVE-2026-110754)

    Text::CSV_XS versions before 1.65 for Perl allow quadratic CPU use by copying the unparsed remainder per
    record of CR-only input in getline.

    With eol unset, the default, getline reads with Perl's default line separator, so input with CR-only line
    endings arrives as one chunk. After each record the parser copies the whole unparsed remainder into a new
    buffer, which the next call parses and copies again, so the work grows with the square of the input size.

    A reader with default options that is sent CSV with classic Mac line endings spends seconds of CPU time on
    a megabyte of input. (CVE-2026-110755)

    Text::CSV_XS versions before 1.65 for Perl drop the end of a record and its line ending when a UTF-8
    flagged field precedes invalid UTF-8 bytes in print.

    When a record contains a UTF-8 flagged field, print holds back trailing bytes that are not valid UTF-8 at
    each buffer flush, so that a character split across two flushes can be completed. Nothing writes the held-
    back bytes after the record's final flush. A record whose last field ends in such a byte loses it, any
    closing quote and the line ending, while print still returns true. combine is not affected.

    The next record is written onto the same line, or, when the last field was quoted, the missing closing
    quote makes a reader take every following record as part of that field. (CVE-2026-110756)

    Text::CSV_XS versions before 1.65 for Perl allow record splitting by writing strings used as numbers
    without quotes in combine.

    combine and print do not check whether a field needs quotes when its value has Perl's integer or numeric
    flag set. Perl sets these flags on a string used in a numeric operation when it parses as a number, which
    allows leading and trailing whitespace. With binary set, as csv does by default, 12\n passes a check
    such as $qty > 0 and is then written unquoted with its newline.

    A value validated as a number can end the record early and turn the fields after it into a separate row.
    (CVE-2026-110757)

    Text::CSV_XS versions before 1.65 for Perl read before the start of an all-blank field under
    allow_whitespace in strip_trail_whitespace.

    Under allow_whitespace, strip_trail_whitespace removes trailing spaces and tabs from each unquoted field
    without stopping at the start of the field. For a field of only blanks it reads the byte before the
    field's heap buffer. If that byte is also a space or tab, it may be zeroed and the walk continue
    backwards, depending on what the allocator placed there.

    Leading blanks are normally skipped before a field is stored, but an all-blank field still arrives after a
    leading escape_char that differs from quote_char, or as a quoted field in getline when its line ends in
    two CRs. (CVE-2026-110758)

    Text::CSV_XS versions before 1.65 for Perl return a 0xFF byte that is not in the input for an empty last
    field followed by a lone CR in parse.

    When the input to parse ends in a separator and a lone CR, the parser treats the end of the input as the
    next character and stores the end-of-file marker in the field as the byte 0xFF. With binary set,
    parse(a,\r) returns the fields a and \xFF. On UTF-8 flagged input the last field is a UTF-8 flagged
    string holding that lone byte, which is malformed UTF-8. The same input with a non-empty last field is
    rejected as an error.

    A CRLF file read line by line and chomped ends this way when its last column is empty, so the application
    receives a byte that is not in its input. (CVE-2026-110759)

Tenable has extracted the preceding description block directly from the tested product security advisory.

Note that Nessus has not tested for these issues but has instead relied only on the application's self-reported version
number.");
  script_set_attribute(attribute:"see_also", value:"https://alas.aws.amazon.com//AL2/ALAS2-2026-4048.html");
  script_set_attribute(attribute:"see_also", value:"https://alas.aws.amazon.com/faqs.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110754.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110755.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110756.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110757.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110758.html");
  script_set_attribute(attribute:"see_also", value:"https://explore.alas.aws.amazon.com/CVE-2026-110759.html");
  script_set_attribute(attribute:"solution", value:
"Run 'yum update perl-Text-CSV_XS' or
  or 'yum update --advisory ALAS2-2026-4048' to update your system.");
  script_set_cvss_base_vector("CVSS2#AV:N/AC:L/Au:N/C:C/I:C/A:C");
  script_set_cvss_temporal_vector("CVSS2#E:U/RL:OF/RC:C");
  script_set_cvss3_base_vector("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H");
  script_set_cvss3_temporal_vector("CVSS:3.0/E:U/RL:O/RC:C");
  script_set_attribute(attribute:"cvss_score_source", value:"CVE-2026-110759");

  script_set_attribute(attribute:"exploitability_ease", value:"No known exploits are available");
  script_set_attribute(attribute:"exploit_available", value:"false");

  script_set_attribute(attribute:"vuln_publication_date", value:"2026/10/15");
  script_set_attribute(attribute:"patch_publication_date", value:"2026/10/30");
  script_set_attribute(attribute:"plugin_publication_date", value:"2026/10/30");

  script_set_attribute(attribute:"plugin_type", value:"local");
  script_set_attribute(attribute:"cpe", value:"p-cpe:/a:amazon:linux:perl-Text-CSV_XS");
  script_set_attribute(attribute:"cpe", value:"p-cpe:/a:amazon:linux:perl-Text-CSV_XS-debuginfo");
  script_set_attribute(attribute:"cpe", value:"cpe:/o:amazon:linux:2");
  script_set_attribute(attribute:"generated_plugin", value:"current");
  script_end_attributes();

  script_category(ACT_GATHER_INFO);
  script_family(english:"Amazon Linux Local Security Checks");

  script_copyright(english:"This script is Copyright (C) 2026 and is owned by Tenable, Inc. or an Affiliate thereof.");

  script_dependencies("ssh_get_info2.nasl");
  script_require_keys("Host/local_checks_enabled", "Host/AmazonLinux/release", "Host/AmazonLinux/rpm-list");

  exit(0);
}

include("rpm2.inc");

if (!get_kb_item("Host/local_checks_enabled")) audit(AUDIT_LOCAL_CHECKS_NOT_ENABLED);

var alas_release = get_kb_item("Host/AmazonLinux/release");
if (isnull(alas_release) || !strlen(alas_release)) audit(AUDIT_OS_NOT, "Amazon Linux");
var os_ver = pregmatch(pattern: "^AL(A|\d+|-\d+)", string:alas_release);
if (isnull(os_ver)) audit(AUDIT_UNKNOWN_APP_VER, "Amazon Linux");
os_ver = os_ver[1];
if (os_ver != "2")
{
  if (os_ver == 'A') os_ver = 'AMI';
  audit(AUDIT_OS_NOT, "Amazon Linux 2", "Amazon Linux " + os_ver);
}

if (!get_kb_item("Host/AmazonLinux/rpm-list")) audit(AUDIT_PACKAGE_LIST_MISSING);

var pkgs = [
    {'reference':'perl-Text-CSV_XS-1.00-3.amzn2.0.3', 'cpu':'aarch64', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE},
    {'reference':'perl-Text-CSV_XS-1.00-3.amzn2.0.3', 'cpu':'i686', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE},
    {'reference':'perl-Text-CSV_XS-1.00-3.amzn2.0.3', 'cpu':'x86_64', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE},
    {'reference':'perl-Text-CSV_XS-debuginfo-1.00-3.amzn2.0.3', 'cpu':'aarch64', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE},
    {'reference':'perl-Text-CSV_XS-debuginfo-1.00-3.amzn2.0.3', 'cpu':'i686', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE},
    {'reference':'perl-Text-CSV_XS-debuginfo-1.00-3.amzn2.0.3', 'cpu':'x86_64', 'release':'AL2', 'rpm_spec_vers_cmp':TRUE}
];

var flag = 0;
foreach var package_array ( pkgs ) {
  var reference = NULL;
  var _release = NULL;
  var sp = NULL;
  var _cpu = NULL;
  var el_string = NULL;
  var rpm_spec_vers_cmp = NULL;
  var epoch = NULL;
  var allowmaj = NULL;
  var exists_check = NULL;
  var cves = NULL;
  if (!empty_or_null(package_array['reference'])) reference = package_array['reference'];
  if (!empty_or_null(package_array['release'])) _release = package_array['release'];
  if (!empty_or_null(package_array['sp'])) sp = package_array['sp'];
  if (!empty_or_null(package_array['cpu'])) _cpu = package_array['cpu'];
  if (!empty_or_null(package_array['el_string'])) el_string = package_array['el_string'];
  if (!empty_or_null(package_array['rpm_spec_vers_cmp'])) rpm_spec_vers_cmp = package_array['rpm_spec_vers_cmp'];
  if (!empty_or_null(package_array['epoch'])) epoch = package_array['epoch'];
  if (!empty_or_null(package_array['allowmaj'])) allowmaj = package_array['allowmaj'];
  if (!empty_or_null(package_array['exists_check'])) exists_check = package_array['exists_check'];
  if (!empty_or_null(package_array['cves'])) cves = package_array['cves'];
  if (reference && _release && (!exists_check || rpm_exists(release:_release, rpm:exists_check))) {
    if (rpm_check(release:_release, sp:sp, cpu:_cpu, reference:reference, epoch:epoch, el_string:el_string, rpm_spec_vers_cmp:rpm_spec_vers_cmp, allowmaj:allowmaj, cves:cves)) flag++;
  }
}

if (flag)
{
  security_report_v4(
      port       : 0,
      severity   : SECURITY_HOLE,
      extra      : rpm_report_get()
  );
  exit(0);
}
else
{
  var tested = pkg_tests_get();
  if (tested) audit(AUDIT_PACKAGE_NOT_AFFECTED, tested);
  else audit(AUDIT_PACKAGE_NOT_INSTALLED, "perl-Text-CSV_XS / perl-Text-CSV_XS-debuginfo");
}

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

30 Oct 2026 00:00Current
6Medium risk
Vulners AI Score6
CVSS 3.19.8
EPSS0.00408
SSVC
2