441 lines
13 KiB
Plaintext
441 lines
13 KiB
Plaintext
IAX2 Security
|
|
|
|
Copyright (c) 2009 - Digium, Inc.
|
|
|
|
All Rights Reserved.
|
|
|
|
Document Version 1.0
|
|
|
|
09/03/09
|
|
|
|
Asterisk Development Team <asteriskteam@digium.com>
|
|
|
|
Table of Contents
|
|
|
|
1. Introduction 3
|
|
|
|
1.1. Overview 3
|
|
|
|
2. User Guide 3
|
|
|
|
2.1. Configuration 3
|
|
|
|
2.1.1. Quick Start 3
|
|
|
|
2.1.2. Controlled Networks 4
|
|
|
|
2.1.2.1. Full Upgrade 4
|
|
|
|
2.1.2.2. Partial Upgrade 4
|
|
|
|
2.1.3. Public Networks 4
|
|
|
|
2.1.3.1. Full Upgrade 4
|
|
|
|
2.1.3.2. Partial Upgrade 5
|
|
|
|
2.1.3.3. Guest Access 5
|
|
|
|
2.2. CLI Commands 6
|
|
|
|
2.2.1. iax2 show callnumber usage 6
|
|
|
|
2.2.2. iax2 show peer 6
|
|
|
|
3. Protocol Modification 6
|
|
|
|
3.1. Overview 6
|
|
|
|
3.2. Call Token Validation 7
|
|
|
|
3.3. Example Message Exchanges 8
|
|
|
|
3.3.1. Call Setup 8
|
|
|
|
3.3.2. Call Setup, client does not support CALLTOKEN 8
|
|
|
|
3.3.3. Call Setup, client supports CALLTOKEN, server does not 9
|
|
|
|
3.3.4. Call Setup from client that sends invalid token 9
|
|
|
|
4. Asterisk Implementation 9
|
|
|
|
4.1. CALLTOKEN IE Payload 9
|
|
|
|
1. Introduction
|
|
|
|
1.1. Overview
|
|
|
|
A change has been made to the IAX2 protocol to help mitigate denial of
|
|
service attacks. This change is referred to as call token validation. This
|
|
change affects how messages are exchanged and is not backwards compatible
|
|
for an older client connecting to an updated server, so a number of
|
|
options have been provided to disable call token validation as needed for
|
|
compatibility purposes.
|
|
|
|
In addition to call token validation, Asterisk can now also limit the
|
|
number of connections allowed per IP address to disallow one host from
|
|
preventing other hosts from making successful connections. These options
|
|
are referred to as call number limits.
|
|
|
|
For additional details about the configuration options referenced in this
|
|
document, see the sample configuration file, iax.conf.sample. For
|
|
information regarding the details of the call token validation protocol
|
|
modification, see section 3 (Protocol Modification) of this document.
|
|
|
|
2. User Guide
|
|
|
|
2.1. Configuration
|
|
|
|
2.1.1. Quick Start
|
|
|
|
We strongly recommend that administrators leave the IAX2 security
|
|
enhancements in place where possible. However, to bypass the security
|
|
enhancements completely and have Asterisk work exactly as it did before,
|
|
the following options can be specified in the [general] section of
|
|
iax.conf:
|
|
|
|
[general]
|
|
|
|
...
|
|
|
|
calltokenoptional = 0.0.0.0/0.0.0.0
|
|
|
|
maxcallnumbers = 16382
|
|
|
|
...
|
|
|
|
2.1.2. Controlled Networks
|
|
|
|
This section discusses what needs to be done for an Asterisk server on a
|
|
network where no unsolicited traffic will reach the IAX2 service.
|
|
|
|
2.1.2.1. Full Upgrade
|
|
|
|
If all IAX2 endpoints have been upgraded, then no changes to configuration
|
|
need to be made.
|
|
|
|
2.1.2.2. Partial Upgrade
|
|
|
|
If only some of the IAX2 endpoints have been upgraded, then some
|
|
configuration changes will need to be made for interoperability. Since
|
|
this is for a controlled network, the easiest thing to do is to disable
|
|
call token validation completely, as described in section 2.1.1.
|
|
|
|
2.1.3. Public Networks
|
|
|
|
This section discusses the use of the IAX2 security functionality on
|
|
public networks where it is possible to receive unsolicited IAX2 traffic.
|
|
|
|
2.1.3.1. Full Upgrade
|
|
|
|
If all IAX2 endpoints have been upgraded to support call token validation,
|
|
then no changes need to be made. However, for enhanced security, the
|
|
administrator may adjust call number limits to further reduce the
|
|
potential impact of malicious call number consumption. The following
|
|
configuration will allow known peers to consume more call numbers than
|
|
unknown source IP addresses:
|
|
|
|
[general]
|
|
|
|
; By default, restrict call number usage to a low number.
|
|
|
|
maxcallnumbers = 16
|
|
|
|
...
|
|
|
|
[callnumberlimits]
|
|
|
|
; For peers with known IP addresses, call number limits can
|
|
|
|
; be set in this section. This limit is per IP address for
|
|
|
|
; addresses that fall in the specified range.
|
|
|
|
; <IP>/<mask> = <limit>
|
|
|
|
192.168.1.0/255.255.255.0 = 1024
|
|
|
|
...
|
|
|
|
[peerA]
|
|
|
|
; Since we won't know the IP address of a dynamic peer until
|
|
|
|
; they register, a max call number limit can be set in a
|
|
|
|
; dynamic peer configuration section.
|
|
|
|
Type = peer
|
|
|
|
host = dynamic
|
|
|
|
maxcallnumbers = 1024
|
|
|
|
...
|
|
|
|
2.1.3.2. Partial Upgrade
|
|
|
|
If only some IAX2 endpoints have been upgraded, or the status of an IAX2
|
|
endpoint is unknown, then call token validation must be disabled to ensure
|
|
interoperability. To reduce the potential impact of disabling call token
|
|
validation, it should only be disabled for a specific peer or user as
|
|
needed. By using the auto option, call token validation will be changed to
|
|
required as soon as we determine that the peer supports it.
|
|
|
|
[friendA]
|
|
|
|
requirecalltoken = auto
|
|
|
|
...
|
|
|
|
Note that there are some cases where auto should not be used. For example,
|
|
if multiple peers use the same authentication details, and they have not
|
|
all upgraded to support call token validation, then the ones that do not
|
|
support it will get locked out. Once an upgraded client successfully
|
|
completes an authenticated call setup using call token validation,
|
|
Asterisk will require it from then on. In that case, it would be better to
|
|
set the requirecalltoken option to no.
|
|
|
|
2.1.3.3. Guest Access
|
|
|
|
Guest access via IAX2 requires special attention. Given the number of
|
|
existing IAX2 endpoints that do not support call token validation, most
|
|
systems that allow guest access should do so without requiring call token
|
|
validation.
|
|
|
|
[guest]
|
|
|
|
; Note that the name "guest" is special here. When the code
|
|
|
|
; tries to determine if call token validation is required, it
|
|
|
|
; will look for a user by the username specified in the
|
|
|
|
; request. Guest calls can be sent without a username. In
|
|
|
|
; that case, we will look for a defined user called "guest" to
|
|
|
|
; determine if call token validation is required or not.
|
|
|
|
type = user
|
|
|
|
requirecalltoken = no
|
|
|
|
...
|
|
|
|
Since disabling call token validation for the guest account allows a huge
|
|
hole for malicious call number consumption, an option has been provided to
|
|
segregate the call numbers consumed by connections not using call token
|
|
validation from those that do. That way, there are resources dedicated to
|
|
the more secure connections to ensure that service is not interrupted for
|
|
them.
|
|
|
|
[general]
|
|
|
|
maxcallnumbers_nonvalidated = 2048
|
|
|
|
2.2. CLI Commands
|
|
|
|
2.2.1. iax2 show callnumber usage
|
|
|
|
Usage: iax2 show callnumber usage [IP address]
|
|
|
|
Show current IP addresses which are consuming IAX2 call numbers.
|
|
|
|
2.2.2. iax2 show peer
|
|
|
|
This command will now also show the configured call number limit and
|
|
whether or not call token validation is required for this peer.
|
|
|
|
3. Protocol Modification
|
|
|
|
This section discusses the modification that has been made to the IAX2
|
|
protocol. This information would be most useful to implementors of IAX2.
|
|
|
|
3.1. Overview
|
|
|
|
The IAX2 protocol uses a call number to associate messages with which call
|
|
they belong to. The available amount of call numbers is finite as defined
|
|
by the protocol. Because of this, it is important to prevent attackers
|
|
from maliciously consuming call numbers. To achieve this, an enhancement
|
|
to the IAX2 protocol has been made which is referred to as call token
|
|
validation.
|
|
|
|
Call token validation ensures that an IAX2 connection is not coming from a
|
|
spoofed IP address. In addition to using call token validation, Asterisk
|
|
will also limit how many call numbers may be consumed by a given remote IP
|
|
address. These limits have defaults that will usually not need to be
|
|
changed, but can be modified for a specific need.
|
|
|
|
The combination of call token validation and call number limits is used to
|
|
mitigate a denial of service attack to consume all available IAX2 call
|
|
numbers. An alternative approach to securing IAX2 would be to use a
|
|
security layer on top of IAX2, such as DTLS [RFC4347] or IPsec [RFC4301].
|
|
|
|
3.2. Call Token Validation
|
|
|
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
|
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
|
document are to be interpreted as described in RFC 2119.
|
|
|
|
For this section, when the word "request" is used, it is referring to the
|
|
command that starts an IAX2 dialog.
|
|
|
|
This modification adds a new IAX2 frame type, and a new information
|
|
element be defined.
|
|
|
|
Frame Type: CALLTOKEN --- 0x28 (40)
|
|
|
|
IE: CALLTOKEN --- 0x36 (54)
|
|
|
|
When a request is initially sent, it SHOULD include the CALLTOKEN IE with
|
|
a zero-length payload to indicate that this client supports the CALLTOKEN
|
|
exchange. When a server receives this request, it MUST respond with the
|
|
IAX2 message CALLTOKEN. The CALLTOKEN message MUST be sent with a source
|
|
call number of 0, as a call number will not yet be allocated for this
|
|
call.
|
|
|
|
For the sake of backwards compatibility with clients that do not support
|
|
token validation, server implementations MAY process requests that do not
|
|
indicate CALLTOKEN support in their initial request. However, this SHOULD
|
|
NOT be the default behavior, as it gives up the security benefits gained
|
|
by CALLTOKEN validation.
|
|
|
|
After a client sends a request with an empty CALLTOKEN IE, it MUST be
|
|
prepared to receive a CALLTOKEN response, or to receive a response that
|
|
would be given in the case of a valid CALLTOKEN. This is how a client must
|
|
behave to inter operate with IAX2 server implementations that do not yet
|
|
support CALLTOKEN validation.
|
|
|
|
When an IAX2 client receives a CALLTOKEN response, it MUST send its
|
|
initial request again. This request MUST include the CALLTOKEN IE with a
|
|
copy of the value of the CALLTOKEN IE received in the CALLTOKEN response.
|
|
The IE value is an opaque value. Clients MUST be able to accept a
|
|
CALLTOKEN payload of any length, up to the maximum length allowed in an
|
|
IAX2 IE.
|
|
|
|
The value of the payload in the CALLTOKEN IE is an implementation detail.
|
|
It is left to the implementor to decide how sophisticated it should be.
|
|
However, it MUST be enough such that when the CALLTOKEN IE is sent back,
|
|
it can be used to verify that the source IP address and port number has
|
|
not been spoofed.
|
|
|
|
If a server receives a request with an invalid CALLTOKEN IE value, then it
|
|
MUST drop it and not respond.
|
|
|
|
3.3. Example Message Exchanges
|
|
|
|
3.3.1. Call Setup
|
|
|
|
Client Server
|
|
|
|
-------- --------
|
|
|
|
------------- NEW ----------->
|
|
|
|
(with empty CALLTOKEN IE)
|
|
|
|
<---------- CALLTOKEN ------------
|
|
|
|
(client must ignore
|
|
|
|
source call number
|
|
|
|
from this message)
|
|
|
|
------------- NEW ----------->
|
|
|
|
(with received token)
|
|
|
|
<---------- AUTHREQ ----------
|
|
|
|
... continue as normal ...
|
|
|
|
3.3.2. Call Setup, client does not support CALLTOKEN
|
|
|
|
Client Server
|
|
|
|
-------- --------
|
|
|
|
------------- NEW ----------->
|
|
|
|
(with no CALLTOKEN IE)
|
|
|
|
<----------- REJECT ----------
|
|
|
|
(sent without allocating
|
|
|
|
a call number)
|
|
|
|
------------- ACK ----------->
|
|
|
|
3.3.3. Call Setup, client supports CALLTOKEN, server does not
|
|
|
|
Client Server
|
|
|
|
-------- --------
|
|
|
|
------------- NEW ----------->
|
|
|
|
(with empty CALLTOKEN IE)
|
|
|
|
<----------- AUTHREQ ---------
|
|
|
|
(sent without allocating
|
|
|
|
a call number)
|
|
|
|
... continue as normal ...
|
|
|
|
3.3.4. Call Setup from client that sends invalid token
|
|
|
|
Client Server
|
|
|
|
-------- --------
|
|
|
|
------------- NEW ----------->
|
|
|
|
(with invalid CALLTOKEN IE)
|
|
|
|
... dropped ...
|
|
|
|
4. Asterisk Implementation
|
|
|
|
This section includes some additional details on the implementation of
|
|
these changes in Asterisk.
|
|
|
|
4.1. CALLTOKEN IE Payload
|
|
|
|
For Asterisk, we will encode the payload of the CALLTOKEN IE such that the
|
|
server is able to validate a received token without having to store any
|
|
information after transmitting the CALLTOKEN response. The CALLTOKEN IE
|
|
payload will contain:
|
|
|
|
* A timestamp (epoch based)
|
|
|
|
* SHA1 hash of the remote IP address and port, the timestamp, as well
|
|
some random data generated when Asterisk starts.
|
|
|
|
When a CALLTOKEN IE is received, its validity will be determined by
|
|
recalculating the SHA1 hash. If it is a valid token, the timestamp is
|
|
checked to determine if the token is expired. The token timeout will be
|
|
hard coded at 10 seconds for now. However, it may be made configurable at
|
|
some point if it seems to be a useful addition. If the server determines
|
|
that a received token is expired, it will treat it as an invalid token and
|
|
not respond to the request.
|
|
|
|
By using this method, we require no additional memory to be allocated for
|
|
a dialog, other than what is on the stack for processing the initial
|
|
request, until token validation is complete.
|
|
|
|
However, one thing to note with this CALLTOKEN IE encoding is that a token
|
|
would be considered valid by Asterisk every time a client sent it until we
|
|
considered it an expired token. However, with use of the "maxcallnumbers"
|
|
option, this is not actually a problem. It just means that an attacker
|
|
could hit their call number limit a bit quicker since they would only have
|
|
to acquire a single token per timeout period, instead of a token per
|
|
request.
|
|
|
|
10 of 10
|