wg(4): Add a test that the driver handles a decryption failure

The test uses a fail point to inject a decryption error in OCF while
sending a ping across the tunnel.  The driver should then fail to
respond to the ping and increment the input error counter on the
interface.

Approved by:	so
Security:	FreeBSD-SA-26:52.if_wg
Security:	CVE-2026-58085
Reviewed by:	markj
Sponsored by:	Chelsio Communications
This commit is contained in:
John Baldwin authored and Mark Johnston committed 2026-07-28 14:38:27 +00:00
1 parent 01b53d5d1e
commit b20841b471
4 files changed
+124

No files matched your search

+2
View File
@@ -848,6 +848,8 @@
..
routing
..
wg
..
..
netgraph
..
+1
View File
@@ -15,6 +15,7 @@ ATF_TESTS_SH+= if_vlan
ATF_TESTS_SH+= if_wg
TESTS_SUBDIRS+= if_ovpn
TESTS_SUBDIRS+= wg
TESTS_SUBDIRS+= routing
# The netmap bridge application is used by if_wg tests.
+10
View File
@@ -0,0 +1,10 @@
PACKAGE= tests
TESTSDIR= ${TESTSBASE}/sys/net/wg
BINDIR= ${TESTSDIR}
ATF_TESTS_SH+= if_wg_nojail
TEST_METADATA.if_wg_nojail= is_exclusive=true
.include <bsd.test.mk>
+111
View File
@@ -0,0 +1,111 @@
#
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2021 The FreeBSD Foundation
#
# This software was developed by Mark Johnston under sponsorship
# from the FreeBSD Foundation.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
. $(atf_get_srcdir)/../../common/vnet.subr
atf_test_case "wg_bad_decrypt" "cleanup"
wg_bad_decrypt_head()
{
atf_set descr 'Create a wg(4) tunnel over an epair and inject a decryption error'
atf_set require.user root
atf_set require.kmods if_wg
}
wg_bad_decrypt_body()
{
local epair pri1 pri2 pub1 pub2 wg1 wg2
local endpoint1 endpoint2 tunnel1 tunnel2
pri1=$(wg genkey)
pri2=$(wg genkey)
endpoint1=192.168.2.1
endpoint2=192.168.2.2
tunnel1=169.254.0.1
tunnel2=169.254.0.2
epair=$(vnet_mkepair)
vnet_init
vnet_mkjail wgtest1 ${epair}a
vnet_mkjail wgtest2 ${epair}b
jexec wgtest1 ifconfig ${epair}a ${endpoint1}/24 up
jexec wgtest2 ifconfig ${epair}b ${endpoint2}/24 up
wg1=$(jexec wgtest1 ifconfig wg create)
echo "$pri1" | jexec wgtest1 wg set $wg1 listen-port 12345 \
private-key /dev/stdin
pub1=$(jexec wgtest1 wg show $wg1 public-key)
wg2=$(jexec wgtest2 ifconfig wg create)
echo "$pri2" | jexec wgtest2 wg set $wg2 listen-port 12345 \
private-key /dev/stdin
pub2=$(jexec wgtest2 wg show $wg2 public-key)
atf_check -s exit:0 -o ignore \
jexec wgtest1 wg set $wg1 peer "$pub2" \
endpoint ${endpoint2}:12345 allowed-ips ${tunnel2}/32
atf_check -s exit:0 \
jexec wgtest1 ifconfig $wg1 inet ${tunnel1}/24 up
atf_check -s exit:0 -o ignore \
jexec wgtest2 wg set $wg2 peer "$pub1" \
endpoint ${endpoint1}:12345 allowed-ips ${tunnel1}/32
atf_check -s exit:0 \
jexec wgtest2 ifconfig $wg2 inet ${tunnel2}/24 up
# Generous timeout since the handshake takes some time.
atf_check -s exit:0 -o ignore jexec wgtest1 ping -c 1 -t 5 $tunnel2
# No receive errors before injection
ierrs=$(netstat -j wgtest2 -I $wg2 --libxo json,pretty | \
awk '/received-errors/ { print $2 }')
atf_check_equal "0," "$ierrs"
# Trigger a decryption error
atf_check -s exit:0 -o ignore \
sysctl debug.fail_point.crypto.inject_badmsg="1*return"
atf_check -s exit:2 -o ignore jexec wgtest1 ping -c 1 -t 5 $tunnel2
ierrs=$(netstat -j wgtest2 -I $wg2 --libxo json,pretty | \
awk '/received-errors/ { print $2 }')
atf_check_equal "1," "$ierrs"
}
wg_bad_decrypt_cleanup()
{
vnet_cleanup
}
atf_init_test_cases()
{
atf_add_test_case "wg_bad_decrypt"
}