forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
security: Add support for SCTP security hooks
The SCTP security hooks are explained in: Documentation/security/LSM-sctp.rst Signed-off-by: Richard Haines <[email protected]> Signed-off-by: Paul Moore <[email protected]>
- Loading branch information
Showing
4 changed files
with
258 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
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 | | ||
------------------------------------------------------------------ | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters