aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristof Provost <kp@FreeBSD.org>2025-01-06 09:06:58 +0000
committerKristof Provost <kp@FreeBSD.org>2025-01-30 11:00:30 +0000
commit4557b1693a11246d2ae9adcf03bd2a4a35d79aa0 (patch)
treee949919723010366568f7e1cfe903c1f1670462a
parentfc167e91313c7c544119f524ae5cbb2439734352 (diff)
pf: verify SCTP v_tag before updating connection state
Make it harder to manipulate the firewall state by verifying the v tag before we update states. MFC after: 2 weeks Sponsored by: Orange Business Services (cherry picked from commit 4713d2fd5663eb64aa582dabced21d253c901a66)
-rw-r--r--sys/netpfil/pf/pf.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 255d85440fa5..15569a294f98 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -6200,6 +6200,13 @@ pf_test_state_sctp(struct pf_kstate **state, struct pfi_kkif *kif,
return (PF_DROP);
}
+ if (src->scrub != NULL) {
+ if (src->scrub->pfss_v_tag == 0) {
+ src->scrub->pfss_v_tag = pd->hdr.sctp.v_tag;
+ } else if (src->scrub->pfss_v_tag != pd->hdr.sctp.v_tag)
+ return (PF_DROP);
+ }
+
/* Track state. */
if (pd->sctp_flags & PFDESC_SCTP_INIT) {
if (src->state < SCTP_COOKIE_WAIT) {
@@ -6231,13 +6238,6 @@ pf_test_state_sctp(struct pf_kstate **state, struct pfi_kkif *kif,
(*state)->timeout = PFTM_SCTP_CLOSED;
}
- if (src->scrub != NULL) {
- if (src->scrub->pfss_v_tag == 0) {
- src->scrub->pfss_v_tag = pd->hdr.sctp.v_tag;
- } else if (src->scrub->pfss_v_tag != pd->hdr.sctp.v_tag)
- return (PF_DROP);
- }
-
(*state)->expire = time_uptime;
/* translate source/destination address, if necessary */