2024-04-02 06:43:30
Linux
PUBLISHED
In the Linux kernel, the following vulnerability has been resolved:
net/sched: flower: Fix chain template offload
When a qdisc is deleted from a net device the stack instructs the
underlying driver to remove its flow offload callback from the
associated filter block using the FLOW_BLOCK_UNBIND command. The stack
then continues to replay the removal of the filters in the block for
this driver by iterating over the chains in the block and invoking the
reoffload operation of the classifier being used. In turn, the
classifier in its reoffload operation prepares and emits a
FLOW_CLS_DESTROY command for each filter.
However, the stack does not do the same for chain templates and the
underlying driver never receives a FLOW_CLS_TMPLT_DESTROY command when
a qdisc is deleted. This results in a memory leak [1] which can be
reproduced using [2].
Fix by introducing a tmplt_reoffload operation and have the stack
invoke it with the appropriate arguments as part of the replay.
Implement the operation in the sole classifier that supports chain
templates (flower) by emitting the FLOW_CLS_TMPLT_{CREATE,DESTROY}
command based on whether a flow offload callback is being bound to a
filter block or being unbound from one.
As far as I can tell, the issue happens since cited commit which
reordered tcf_block_offload_unbind() before tcf_block_flush_all_chains()
in __tcf_block_put(). The order cannot be reversed as the filter block
is expected to be freed after flushing all the chains.
[1]
unreferenced object 0xffff888107e28800 (size 2048):
comm "tc", pid 1079, jiffies 4294958525 (age 3074.287s)
hex dump (first 32 bytes):
b1 a6 7c 11 81 88 ff ff e0 5b b3 10 81 88 ff ff ..|......[......
01 00 00 00 00 00 00 00 e0 aa b0 84 ff ff ff ff ................
backtrace:
[