Bug 2556782 - CVE-2026-114038 device-mapper-multipath: device-mapper-multipath: Information disclosure via malformed format string [fedora-all]
Summary: CVE-2026-114038 device-mapper-multipath: device-mapper-multipath: Information...
Keywords:
Status: NEW
Alias: None
Product: Fedora
Classification: Fedora
Component: device-mapper-multipath
Version: rawhide
Hardware: Unspecified
OS: Unspecified
medium
medium
Target Milestone: ---
Assignee: Ben Marzinski
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard: {"flaws": ["ea93b4b6-0e55-456f-8ef1-9...
Depends On:
Blocks: CVE-2026-114038
TreeView+ depends on / blocked
 
Reported: 2026-10-20 22:31 UTC by Marco Benatto
Modified: 2026-10-20 22:31 UTC (History)
7 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed:
Type: ---
Embargoed:


Attachments (Terms of Use)

Description Marco Benatto 2026-10-20 22:31:56 UTC
Disclaimer: Community trackers are created by Red Hat Product Security team on a best effort basis. Package maintainers are required to ascertain if the flaw indeed affects their package, before starting the update process.

AI_ONLY_REPORT
package: device-mapper-multipath-0.9.9-18.el10
------
Summary: Heap Out-of-Bounds Read in Custom Format String Parser via  
Trailing '%': a trailing `%` in user-supplied `list` or `show` format  
strings can advance the parser past the string terminator and cause  
`multipathd` to read and return unintended daemon memory bytes to a local  
requester, with possible daemon instability in some builds.
Requirements to exploit: `multipathd` must be running and reachable over  
its control socket, and an attacker must be able to issue a local `list` or  
`show` command with a user-controlled `format` string ending in `%`. The  
available evidence supports that non-root users can reach `VRB_LIST`  
commands, and the default pathname socket setup makes this practically  
reachable on typical deployments.
Component affected: `device-mapper-multipath-0.9.9-18.el10`, specifically  
the format parsing helpers in `libmultipath/print.c`  
(`snprint_multipath_header`, `_snprint_multipath`, `snprint_path_header`,  
`_snprint_path`, and `_snprint_pathgroup`) as reached from `multipathd`  
`list`/`show` handlers.
Version affected: `device-mapper-multipath-0.9.9-18.el10`
Patch available: no released package fix established; proposed patch  
included below
Version fixed: unknown
Upstream coordination: Not notified.
CVSS: CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - 4.8 (MEDIUM)
AV:L - exploitation requires local access to the `multipathd` control  
interface.
AC:L - the trigger is a simple trailing `%` in a user-controlled format  
string.
PR:N - the available evidence indicates non-root users can issue  
`VRB_LIST` requests.
UI:N - no user interaction is required once local access is available.
S:U - the impact is limited to the vulnerable daemon's own security  
scope.
C:L - unintended memory disclosure appears real, but the amount and  
usefulness of leaked data are limited and nondeterministic.
I:N - the issue does not provide a demonstrated integrity modification  
primitive.
A:L - some builds may experience instability or a daemon crash from the  
out-of-bounds read.
Impact: Moderate. This issue is not consistent with Red Hat's Critical or  
Important ratings because the attack is local, does not provide arbitrary  
code execution or privilege escalation, and the demonstrated  
confidentiality impact is limited to a small, nondeterministic memory  
disclosure with possible local denial of service. It is stronger than Low  
because the vulnerable path appears reachable by an unprivileged local user  
through normal `list`/`show` functionality and can affect confidentiality  
and availability under realistic conditions.
Embargo: no
Reason: the issue is local, the impact is limited, and the mitigation  
and code fix are straightforward. Based on the available technical  
evidence, this aligns with the usual handling for moderate or lower  
severity flaws that do not warrant extended embargo.
Acknowledgement: Aisle Research
Vulnerability Details: The custom format parser in `libmultipath/print.c`  
searches for `%` markers, advances `format` to the character after `%`, and  
later prints the remaining string. With a trailing `%`, `format` is  
advanced to the terminating NUL byte, then incremented again by the loop  
update, producing a one-past-end pointer that is subsequently reused by  
`strchr()` and by the final `%s` print.
```c
for (f = strchr(format, '%'); f; f = strchr(++format, '%')) {
...
format = f + 1;
...
}
if ((rc = print_strbuf(line, "%s\n", format)) < 0)
return rc;
```
If `%` is the last character in the supplied format string, the parser  
reaches an out-of-bounds pointer state and `print_strbuf(line, "%s\n",  
format)` may continue reading memory until a later NUL byte is encountered.  
This can append unintended bytes to the reply buffer and, depending on  
allocator layout and build instrumentation, may also fault.
The reachable control path is supported by the command handling logic.  
Non-root users are allowed to issue `VRB_LIST` requests:
```c
if (!c->is_root && kw->code != VRB_LIST) {
c->error = -EPERM;
}
```
The `format` parameter for list operations is user-controlled:
```c
char *fmt = get_keyparam(v, KEY_FMT);
return show_paths(reply, vecs, fmt, 1);
```
The same parser pattern is present in multiple helpers in `print.c`, so the  
issue is not limited to a single path-printing function.
Steps to reproduce:
1. Start `multipathd` with its default control sockets enabled.
2. As a local non-root user, issue `multipathd -k 'list paths format %'`.
3. Observe the reply for unintended trailing bytes beyond the expected  
output; on some builds, the daemon may instead show instability or  
terminate.
4. The same behavior is also expected with similar format-driven `list` or  
`show` requests such as `list maps format %`.
5. For stronger confirmation, run an instrumented build with ASan or UBSan  
and repeat the command to observe the invalid read in the parser path.
Mitigation: Restrict access to the `multipathd` control socket to trusted  
users until a fix is available, and avoid exposing attacker-controlled  
`format` strings to `list` or `show` operations. If operationally  
acceptable, limiting or disabling unprivileged access to the control  
interface reduces practical reachability.
Proposed Fix: Add an explicit trailing-`%` guard after `format = f + 1`,  
and avoid the `strchr(++format, '%')` update pattern so the next search  
never begins from a one-past-end pointer. The same change should be applied  
consistently to all five affected loops in `libmultipath/print.c`.
```diff
diff --git a/libmultipath/print.c b/libmultipath/print.c
@@
for (f = strchr(format, '%'); f; f = strchr(++format, '%')) {
+ for (f = strchr(format, '%'); f; ) {
@@
      format = f + 1;
+    if (*format == '\0')
+        break; /* trailing '%' */
@@

   if ((iwc = pd_lookup(*format)) == -1)

       continue;
+    if ((iwc = pd_lookup(*format)) == -1)
+        goto next;
@@
+next:
+    f = strchr(format + 1, '%');
  }
```


------
This report was generated using AI technology. Always review AI-generated  
content prior to use


Note You need to log in before you can comment on or make changes to this bug.