Problem Description:
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.
Impact:
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).