Lucene search
+L

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

🗓️ 26 Aug 2026 00:00:00Reported by TenableType 
nessus
 nessus
🔗 www.tenable.com👁 4 Views

Use-after-free in Unity Linux 20 kernel vhost-scsi from repeated set_endpoint calls.

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

include('compat.inc');

if (description)
{
  script_id(340239);
  script_version("1.1");
  script_set_attribute(attribute:"plugin_modification_date", value:"2026/08/26");

  script_cve_id("CVE-2025-22083");

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

  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-098851 advisory.

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

    vhost-scsi: Fix handling of multiple calls to vhost_scsi_set_endpoint

    If vhost_scsi_set_endpoint is called multiple times without a
    vhost_scsi_clear_endpoint between them, we can hit multiple bugs
    found by Haoran Zhang:

    1. Use-after-free when no tpgs are found:

    This fixes a use after free that occurs when vhost_scsi_set_endpoint is
    called more than once and calls after the first call do not find any
    tpgs to add to the vs_tpg. When vhost_scsi_set_endpoint first finds
    tpgs to add to the vs_tpg array match=true, so we will do:

    vhost_vq_set_backend(vq, vs_tpg);
    ...

    kfree(vs->vs_tpg);
    vs->vs_tpg = vs_tpg;

    If vhost_scsi_set_endpoint is called again and no tpgs are found
    match=false so we skip the vhost_vq_set_backend call leaving the
    pointer to the vs_tpg we then free via:

    kfree(vs->vs_tpg);
    vs->vs_tpg = vs_tpg;

    If a scsi request is then sent we do:

    vhost_scsi_handle_vq -> vhost_scsi_get_req -> vhost_vq_get_backend

    which sees the vs_tpg we just did a kfree on.

    2. Tpg dir removal hang:

    This patch fixes an issue where we cannot remove a LIO/target layer
    tpg (and structs above it like the target) dir due to the refcount
    dropping to -1.

    The problem is that if vhost_scsi_set_endpoint detects a tpg is already
    in the vs->vs_tpg array or if the tpg has been removed so
    target_depend_item fails, the undepend goto handler will do
    target_undepend_item on all tpgs in the vs_tpg array dropping their
    refcount to 0. At this time vs_tpg contains both the tpgs we have added
    in the current vhost_scsi_set_endpoint call as well as tpgs we added in
    previous calls which are also in vs->vs_tpg.

    Later, when vhost_scsi_clear_endpoint runs it will do
    target_undepend_item on all the tpgs in the vs->vs_tpg which will drop
    their refcount to -1. Userspace will then not be able to remove the tpg
    and will hang when it tries to do rmdir on the tpg dir.

    3. Tpg leak:

    This fixes a bug where we can leak tpgs and cause them to be
    un-removable because the target name is overwritten when
    vhost_scsi_set_endpoint is called multiple times but with different
    target names.

    The bug occurs if a user has called VHOST_SCSI_SET_ENDPOINT and setup
    a vhost-scsi device to target/tpg mapping, then calls
    VHOST_SCSI_SET_ENDPOINT again with a new target name that has tpgs we
    haven't seen before (target1 has tpg1 but target2 has tpg2). When this
    happens we don't teardown the old target tpg mapping and just overwrite
    the target name and the vs->vs_tpg array. Later when we do
    vhost_scsi_clear_endpoint, we are passed in either target1 or target2's
    name and we will only match that target's tpgs when we loop over the
    vs->vs_tpg. We will then return from the function without doing
    target_undepend_item on the tpgs.

    Because of all these bugs, it looks like being able to call
    vhost_scsi_set_endpoint multiple times was never supported. The major
    user, QEMU, already has checks to prevent this use case. So to fix the
    issues, this patch prevents vhost_scsi_set_endpoint from being called
    if it's already successfully added tpgs. To add, remove or change the
    tpg config or target name, you must do a vhost_scsi_clear_endpoint
    first.

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-098851
  script_set_attribute(attribute:"see_also", value:"http://www.nessus.org/u?079236dd");
  # https://lore.kernel.org/linux-cve-announce/2025041614-CVE-2025-22083-8012@gregkh
  script_set_attribute(attribute:"see_also", value:"http://www.nessus.org/u?4fff4639");
  script_set_attribute(attribute:"see_also", value:"https://nvd.nist.gov/vuln/detail/CVE-2025-22083");
  script_set_attribute(attribute:"solution", value:
"Update the affected kernel package.");
  script_set_cvss_base_vector("CVSS2#AV:L/AC:L/Au:S/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:L/AC:L/PR:L/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-2025-22083");

  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:"2025/04/16");
  script_set_attribute(attribute:"patch_publication_date", value:"2026/08/10");
  script_set_attribute(attribute:"plugin_publication_date", value:"2026/08/26");

  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_WARNING,
      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

26 Aug 2026 00:00Current
5.9Medium risk
Vulners AI Score5.9
CVSS 3.17.8
EPSS0.00199
4