On Mon, Feb 14, 2022 at 11:14 PM Paul Moore <paul@xxxxxxxxxxxxxx> wrote: > 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? No, not really. There is still the inconsistency that peeloff sockets go through the socket_[post_]create hooks and then the label computed is overwritten by the sctp_sk_clone hook. But it's a different issue unrelated to this one. I'm still in the process of cooking up the patches and figuring out the consequences (other LSMs would be affected by the change, too, so it is tricky...). -- Ondrej Mosnacek Software Engineer, Linux Security - SELinux kernel Red Hat, Inc.