Re: [PATCH] net/sched: act_pedit: require matching IPv4 L4 protocol
From: Jamal Hadi Salim
Date: Sat Jun 06 2026 - 17:29:45 EST
On Fri, Jun 5, 2026 at 3:46 PM Samuel Moelius
<sam.moelius@xxxxxxxxxxxxxxx> wrote:
>
> The extended IPv4 L4 header mode in act_pedit can select TCP or UDP
> header fields without confirming that the IPv4 protocol field matches
> the selected transport header.
>
> That lets a rule written for TCP or UDP modify unrelated payload bytes
> in a packet carrying a different protocol.
>
> Verify the IPv4 protocol before applying TCP or UDP extended header
> edits.
>
> Assisted-by: Codex:gpt-5.5-cyber-preview
> Signed-off-by: Samuel Moelius <sam.moelius@xxxxxxxxxxxxxxx>
> ---
> net/sched/act_pedit.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
> index bc20f08a2789..9a4590451f7e 100644
> --- a/net/sched/act_pedit.c
> +++ b/net/sched/act_pedit.c
> @@ -341,6 +341,8 @@ static int pedit_l4_skb_offset(struct sk_buff *skb, int *hoffset, const int head
>
> if (!iph)
> goto out;
> + if (iph->ihl < 5 || iph->protocol != header_type)
> + goto out;
>From inspection the fix looks reasonable.
At first glance it seems that the only fix that resolves the issue you
are describing is to check the protocol header.
header length seems to be an extra thing. But let's do what the v6
side seems to and skip frags as well? Something maybe along the lines
of:
if (iph->ihl < 5 || iph->protocol != header_type || (iph->frag_off &
htons(IP_OFFSET)))
goto out;
Are you able to describe how someone would configure a tc rule that
will allow this to happen?
IOW, how did you verify the problem and then validate that your fix works?
cheers,
jamal
> *hoffset = noff + iph->ihl * 4;
> ret = 0;
> break;
> --
> 2.43.0
>