netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Mickaël Salaün" <mic@digikod.net>
To: "Konstantin Meskhidze (A)" <konstantin.meskhidze@huawei.com>,
	"Günther Noack" <gnoack3000@gmail.com>
Cc: willemdebruijn.kernel@gmail.com,
	linux-security-module@vger.kernel.org, netdev@vger.kernel.org,
	netfilter-devel@vger.kernel.org, yusongping@huawei.com,
	artem.kuzin@huawei.com
Subject: Re: [PATCH v9 12/12] landlock: Document Landlock's network support
Date: Mon, 6 Mar 2023 17:09:35 +0100	[thread overview]
Message-ID: <950d64ee-5b17-af81-8b85-dd2b392c7487@digikod.net> (raw)
In-Reply-To: <85b31cb8-1aeb-d6f0-6c7d-91cea6b563d4@huawei.com>


On 06/03/2023 14:43, Konstantin Meskhidze (A) wrote:
> 
> 
> 2/21/2023 7:16 PM, Mickaël Salaün пишет:
>>
>> On 30/01/2023 11:03, Konstantin Meskhidze (A) wrote:
>>>
>>>
>>> 1/27/2023 9:22 PM, Mickaël Salaün пишет:
>>>>
>>>> On 23/01/2023 10:38, Konstantin Meskhidze (A) wrote:
>>>>>
>>>>>
>>>>> 1/22/2023 2:07 AM, Günther Noack пишет:
>>>>
>>>> [...]
>>>>
>>>>>>> @@ -143,10 +157,24 @@ for the ruleset creation, by filtering access rights according to the Landlock
>>>>>>>     ABI version.  In this example, this is not required because all of the requested
>>>>>>>     ``allowed_access`` rights are already available in ABI 1.
>>>>>>>     
>>>>>>> -We now have a ruleset with one rule allowing read access to ``/usr`` while
>>>>>>> -denying all other handled accesses for the filesystem.  The next step is to
>>>>>>> -restrict the current thread from gaining more privileges (e.g. thanks to a SUID
>>>>>>> -binary).
>>>>>>> +For network access-control, we can add a set of rules that allow to use a port
>>>>>>> +number for a specific action. All ports values must be defined in network byte
>>>>>>> +order.
>>>>>>
>>>>>> What is the point of asking user space to convert this to network byte
>>>>>> order? It seems to me that the kernel would be able to convert it to
>>>>>> network byte order very easily internally and in a single place -- why
>>>>>> ask all of the users to deal with that complexity? Am I overlooking
>>>>>> something?
>>>>>
>>>>>      I had a discussion about this issue with Mickaёl.
>>>>>      Please check these threads:
>>>>>      1.
>>>>> https://lore.kernel.org/netdev/49391484-7401-e7c7-d909-3bd6bd024731@digikod.net/
>>>>>      2.
>>>>> https://lore.kernel.org/netdev/1ed20e34-c252-b849-ab92-78c82901c979@huawei.com/
>>>>
>>>> I'm definitely not sure if this is the right solution, or if there is
>>>> one. The rationale is to make it close to the current (POSIX) API. We
>>>> didn't get many opinion about that but I'd really like to have a
>>>> discussion about port endianness for this Landlock API.
>>>
>>>      As for me, the kernel should take care about port converting. This
>>> work should be done under the hood.
>>>
>>>      Any thoughts?
>>>
>>>>
>>>> I looked at some code (e.g. see [1]) and it seems that using htons()
>>>> might make application patching more complex after all. What do you
>>>> think? Is there some network (syscall) API that don't use this convention?
>>>>
>>>> [1] https://github.com/landlock-lsm/tuto-lighttpd
>>>>
>>>>>>
>>>>>>> +
>>>>>>> +.. code-block:: c
>>>>>>> +
>>>>>>> +    struct landlock_net_service_attr net_service = {
>>>>>>> +        .allowed_access = LANDLOCK_ACCESS_NET_BIND_TCP,
>>>>>>> +        .port = htons(8080),
>>>>>>> +    };
>>>>>>
>>>>>> This is a more high-level comment:
>>>>>>
>>>>>> The notion of a 16-bit "port" seems to be specific to TCP and UDP --
>>>>>> how do you envision this struct to evolve if other protocols need to
>>>>>> be supported in the future?
>>>>>
>>>>>       When TCP restrictions land into Linux, we need to think about UDP
>>>>> support. Then other protocols will be on the road. Anyway you are right
>>>>> this struct will be evolving in long term, but I don't have a particular
>>>>> envision now. Thanks for the question - we need to think about it.
>>>>>>
>>>>>> Should this struct and the associated constants have "TCP" in its
>>>>>> name, and other protocols use a separate struct in the future?
>>>>
>>>> Other protocols such as AF_VSOCK uses a 32-bit port. We could use a
>>>> 32-bits port field or ever a 64-bit one. The later could make more sense
>>>> because each field would eventually be aligned on 64-bit. Picking a
>>>> 16-bit value was to help developers (and compilers/linters) with the
>>>> "correct" type (for TCP).
>>
>> Thinking more about this, let's use a __u64 port (and remove the
>> explicit packing). The landlock_append_net_rule() function should use a
>> __u16 port argument, but the add_rule_net_service() function should
>> check that there is no overflow with the port attribute (not higher than
>> U16_MAX) before passing it to landlock_append_net_rule(). We should
>> prioritize flexibility for the kernel UAPI over stricter types. User
>> space libraries can improve this kind of types with a more complex API.
>>
>> Big endian can make sense for a pure network API because the port value
>> (and the IP address) is passed to other machines through the network,
>> as-is. However, with Landlock, the port value is only used by the
>> kernel. Moreover, in practice, port values are mostly converted when
>> filling the sockaddr*_in structs. It would then make it more risky to
>> ask developers another explicit htons() conversion for Landlock
>> syscalls. Let's stick to the host endianess and let the kernel do the
>> conversion.
>>
>> Please include these rationales in code comments. We also need to update
>> the tests for endianess, but still check big and little endian
>> consistency as it is currently done in these tests. A new test should be
>> added to check port boundaries with:
>> - port = 0
>> - port = U16_MAX
>       port = U16_MAX value passes.

correct

> 
>> - port = U16_MAX + 1 (which should get an EINVAL)
>       port = U16_MAX + 1 after casting is 0, EINVAL is returned.

In the tests, we want the casting to be be done by the kernel. The test 
should then pass 0x10000 to the struct and the kernel should return 
EINVAL because it is greater than U16_MAX, not because it is zero.

> 
>> - port = U16_MAX + 2 (to check u16 casting != 0)
>       port = U16_MAX + 2 after casting is 1, is it passes?

In this case, 0x10001 should be rejected by the kernel (and return 
EINVAL) because it is greater than U16_MAX.

> 
>> - port = U32_MAX + 1
>> - port = U32_MAX + 2
> 
>       Don't you think that all port values >= U16_MAX + 1, EINVAL should
>       be returned?

All port values > U16_MAX should indeed return EINVAL, and tests should 
check kernel casting (i.e. the kernel must check the 64-bit value before 
casting it to a 16-bit value and only check the casted zero). I didn't 
mean that these cases should pass, only that they should be tested, but 
I think you got it. ;)

>>
>>
>>>>
>>>> If we think about protocols other than TCP and UDP (e.g. AF_VSOCK), it
>>>> could make sense to have a dedicated attr struct specifying other
>>>> properties (e.g. CID). Anyway, the API is flexible but it would be nice
>>>> to not mess with it too much. What do you think?
>>>>
>>>>
>>>>>>
>>>>>>> +
>>>>>>> +    err = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_NET_SERVICE,
>>>>>>> +                            &net_service, 0);
>>>>>>> +
>>>>>>> +The next step is to restrict the current thread from gaining more privileges
>>>>>>> +(e.g. thanks to a SUID binary). We now have a ruleset with the first rule allowing
>>>>>>              ^^^^^^
>>>>>>              "through" a SUID binary? "thanks to" sounds like it's desired
>>>>>>              to do that, while we're actually trying to prevent it here?
>>>>>
>>>>>       This is Mickaёl's part. Let's ask his opinion here.
>>>>>
>>>>>       Mickaёl, any thoughts?
>>>>
>>>> Yep, "through" looks better.
>>>> .
>> .

  reply	other threads:[~2023-03-06 16:15 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-16  8:58 [PATCH v9 00/12] Network support for Landlock Konstantin Meskhidze
2023-01-16  8:58 ` [PATCH v9 01/12] landlock: Make ruleset's access masks more generic Konstantin Meskhidze
2023-01-16  8:58 ` [PATCH v9 02/12] landlock: Allow filesystem layout changes for domains without such rule type Konstantin Meskhidze
2023-02-10 17:34   ` Mickaël Salaün
2023-02-14  8:51     ` Konstantin Meskhidze (A)
2023-02-14 12:07       ` Mickaël Salaün
2023-02-14 12:57         ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 03/12] landlock: Refactor landlock_find_rule/insert_rule Konstantin Meskhidze
2023-02-10 17:36   ` Mickaël Salaün
2023-02-14 10:15     ` Konstantin Meskhidze (A)
2023-02-14 12:09       ` Mickaël Salaün
2023-02-14 13:28         ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 04/12] landlock: Refactor merge/inherit_ruleset functions Konstantin Meskhidze
2023-01-16  8:58 ` [PATCH v9 05/12] landlock: Move and rename umask_layers() and init_layer_masks() Konstantin Meskhidze
2023-02-10 17:37   ` Mickaël Salaün
2023-02-14 10:15     ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 06/12] landlock: Refactor _unmask_layers() and _init_layer_masks() Konstantin Meskhidze
2023-02-10 17:38   ` Mickaël Salaün
2023-02-14 10:16     ` Konstantin Meskhidze (A)
2023-02-21 18:07   ` Mickaël Salaün
2023-03-06  7:52     ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 07/12] landlock: Refactor landlock_add_rule() syscall Konstantin Meskhidze
2023-02-10 17:38   ` Mickaël Salaün
2023-02-14 10:18     ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 08/12] landlock: Add network rules and TCP hooks support Konstantin Meskhidze
2023-02-10 17:39   ` Mickaël Salaün
2023-02-14 10:19     ` Konstantin Meskhidze (A)
2023-03-13  9:33     ` Konstantin Meskhidze (A)
2023-03-14 12:13       ` Mickaël Salaün
2023-03-14 14:38         ` Konstantin Meskhidze (A)
2023-02-21 18:04   ` Mickaël Salaün
2023-03-06 10:18     ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 09/12] selftests/landlock: Share enforce_ruleset() Konstantin Meskhidze
2023-01-16  8:58 ` [PATCH v9 10/12] selftests/landlock: Add 10 new test suites dedicated to network Konstantin Meskhidze
2023-02-10 17:40   ` Mickaël Salaün
2023-02-14 10:36     ` Konstantin Meskhidze (A)
2023-02-14 12:13       ` Mickaël Salaün
2023-02-14 13:28         ` Konstantin Meskhidze (A)
2023-02-21 18:05   ` Mickaël Salaün
2023-03-06 12:03     ` Konstantin Meskhidze (A)
2023-03-06 16:00       ` Mickaël Salaün
2023-03-06 18:13         ` Konstantin Meskhidze (A)
2023-01-16  8:58 ` [PATCH v9 11/12] samples/landlock: Add network demo Konstantin Meskhidze
2023-01-16  8:58 ` [PATCH v9 12/12] landlock: Document Landlock's network support Konstantin Meskhidze
2023-01-21 23:07   ` Günther Noack
2023-01-23  9:38     ` Konstantin Meskhidze (A)
2023-01-27 18:22       ` Mickaël Salaün
2023-01-30 10:03         ` Konstantin Meskhidze (A)
2023-02-21 16:16           ` Mickaël Salaün
2023-03-06 13:43             ` Konstantin Meskhidze (A)
2023-03-06 16:09               ` Mickaël Salaün [this message]
2023-03-06 17:55                 ` Konstantin Meskhidze (A)
2023-01-30 12:26         ` Konstantin Meskhidze (A)
2023-02-23 22:17 ` [PATCH v9 00/12] Network support for Landlock Günther Noack
2023-03-06  7:45   ` Konstantin Meskhidze (A)
2023-03-13 17:16   ` Konstantin Meskhidze (A)
2023-03-14 13:28     ` Mickaël Salaün
2023-06-26 15:29       ` [PATCH v9 00/12] Network support for Landlock - allowed list of protocols Mickaël Salaün
2023-06-28  2:33         ` Jeff Xu
2023-06-28 19:03           ` Mickaël Salaün
2023-06-28 21:56             ` Jeff Xu
2023-06-28  8:44         ` Günther Noack
2023-06-28 17:03           ` Jeff Xu
2023-06-28 19:29             ` Mickaël Salaün
2023-06-29  3:18               ` Jeff Xu
2023-06-29 11:07                 ` Mickaël Salaün
2023-06-30  4:18                   ` Jeff Xu
2023-06-30 18:23                     ` Mickaël Salaün
2023-07-05 15:00                       ` Jeff Xu
2023-07-12 11:30                         ` Mickaël Salaün
2023-07-13 13:20                           ` Konstantin Meskhidze (A)
2023-07-13 14:52                             ` Mickaël Salaün
2023-07-13 11:44                   ` Konstantin Meskhidze (A)
2023-06-28 19:07           ` Mickaël Salaün

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=950d64ee-5b17-af81-8b85-dd2b392c7487@digikod.net \
    --to=mic@digikod.net \
    --cc=artem.kuzin@huawei.com \
    --cc=gnoack3000@gmail.com \
    --cc=konstantin.meskhidze@huawei.com \
    --cc=linux-security-module@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=willemdebruijn.kernel@gmail.com \
    --cc=yusongping@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).