...
Section 7.14.1.1, para. 5, of the C standard [ISO/IEC 9899:2011], states that if the signal occurs other than as the result of calling the abort()
or raise()
function, the behavior is undefined if
...
All functions not listed in this table are considered to be unsafe with respect to signals. In the presence of signals, all functions defined by IEEE standard 1003.1-2001 behave as defined when called from or interrupted by a signal handler, with a single exception: when a signal interrupts an unsafe function and the signal handler calls an unsafe function, the behavior is undefined.
Note that although raise()
is on the list of asynchronous-safe functions, it should not be called within a signal handler if the signal occurs as a result of abort() or raise()
function.
Section 7.14.1.1, para. 4, of the C standard [ISO/IEC 9899:2011] states:
...
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
Compass/ROSE | Can detect violations of the rule for single-file programs. | ||||||||
| 88 D | Fully implemented. | |||||||
Splint |
|
|
|
Related Vulnerabilities
For an overview of software vulnerabilities resulting from improper signal handling, see Zalewski's paper on understanding, exploiting, and preventing signal-handling-related vulnerabilities [Zalewski 2001]. VU #834865 describes a vulnerability resulting from a violation of this rule.
Another notable case where using the longjmp()
function in a signal handler caused a serious vulnerability is wu-ftpd 2.4 [Greenman 1997]. The effective user ID is set to zero in one signal handler. If a second signal interrupts the first, a call is made to longjmp()
, returning the program to the main thread but without lowering the user's privileges. These escalated privileges can be used for further exploitation.
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...
ISO/IEC TR 17961 (Draft) Calling functions in the C Standard Library other than abort, _Exit, and signal
from within a signal handler [asyncsig]
...
[Dowd 2006] Chapter 13, "Synchronization and State"
[ISO/IEC 2003] Section 5.2.3, "Signals and interrupts"
[Open Group 2004] longjmp()
[OpenBSD] signal()
Man Page
[Zalewski 2001]
...