In the Linux kernel, the following vulnerability has been resolved:
netfilter: conntrack: fix wrong ct->timeout value
(struct nf_conn)->timeout is an interval before the conntrack confirmed. After confirmed, it becomes a timestamp.
It is observed that timeout of an unconfirmed conntrack:
- Set by calling ctnetlinkchangetimeout(). As a result,
nfct_time_stamp was wrongly added to ct->timeout twice.
- Get by calling ctnetlinkdumptimeout(). As a result,
nfct_time_stamp was wrongly subtracted.
Call Trace: <TASK> dumpstacklvl ctnetlinkdumptimeout _ctnetlinkgluebuild ctnetlinkgluebuild _nfqnlenqueuepacket nfqueue nfhookslow ipmcoutput ? _pfxipfinishoutput ipsendskb ? _pfxdstoutput udpsendskb udpsendmsg ? _pfxipgenericgetfrag socksendmsg
Separate the 2 cases in:
- Setting ct->timeout in _nfctsettimeout().
- Getting ct->timeout in ctnetlinkdumptimeout().
Pablo appends:
Update ctnetlink to set up the timeout after the IPS_CONFIRMED flag is set on, otherwise conntrack creation via ctnetlink breaks.
Note that the problem described in this patch occurs since the introduction of the nfnetlink_queue conntrack support, select a sufficiently old Fixes: tag for -stable kernel to pick up this fix.