On Sat, Feb 12, 2022 at 12:59 PM Ondrej Mosnacek <omosnace@xxxxxxxxxx> wrote: > > Do this by extracting the peer labeling per-association logic from > selinux_sctp_assoc_request() into a new helper > selinux_sctp_process_new_assoc() and use this helper in both > selinux_sctp_assoc_request() and selinux_sctp_assoc_established(). This > ensures that the peer labeling behavior as documented in > Documentation/security/SCTP.rst is applied both on the client and server > side: > """ > An SCTP socket will only have one peer label assigned to it. This will be > assigned during the establishment of the first association. Any further > associations on this socket will have their packet peer label compared to > the sockets peer label, and only if they are different will the > ``association`` permission be validated. This is validated by checking the > socket peer sid against the received packets peer sid to determine whether > the association should be allowed or denied. > """ > > At the same time, it also ensures that the peer label of the association > is set to the correct value, such that if it is peeled off into a new > socket, the socket's peer label will then be set to the association's > peer label, same as it already works on the server side. > > While selinux_inet_conn_established() (which we are replacing by > selinux_sctp_assoc_established() for SCTP) only deals with assigning a > peer label to the connection (socket), in case of SCTP we need to also > copy the (local) socket label to the association, so that > selinux_sctp_sk_clone() can then pick it up for the new socket in case > of SCTP peeloff. > > Careful readers will notice that the selinux_sctp_process_new_assoc() > helper also includes the "IPv4 packet received over an IPv6 socket" > check, even though it hadn't been in selinux_sctp_assoc_request() > before. While such check is not necessary in > selinux_inet_conn_request() (because struct request_sock's family field > is already set according to the skb's family), here it is needed, as we > don't have request_sock and we take the initial family from the socket. > In selinux_sctp_assoc_established() it is similarly needed as well (and > also selinux_inet_conn_established() already has it). > > Fixes: 72e89f50084c ("security: Add support for SCTP security hooks") > Reported-by: Prashanth Prahlad <pprahlad@xxxxxxxxxx> > Based-on-patch-by: Xin Long <lucien.xin@xxxxxxxxx> > Signed-off-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx> > --- > security/selinux/hooks.c | 90 +++++++++++++++++++++++++++++----------- > 1 file changed, 66 insertions(+), 24 deletions(-) This patch, and patch 1/2, look good to me; I'm assuming this resolves all of the known SELinux/SCTP problems identified before the new year? If I can get an ACK from one of the SCTP and/or netdev folks I'll merge this into the selinux/next branch. -- paul-moore.com