mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r216263 | russell | 2009-09-04 05:48:00 -0500 (Fri, 04 Sep 2009) | 9 lines Merged revisions 216262 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r216262 | russell | 2009-09-04 05:47:37 -0500 (Fri, 04 Sep 2009) | 2 lines Add a plain text version of the IAX2 security document. ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@216264 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			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
 |