 6e3027a57e
			
		
	
	
		6e3027a57e
		
	
	
	
	
		
			
			The extra sanity check for replay protection in these procedures ended up breaking the tests. RESET_PN cannot be used before RESEND_* commands since that would prevent the DUT from accepting the retransmitted EAPOL-Key frames. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
		
			
				
	
	
		
			377 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| Cipher suite (CCMP, TKIP, GCMP, ..) and key management testing
 | |
| ==============================================================
 | |
| 
 | |
| wpa_supplicant and hostapd include number of extensions that allow
 | |
| special test builds to be used for testing functionality related to
 | |
| correct implementation of IEEE 802.11. These extensions allow behavior
 | |
| to be modified and invalid operations to be performed to verify behavior
 | |
| of other devices in unexpected situations. While most of the testing
 | |
| extensions are focused on the fully automated testing framework with
 | |
| mac80211_hwsim (see tests/hwsim subdirectory), many of these can be used
 | |
| for over-the-air testing of the protocol as well.
 | |
| 
 | |
| Since some of the testing extensions can result in exposing key
 | |
| information or allowing non-compliant behavior, these changes are
 | |
| disabled in default wpa_supplicant and hostapd builds for production
 | |
| purposes. Testing functionality can be enabled by adding
 | |
| CONFIG_TESTING_OPTIONS=y into build configuration (hostapd/.config and
 | |
| wpa_supplicant/.config).
 | |
| 
 | |
| 
 | |
| Testing setup
 | |
| -------------
 | |
| 
 | |
| These tests can be run as black-box testing without having to modify the
 | |
| tested device at all or without knowing details of its
 | |
| functionality. The test commands in wpa_supplicant/hostapd control
 | |
| interfaces are used to perform unexpected operations and normal data
 | |
| traffic is used to verify reaction of the tested device to such
 | |
| operations.
 | |
| 
 | |
| In theory, the test functionality is available with most drivers
 | |
| supported by wpa_supplicant/hostapd, but the most reliable results are
 | |
| likely available through ath9k-based devices. If you are using something
 | |
| else, it is strongly recommended that you'll run the first tests with
 | |
| sniffer captures and verify that the test tools are behaving correctly.
 | |
| 
 | |
| wpa_supplicant is used to control a test device in station mode to test
 | |
| an AP and hostapd is similarly used to control a test device in AP mode
 | |
| to test a station.
 | |
| 
 | |
| Various data traffic generators could be used to test the behavior, but
 | |
| this document focuses on using ping to test unicast traffic and arping
 | |
| to test broadcast traffic. To keep things simple and to reduce
 | |
| interference from unrelated traffic, the steps here assume static IPv4
 | |
| addresses are used and IPv6 is disabled.
 | |
| 
 | |
| The tests here use WPA2-Personal for simplicity. WPA2-Enterprise and
 | |
| other cipher suites can also be tested for more complete coverage.
 | |
| 
 | |
| Example hostapd.conf for the test tool in AP mode:
 | |
| 
 | |
| driver=nl80211
 | |
| hw_mode=g
 | |
| channel=1
 | |
| ieee80211n=1
 | |
| interface=wlan0
 | |
| ctrl_interface=/var/run/hostapd
 | |
| ctrl_interface_group=adm
 | |
| ssid=test-psk
 | |
| wpa=2
 | |
| wpa_key_mgmt=WPA-PSK
 | |
| wpa_pairwise=CCMP
 | |
| wpa_passphrase=12345678
 | |
| 
 | |
| Example wpa_supplicant.conf for the test tool in station mode:
 | |
| 
 | |
| ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=adm
 | |
| 
 | |
| network={
 | |
|     ssid="test-psk"
 | |
|     key_mgmt=WPA-PSK
 | |
|     psk="12345678"
 | |
| }
 | |
| 
 | |
| The examples in this document assume following IPv4 address
 | |
| configuration:
 | |
| 
 | |
| Test tool (either AP or station mode): 192.168.1.1/24
 | |
| Device under test: 192.168.1.2/24
 | |
| 
 | |
| 
 | |
| Data traffic tests
 | |
| ------------------
 | |
| 
 | |
| ping is used to test whether unicast frames go through on the data
 | |
| link. It should be noted that ping may need to use broadcast ARP at the
 | |
| beginning if the other device is not yet in the ARP table, so working
 | |
| broadcast and unicast connectivity may be needed to get this started.
 | |
| 
 | |
| Example:
 | |
| 
 | |
| $ ping -n -c 5 192.168.1.2
 | |
| PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
 | |
| 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=43.7 ms
 | |
| 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=67.9 ms
 | |
| 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=900 ms
 | |
| 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=5.81 ms
 | |
| 64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=135 ms
 | |
| 
 | |
| --- 192.168.1.2 ping statistics ---
 | |
| 5 packets transmitted, 5 received, 0% packet loss, time 4004ms
 | |
| rtt min/avg/max/mdev = 5.811/230.605/900.223/337.451 ms
 | |
| 
 | |
| This shows working unicast data connectivity.
 | |
| 
 | |
| $ ping -n -c 5 192.168.1.2
 | |
| PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
 | |
| 
 | |
| --- 192.168.1.2 ping statistics ---
 | |
| 5 packets transmitted, 0 received, 100% packet loss, time 4033ms
 | |
| 
 | |
| This shows not working unicast data connectivity.
 | |
| 
 | |
| 
 | |
| arping is used to test broadcast connectivity.
 | |
| 
 | |
| Example:
 | |
| 
 | |
| $ arping -b -I wlan0 192.168.1.2 -c 5
 | |
| ARPING 192.168.1.2 from 192.168.1.1 wlan0
 | |
| Unicast reply from 192.168.1.2 [<DUT MAC address>]  119.695ms
 | |
| Unicast reply from 192.168.1.2 [<DUT MAC address>]  144.496ms
 | |
| Unicast reply from 192.168.1.2 [<DUT MAC address>]  166.788ms
 | |
| Unicast reply from 192.168.1.2 [<DUT MAC address>]  2.283ms
 | |
| Unicast reply from 192.168.1.2 [<DUT MAC address>]  2.234ms
 | |
| Sent 5 probes (5 broadcast(s))
 | |
| Received 5 response(s)
 | |
| 
 | |
| This shows working broadcast data connectivity.
 | |
| 
 | |
| $ arping -b -I wlan0 192.168.1.2 -c 5
 | |
| ARPING 192.168.1.2 from 192.168.1.1 wlan0
 | |
| Sent 5 probes (5 broadcast(s))
 | |
| Received 0 response(s)
 | |
| 
 | |
| This shows not working broadcast data connectivity.
 | |
| 
 | |
| If testing results do not look consistent, the testing state can be
 | |
| cleared by disconnection and reconnecting the station (the test tool or
 | |
| the DUT) to the network.
 | |
| 
 | |
| 
 | |
| Sniffer and wlantest
 | |
| --------------------
 | |
| 
 | |
| It is useful to get a wireless sniffer capture from the operating
 | |
| channel of the AP to be able to confirm DUT behavior if any of the data
 | |
| tests indicate reason to believe something is not working as expected.
 | |
| 
 | |
| wlantest (from the wlantest directory of hostap.git) can be used to
 | |
| decrypt and analyze a sniffer capture. For example:
 | |
| 
 | |
| wlantest -r wlan0.pcap -n decrypted.pcap -p 12345678
 | |
| 
 | |
| The debug prints and comments in the generated file indicate where
 | |
| unexpected behavior has been detected, e.g., when the test tool ends up
 | |
| clearing its packet number to test replay protection. That can help in
 | |
| checking whether the DUT actually replies to a frame that it was
 | |
| supposed to drop due replay.
 | |
| 
 | |
| 
 | |
| Testing replay protection on a station device
 | |
| ---------------------------------------------
 | |
| 
 | |
| Start hostapd and use hostapd_cli on the test device to control testing
 | |
| operations. Connect the DUT to the network.
 | |
| 
 | |
| <3>AP-STA-CONNECTED <DUT MAC address>
 | |
| 
 | |
| This indicates that the connection was completed successfully.
 | |
| 
 | |
| Verify that broadcast and unicast traffic works correctly (if not,
 | |
| something is wrong in the test setup and that needs to be resolved
 | |
| before being able to run any tests).
 | |
| 
 | |
| Verify that unicast traffic works and issue the following command in
 | |
| hostapd_cli:
 | |
| 
 | |
| > raw RESET_PN <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| Verify that unicast traffic does not work anymore. If it does, the DUT
 | |
| does not implement replay protection correctly for unicast frames. Note
 | |
| that unicast traffic can recover once the packet number from the test
 | |
| device increases beyond the value used prior to that RESET_PN command.
 | |
| 
 | |
| 
 | |
| Verify that broadcast traffic works and issue the following command in
 | |
| hostapd_cli:
 | |
| 
 | |
| > raw RESET_PN ff:ff:ff:ff:ff:ff
 | |
| OK
 | |
| 
 | |
| Verify that broadcast traffic does not work anymore. If it does, the DUT
 | |
| does not implement replay protection correctly for broadcast
 | |
| frames. Note that broadcast traffic can recover once the packet number
 | |
| from the test device increases beyond the value used prior to that
 | |
| RESET_PN command.
 | |
| 
 | |
| 
 | |
| Testing replay protection on an AP device
 | |
| -----------------------------------------
 | |
| 
 | |
| Start the AP (DUT) and start wpa_supplicant on the test device to
 | |
| connect to the network. Use wpa_cli to control the test device.
 | |
| 
 | |
| <3>SME: Trying to authenticate with <DUT MAC address> (SSID='test-psk' freq=5240 MHz)
 | |
| <3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
 | |
| <3>Trying to associate with <DUT MAC address> (SSID='test-psk' freq=5240 MHz)
 | |
| <3>Associated with <DUT MAC address>
 | |
| <3>WPA: Key negotiation completed with <DUT MAC address> [PTK=CCMP GTK=CCMP]
 | |
| <3>CTRL-EVENT-CONNECTED - Connection to <DUT MAC address> completed [id=0 id_str=]
 | |
| 
 | |
| Verify that unicast traffic works and issue the following command in
 | |
| wpa_cli:
 | |
| 
 | |
| > raw RESET_PN
 | |
| OK
 | |
| 
 | |
| Verify that unicast traffic does not work anymore. If it does, the DUT
 | |
| does not implement replay protection correctly. Note that unicast
 | |
| traffic can recover once the packet number from the test device
 | |
| increases beyond the value used prior to that RESET_PN command.
 | |
| 
 | |
| IEEE 802.11 protocol uses unicast frames in station-to-AP direction, so
 | |
| there is no need to test AP replay protection behavior separately with
 | |
| the broadcast IPv4 traffic (which would be converted to unicast frames
 | |
| on the link layer).
 | |
| 
 | |
| 
 | |
| Testing GTK reinstallation protection on a station device (group handshake)
 | |
| ---------------------------------------------------------------------------
 | |
| 
 | |
| Use the procedure describe above for testing replay protection, but with
 | |
| the following hostapd_cli commands:
 | |
| 
 | |
| Test broadcast connectivity; should work
 | |
| 
 | |
| > raw RESEND_GROUP_M1 <DUT MAC address>
 | |
| OK
 | |
| > raw RESET_PN ff:ff:ff:ff:ff:ff
 | |
| OK
 | |
| 
 | |
| Test broadcast connectivity; should not work; if it does, the device
 | |
| does not implement protection for delayed retransmission of Group Key
 | |
| Message 1/2.
 | |
| 
 | |
| 
 | |
| Testing GTK reinstallation protection on a station device (4-way handshake)
 | |
| ---------------------------------------------------------------------------
 | |
| 
 | |
| Use the procedure described above for testing replay protection for
 | |
| broadcast traffic, but with the following hostapd_cli commands:
 | |
| 
 | |
| Test broadcast connectivity; should work
 | |
| 
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| > raw RESET_PN ff:ff:ff:ff:ff:ff
 | |
| OK
 | |
| 
 | |
| Test broadcast connectivity; should not work; if it does, the device
 | |
| does not implement protection for delayed retransmission of 4-way
 | |
| handshake EAPOL-Key Message 3/4.
 | |
| 
 | |
| Variant 1: Include extra Message 1/4
 | |
| 
 | |
| Otherwise same as above, but replace RESEND_M3 command with:
 | |
| 
 | |
| > raw RESEND_M1 <DUT MAC address>
 | |
| OK
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| Variant 2: Include two extra Message 1/4
 | |
| 
 | |
| Otherwise same as above, but replace RESEND_M3 command with:
 | |
| 
 | |
| > raw RESEND_M1 <DUT MAC address> change-anonce
 | |
| OK
 | |
| > raw RESEND_M1 <DUT MAC address>
 | |
| OK
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| 
 | |
| Testing TK reinstallation protection on a station device (4-way handshake)
 | |
| --------------------------------------------------------------------------
 | |
| 
 | |
| Use the procedure described above for testing replay protection for
 | |
| unicast traffic, but with the following hostapd_cli commands:
 | |
| 
 | |
| Test unicast connectivity; should work
 | |
| 
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| > raw RESET_PN <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| Test unicast connectivity; should not work; if it does, the device
 | |
| does not implement protection for delayed retransmission of 4-way
 | |
| handshake EAPOL-Key Message 3/4.
 | |
| 
 | |
| Variant 1: Include extra Message 1/4
 | |
| 
 | |
| Otherwise same as above, but replace RESEND_M3 command with:
 | |
| 
 | |
| > raw RESEND_M1 <DUT MAC address>
 | |
| OK
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| Variant 2: Include two extra Message 1/4
 | |
| 
 | |
| Otherwise same as above, but replace RESEND_M3 command with:
 | |
| 
 | |
| > raw RESEND_M1 <DUT MAC address> change-anonce
 | |
| OK
 | |
| > raw RESEND_M1 <DUT MAC address>
 | |
| OK
 | |
| > raw RESEND_M3 <DUT MAC address>
 | |
| OK
 | |
| 
 | |
| 
 | |
| Testing ANonce generation on an AP device
 | |
| -----------------------------------------
 | |
| 
 | |
| Start the AP (DUT) and start wpa_supplicant on the test device to
 | |
| connect to the network. Use wpa_cli to control the test device.
 | |
| 
 | |
| <3>SME: Trying to authenticate with <DUT MAC address> (SSID='test-psk' freq=5240 MHz)
 | |
| <3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
 | |
| <3>Trying to associate with <DUT MAC address> (SSID='test-psk' freq=5240 MHz)
 | |
| <3>Associated with <DUT MAC address>
 | |
| <3>WPA: Key negotiation completed with <DUT MAC address> [PTK=CCMP GTK=CCMP]
 | |
| <3>CTRL-EVENT-CONNECTED - Connection to <DUT MAC address> completed [id=0 id_str=]
 | |
| 
 | |
| Show the ANonce from the first 4-way handshake, request PTK rekeying,
 | |
| and show the ANonce from the second 4-way handshake:
 | |
| 
 | |
| > GET anonce
 | |
| df8c61d1f1f7aca9f1739dd888199547f4af2b8b07f8bf15b45ea271da0072b2
 | |
| > raw KEY_REQUEST 0 1
 | |
| OK
 | |
| > GET anonce
 | |
| d8ddcb716f28abfdf1352a05d51e7a70f58802122e99d13c730c3c0f09594aac
 | |
| 
 | |
| If the ANonce values are same, the AP did not update the ANonce for
 | |
| rekeying (it should have as shown in the example above).
 | |
| 
 | |
| 
 | |
| Testing FT Reassociation Request frame retransmission on an AP device
 | |
| ---------------------------------------------------------------------
 | |
| 
 | |
| This test case requires a sniffer to be used and manually analyzed.
 | |
| 
 | |
| Enable FT on the DUT AP (likely two AP devices needed), connect test
 | |
| tool to the AP using FT protocol (e.g., connect to another AP first and
 | |
| then use the "ROAM <BSSID>" command), and do the following steps:
 | |
| 
 | |
| - verify unicast traffic from the AP to test station (either ping from
 | |
|   the AP or from a device behind the AP); this needs to work
 | |
| - wpa_cli "raw RESEND_ASSOC"
 | |
| - verify unicast traffic from the AP to test station (either ping from
 | |
|   the AP or from a device behind the AP); this is likely to fail, but
 | |
|   the real analysis is done based on the sniffer capture
 | |
| 
 | |
| In the sniffer capture, find the last Reassociation Request frame from
 | |
| the test station (this is more or less identical to the previous one and
 | |
| the only one that should not have Authentication frame exchange before
 | |
| it). Look at the last used PN in a unicast Data frame from the AP to the
 | |
| test station before the last Reassociation Request frame and the PN in
 | |
| the following unicast Data frame after the last Reassociation Request
 | |
| frame. If the PN goes down (e.g., is reset to 1), this would be a sign
 | |
| of a likely security vulnerability. The AP's TK configuration should be
 | |
| verified (i.e., whether it is configuring the same TK again and then
 | |
| allowing it to be used with reused PN values).
 |