CVE-2026-75904
libmodplug <= 0.8.9.1 - Out-of-Bounds Read in pat_smplooped via Crafted MIDI File
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
Attack profile
How easy it is to exploit
- Attack vector
- Local
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.8
libmodplug <= 0.8.9.1 - Out-of-Bounds Read in pat_smplooped via Crafted MIDI File
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
CVE-2026-75904- CVSS 4.0
- 4.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Weakness
- CWE-125
- Updated
- 2026-11-02
EUVDEUVD-2026-60967
4.8
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
EUVD-2026-60967- CVSS 4.0
- 4.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-prc8-cg98-hxwc
4.8
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp....
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
GHSA-prc8-cg98-hxwc- CVSS 4.0
- 4.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/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
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Weakness
- CWE-125
- Updated
- 2026-11-02
NVD
4.8
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
CVE-2026-75904- CVSS 4.0
- 4.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/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
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Weakness
- CWE-125
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-75904
3.3
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
DEBIAN-CVE-2026-75904- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVOESA-2026-3602
3.3
libmodplug security update
The library which was part of the Modplug-xmms project.
Security Fix(es):
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.(CVE-2026-75904)
- Record
OESA-2026-3602- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
Show 8 moreShow less
OSVOESA-2026-3603
3.3
libmodplug security update
The library which was part of the Modplug-xmms project.
Security Fix(es):
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.(CVE-2026-75904)
- Record
OESA-2026-3603- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVOESA-2026-3604
3.3
libmodplug security update
The library which was part of the Modplug-xmms project.
Security Fix(es):
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.(CVE-2026-75904)
- Record
OESA-2026-3604- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVOESA-2026-3605
3.3
libmodplug security update
The library which was part of the Modplug-xmms project.
Security Fix(es):
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.(CVE-2026-75904)
- Record
OESA-2026-3605- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVOESA-2026-3734
3.3
libmodplug security update
The library which was part of the Modplug-xmms project.
Security Fix(es):
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.(CVE-2026-75904)
- Record
OESA-2026-3734- CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-75904
4.8
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
UBUNTU-CVE-2026-75904- CVSS 4.0
- 4.8 Medium
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 3.3 Low
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
OSVAZL-96854 No score
CVE-2026-75904 affecting package libmodplug 0.8.9.0-12
libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp. The function validates only the upper bound of its sample index against MAXSMP and then subtracts one before indexing the 191-byte static array pat_loops, so an index of zero reads pat_loops[-1], one byte before the array. The index is the smpno field of a parsed MIDI event, which is initialised to zero and only later overwritten from a program-change parameter, so an event reaching the note test before an instrument is assigned carries zero. A 32-byte MIDI file supplied to the library's public ModPlug_Load entry point drives the path through CSoundFile::Create, CSoundFile::ReadMID, and MID_ReadPatterns to the read. The byte read out of bounds determines whether a note event is treated as looping, so adjacent static storage influences playback state.
- Record
AZL-96854- Updated
- 2026-11-05
OSVopenSUSE-SU-2026:12215-1 No score
libmodplug-devel-0.8.9.0+git20170610.f6dd59a-4.1 on GA media
These are all security issues fixed in the libmodplug-devel-0.8.9.0+git20170610.f6dd59a-4.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12215-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:22165-1 No score
Security update for libmodplug
This update for libmodplug fixes the following issues:
Changes in libmodplug:
- CVE-2026-108577: This issue affects the function abc_add_gchord of the file src/load_abc.cpp of the component ABC Music Format Parser. This manipulation causes resource consumption [bsc#1284977]
- CVE-2026-111270: a heap-based out-of-bounds write in CSoundFile:ReadDSM() in src/load_dsm.cpp because nPat is never checked against MAX_PATTERNS [bsc#1285765]
- CVE-2026-111271: a heap-based out-of-bounds read vulnerability in CSoundFile:ReadAMS2() in src/load_ams.cpp [bsc#1285766]
- CVE-2026-75904: libmodplug through 0.8.9.1 contains an out-of-bounds read in pat_smplooped in src/load_pat.cpp [bsc#1275624]
- Record
openSUSE-SU-2026:22165-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
libmodplugAzure Linux:3 |
through 0.8.9.0-12 | None known |
libmodplugDebian:12 |
All versions, plus listed versions 1:0.8.9.0-31:0.8.9.0-4 |
None known |
libmodplugDebian:13 |
All versions, plus listed versions 1:0.8.9.0-31:0.8.9.0-4 |
None known |
libmodplugDebian:14 |
before 1:0.8.9.0-4, plus listed versions 1:0.8.9.0-3 |
1:0.8.9.0-4 |
libmodplugopenEuler:24.03-LTS-SP3 |
before 0.8.9.0-11.oe2403sp3 | 0.8.9.0-11.oe2403sp3 |
libmodplugopenEuler:20.03-LTS-SP4 |
before 0.8.9.0-11.oe2003sp4 | 0.8.9.0-11.oe2003sp4 |
libmodplugopenEuler:22.03-LTS-SP4 |
before 0.8.9.0-11.oe2203sp4 | 0.8.9.0-11.oe2203sp4 |
libmodplugopenEuler:24.03-LTS-SP1 |
before 0.8.9.0-11.oe2403sp1 | 0.8.9.0-11.oe2403sp1 |
libmodplugopenEuler:24.03-LTS-SP4 |
before 0.8.9.0-11.oe2403sp4 | 0.8.9.0-11.oe2403sp4 |
gst-plugins-bad0.10Ubuntu:Pro:14.04:LTS |
All versions, plus listed versions 0.10.23-7ubuntu20.10.23-7.2ubuntu10.10.23-7.2ubuntu1.10.10.23-7.2ubuntu1.20.10.23-7.2ubuntu1.30.10.23-7.2ubuntu1.3+esm1 |
None known |
Show 10 moreShow less
| Package | Affected | Fixed |
|---|---|---|
libmodplugUbuntu:14.04:LTS |
All versions, plus listed versions 1:0.8.8.4-41:0.8.8.4-4.1 |
None known |
libmodplugUbuntu:16.04:LTS |
All versions, plus listed versions 1:0.8.8.5-2 |
None known |
libmodplugUbuntu:18.04:LTS |
All versions, plus listed versions 1:0.8.9.0-1 |
None known |
libmodplugUbuntu:20.04:LTS |
All versions, plus listed versions 1:0.8.9.0-21:0.8.9.0-2build1 |
None known |
libmodplugUbuntu:22.04:LTS |
All versions, plus listed versions 1:0.8.9.0-3 |
None known |
libmodplugUbuntu:24.04:LTS |
All versions, plus listed versions 1:0.8.9.0-31:0.8.9.0-3build1 |
None known |
libmodplugUbuntu:26.10 |
All versions, plus listed versions 1:0.8.9.0-3build2 |
None known |
libmodplugUbuntu:26.04:LTS |
All versions, plus listed versions 1:0.8.9.0-3build11:0.8.9.0-3build2 |
None known |
libmodplugopenSUSE:Tumbleweed From an advisory covering 4 CVEs |
before 0.8.9.0+git20170610.f6dd59a-4.1 | 0.8.9.0+git20170610.f6dd59a-4.1 |
libmodplugopenSUSE:Leap 16.0 From an advisory covering 4 CVEs |
before 0.8.9.0+git20170610.f6dd59a-bp160.2.1 | 0.8.9.0+git20170610.f6dd59a-bp160.2.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| facts | 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-75904 is a medium vulnerability (CVSS 4.8) in Konstanty Bialkowski Libmodplug, published August 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.19%, the 8th percentile. Fixed in libmodplug 1:0.8.9.0-4.
References
github.com/Konstanty/libmodplug/issues/103
github.com/Konstanty/libmodplug/blob/d1b97ed0020bc620a059d3675d1854b40bd2608d/src/load_pat.cpp
github.com/Konstanty/libmodplug/blob/d1b97ed0020bc620a059d3675d1854b40bd2608d/src/load_mid.cpp
github.com/Konstanty/libmodplug
vulncheck.com/advisories/libmodplug-out-of-bounds-read-in-pat-smplooped-via-crafted-midi-file
nvd.nist.gov/vuln/detail/CVE-2026-75904
Show 17 moreShow less
github.com/advisories/GHSA-prc8-cg98-hxwc
security-tracker.debian.org/tracker/CVE-2026-75904
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3602
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3603
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3604
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3605
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-3734
ubuntu.com/security/CVE-2026-75904
cve.org/CVERecord?id=CVE-2026-75904
suse.com/security/cve/CVE-2026-108577
suse.com/security/cve/CVE-2026-111270
suse.com/security/cve/CVE-2026-111271
suse.com/security/cve/CVE-2026-75904
bugzilla.suse.com/1275624
bugzilla.suse.com/1284977
bugzilla.suse.com/1285765
bugzilla.suse.com/1285766