Path: blob/main/tests/sys/netpfil/pf/fragmentation_compat.sh
39507 views
#1# SPDX-License-Identifier: BSD-2-Clause2#3# Copyright (c) 2017 Kristof Provost <[email protected]>4#5# Redistribution and use in source and binary forms, with or without6# modification, are permitted provided that the following conditions7# are met:8# 1. Redistributions of source code must retain the above copyright9# notice, this list of conditions and the following disclaimer.10# 2. Redistributions in binary form must reproduce the above copyright11# notice, this list of conditions and the following disclaimer in the12# documentation and/or other materials provided with the distribution.13#14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24# SUCH DAMAGE.2526. $(atf_get_srcdir)/utils.subr2728atf_test_case "too_many_fragments" "cleanup"2930too_many_fragments_head()31{32atf_set descr 'IPv4 fragment limitation test'33atf_set require.user root34}3536too_many_fragments_body()37{38pft_init3940epair=$(vnet_mkepair)41vnet_mkjail alcatraz ${epair}a4243ifconfig ${epair}b inet 192.0.2.1/24 up44jexec alcatraz ifconfig ${epair}a 192.0.2.2/24 up4546ifconfig ${epair}b mtu 20047jexec alcatraz ifconfig ${epair}a mtu 2004849jexec alcatraz pfctl -e50pft_set_rules alcatraz \51"scrub all fragment reassemble"5253# So we know pf is limiting things54jexec alcatraz sysctl net.inet.ip.maxfragsperpacket=10245556# Sanity check57atf_check -s exit:0 -o ignore ping -c 1 192.0.2.25859# We can ping with < 64 fragments60atf_check -s exit:0 -o ignore ping -c 1 -s 800 192.0.2.26162# Too many fragments should fail63atf_check -s exit:2 -o ignore ping -c 1 -s 20000 192.0.2.264}6566too_many_fragments_cleanup()67{68pft_cleanup69}7071atf_test_case "v6" "cleanup"72v6_head()73{74atf_set descr 'IPv6 fragmentation test'75atf_set require.user root76atf_set require.progs python3 scapy77}7879v6_body()80{81pft_init8283epair_send=$(vnet_mkepair)84epair_link=$(vnet_mkepair)8586vnet_mkjail alcatraz ${epair_send}b ${epair_link}a87vnet_mkjail singsing ${epair_link}b8889ifconfig ${epair_send}a inet6 2001:db8:42::1/64 no_dad up9091jexec alcatraz ifconfig ${epair_send}b inet6 2001:db8:42::2/64 no_dad up92jexec alcatraz ifconfig ${epair_link}a inet6 2001:db8:43::2/64 no_dad up93jexec alcatraz sysctl net.inet6.ip6.forwarding=19495jexec singsing ifconfig ${epair_link}b inet6 2001:db8:43::3/64 no_dad up96jexec singsing route add -6 2001:db8:42::/64 2001:db8:43::297route add -6 2001:db8:43::/64 2001:db8:42::29899jexec alcatraz ifconfig ${epair_send}b inet6 -ifdisabled100jexec alcatraz ifconfig ${epair_link}a inet6 -ifdisabled101jexec singsing ifconfig ${epair_link}b inet6 -ifdisabled102ifconfig ${epair_send}a inet6 -ifdisabled103104ifconfig ${epair_send}a105jexec alcatraz ifconfig ${epair_send}b106lladdr=$(jexec alcatraz ifconfig ${epair_send}b | awk '/ scopeid / { print($2); }' | cut -f 1 -d %)107108jexec alcatraz pfctl -e109pft_set_rules alcatraz \110"scrub fragment reassemble" \111"block in" \112"pass in inet6 proto icmp6 icmp6-type { neighbrsol, neighbradv }" \113"pass in inet6 proto icmp6 icmp6-type { echoreq, echorep }" \114"set skip on lo"115116# Host test117atf_check -s exit:0 -o ignore \118ping -6 -c 1 2001:db8:42::2119120atf_check -s exit:0 -o ignore \121ping -6 -c 1 -s 4500 2001:db8:42::2122123atf_check -s exit:0 -o ignore\124ping -6 -c 1 -b 70000 -s 65000 2001:db8:42::2125126# Force an NDP lookup127ping -6 -c 1 ${lladdr}%${epair_send}a128129atf_check -s exit:0 -o ignore\130ping -6 -c 1 -b 70000 -s 65000 ${lladdr}%${epair_send}a131132# Forwarding test133atf_check -s exit:0 -o ignore \134ping -6 -c 1 2001:db8:43::3135136atf_check -s exit:0 -o ignore \137ping -6 -c 1 -s 4500 2001:db8:43::3138139atf_check -s exit:0 -o ignore\140ping -6 -c 1 -b 70000 -s 65000 2001:db8:43::3141142$(atf_get_srcdir)/CVE-2019-5597.py \143${epair_send}a \1442001:db8:42::1 \1452001:db8:43::3146}147148v6_cleanup()149{150pft_cleanup151}152153atf_test_case "mtu_diff" "cleanup"154mtu_diff_head()155{156atf_set descr 'Test reassembly across different MTUs, PR #255432'157atf_set require.user root158}159160mtu_diff_body()161{162pft_init163164epair_small=$(vnet_mkepair)165epair_large=$(vnet_mkepair)166167vnet_mkjail first ${epair_small}b ${epair_large}a168vnet_mkjail second ${epair_large}b169170ifconfig ${epair_small}a 192.0.2.1/25 up171jexec first ifconfig ${epair_small}b 192.0.2.2/25 up172173jexec first sysctl net.inet.ip.forwarding=1174jexec first ifconfig ${epair_large}a 192.0.2.130/25 up175jexec first ifconfig ${epair_large}a mtu 9000176jexec second ifconfig ${epair_large}b 192.0.2.131/25 up177jexec second ifconfig ${epair_large}b mtu 9000178jexec second route add default 192.0.2.130179180route add 192.0.2.128/25 192.0.2.2181182jexec first pfctl -e183pft_set_rules first \184"scrub all fragment reassemble"185186# Sanity checks187atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2188atf_check -s exit:0 -o ignore ping -c 1 192.0.2.130189atf_check -s exit:0 -o ignore ping -c 1 192.0.2.131190191# Large packet that'll get reassembled and sent out in one on the large192# epair193atf_check -s exit:0 -o ignore ping -c 1 -s 8000 192.0.2.131194}195196mtu_diff_cleanup()197{198pft_cleanup199}200201frag_common()202{203name=$1204205pft_init206207epair=$(vnet_mkepair)208vnet_mkjail alcatraz ${epair}a209210ifconfig ${epair}b inet 192.0.2.1/24 up211jexec alcatraz ifconfig ${epair}a 192.0.2.2/24 up212213jexec alcatraz pfctl -e214pft_set_rules alcatraz \215"scrub all fragment reassemble"216217# Sanity check218atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2219220atf_check -s exit:0 -o ignore $(atf_get_srcdir)/frag-${1}.py \221--to 192.0.2.2 \222--fromaddr 192.0.2.1 \223--sendif ${epair}b \224--recvif ${epair}b225}226227atf_test_case "overreplace" "cleanup"228overreplace_head()229{230atf_set descr 'ping fragment that overlaps fragment at index boundary and replace it'231atf_set require.user root232atf_set require.progs python3 scapy233}234235overreplace_body()236{237frag_common overreplace238}239240overreplace_cleanup()241{242pft_cleanup243}244245atf_test_case "overindex" "cleanup"246overindex_head()247{248atf_set descr 'ping fragment that overlaps the first fragment at index boundary'249atf_set require.user root250atf_set require.progs python3 scapy251}252253overindex_body()254{255frag_common overindex256}257258overindex_cleanup()259{260pft_cleanup261}262263atf_test_case "overlimit" "cleanup"264overlimit_head()265{266atf_set descr 'ping fragment at index boundary that cannot be requeued'267atf_set require.user root268atf_set require.progs python3 scapy269}270271overlimit_body()272{273frag_common overlimit274}275276overlimit_cleanup()277{278pft_cleanup279}280281atf_test_case "reassemble" "cleanup"282reassemble_head()283{284atf_set descr 'Test reassembly'285atf_set require.user root286}287288reassemble_body()289{290pft_init291292epair=$(vnet_mkepair)293vnet_mkjail alcatraz ${epair}a294295ifconfig ${epair}b inet 192.0.2.1/24 up296jexec alcatraz ifconfig ${epair}a 192.0.2.2/24 up297298# Sanity check299atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2300301jexec alcatraz pfctl -e302pft_set_rules alcatraz \303"scrub in" \304"pass out" \305"block in" \306"pass in inet proto icmp all icmp-type echoreq"307308# Both single packet & fragmented pass when we scrub309atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2310atf_check -s exit:0 -o ignore ping -c 1 -s 2000 192.0.2.2311312pft_set_rules alcatraz \313"scrub in fragment no reassemble" \314"pass out" \315"block in" \316"pass in inet proto icmp all icmp-type echoreq"317318# And the fragmented ping doesn't pass if we do not reassemble319atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2320atf_check -s exit:2 -o ignore ping -c 1 -s 2000 192.0.2.2321}322323reassemble_cleanup()324{325pft_cleanup326}327328atf_init_test_cases()329{330atf_add_test_case "too_many_fragments"331atf_add_test_case "v6"332atf_add_test_case "mtu_diff"333atf_add_test_case "overreplace"334atf_add_test_case "overindex"335atf_add_test_case "overlimit"336atf_add_test_case "reassemble"337}338339340