{
    "dataType": "CVE_RECORD",
    "dataVersion": "5.2",
    "cveMetadata": {
        "cveId": "CVE-2026-90833",
        "assignerOrgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
        "state": "PUBLISHED",
        "assignerShortName": "zephyr",
        "dateReserved": "2026-09-13T19:22:58.656Z",
        "datePublished": "2026-11-10T22:07:42.603Z",
        "dateUpdated": "2026-11-10T22:07:42.603Z"
    },
    "containers": {
        "cna": {
            "providerMetadata": {
                "orgId": "e2e69745-5e70-4e92-8431-deb5529a81ad",
                "shortName": "zephyr",
                "dateUpdated": "2026-11-10T22:07:42.603Z"
            },
            "title": "Signed offset bypasses bounds check in simulated EEPROM driver, allowing out-of-bounds kernel memory read and write from user mode",
            "descriptions": [
                {
                    "lang": "en",
                    "value": "The simulated EEPROM driver validated access ranges in eeprom_range_is_valid() (drivers/eeprom/eeprom_simulator.c) with a single test, (offset + len) <= config->size. Because offset is a signed off_t and len an unsigned size_t of the same rank, the addition is evaluated in unsigned arithmetic: a negative offset combined with a compensating len wraps the sum back into the accepted range. eeprom_sim_read() and eeprom_sim_write() then memcpy() through the EEPROM(addr) macro, which is plain pointer arithmetic on the driver's static mock_eeprom array, so the copy addresses memory located before that array.\n\neeprom_read() and eeprom_write() are __syscall entry points, and their verification handlers in drivers/eeprom/eeprom_handlers.c check only the device object and the caller's own data buffer (K_SYSCALL_MEMORY_READ/K_SYSCALL_MEMORY_WRITE) — the offset argument is passed to the driver unvalidated. With CONFIG_USERSPACE=y, a CONFIG_EEPROM_SIMULATOR device instance, and the device object granted to a user thread (the usage the in-tree tests/drivers/eeprom/api suite exercises from ZTEST_USER threads), an unprivileged thread could supply a negative offset and have the kernel perform the copy on its behalf.\n\nThe result is an out-of-bounds read of kernel .bss returned into the caller's buffer and, via the write path, an out-of-bounds write of caller-supplied bytes over kernel memory preceding mock_eeprom. Both the start address and the length of the affected span are attacker-selected, so the primitive is sufficient to corrupt adjacent kernel state and escape the user-mode sandbox. Exposure is limited to builds that instantiate the simulated EEPROM (status = \"okay\" by default on qemu_x86 and native_sim, otherwise added by a devicetree overlay) together with userspace isolation.\n\nThe fix rejects negative offsets and performs the remaining bound check without overflow."
                }
            ],
            "affected": [
                {
                    "vendor": "zephyrproject",
                    "product": "zephyr",
                    "collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
                    "packageName": "zephyr",
                    "defaultStatus": "unaffected",
                    "programFiles": [
                        "drivers/eeprom/eeprom_simulator.c"
                    ],
                    "programRoutines": [
                        {
                            "name": "eeprom_range_is_valid"
                        },
                        {
                            "name": "eeprom_sim_read"
                        },
                        {
                            "name": "eeprom_sim_write"
                        },
                        {
                            "name": "z_vrfy_eeprom_read"
                        },
                        {
                            "name": "z_vrfy_eeprom_write"
                        }
                    ],
                    "versions": [
                        {
                            "version": "2.2.0",
                            "status": "affected",
                            "versionType": "semver",
                            "lessThan": "4.3.2"
                        },
                        {
                            "version": "4.4.0",
                            "status": "affected",
                            "versionType": "semver",
                            "lessThan": "4.5.0"
                        }
                    ]
                }
            ],
            "references": [
                {
                    "url": "https://github.com/zephyrproject-rtos/zephyr/commit/ce2ec9b3a34d71f52f5d1d7491b91393e334713e",
                    "name": "Fix commit",
                    "tags": [
                        "patch"
                    ]
                },
                {
                    "url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-vf6j-hcx8-44vh",
                    "name": "GHSA-vf6j-hcx8-44vh"
                }
            ],
            "metrics": [
                {
                    "format": "CVSS",
                    "cvssV3_1": {
                        "version": "3.1",
                        "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
                        "baseScore": 7.8,
                        "baseSeverity": "HIGH"
                    }
                }
            ],
            "problemTypes": [
                {
                    "descriptions": [
                        {
                            "lang": "en",
                            "description": "bounds",
                            "cweId": "CWE-787",
                            "type": "CWE"
                        }
                    ]
                }
            ],
            "x_generator": {
                "engine": "cvelib 1.8.0"
            }
        }
    }
}