[RFC PATCH v2 1/8] landlock: Fix non-TCP sockets restriction
Mikhail Ivanov
ivanov.mikhail1 at huawei-partners.com
Wed Jan 29 09:52:00 UTC 2025
On 1/28/2025 9:14 PM, Matthieu Baerts wrote:
> Hi Mikhail,
>
> Sorry, I didn't follow all the discussions in this thread, but here are
> some comments, hoping this can help to clarify the MPTCP case.
Thanks a lot for sharing your knowledge, Matthieu!
>
> On 28/01/2025 11:56, Mikhail Ivanov wrote:
>> On 1/27/2025 10:48 PM, Mickaël Salaün wrote:
>
> (...)
>
>>> I'm a bit worried that we miss some of these places (now or in future
>>> kernel versions). We'll need a new LSM hook for that.
>>>
>>> Could you list the current locations?
>>
>> Currently, I know only about TCP-related transformations:
>>
>> * SMC can fallback to TCP during connection. TCP connection is used
>> (1) to exchange CLC control messages in default case and (2) for the
>> communication in the case of fallback. If socket was connected or
>> connection failed, socket can not be reconnected again. There is no
>> existing security hook to control the fallback case,
>>
>> * MPTCP uses TCP for communication between two network interfaces in the
>> default case and can fallback to plain TCP if remote peer does not
>> support MPTCP. AFAICS, there is also no security hook to control the
>> fallback transformation,
>
> There are security hooks to control the path creation, but not to
> control the "fallback transformation".
>
> Technically, with MPTCP, the userspace will create an IPPROTO_MPTCP
> socket. This is only used "internally": to communicate between the
> userspace and the kernelspace, but not directly used between network
> interfaces. This "external" communication is done via one or multiple
> kernel TCP sockets carrying extra TCP options for the mapping. The
> userspace cannot directly control these sockets created by the kernel.
>
> In case of fallback, the kernel TCP socket "simply" drop the extra TCP
> options needed for MPTCP, and carry on like normal TCP. So on the wire
> and in the Linux network stack, it is the same TCP connection, without
> the MPTCP options in the TCP header. The userspace continue to
> communicate with the same socket.
>
> I'm not sure if there is a need to block the fallback: it means only one
> path can be used at a time.
You mean that users always rely on a plain TCP communication in the case
the connection of MPTCP multipath communication fails?
>
>> * IPv6 -> IPv4 transformation for TCP and UDP sockets withon
>> IPV6_ADDRFORM. Can be controlled with setsockopt() security hook.
>>
>> As I said before, I wonder if user may want to use SMC or MPTCP and deny
>> TCP communication, since he should rely on fallback transformation
>> during the connection in the common case. It may be unexpected for
>> connect(2) to fail during the fallback due to security politics.
>
> With MPTCP, fallbacks can happen at the beginning of a connection, when
> there is only one path. This is done after the userspace's connect(). If
> the fallback is blocked, I guess the userspace will get the same errors
> as when an open connection is reset.
In the case of blocking due to security policy, userspace should get
-EACESS. I mean, the user might not expect the fallback path to be
blocked during the connection if he has allowed only MPTCP communication
using the Landlock policy.
>
> (Note that on the listener side, the fallback can happen before the
> userspace's accept() which can even get an IPPROTO_TCP socket in return)
Indeed, fallback can happen on a server side as well.
>
>> Theoretically, any TCP restriction should cause similar SMC and MPTCP
>> restriction. If we deny creation of TCP sockets, we should also deny
>> creation of SMC and MPTCP sockets. I thought that such dependencies may
>> be too complex and it will be better to leave them for the user and not
>> provide any transformation control at all. What do you think?
> I guess the creation of "kernel" TCP sockets used by MPTCP (and SMC?)
> can be restricted, it depends on where this hook is placed I suppose.
Calling
socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP)
causes creation of kernel TCP socket, so we can use
security_socket_create() hook for this purpose.
>
> (...)
>
> Cheers,
> Matt
More information about the Linux-security-module-archive
mailing list