176 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
SCTP LSM Support
 | 
						|
================
 | 
						|
 | 
						|
For security module support, three SCTP specific hooks have been implemented::
 | 
						|
 | 
						|
    security_sctp_assoc_request()
 | 
						|
    security_sctp_bind_connect()
 | 
						|
    security_sctp_sk_clone()
 | 
						|
 | 
						|
Also the following security hook has been utilised::
 | 
						|
 | 
						|
    security_inet_conn_established()
 | 
						|
 | 
						|
The usage of these hooks are described below with the SELinux implementation
 | 
						|
described in ``Documentation/security/SELinux-sctp.rst``
 | 
						|
 | 
						|
 | 
						|
security_sctp_assoc_request()
 | 
						|
-----------------------------
 | 
						|
Passes the ``@ep`` and ``@chunk->skb`` of the association INIT packet to the
 | 
						|
security module. Returns 0 on success, error on failure.
 | 
						|
::
 | 
						|
 | 
						|
    @ep - pointer to sctp endpoint structure.
 | 
						|
    @skb - pointer to skbuff of association packet.
 | 
						|
 | 
						|
 | 
						|
security_sctp_bind_connect()
 | 
						|
-----------------------------
 | 
						|
Passes one or more ipv4/ipv6 addresses to the security module for validation
 | 
						|
based on the ``@optname`` that will result in either a bind or connect
 | 
						|
service as shown in the permission check tables below.
 | 
						|
Returns 0 on success, error on failure.
 | 
						|
::
 | 
						|
 | 
						|
    @sk      - Pointer to sock structure.
 | 
						|
    @optname - Name of the option to validate.
 | 
						|
    @address - One or more ipv4 / ipv6 addresses.
 | 
						|
    @addrlen - The total length of address(s). This is calculated on each
 | 
						|
               ipv4 or ipv6 address using sizeof(struct sockaddr_in) or
 | 
						|
               sizeof(struct sockaddr_in6).
 | 
						|
 | 
						|
  ------------------------------------------------------------------
 | 
						|
  |                     BIND Type Checks                           |
 | 
						|
  |       @optname             |         @address contains         |
 | 
						|
  |----------------------------|-----------------------------------|
 | 
						|
  | SCTP_SOCKOPT_BINDX_ADD     | One or more ipv4 / ipv6 addresses |
 | 
						|
  | SCTP_PRIMARY_ADDR          | Single ipv4 or ipv6 address       |
 | 
						|
  | SCTP_SET_PEER_PRIMARY_ADDR | Single ipv4 or ipv6 address       |
 | 
						|
  ------------------------------------------------------------------
 | 
						|
 | 
						|
  ------------------------------------------------------------------
 | 
						|
  |                   CONNECT Type Checks                          |
 | 
						|
  |       @optname             |         @address contains         |
 | 
						|
  |----------------------------|-----------------------------------|
 | 
						|
  | SCTP_SOCKOPT_CONNECTX      | One or more ipv4 / ipv6 addresses |
 | 
						|
  | SCTP_PARAM_ADD_IP          | One or more ipv4 / ipv6 addresses |
 | 
						|
  | SCTP_SENDMSG_CONNECT       | Single ipv4 or ipv6 address       |
 | 
						|
  | SCTP_PARAM_SET_PRIMARY     | Single ipv4 or ipv6 address       |
 | 
						|
  ------------------------------------------------------------------
 | 
						|
 | 
						|
A summary of the ``@optname`` entries is as follows::
 | 
						|
 | 
						|
    SCTP_SOCKOPT_BINDX_ADD - Allows additional bind addresses to be
 | 
						|
                             associated after (optionally) calling
 | 
						|
                             bind(3).
 | 
						|
                             sctp_bindx(3) adds a set of bind
 | 
						|
                             addresses on a socket.
 | 
						|
 | 
						|
    SCTP_SOCKOPT_CONNECTX - Allows the allocation of multiple
 | 
						|
                            addresses for reaching a peer
 | 
						|
                            (multi-homed).
 | 
						|
                            sctp_connectx(3) initiates a connection
 | 
						|
                            on an SCTP socket using multiple
 | 
						|
                            destination addresses.
 | 
						|
 | 
						|
    SCTP_SENDMSG_CONNECT  - Initiate a connection that is generated by a
 | 
						|
                            sendmsg(2) or sctp_sendmsg(3) on a new asociation.
 | 
						|
 | 
						|
    SCTP_PRIMARY_ADDR     - Set local primary address.
 | 
						|
 | 
						|
    SCTP_SET_PEER_PRIMARY_ADDR - Request peer sets address as
 | 
						|
                                 association primary.
 | 
						|
 | 
						|
    SCTP_PARAM_ADD_IP          - These are used when Dynamic Address
 | 
						|
    SCTP_PARAM_SET_PRIMARY     - Reconfiguration is enabled as explained below.
 | 
						|
 | 
						|
 | 
						|
To support Dynamic Address Reconfiguration the following parameters must be
 | 
						|
enabled on both endpoints (or use the appropriate **setsockopt**\(2))::
 | 
						|
 | 
						|
    /proc/sys/net/sctp/addip_enable
 | 
						|
    /proc/sys/net/sctp/addip_noauth_enable
 | 
						|
 | 
						|
then the following *_PARAM_*'s are sent to the peer in an
 | 
						|
ASCONF chunk when the corresponding ``@optname``'s are present::
 | 
						|
 | 
						|
          @optname                      ASCONF Parameter
 | 
						|
         ----------                    ------------------
 | 
						|
    SCTP_SOCKOPT_BINDX_ADD     ->   SCTP_PARAM_ADD_IP
 | 
						|
    SCTP_SET_PEER_PRIMARY_ADDR ->   SCTP_PARAM_SET_PRIMARY
 | 
						|
 | 
						|
 | 
						|
security_sctp_sk_clone()
 | 
						|
-------------------------
 | 
						|
Called whenever a new socket is created by **accept**\(2)
 | 
						|
(i.e. a TCP style socket) or when a socket is 'peeled off' e.g userspace
 | 
						|
calls **sctp_peeloff**\(3).
 | 
						|
::
 | 
						|
 | 
						|
    @ep - pointer to current sctp endpoint structure.
 | 
						|
    @sk - pointer to current sock structure.
 | 
						|
    @sk - pointer to new sock structure.
 | 
						|
 | 
						|
 | 
						|
security_inet_conn_established()
 | 
						|
---------------------------------
 | 
						|
Called when a COOKIE ACK is received::
 | 
						|
 | 
						|
    @sk  - pointer to sock structure.
 | 
						|
    @skb - pointer to skbuff of the COOKIE ACK packet.
 | 
						|
 | 
						|
 | 
						|
Security Hooks used for Association Establishment
 | 
						|
=================================================
 | 
						|
The following diagram shows the use of ``security_sctp_bind_connect()``,
 | 
						|
``security_sctp_assoc_request()``, ``security_inet_conn_established()`` when
 | 
						|
establishing an association.
 | 
						|
::
 | 
						|
 | 
						|
      SCTP endpoint "A"                                SCTP endpoint "Z"
 | 
						|
      =================                                =================
 | 
						|
    sctp_sf_do_prm_asoc()
 | 
						|
 Association setup can be initiated
 | 
						|
 by a connect(2), sctp_connectx(3),
 | 
						|
 sendmsg(2) or sctp_sendmsg(3).
 | 
						|
 These will result in a call to
 | 
						|
 security_sctp_bind_connect() to
 | 
						|
 initiate an association to
 | 
						|
 SCTP peer endpoint "Z".
 | 
						|
         INIT --------------------------------------------->
 | 
						|
                                                   sctp_sf_do_5_1B_init()
 | 
						|
                                                 Respond to an INIT chunk.
 | 
						|
                                             SCTP peer endpoint "A" is
 | 
						|
                                             asking for an association. Call
 | 
						|
                                             security_sctp_assoc_request()
 | 
						|
                                             to set the peer label if first
 | 
						|
                                             association.
 | 
						|
                                             If not first association, check
 | 
						|
                                             whether allowed, IF so send:
 | 
						|
          <----------------------------------------------- INIT ACK
 | 
						|
          |                                  ELSE audit event and silently
 | 
						|
          |                                       discard the packet.
 | 
						|
          |
 | 
						|
    COOKIE ECHO ------------------------------------------>
 | 
						|
                                                          |
 | 
						|
                                                          |
 | 
						|
                                                          |
 | 
						|
          <------------------------------------------- COOKIE ACK
 | 
						|
          |                                               |
 | 
						|
    sctp_sf_do_5_1E_ca                                    |
 | 
						|
 Call security_inet_conn_established()                    |
 | 
						|
 to set the peer label.                                   |
 | 
						|
          |                                               |
 | 
						|
          |                               If SCTP_SOCKET_TCP or peeled off
 | 
						|
          |                               socket security_sctp_sk_clone() is
 | 
						|
          |                               called to clone the new socket.
 | 
						|
          |                                               |
 | 
						|
      ESTABLISHED                                    ESTABLISHED
 | 
						|
          |                                               |
 | 
						|
    ------------------------------------------------------------------
 | 
						|
    |                     Association Established                    |
 | 
						|
    ------------------------------------------------------------------
 | 
						|
 | 
						|
 |