GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

OESA-2026-2556 (CVE-2026-9149)

Vulnerability from osv_openeuler – Published: 2026-06-05 11:11 – Updated: 2026-08-06 11:11 – Source website
VLAI
Summary
libsolv security update
Details

A free package dependency solver using a satisfiability algorithm. The library is based on two major, but independent, blocks:

Security Fix(es):

MANUALLY_VERIFIED_REPORT package: libsolv-0.7.33-2.el10


[Security] Heap Buffer Overflow in repo_add_solv via Negative maxsize Summary: Heap buffer overflow in repo_add_solv when parsing attacker-controlled .solv files; large encoded maxsize/allsize header values can decode to negative signed Id values, leading to undersized heap allocation while a subsequent fread uses DATA_READ_CHUNK (8192) bytes. Requirements to exploit: Ability to supply a crafted .solv file that a victim processes with libsolv (directly or via a consumer such as dumpsolv or an application that calls repo_add_solv on untrusted input). Component affected: libsolv Version affected: <= 0.7.36 Version fixed (if any already): >= TBD CVSS: 6.5 (Medium) — CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H Impact: Moderate (proposed). Per https://access.redhat.com/security/updates/classification this is memory corruption reachable via untrusted .solv ingestion and can at least cause a denial of service; it is not clearly "High" because an attacker typically needs the victim to process attacker-controlled input (configuration/user action) and reliable system compromise is not demonstrated here. This may be "Low" instead in product contexts where the vulnerable path is not used by default, is only reachable via uncommon workflows, or is effectively mitigated (e.g., only trusted solvdb is processed). Embargo: no Acknowledgement: Aisle Research Steps to reproduce if available: See "Reproduction steps" below. Mitigation if available: Prefer only consuming trusted .solv / solvdb inputs; avoid parsing untrusted .solv files until patched. Original report: Hello libsolv maintainers, We believe that we have discovered a potential security vulnerability in repo_add_solv when parsing attacker-controlled .solv files.

Vulnerability details

read_id decodes into an unsigned value and returns Id (signed int), so large encoded values can become negative after conversion:

/* src/repo_solv.c */
static Id
read_id(Repodata *data, Id max)
{
unsigned int x = 0;
...
return x;
}

In repo_add_solv, maxsize and allsize are read with max=0 (no bounds check), then used for allocation and read length:

/* src/repo_solv.c */
maxsize = read_id(&amp;data, 0);
allsize = read_id(&amp;data, 0);
maxsize += 5;
if (maxsize &gt; allsize)
maxsize = allsize;
buf = solv_calloc(maxsize + DATA_READ_CHUNK + 4, 1);
l = maxsize;
if (l &lt; DATA_READ_CHUNK)
l = DATA_READ_CHUNK;
if (l &gt; allsize)
l = allsize;
if (!l || fread(buf, l, 1, data.fp) != 1)

If maxsize is negative, solv_calloc(maxsize + 8192 + 4, 1) can allocate a much smaller buffer, but l is then raised to 8192, and fread writes 8192 bytes into that undersized heap buffer. Most relevant CWEs: - CWE-122 (Heap-based Buffer Overflow): direct overflow sink. - CWE-20 (Improper Input Validation): negative header fields are accepted. - CWE-195 (Signed to Unsigned Conversion Error): signed int values flow into allocation sizing.

Reproduction steps

  1. Build libsolv with ASAN (or run a consumer binary that calls repo_add_solv on .solv input, e.g. dumpsolv).
  2. Run the parser on this file (dumpsolv crafted.solv or equivalent).

Crash:

[root@c28a4ffb0823 workspace]# ./build-asan/tools/dumpsolv ./vuln_1_101_1_negative_maxsize.solv

==542==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5020000000b1 at pc 0x00000041fb3c bp 0x7ffffffc5fd0 sp 0x7ffffffc5798 WRITE of size 8192 at 0x5020000000b1 thread T0

0 0x00000041fb3b (/workspace/build-asan/tools/dumpsolv+0x41fb3b) (BuildId: 3a1e71d74bd4d38c896ffc899393aedf86bf1cfc)

1 0x7fffff662147 (/workspace/build-asan/src/libsolv.so.1+0x57147) (BuildId: ebfff12c035b97f95b2d532a1d6d237ac31e770a)

2 0x0000004e45fe (/workspace/build-asan/tools/dumpsolv+0x4e45fe) (BuildId: 3a1e71d74bd4d38c896ffc899393aedf86bf1cfc)

3 0x7fffff2f0447 (/lib64/libc.so.6+0x3447) (BuildId: dae6ae6929d69dca842288f5300af5a33d1bdcd7)

4 0x7fffff2f050a (/lib64/libc.so.6+0x350a) (BuildId: (CVE-2026-9149)

A flaw was found in libsolv. This stack-based buffer overflow vulnerability occurs in libsolv's Debian metadata parser when processing specially crafted Debian repository metadata. An attacker could exploit this by providing malicious SHA384 or SHA512 checksum tags, leading to memory corruption and a denial of service (DoS) in the affected system.(CVE-2026-9150)


{
  "affected": [
    {
      "ecosystem_specific": {
        "aarch64": [
          "libsolv-0.7.24-5.oe2403sp3.aarch64.rpm",
          "libsolv-debuginfo-0.7.24-5.oe2403sp3.aarch64.rpm",
          "libsolv-debugsource-0.7.24-5.oe2403sp3.aarch64.rpm",
          "libsolv-demo-0.7.24-5.oe2403sp3.aarch64.rpm",
          "libsolv-devel-0.7.24-5.oe2403sp3.aarch64.rpm",
          "libsolv-tools-0.7.24-5.oe2403sp3.aarch64.rpm",
          "perl-solv-0.7.24-5.oe2403sp3.aarch64.rpm",
          "python3-solv-0.7.24-5.oe2403sp3.aarch64.rpm",
          "ruby-solv-0.7.24-5.oe2403sp3.aarch64.rpm"
        ],
        "noarch": [
          "libsolv-help-0.7.24-5.oe2403sp3.noarch.rpm"
        ],
        "src": [
          "libsolv-0.7.24-5.oe2403sp3.src.rpm"
        ],
        "x86_64": [
          "libsolv-0.7.24-5.oe2403sp3.x86_64.rpm",
          "libsolv-debuginfo-0.7.24-5.oe2403sp3.x86_64.rpm",
          "libsolv-debugsource-0.7.24-5.oe2403sp3.x86_64.rpm",
          "libsolv-demo-0.7.24-5.oe2403sp3.x86_64.rpm",
          "libsolv-devel-0.7.24-5.oe2403sp3.x86_64.rpm",
          "libsolv-tools-0.7.24-5.oe2403sp3.x86_64.rpm",
          "perl-solv-0.7.24-5.oe2403sp3.x86_64.rpm",
          "python3-solv-0.7.24-5.oe2403sp3.x86_64.rpm",
          "ruby-solv-0.7.24-5.oe2403sp3.x86_64.rpm"
        ]
      },
      "package": {
        "ecosystem": "openEuler:24.03-LTS-SP3",
        "name": "libsolv",
        "purl": "pkg:rpm/openEuler/libsolv\u0026distro=openEuler-24.03-LTS-SP3"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "0.7.24-5.oe2403sp3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "database_specific": {
    "severity": "Medium"
  },
  "details": "A free package dependency solver using a satisfiability algorithm. The library is based on two major, but independent, blocks:\r\n\r\nSecurity Fix(es):\n\nMANUALLY_VERIFIED_REPORT\npackage: libsolv-0.7.33-2.el10\n------\n[Security] Heap Buffer Overflow in repo_add_solv via Negative maxsize\nSummary:  Heap buffer overflow in `repo_add_solv` when parsing attacker-controlled `.solv` files; large encoded `maxsize`/`allsize` header values can decode to negative signed `Id` values, leading to undersized heap allocation while a subsequent `fread` uses `DATA_READ_CHUNK` (8192) bytes.\nRequirements to exploit: Ability to supply a crafted `.solv` file that a victim processes with libsolv (directly or via a consumer such as `dumpsolv` or an application that calls `repo_add_solv` on untrusted input).\nComponent affected: libsolv\nVersion affected: \u0026lt;= 0.7.36\nVersion fixed (if any already): \u0026gt;= TBD\nCVSS:  6.5 (Medium) \u2014 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H\nImpact: Moderate (proposed). Per https://access.redhat.com/security/updates/classification this is memory corruption reachable via untrusted `.solv` ingestion and can at least cause a denial of service; it is not clearly \u0026quot;High\u0026quot; because an attacker typically needs the victim to process attacker-controlled input (configuration/user action) and reliable system compromise is not demonstrated here. This may be \u0026quot;Low\u0026quot; instead in product contexts where the vulnerable path is not used by default, is only reachable via uncommon workflows, or is effectively mitigated (e.g., only trusted solvdb is processed).\nEmbargo: no\nAcknowledgement: Aisle Research\nSteps to reproduce if available: See \u0026quot;Reproduction steps\u0026quot; below.\nMitigation if available: Prefer only consuming trusted `.solv` / solvdb inputs; avoid parsing untrusted `.solv` files until patched.\nOriginal report:\nHello libsolv maintainers,\nWe believe that we have discovered a potential security vulnerability in `repo_add_solv` when parsing attacker-controlled `.solv` files.\n### Vulnerability details\n`read_id` decodes into an unsigned value and returns `Id` (signed `int`), so large encoded values can become negative after conversion:\n```c\n/* src/repo_solv.c */\nstatic Id\nread_id(Repodata *data, Id max)\n{\nunsigned int x = 0;\n...\nreturn x;\n}\n```\nIn `repo_add_solv`, `maxsize` and `allsize` are read with `max=0` (no bounds check), then used for allocation and read length:\n```c\n/* src/repo_solv.c */\nmaxsize = read_id(\u0026amp;data, 0);\nallsize = read_id(\u0026amp;data, 0);\nmaxsize += 5;\nif (maxsize \u0026gt; allsize)\nmaxsize = allsize;\nbuf = solv_calloc(maxsize + DATA_READ_CHUNK + 4, 1);\nl = maxsize;\nif (l \u0026lt; DATA_READ_CHUNK)\nl = DATA_READ_CHUNK;\nif (l \u0026gt; allsize)\nl = allsize;\nif (!l || fread(buf, l, 1, data.fp) != 1)\n```\nIf `maxsize` is negative, `solv_calloc(maxsize + 8192 + 4, 1)` can allocate a much smaller buffer, but `l` is then raised to `8192`, and `fread` writes `8192` bytes into that undersized heap buffer.\nMost relevant CWEs:\n- `CWE-122` (Heap-based Buffer Overflow): direct overflow sink.\n- `CWE-20` (Improper Input Validation): negative header fields are accepted.\n- `CWE-195` (Signed to Unsigned Conversion Error): signed `int` values flow into allocation sizing.\n### Reproduction steps\n1. Build libsolv with ASAN (or run a consumer binary that calls `repo_add_solv` on `.solv` input, e.g. `dumpsolv`).\n2. Run the parser on this file (`dumpsolv crafted.solv` or equivalent).\n### Crash:\n[root@c28a4ffb0823 workspace]# ./build-asan/tools/dumpsolv ./vuln_1_101_1_negative_maxsize.solv\n=================================================================\n==542==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5020000000b1 at pc 0x00000041fb3c bp 0x7ffffffc5fd0 sp 0x7ffffffc5798\nWRITE of size 8192 at 0x5020000000b1 thread T0\n#0 0x00000041fb3b  (/workspace/build-asan/tools/dumpsolv+0x41fb3b) (BuildId: 3a1e71d74bd4d38c896ffc899393aedf86bf1cfc)\n#1 0x7fffff662147  (/workspace/build-asan/src/libsolv.so.1+0x57147) (BuildId: ebfff12c035b97f95b2d532a1d6d237ac31e770a)\n#2 0x0000004e45fe  (/workspace/build-asan/tools/dumpsolv+0x4e45fe) (BuildId: 3a1e71d74bd4d38c896ffc899393aedf86bf1cfc)\n#3 0x7fffff2f0447  (/lib64/libc.so.6+0x3447) (BuildId: dae6ae6929d69dca842288f5300af5a33d1bdcd7)\n#4 0x7fffff2f050a  (/lib64/libc.so.6+0x350a) (BuildId: (CVE-2026-9149)\n\nA flaw was found in libsolv. This stack-based buffer overflow vulnerability occurs in libsolv\u0026apos;s Debian metadata parser when processing specially crafted Debian repository metadata. An attacker could exploit this by providing malicious SHA384 or SHA512 checksum tags, leading to memory corruption and a denial of service (DoS) in the affected system.(CVE-2026-9150)",
  "id": "OESA-2026-2556",
  "modified": "2026-08-06T11:11:30Z",
  "published": "2026-06-05T11:11:30Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-2556"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-9149"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-9150"
    }
  ],
  "schema_version": "1.7.2",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H",
      "type": "CVSS_V3"
    }
  ],
  "summary": "libsolv security update",
  "upstream": [
    "CVE-2026-9149",
    "CVE-2026-9150"
  ]
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…