Lucene search
+L

Unity Linux 20.1050a Security Update: kernel (UTSA-2026-146631)

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

Linux kernel SUNRPC gssx_dec_option_array bugs lead to NULL deref, leak, and use-after-free.

Related
Refs
Code
#%NASL_MIN_LEVEL 80900
##
# (C) Tenable, Inc.
##

include('compat.inc');

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

  script_cve_id("CVE-2026-89544");

  script_name(english:"Unity Linux 20.1050a Security Update: kernel (UTSA-2026-146631)");

  script_set_attribute(attribute:"synopsis", value:
"The Unity Linux host is missing one or more security updates.");
  script_set_attribute(attribute:"description", value:
"The Unity Linux 20 host has a package installed that is affected by a vulnerability as referenced in the
UTSA-2026-146631 advisory.

    In the Linux kernel, the following vulnerability has been resolved:

    SUNRPC: fix gssx_dec_option_array error path bugs

    Four coupled defects in the gssx XDR option-array decoder make the
    error paths unsafe: a NULL deref in the caller, a refcount leak on
    the decoded group_info, and a latent use-after-free that the leak
    fix would otherwise expose.

    gssx_dec_option_array() sets oa->count = 1 before allocating
    oa->data.  If that allocation fails, -ENOMEM is returned with
    oa->count == 1 and oa->data == NULL.  All other error paths jump
    to free_oa: which frees oa->data and NULLs it but also leaves
    oa->count == 1.  The caller trusts the count:

        gssp_accept_sec_context_upcall()
          gssx_dec_accept_sec_context()
            gssx_dec_option_array()        /* fails, count=1 data=NULL */
          data = res.options.data[0].value /* NULL deref */

    Independently, free_creds: releases the partially decoded svc_cred
    with a bare kfree(creds).  gssx_dec_linux_creds() installs a
    groups_alloc() result into creds->cr_group_info; that object is
    kvmalloc-backed and refcounted, and only put_group_info() reaches
    kvfree().  A plain kfree(creds) drops the wrapper and leaks the
    group_info allocation.

    The natural fix for the leak is to call free_svc_cred(creds) before
    kfree(creds), but free_svc_cred() invokes put_group_info() on
    creds->cr_group_info unconditionally when non-NULL.  The existing
    out_free_groups: path in gssx_dec_linux_creds() already called
    groups_free() on that pointer without clearing it, so once
    free_svc_cred() is wired in, the subsequent put_group_info() would
    touch freed memory.

    Fix all four together:

      - Move the oa->count = 1 assignment below the oa->data allocation
        so it is never set when oa->data is NULL.
      - Reset oa->count to 0 at free_oa: so count and data stay
        coherent and the caller sees an empty option array.
      - Call free_svc_cred(creds) before kfree(creds) at free_creds:
        so the refcounted cr_group_info is released.  free_svc_cred()
        either NULL-guards each field explicitly (cr_group_info has
        an if() check) or delegates to a helper that is NULL-safe
        itself (kfree for the string fields, gss_mech_put() which
        guards with if(gm) at gss_mech_switch.c:342), so it is safe
        to call on a partially decoded svc_cred where only
        cr_uid/cr_gid/cr_group_info have been written and everything
        else is zero from kzalloc.
      - In gssx_dec_linux_creds()'s out_free_groups: path, release
        cr_group_info with put_group_info() rather than groups_free()
        so the teardown matches free_svc_cred()'s refcount-aware path,
        and clear the pointer so a later free_svc_cred() on the same
        creds does not release it a second time.

Tenable has extracted the preceding description block directly from the Unity Linux security advisory.

Note that Nessus has not tested for this issue but has instead relied only on the application's self-reported version
number.");
  # https://src.uniontech.com/#/security_advisory_detail?utsa_id=UTSA-2026-146631
  script_set_attribute(attribute:"see_also", value:"http://www.nessus.org/u?0dc85e31");
  # https://lore.kernel.org/linux-cve-announce/2026091120-CVE-2026-89544-dc47@gregkh
  script_set_attribute(attribute:"see_also", value:"http://www.nessus.org/u?6a168a2f");
  script_set_attribute(attribute:"see_also", value:"https://nvd.nist.gov/vuln/detail/CVE-2026-89544");
  script_set_attribute(attribute:"solution", value:
"Update the affected kernel package.");
  script_set_cvss_base_vector("CVSS2#AV:N/AC:L/Au:N/C:N/I:N/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:N/I:N/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-89544");

  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/09/11");
  script_set_attribute(attribute:"patch_publication_date", value:"2026/10/28");
  script_set_attribute(attribute:"plugin_publication_date", value:"2026/10/28");

  script_set_attribute(attribute:"plugin_type", value:"local");
  script_set_attribute(attribute:"generated_plugin", value:"current");
  script_end_attributes();

  script_category(ACT_GATHER_INFO);
  script_family(english:"Unity 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/UOS-Server/release", "Host/UOS-Server/rpm-list", "Host/cpu");

  exit(0);
}
include('rpm2.inc');

if (!get_kb_item('Host/local_checks_enabled')) audit(AUDIT_LOCAL_CHECKS_NOT_ENABLED);
var os_product = get_kb_item('installed_os/local/SSH/0/product');
if (isnull(os_product) || 'UOS Server' >!< os_product) audit(AUDIT_OS_NOT, 'UOS Server');
var os_version = get_kb_item('installed_os/local/SSH/0/version');
if (isnull(os_version)) audit(AUDIT_UNKNOWN_APP_VER, 'UOS Server');
if (! preg(pattern:"^(20.1050a)([^0-9]|$)", string:os_version)) audit(AUDIT_OS_NOT, 'UOS Server 20.1050a', 'UOS Server ' + os_version);

if (!get_kb_item('Host/UOS-Server/rpm-list')) audit(AUDIT_PACKAGE_LIST_MISSING);

var cpu = get_kb_item('Host/cpu');
if (isnull(cpu)) audit(AUDIT_UNKNOWN_ARCH);
if ('aarch64' >!< cpu && 'amd64' >!< cpu && 'loongarch64' >!< cpu && 'x86_64' >!< cpu) audit(AUDIT_LOCAL_CHECKS_NOT_IMPLEMENTED, 'UOS Server', cpu);


var constraints = [
  {
    'release': '20',
    'sp': '1050a',
    'pkgs': [
      {'reference':'kernel-4.19.0-91.82.132.24.uelc20', 'sp':'1050a', 'cpu':'aarch64', 'rpm_spec_vers_cmp':TRUE},
      {'reference':'kernel-4.19.0-91.82.132.24.uelc20', 'sp':'1050a', 'cpu':'amd64', 'rpm_spec_vers_cmp':TRUE},
      {'reference':'kernel-4.19.0-91.82.132.24.uelc20', 'sp':'1050a', 'cpu':'loongarch64', 'rpm_spec_vers_cmp':TRUE},
      {'reference':'kernel-4.19.0-91.82.132.24.uelc20', 'sp':'1050a', 'cpu':'x86_64', 'rpm_spec_vers_cmp':TRUE}
    ]
  }
];

var os_release = get_one_kb_item('installed_os/local/SSH/0/release');
var os_sp = get_one_kb_item('Host/*/minor_release');

var flag = 0;
var reference;
var sp;
var _cpu;
var el_string;
var rpm_spec_vers_cmp;
var epoch;
var allowmaj;
var exists_check;
var cves;
foreach var constraint ( constraints ) {
  # Check that the target release is equal to the affected release
  if (!empty_or_null(constraint['release'])){
    if (constraint['release'] != os_release) continue;
  }
  if (!empty_or_null(constraint['sp'])){
    if (constraint['sp'] != os_sp) continue;
  }
  foreach var pkg ( constraint['pkgs'] ) {
    reference = NULL;
    sp = NULL;
    _cpu = NULL;
    el_string = NULL;
    rpm_spec_vers_cmp = NULL;
    epoch = NULL;
    allowmaj = NULL;
    exists_check = NULL;
    cves = NULL;
    if (!empty_or_null(pkg['reference'])) reference = pkg['reference'];
    if (!empty_or_null(pkg['sp'])) sp = pkg['sp'];
    if (!empty_or_null(pkg['cpu'])) _cpu = pkg['cpu'];
    if (!empty_or_null(pkg['el_string'])) el_string = pkg['el_string'];
    if (!empty_or_null(pkg['rpm_spec_vers_cmp'])) rpm_spec_vers_cmp = pkg['rpm_spec_vers_cmp'];
    if (!empty_or_null(pkg['epoch'])) epoch = pkg['epoch'];
    if (!empty_or_null(pkg['allowmaj'])) allowmaj = pkg['allowmaj'];
    if (!empty_or_null(pkg['exists_check'])) exists_check = pkg['exists_check'];
    if (!empty_or_null(pkg['cves'])) cves = pkg['cves'];
    if (reference &&
        ## (no known rpm to check OR known rpm_exists)
        (!exists_check || rpm_exists(rpm:exists_check)) &&
        rpm_check(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, 'kernel');
}

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

28 Oct 2026 00:00Current
6.1Medium risk
Vulners AI Score6.1
CVSS 3.17.5
EPSS0.00594
SSVC
1