Severity by source
AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Jail boundary bypass constitutes a scope change (S:C); exploitation requires only a local low-privileged account; impact is availability-only from signal delivery.
Primary rating from Vendor (freebsd).
CVSS VectorVendor: freebsd
Lifecycle Timeline
3DescriptionCVE.org
When used to deliver a signal to a specific thread, thr_kill2(2) called p_cansignal() to determine whether the operation was permitted but did not check the result before delivering the signal. The signal was sent even when the permission check failed. The system call returned the resulting error to the caller, but by then the signal had already been delivered.
The missing check allows an unprivileged local user who knows or can guess a target's process and thread IDs to send any signal to a process they would not normally be permitted to signal, including processes owned by other users or by root. The same check enforces jail boundaries, so a jailed process can signal processes on the host or in other jails. Thread IDs are allocated globally and sequentially, and so can be discovered by brute force with no visibility into the target.
An attacker can stop or terminate arbitrary processes, including critical system daemons, resulting in a Denial of Service (DoS).
AnalysisAI
Signal delivery bypass in FreeBSD's thr_kill2(2) system call allows an unprivileged local user - or a jailed process - to send arbitrary signals to any process on the system, including root-owned processes and critical daemons, causing Denial of Service. The flaw stems from a missing check on the return value of p_cansignal(), the kernel's permission enforcement primitive: the signal is unconditionally delivered before the error is propagated to the caller. No public exploit has been identified at time of analysis and SSVC assesses exploitation as none, though globally sequential thread IDs reduce the skill requirement to simple brute force, and the jail boundary bypass adds a container-escape dimension absent from the base CVSS score.
Technical ContextAI
The vulnerable code path is FreeBSD's thr_kill2(2) system call, which sends a signal to a specific thread within a target process. The kernel calls p_cansignal() - a mandatory access control primitive - to determine whether the calling process may signal the target. A logic error causes the signal to be delivered unconditionally before the return value of p_cansignal() is evaluated; the error is propagated to the caller only after the signal has already been sent. CWE-269 (Improper Privilege Management) captures this root cause: the privilege enforcement mechanism is present but its result is not acted upon. Critically, p_cansignal() also enforces FreeBSD jail isolation boundaries, meaning a jailed process exploiting this flaw can signal processes on the host or in sibling jails - a container-escape-class impact for jail-based multi-tenant deployments. FreeBSD thread IDs are allocated from a global monotonically increasing counter, making them enumerable by brute force without any special privileges or prior visibility into the target. Affected versions confirmed by EUVD-2026-39776: FreeBSD 15.0-RELEASE prior to p10, FreeBSD 14.3-RELEASE prior to p15, and FreeBSD 14.4-RELEASE prior to p6.
RemediationAI
Apply the vendor-released patches documented in FreeBSD Security Advisory FreeBSD-SA-26:25.thr.asc (https://security.freebsd.org/advisories/FreeBSD-SA-26:25.thr.asc): upgrade FreeBSD 15.0-RELEASE to p10 or later, FreeBSD 14.3-RELEASE to p15 or later, and FreeBSD 14.4-RELEASE to p6 or later using freebsd-update or from source. As a compensating control pending patch deployment, administrators can restrict unprivileged access to the thr_kill2(2) system call via MAC framework policies (e.g., mac_bsdextended) or capsicum capability mode if the application profile permits - note that this may impact multi-threaded applications that legitimately use the call. For jail environments specifically, consider auditing which jailed workloads carry local user access and applying resource limits (rctl) or restricting jail-level syscall access, though neither fully mitigates the bypass without the kernel patch. Restarting affected systems after patching ensures the corrected kernel is active.
The x86-64 kernel system-call functionality in Xen 4.1.2 and earlier, as used in Citrix XenServer 6.0.2 and earlier and
The rtsol(8) and rtsold(8) programs do not validate the domain search list options provided in router advertisement mess
The RFC 5011 implementation in rdata.c in ISC BIND 9.7.x and 9.8.x before 9.8.5-P2, 9.8.6b1, 9.9.x before 9.9.3-P2, and
Remote code execution in OpenSSH's sshd server (regression of CVE-2006-5051) allows unauthenticated remote attackers to
The SSH transport protocol with certain OpenSSH extensions, found in OpenSSH before 9.6 and other products, allows remot
The vm_map_lookup function in sys/vm/vm_map.c in the mmap implementation in the kernel in FreeBSD 9.0 through 9.1-RELEAS
Integer overflow in the _gd2GetHeader function in gd_gd2.c in the GD Graphics Library (aka libgd) before 2.2.3, as used
The Stream Control Transmission Protocol (SCTP) module in FreeBSD 9.3 before p33, 10.1 before p26, and 10.2 before p9, w
In FreeBSD 12.1-STABLE before r359565, 12.1-RELEASE before p7, 11.4-STABLE before r362975, 11.4-RELEASE before p1, and 1
A statement in the System Programming Guide of the Intel 64 and IA-32 Architectures Software Developer's Manual (SDM) wa
The SCTP implementation in FreeBSD 8.2 allows remote attackers to cause a denial of service (NULL pointer dereference an
NFS in a BSD derived codebase, as used in OpenBSD through 7.4 and FreeBSD through 14.0-RELEASE, allows remote attackers
Same weakness CWE-269 – Improper Privilege Management
View allSame technique Privilege Escalation
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-39776
GHSA-hvc9-hvw8-q2fx