The device multiplexer pseudo-driver in drivers/misc/devmux/devmux.c exposes two system calls, devmux_select_get() and devmux_select_set(). When CONFIG_USERSPACE is enabled, their user-mode verifiers z_vrfy_devmux_select_get() and z_vrfy_devmux_select_set() forwarded directly to the kernel implementations without performing any kernel-object validation — no k_object_access_check() and no driver object check. Compounding this, DEVICE_DT_INST_DEFINE() registered devmux instances with a NULL driver API pointer, which causes scripts/build/gen_kobject_list.py to skip them entirely, so a devmux device had no struct k_object and no permission on it could be granted or withheld in the first place.
Any thread running in user mode can reach the defect: device pointers such as DEVICE_DT_GET(DT_NODELABEL(devmux0)) are compile-time constants available to application code, and the syscall accepted them from a thread that had never been granted access to the device. The kernel implementations do validate the pointer against the static devmux instance table and bounds-check the selection index, so this is not a memory-safety issue; the failure is purely one of authorization. Exposure requires CONFIG_USERSPACE=y together with the experimental CONFIG_DEVMUX=y (which depends on CONFIG_DEVICE_MUTABLE) and a zephyr,devmux devicetree node.
An unprivileged user-mode thread can read and change which downstream device a multiplexer forwards to, bypassing the userspace object-permission model. Because a devmux forwards the data, configuration and API of the selected device — its documented use being zephyr,console and zephyr,shell-uart switching — an attacker can suppress console, log and shell output, redirect that output to a downstream device it is able to observe, or flip the selection underneath another thread that is legitimately using the multiplexer. The impact is bounded to the devicetree-fixed set of downstream devices; no out-of-bounds access or arbitrary pointer dereference is reachable.
The fix declares __subsystem struct devmux_driver_api and attaches a DEVICE_API(devmux, devmux_api) instance to each devmux device so that it becomes a tracked K_OBJ_DRIVER_DEVMUX kernel object, and adds K_OOPS(devmux_inst_get(dev) == SIZE_MAX) plus K_OOPS(k_object_access_check(dev) != 0) to both verifiers.
{
"cna_assigner": "zephyr",
"cwe_ids": [
"CWE-862"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/19xxx/CVE-2026-19947.json",
"unresolved_ranges": [
{
"extracted_events": [
{
"range": [
{
"introduced": "3.6.0"
},
{
"fixed": "4.5.0"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StandardRange"
}
]
}
]
}{
"extracted_events": [
{
"range": [
{
"fixed": "4b7f98345d8f894f4b8aabe52a2623d843669fac"
}
],
"source": "REFERENCES_COMMIT"
}
]
}
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-19947.json"
[
{
"deprecated": false,
"digest": {
"function_hash": "148531830299181059324652930051072348740",
"length": 86
},
"id": "CVE-2026-19947-57b452ed",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/4b7f98345d8f894f4b8aabe52a2623d843669fac",
"target": {
"file": "drivers/misc/devmux/devmux.c",
"function": "z_vrfy_devmux_select_set"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"108691657577698391629042792544935654571",
"76409002342487092419663925909527302448",
"189668668943998480318119588048355354178"
],
"threshold": 0.9
},
"id": "CVE-2026-19947-68f4c5fa",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/4b7f98345d8f894f4b8aabe52a2623d843669fac",
"target": {
"file": "include/zephyr/drivers/misc/devmux/devmux.h"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"289586218110272944753212099143835157734",
"98034573165454826925129886609405253914",
"137760067410524941514193963018949978045",
"75288941879512395632411137196319404752",
"211099229422730164266441406074371438007",
"241064285857747181730267997897704835394",
"165786056732084874750636459852618750067",
"140435076406253689663105482787945794768",
"124380811646820082066483903837301385506",
"284158341892753562506675688072423451274",
"182689324656652368686936403593741881734",
"192626039280476916502211877816124437587",
"212720391147088549290173898297962858641",
"146067649663353048068234809541974132705",
"74701107924622340813154138175068970152",
"67793130531655715426352341385791589975",
"331172668747572275413210775155992061139",
"202100566226562973653668219539684774598",
"308096772013396751291000132282024445490",
"154204913449309231606661129533603523535",
"325953349069305432237962745607790344551",
"209516287308484477758537575820749821173",
"161306194934331033811199562263674281781",
"132457422516649101429413359443431983403",
"292490344592577311895896887911770177521"
],
"threshold": 0.9
},
"id": "CVE-2026-19947-732e332c",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/4b7f98345d8f894f4b8aabe52a2623d843669fac",
"target": {
"file": "drivers/misc/devmux/devmux.c"
}
},
{
"deprecated": false,
"digest": {
"function_hash": "134087146861038069845427907574047506124",
"length": 70
},
"id": "CVE-2026-19947-a827483a",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/4b7f98345d8f894f4b8aabe52a2623d843669fac",
"target": {
"file": "drivers/misc/devmux/devmux.c",
"function": "z_vrfy_devmux_select_get"
}
}
]
"2026-10-22T07:42:03Z"