Skip to content

Commit a9e9413

Browse files
committed
netfilter: conntrack: restore IPS_CONFIRMED out of nf_conntrack_hash_check_insert()
jira VULN-430 cve-pre CVE-2023-4244 commit-author Pablo Neira Ayuso <pablo@netfilter.org> commit 2cdaa3e e6d57e9 ("netfilter: conntrack: fix rmmod double-free race") consolidates IPS_CONFIRMED bit set in nf_conntrack_hash_check_insert(). However, this breaks ctnetlink: # conntrack -I -p tcp --timeout 123 --src 1.2.3.4 --dst 5.6.7.8 --state ESTABLISHED --sport 1 --dport 4 -u SEEN_REPLY conntrack v1.4.6 (conntrack-tools): Operation failed: Device or resource busy This is a partial revert of the aforementioned commit to restore IPS_CONFIRMED. Fixes: e6d57e9 ("netfilter: conntrack: fix rmmod double-free race") Reported-by: Stéphane Graber <stgraber@stgraber.org> Tested-by: Stéphane Graber <stgraber@stgraber.org> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> (cherry picked from commit 2cdaa3e) Signed-off-by: Marcin Wcisło <marcin.wcislo@conclusive.pl>
1 parent 47d4b36 commit a9e9413

File tree

3 files changed

+4
-1
lines changed

3 files changed

+4
-1
lines changed

net/netfilter/nf_conntrack_bpf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ struct nf_conn *bpf_ct_insert_entry(struct nf_conn___init *nfct_i)
339339
struct nf_conn *nfct = (struct nf_conn *)nfct_i;
340340
int err;
341341

342+
nfct->status |= IPS_CONFIRMED;
342343
err = nf_conntrack_hash_check_insert(nfct);
343344
if (err < 0) {
344345
nf_conntrack_free(nfct);

net/netfilter/nf_conntrack_core.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,6 @@ nf_conntrack_hash_check_insert(struct nf_conn *ct)
938938
goto out;
939939
}
940940

941-
ct->status |= IPS_CONFIRMED;
942941
smp_wmb();
943942
/* The caller holds a reference to this object */
944943
refcount_set(&ct->ct_general.use, 2);

net/netfilter/nf_conntrack_netlink.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,9 @@ ctnetlink_create_conntrack(struct net *net,
23162316
nfct_seqadj_ext_add(ct);
23172317
nfct_synproxy_ext_add(ct);
23182318

2319+
/* we must add conntrack extensions before confirmation. */
2320+
ct->status |= IPS_CONFIRMED;
2321+
23192322
if (cda[CTA_STATUS]) {
23202323
err = ctnetlink_change_status(ct, cda);
23212324
if (err < 0)

0 commit comments

Comments
 (0)