<?xml version="1.0" encoding="UTF-8"?>
<cvrfdoc xmlns="http://www.icasi.org/CVRF/schema/cvrf/1.1" xmlns:cvrf="http://www.icasi.org/CVRF/schema/cvrf/1.1">
	<DocumentTitle xml:lang="en">An update for libsolv is now available for openEuler-24.03-LTS-SP3</DocumentTitle>
	<DocumentType>Security Advisory</DocumentType>
	<DocumentPublisher Type="Vendor">
		<ContactDetails>openeuler-security@openeuler.org</ContactDetails>
		<IssuingAuthority>openEuler security committee</IssuingAuthority>
	</DocumentPublisher>
	<DocumentTracking>
		<Identification>
			<ID>openEuler-SA-2026-2556</ID>
		</Identification>
		<Status>Final</Status>
		<Version>1.0</Version>
		<RevisionHistory>
			<Revision>
				<Number>1.0</Number>
				<Date>2026-06-05</Date>
				<Description>Initial</Description>
			</Revision>
		</RevisionHistory>
		<InitialReleaseDate>2026-06-05</InitialReleaseDate>
		<CurrentReleaseDate>2026-06-05</CurrentReleaseDate>
		<Generator>
			<Engine>openEuler SA Tool V1.0</Engine>
			<Date>2026-06-05</Date>
		</Generator>
	</DocumentTracking>
	<DocumentNotes>
		<Note Title="Synopsis" Type="General" Ordinal="1" xml:lang="en">libsolv security update</Note>
		<Note Title="Summary" Type="General" Ordinal="2" xml:lang="en">An update for libsolv is now available for openEuler-24.03-LTS-SP3</Note>
		<Note Title="Description" Type="General" Ordinal="3" xml:lang="en">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: &lt;= 0.7.36
Version fixed (if any already): &gt;= 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 &quot;High&quot; 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 &quot;Low&quot; 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 &quot;Reproduction steps&quot; 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:
```c
/* 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:
```c
/* 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&apos;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)</Note>
		<Note Title="Topic" Type="General" Ordinal="4" xml:lang="en">An update for libsolv is now available for openEuler-24.03-LTS-SP3.

openEuler Security has rated this update as having a security impact of medium. A Common Vunlnerability Scoring System(CVSS)base score,which gives a detailed severity rating, is available for each vulnerability from the CVElink(s) in the References section.</Note>
		<Note Title="Severity" Type="General" Ordinal="5" xml:lang="en">Medium</Note>
		<Note Title="Affected Component" Type="General" Ordinal="6" xml:lang="en">libsolv</Note>
	</DocumentNotes>
	<DocumentReferences>
		<Reference Type="Self">
			<URL>https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-2556</URL>
		</Reference>
		<Reference Type="openEuler CVE">
			<URL>https://www.openeuler.org/en/security/cve/detail/?cveId=CVE-2026-9149</URL>
			<URL>https://www.openeuler.org/en/security/cve/detail/?cveId=CVE-2026-9150</URL>
		</Reference>
		<Reference Type="Other">
			<URL>https://nvd.nist.gov/vuln/detail/CVE-2026-9149</URL>
			<URL>https://nvd.nist.gov/vuln/detail/CVE-2026-9150</URL>
		</Reference>
	</DocumentReferences>
	<ProductTree xmlns="http://www.icasi.org/CVRF/schema/prod/1.1">
		<Branch Type="Product Name" Name="openEuler">
			<FullProductName ProductID="openEuler-24.03-LTS-SP3" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">openEuler-24.03-LTS-SP3</FullProductName>
		</Branch>
		<Branch Type="Package Arch" Name="aarch64">
			<FullProductName ProductID="libsolv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-debuginfo-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-debuginfo-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-debugsource-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-debugsource-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-demo-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-demo-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-devel-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-devel-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-tools-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-tools-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="perl-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">perl-solv-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="python3-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">python3-solv-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
			<FullProductName ProductID="ruby-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">ruby-solv-0.7.24-5.oe2403sp3.aarch64.rpm</FullProductName>
		</Branch>
		<Branch Type="Package Arch" Name="src">
			<FullProductName ProductID="libsolv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-0.7.24-5.oe2403sp3.src.rpm</FullProductName>
		</Branch>
		<Branch Type="Package Arch" Name="x86_64">
			<FullProductName ProductID="libsolv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-debuginfo-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-debuginfo-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-debugsource-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-debugsource-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-demo-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-demo-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-devel-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-devel-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="libsolv-tools-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-tools-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="perl-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">perl-solv-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="python3-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">python3-solv-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
			<FullProductName ProductID="ruby-solv-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">ruby-solv-0.7.24-5.oe2403sp3.x86_64.rpm</FullProductName>
		</Branch>
		<Branch Type="Package Arch" Name="noarch">
			<FullProductName ProductID="libsolv-help-0.7.24-5" CPE="cpe:/a:openEuler:openEuler:24.03-LTS-SP3">libsolv-help-0.7.24-5.oe2403sp3.noarch.rpm</FullProductName>
		</Branch>
	</ProductTree>
	<Vulnerability Ordinal="1" xmlns="http://www.icasi.org/CVRF/schema/vuln/1.1">
		<Notes>
			<Note Title="Vulnerability Description" Type="General" Ordinal="1" xml:lang="en">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: &lt;= 0.7.36
Version fixed (if any already): &gt;= 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 &quot;High&quot; 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 &quot;Low&quot; 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 &quot;Reproduction steps&quot; 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:
```c
/* 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:
```c
/* 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: </Note>
		</Notes>
		<ReleaseDate>2026-06-05</ReleaseDate>
		<CVE>CVE-2026-9149</CVE>
		<ProductStatuses>
			<Status Type="Fixed">
				<ProductID>openEuler-24.03-LTS-SP3</ProductID>
			</Status>
		</ProductStatuses>
		<Threats>
			<Threat Type="Impact">
				<Description>Medium</Description>
			</Threat>
		</Threats>
		<CVSSScoreSets>
			<ScoreSet>
				<BaseScore>6.5</BaseScore>
				<Vector>AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H</Vector>
			</ScoreSet>
		</CVSSScoreSets>
		<Remediations>
			<Remediation Type="Vendor Fix">
				<Description>libsolv security update</Description>
				<DATE>2026-06-05</DATE>
				<URL>https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-2556</URL>
			</Remediation>
		</Remediations>
	</Vulnerability>
	<Vulnerability Ordinal="2" xmlns="http://www.icasi.org/CVRF/schema/vuln/1.1">
		<Notes>
			<Note Title="Vulnerability Description" Type="General" Ordinal="1" xml:lang="en">A flaw was found in libsolv. This stack-based buffer overflow vulnerability occurs in libsolv&apos;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.</Note>
		</Notes>
		<ReleaseDate>2026-06-05</ReleaseDate>
		<CVE>CVE-2026-9150</CVE>
		<ProductStatuses>
			<Status Type="Fixed">
				<ProductID>openEuler-24.03-LTS-SP3</ProductID>
			</Status>
		</ProductStatuses>
		<Threats>
			<Threat Type="Impact">
				<Description>Medium</Description>
			</Threat>
		</Threats>
		<CVSSScoreSets>
			<ScoreSet>
				<BaseScore>6.5</BaseScore>
				<Vector>AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H</Vector>
			</ScoreSet>
		</CVSSScoreSets>
		<Remediations>
			<Remediation Type="Vendor Fix">
				<Description>libsolv security update</Description>
				<DATE>2026-06-05</DATE>
				<URL>https://www.openeuler.org/zh/security/security-bulletins/detail/?id=openEuler-SA-2026-2556</URL>
			</Remediation>
		</Remediations>
	</Vulnerability>
</cvrfdoc>