CVE-2026-112401
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
6.9
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
CVE-2026-112401- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-407
- Updated
- 2026-11-02
EUVDEUVD-2026-104638
6.9
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
EUVD-2026-104638- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-74r2-7ff9-mjj2
6.9
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
============================================================================
Quadratic GIF comment concatenation allows DoS in Image.open()
Location: src/PIL/GifImagePlugin.py:266 in GifImageFile._seek()
Commit: a707c6b21c313880d0771e54965d142dd42358b6
============================================================================
Opening a crafted GIF file with Image.open() takes time that grows with the square of the file's size, so anyone who can submit an image to a service that uses Pillow can keep one worker busy at full processor load for a long time with a small file. A 2 MB file takes about 5 seconds to open, a 4 MB file about 35 seconds, and an 8 MB file about 3 minutes. An ordinary GIF of the same size opens in well under a second. The cost is paid inside Image.open() itself, with default settings, before the application has seen the image's size or format.
The bug is in GifImageFile._seek() in src/PIL/GifImagePlugin.py, which builds info["comment"] by appending to an immutable bytes object with no size limit. It appends once per 255-byte sub-block (comment += block, line 261) and once per comment extension (info["comment"] += b"\n" + comment, line 266). Each append copies everything collected so far. A file made of many tiny comment extensions forces a full re-copy for each one. Because _open() ends with self._seek(0), any code that only opens an uploaded file to identify it, read its dimensions, or make a thumbnail pays the full cost. The decompression-bomb check does not help, since the image is 1×1. Memory use stays linear, so the effect is processor exhaustion and latency, bounded by whatever upload size the service allows (about 1 second at 1 MB). This is the same kind of issue as the EPS open-phase slowdown fixed as CVE-2021-28677, here in the GIF comment handling. The quadratic pattern was introduced in commit b2b737b68b06 ("Allow arbitrary number of comment extension subblocks", November 2018) and has shipped since Pillow 5.4.0. The attached script builds 2 MB and 4 MB test files and compares each against a byte-identical control whose extensions are labelled as plain text instead of comment. The 4 MB comment file took about 34 seconds to open, against 0.26 seconds for its control. A patch that collects the pieces in a list and joins them once is also attached.
Details
GifImageFile._seek() collects GIF comment extensions into info["comment"] using bytes concatenation, once per 255-byte sub-block and once per comment extension, with no limit on the total. bytes is immutable, so every += allocates a new object and copies everything accumulated so far; the work done by Image.open() is therefore quadratic in the amount of comment data in frame 0.
A 1×1 GIF89a whose body is nothing but the 5-byte comment extension 21 FE 01 41 00 repeated makes this directly observable. Image.open(BytesIO(data)) on such a file, stock build at this commit, 2-CPU machine:
| file size | comment extensions (21 FE …) | same bytes labelled plain-text extension (21 01 …) |
|---|---|---|
| 1 MB | 1.2 s | 0.09 s |
| 2 MB | 4.9 s | 0.13 s |
| 4 MB | 35 s | 0.26 s |
| 8 MB | 183 s | — |
The control column is the identical byte stream with the extension label changed from 0xFE to 0x01; it goes through the same loop and the same self.data() reads but is discarded instead of concatenated, and scales linearly. No load() is needed and no warning or exception is raised; im.info["comment"] simply ends up holding the multi-megabyte blob.
The code, src/PIL/GifImagePlugin.py:229-281 (trimmed):
elif s == b"!":
s = self.fp.read(1)
block = self.data()
…
elif s[0] == 254:
#
# comment extension
#
comment = b""
# Read this comment block
while block:
…
- Record
GHSA-74r2-7ff9-mjj2- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-407
- Updated
- 2026-11-02
NVD
6.9
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
CVE-2026-112401- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-407
- Updated
- 2026-11-02
OSV
6.9
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
CVE-2026-112401- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-407
- Updated
- 2026-11-03
OSVDEBIAN-CVE-2026-112401
7.5
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
DEBIAN-CVE-2026-112401- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
Show 5 moreShow less
OSVGHSA-74r2-7ff9-mjj2
6.9
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
============================================================================
Quadratic GIF comment concatenation allows DoS in Image.open()
Location: src/PIL/GifImagePlugin.py:266 in GifImageFile._seek()
Commit: a707c6b21c313880d0771e54965d142dd42358b6
============================================================================
Opening a crafted GIF file with Image.open() takes time that grows with the square of the file's size, so anyone who can submit an image to a service that uses Pillow can keep one worker busy at full processor load for a long time with a small file. A 2 MB file takes about 5 seconds to open, a 4 MB file about 35 seconds, and an 8 MB file about 3 minutes. An ordinary GIF of the same size opens in well under a second. The cost is paid inside Image.open() itself, with default settings, before the application has seen the image's size or format.
The bug is in GifImageFile._seek() in src/PIL/GifImagePlugin.py, which builds info["comment"] by appending to an immutable bytes object with no size limit. It appends once per 255-byte sub-block (comment += block, line 261) and once per comment extension (info["comment"] += b"\n" + comment, line 266). Each append copies everything collected so far. A file made of many tiny comment extensions forces a full re-copy for each one. Because _open() ends with self._seek(0), any code that only opens an uploaded file to identify it, read its dimensions, or make a thumbnail pays the full cost. The decompression-bomb check does not help, since the image is 1×1. Memory use stays linear, so the effect is processor exhaustion and latency, bounded by whatever upload size the service allows (about 1 second at 1 MB). This is the same kind of issue as the EPS open-phase slowdown fixed as CVE-2021-28677, here in the GIF comment handling. The quadratic pattern was introduced in commit b2b737b68b06 ("Allow arbitrary number of comment extension subblocks", November 2018) and has shipped since Pillow 5.4.0. The attached script builds 2 MB and 4 MB test files and compares each against a byte-identical control whose extensions are labelled as plain text instead of comment. The 4 MB comment file took about 34 seconds to open, against 0.26 seconds for its control. A patch that collects the pieces in a list and joins them once is also attached.
Details
GifImageFile._seek() collects GIF comment extensions into info["comment"] using bytes concatenation, once per 255-byte sub-block and once per comment extension, with no limit on the total. bytes is immutable, so every += allocates a new object and copies everything accumulated so far; the work done by Image.open() is therefore quadratic in the amount of comment data in frame 0.
A 1×1 GIF89a whose body is nothing but the 5-byte comment extension 21 FE 01 41 00 repeated makes this directly observable. Image.open(BytesIO(data)) on such a file, stock build at this commit, 2-CPU machine:
| file size | comment extensions (21 FE …) | same bytes labelled plain-text extension (21 01 …) |
|---|---|---|
| 1 MB | 1.2 s | 0.09 s |
| 2 MB | 4.9 s | 0.13 s |
| 4 MB | 35 s | 0.26 s |
| 8 MB | 183 s | — |
The control column is the identical byte stream with the extension label changed from 0xFE to 0x01; it goes through the same loop and the same self.data() reads but is discarded instead of concatenated, and scales linearly. No load() is needed and no warning or exception is raised; im.info["comment"] simply ends up holding the multi-megabyte blob.
The code, src/PIL/GifImagePlugin.py:229-281 (trimmed):
elif s == b"!":
s = self.fp.read(1)
block = self.data()
…
elif s[0] == 254:
#
# comment extension
#
comment = b""
# Read this comment block
while block:
…
- Record
GHSA-74r2-7ff9-mjj2- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-407
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-112401
6.9
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
UBUNTU-CVE-2026-112401- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-04
OSVBIT-pillow-2026-112401 No score
Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()
Pillow is a Python imaging library. From 5.4.0 until 13.0.0, Pillow performs quadratic copying while parsing GIF comments. GifImageFile._seek() repeatedly appends immutable bytes for comment sub-blocks and multiple comment extensions, and frame zero is parsed during Image.open(). An attacker can submit a small-dimension GIF containing many comment extensions to any application that opens the file. This can consume excessive CPU and deny service before the application can inspect the image. This issue is fixed in version 13.0.0.
- Record
BIT-pillow-2026-112401- Updated
- 2026-11-02
OSVCLSA-2026-1793017750 No score
TuxCare security update for pillow (9 CVEs)
TuxCare rebuilt pillow to address 9 CVEs. Fixed in 11.3.0.post11+tuxcare.
- Record
CLSA-2026-1793017750- Updated
- 2026-11-02
OSVSUSE-SU-2026:5038-1 No score
Security update for python-Pillow
This update for python-Pillow fixes the following issues:
- CVE-2026-96636: decompression-bomb protection bypass via multi-frame
seek()in MPO and DCX (bsc#1286802). - CVE-2026-96637: decompression bomb check bypass in
SpiderImagePlugin.seek()leads to unbounded allocation DoS (bsc#1286801). - CVE-2026-96640: PDF append accepts malformed shared page-tree DAG, which can cause resource exhaustion (bsc#1286798).
- CVE-2026-96641: reachable undefined behavior in native integer operations can lead to denial of service or logic integrity compromise (bsc#1286797).
- CVE-2026-96642:
TarIOnegative size field causes infinite CPU-spin loop (bsc#1286796). - CVE-2026-112390: Denial of Service via infinite loop during crafted MIC image parsing (bsc#1286256).
- CVE-2026-112391: Denial of Service via unbounded recursion in PDF parser (bsc#1286273).
- CVE-2026-112392: Denial of Service via zero-size images in rank filters (bsc#1286287).
- CVE-2026-112393: heap buffer overflow and stale-heap disclosure in _tiffWriteProc when saving compressed TIFF data (bsc#1286325).
- CVE-2026-112394:
P;2LandP;4Ldecoders may read 1 to 3 bytes past the passed buffer size (bsc#1286311). - CVE-2026-112397: out-of-bounds access in
_imagingmorphon a zero-width image (bsc#1286314). - CVE-2026-112398: heap buffer overflow in FPX JPEG decoding can lead to code execution (bsc#1286406).
- CVE-2026-112399: Denial of service via crafted APNG image (bsc#1286368).
- CVE-2026-112400: Denial of Service via memory exhaustion from crafted GIF image (bsc#1286370).
- CVE-2026-112401: Denial of Service via crafted GIF comments (bsc#1286372).
- CVE-2026-112402: Denial of service via double free during image transformation (bsc#1286381).
- CVE-2026-112403: heap buffer overflow in
ImagingJpegDecodeallows for code execution (bsc#1286405). - CVE-2026-112405: NULL pointer dereference in
Image.mergevia an unvalidated band 0 (bsc#1286404). - CVE-2026-112406: infinite loop in
PdfParser.rewrite_pageson page treeParentcycle (bsc#1286403). - CVE-2026-112891: quadratic GIF comment copying during save (bsc#1286402).
- CVE-2026-112892: MSP RLE decoder expands a tiny file into unbounded memory (bsc#1286401).
- CVE-2026-112894: Denial of Service via crafted multi-frame image conversion (bsc#1286408).
- CVE-2026-112895: Denial of service via crafted PDF during append operations (bsc#1286411).
- CVE-2026-112896: TIFF encoder
ColorMapplane-size mismatch causes a heap out-of-bounds read (bsc#1286400). - CVE-2026-112897:
TiffDecodereturns uninitialized memory as pixels for short JPEG strips (bsc#1286398). - CVE-2026-112899: EPS
load(scale)lets Ghostscript render past the decompression bomb limit (bsc#1286489). - CVE-2026-112900: argument Injection in Ghostscript call can lead to remote code execution (bsc#1286397).
- CVE-2026-112901: ReDoS in
XbmImagePlugincan be triggered by 512-byte file (bsc#1286396). - CVE-2026-112902: memory disclosure and segfault in libtiff encoder via crafted TIFF tags (bsc#1286804).
- Record
SUSE-SU-2026:5038-1- Updated
- 2026-11-03
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pillowPyPI |
5.4.0 up to 13.0.0 | 13.0.0 |
pillowBitnami |
5.4.0 up to 13.0.0 | 13.0.0 |
pillowTuxCare:PyPI From an advisory covering 9 CVEs |
11.3.0 up to 11.3.0.post11+tuxcare, plus listed versions 11.3.0.post1+tuxcare11.3.0.post10+tuxcare11.3.0.post2+tuxcare11.3.0.post3+tuxcare11.3.0.post4+tuxcare Show 5 moreShow less11.3.0.post5+tuxcare11.3.0.post6+tuxcare11.3.0.post7+tuxcare11.3.0.post8+tuxcare11.3.0.post9+tuxcare |
11.3.0.post11+tuxcare |
pillowDebian:12 |
All versions, plus listed versions 10.0.0-110.1.0-110.2.0-110.3.0-110.3.0-2 Show 19 moreShow less10.4.0-110.4.0-1.111.1.0-111.1.0-211.1.0-311.1.0-411.1.0-511.2.1-111.3.0-112.0.0-112.1.0-112.1.1-112.1.1-212.2.0-112.3.0-113.0.0-19.4.0-1.19.4.0-1.1+deb12u19.5.0-1 |
None known |
pillowDebian:13 |
All versions, plus listed versions 11.1.0-511.1.0-5+deb13u111.1.0-5+deb13u211.1.0-5+deb13u311.1.0-5+deb13u4 Show 9 moreShow less11.2.1-111.3.0-112.0.0-112.1.0-112.1.1-112.1.1-212.2.0-112.3.0-113.0.0-1 |
None known |
pillowDebian:14 |
All versions, plus listed versions 11.1.0-511.2.1-111.3.0-112.0.0-112.1.0-1 Show 5 moreShow less12.1.1-112.1.1-212.2.0-112.3.0-113.0.0-1 |
None known |
pillowPyPI |
5.4.0 up to 13.0.0, plus listed versions 10.0.010.0.110.1.010.2.010.3.0 Show 39 moreShow less10.4.011.0.011.1.011.2.111.3.012.0.012.1.012.1.112.2.012.3.05.4.16.0.06.1.06.2.06.2.16.2.27.0.07.1.07.1.17.1.27.2.08.0.08.0.18.1.08.1.18.1.28.2.08.3.08.3.18.3.28.4.09.0.09.0.19.1.09.1.19.2.09.3.09.4.09.5.0 |
13.0.0 |
python-PillowSUSE:Linux Enterprise Module for Package Hub 15 SP7 From an advisory covering 29 CVEs |
before 7.2.0-150300.3.33.1 | 7.2.0-150300.3.33.1 |
pillowUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 6.1.0-16.1.0-1build16.2.1-27.0.0-47.0.0-4build1 Show 10 moreShow less7.0.0-4ubuntu0.17.0.0-4ubuntu0.27.0.0-4ubuntu0.37.0.0-4ubuntu0.47.0.0-4ubuntu0.57.0.0-4ubuntu0.67.0.0-4ubuntu0.77.0.0-4ubuntu0.87.0.0-4ubuntu0.97.0.0-4ubuntu0.9+esm1 |
None known |
pillow-python2Ubuntu:Pro:20.04:LTS |
All versions, plus listed versions 6.2.1-3~build16.2.1-36.2.1-3ubuntu0.1~esm16.2.1-3ubuntu0.1~esm2 |
None known |
Show 4 moreShow less
| Package | Affected | Fixed |
|---|---|---|
pillowUbuntu:22.04:LTS |
All versions, plus listed versions 8.1.2+dfsg-0.39.0.0-19.0.1-19.0.1-1build19.0.1-1ubuntu0.1 Show 5 moreShow less9.0.1-1ubuntu0.29.0.1-1ubuntu0.39.0.1-1ubuntu0.49.0.1-1ubuntu0.59.0.1-1ubuntu0.6 |
None known |
pillowUbuntu:24.04:LTS |
All versions, plus listed versions 10.0.0-110.1.0-110.2.0-110.2.0-1build110.2.0-1ubuntu110.2.0-1ubuntu1.210.2.0-1ubuntu1.310.2.0-1ubuntu1.4 |
None known |
pillowUbuntu:26.10 |
All versions, plus listed versions 12.1.1-2ubuntu112.3.0-1ubuntu1 |
None known |
pillowUbuntu:26.04:LTS |
All versions, plus listed versions 11.3.0-1ubuntu111.3.0-1ubuntu212.0.0-1ubuntu112.1.1-1ubuntu112.1.1-2ubuntu1 Show 4 moreShow less12.1.1-2ubuntu1.112.1.1-2ubuntu1.212.1.1-2ubuntu1.312.1.1-2ubuntu1.4 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| affected | OSV | |
| affected, facts | OSV | |
| affected, aliases, references | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-112401 is a medium vulnerability (CVSS 6.9) in Python Pillow, published October 19, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.65%, the 51st percentile. Fixed in pillow 13.0.0.
References
github.com/python-pillow/Pillow/security/advisories/GHSA-74r2-7ff9-mjj2
github.com/python-pillow/Pillow/commit/68a3fe957d8a4d552e8c69d96066d749f0614c7e
github.com/python-pillow/Pillow/releases/tag/13.0.0
nvd.nist.gov/vuln/detail/CVE-2026-112401
github.com/advisories/GHSA-74r2-7ff9-mjj2
github.com/CVEProject/cvelistV5/tree/main/cves/2026/112xxx/CVE-2026-112401.json
Show 63 moreShow less
security-tracker.debian.org/tracker/CVE-2026-112401
github.com/python-pillow/Pillow
suse.com/support/update/announcement/2026/suse-su-20265038-1
bugzilla.suse.com/1286256
bugzilla.suse.com/1286273
bugzilla.suse.com/1286287
bugzilla.suse.com/1286311
bugzilla.suse.com/1286314
bugzilla.suse.com/1286325
bugzilla.suse.com/1286368
bugzilla.suse.com/1286370
bugzilla.suse.com/1286372
bugzilla.suse.com/1286381
bugzilla.suse.com/1286396
bugzilla.suse.com/1286397
bugzilla.suse.com/1286398
bugzilla.suse.com/1286400
bugzilla.suse.com/1286401
bugzilla.suse.com/1286402
bugzilla.suse.com/1286403
bugzilla.suse.com/1286404
bugzilla.suse.com/1286405
bugzilla.suse.com/1286406
bugzilla.suse.com/1286408
bugzilla.suse.com/1286411
bugzilla.suse.com/1286489
bugzilla.suse.com/1286796
bugzilla.suse.com/1286797
bugzilla.suse.com/1286798
bugzilla.suse.com/1286801
bugzilla.suse.com/1286802
bugzilla.suse.com/1286804
suse.com/security/cve/CVE-2026-112390
suse.com/security/cve/CVE-2026-112391
suse.com/security/cve/CVE-2026-112392
suse.com/security/cve/CVE-2026-112393
suse.com/security/cve/CVE-2026-112394
suse.com/security/cve/CVE-2026-112397
suse.com/security/cve/CVE-2026-112398
suse.com/security/cve/CVE-2026-112399
suse.com/security/cve/CVE-2026-112400
suse.com/security/cve/CVE-2026-112401
suse.com/security/cve/CVE-2026-112402
suse.com/security/cve/CVE-2026-112403
suse.com/security/cve/CVE-2026-112405
suse.com/security/cve/CVE-2026-112406
suse.com/security/cve/CVE-2026-112891
suse.com/security/cve/CVE-2026-112892
suse.com/security/cve/CVE-2026-112894
suse.com/security/cve/CVE-2026-112895
suse.com/security/cve/CVE-2026-112896
suse.com/security/cve/CVE-2026-112897
suse.com/security/cve/CVE-2026-112899
suse.com/security/cve/CVE-2026-112900
suse.com/security/cve/CVE-2026-112901
suse.com/security/cve/CVE-2026-112902
suse.com/security/cve/CVE-2026-96636
suse.com/security/cve/CVE-2026-96637
suse.com/security/cve/CVE-2026-96640
suse.com/security/cve/CVE-2026-96641
suse.com/security/cve/CVE-2026-96642
ubuntu.com/security/CVE-2026-112401
cve.org/CVERecord?id=CVE-2026-112401
Left out here: the rest of 2 source descriptions. The JSON record has them.