On 25 Oct 2021, at 17:38, Klemens Nanni wrote:
> On Mon, Oct 25, 2021 at 05:18:48PM +0200, Kristof Provost wrote:
>> On 25 Oct 2021, at 17:06, Alexandr Nedvedicky wrote:
>>> Hello,
>>>
>>> On Fri, Oct 22, 2021 at 02:47:07PM +0200, Kristof Provost wrote:
>>>> On 21 Oct 2021, at 20:33, Alexandr Nedvedicky wrote:
>>>>> Hello,
>>>>>
>>>>>> I’ve had a bug report against FreeBSD’s pfctl which I think also applies
>>>>>> to OpenBSD.
>>>>>>
>>>>>> The gist of it is that the macro expansion in labels/tags is done prior
>>>>>> to
>>>>>> the rule optimisation, which means that at least the $nr expansion can be
>>>>>> wrong.
>>>>>
>>>>> I agree OpenBSD suffers from the same issue. Below is a diff for
>>>>> OpenBSD.
>>>>> The FreeBSD diff, which we got from Kristof, merged with rejects.
>>>>> While
>>>>> dealing with them, I came with slightly different version of the fix,
>>>>> which
>>>>> minimizes diff.
>>>>>
>>>> I’d initially gone that route as well, but decided I wanted all of the
>>>> macro
>>>> expansions to be done at the same time. In part to keep things simple, but
>>>> also because I wasn’t 100% sure the rule number one would be the only one
>>>> with issues. For example, if the optimiser decides to merge rules because
>>>> it
>>>> can merge address ranges $srcaddr or $dstaddr might end up being wrong.
>>>
>>> Klemens (kn@...) and I poked into it for a bit and it looks like
>>> optimizer
>>> won't attempt to merge rules, which have a label.
>>>
>> That is correct, but macros can also occur in tagname and match_tagname,
>> which will not stop the optimiser from merging rules.
>
> Yes, pfctl_optimize.c is pretty obvious in this regard.
>
> To clarify: we did defer expansion of the *`$nr' macro alone* to after
> superblocks have been created as that is the only step needed to fix
> the bug you reported.
>
> To illustrate:
>
> $ cat tag.ruleset
> pass to ::1
> pass to ::2
> pass to ::3
> pass to ::4
> pass to ::5
> pass to ::6
> pass tag "$nr"
>
> $ pfctl -vvnf./tag.ruleset
> Loaded 714 passive OS fingerprints
> table <__automatic_0> const { ::1 ::2 ::3 ::4 ::5 ::6 }
> @0 pass inet6 from any to <__automatic_0:0> flags S/SA
> @1 pass all flags S/SA tag 1
>
> $ cat label.ruleset
> pass to ::1
> pass to ::2
> pass to ::3
> pass to ::4
> pass to ::5
> pass to ::6
> pass label "$nr"
>
> $ pfctl -vvnf./label.ruleset
> Loaded 714 passive OS fingerprints
> table <__automatic_0> const { ::1 ::2 ::3 ::4 ::5 ::6 }
> @0 pass inet6 from any to <__automatic_0:0> flags S/SA
> @1 pass all flags S/SA label "1"
>
> As far as *I* understand, `$nr' is the only macros that needs fixing.
> I tested the other macros but could not find any combination of rules
> and macros that would yield bogus labels or tags.
Super. Glad to hear my worries were unfounded.
Best regards,
Kristof