Prevent oracle attacks in the legacy protocol (CVE-2018-16737, CVE-2018-16738)
[tinc] / test / security.test
1 #!/bin/sh
2
3 . "${0%/*}/testlib.sh"
4
5 # Skip this test if tools are missing
6
7 which socket >/dev/null || exit 77
8 which timeout >/dev/null || exit 77
9
10 # Initialize two nodes
11
12 $tinc $c1 <<EOF
13 init foo
14 set DeviceType dummy
15 set Port 32754
16 set Address localhost
17 set PingTimeout 1
18 set AutoConnect no
19 EOF
20
21 $tinc $c2 <<EOF
22 init bar
23 set DeviceType dummy
24 set Port 32755
25 set PingTimeout 1
26 set MaxTimeout 1
27 set ExperimentalProtocol no
28 set AutoConnect no
29 EOF
30
31 # Exchange host config files
32
33 $tinc $c1 export | $tinc $c2 exchange | $tinc $c1 import
34
35 $tinc $c1 start $r1
36 $tinc $c2 start $r2
37
38 # No ID sent by responding node if we don't send an ID first, before the timeout
39
40 result=`(sleep 2; echo "0 bar 17.7") | timeout 3 socket localhost 32754` && exit 1
41 test $? = 124
42 test -z "$result"
43
44 # ID sent if initiator sends first, but still tarpitted
45
46 result=`echo "0 bar 17.7" | timeout 3 socket localhost 32754` && exit 1
47 test $? = 124
48 test "`echo "$result" | head -c 10`" = "0 foo 17.7"
49
50 # No invalid IDs allowed
51
52 result=`echo "0 foo 17.7" | timeout 1 socket localhost 32754` && exit 1
53 test $? = 124
54 test -z "$result"
55
56 result=`echo "0 baz 17.7" | timeout 1 socket localhost 32754` && exit 1
57 test $? = 124
58 test -z "$result"
59
60 # No NULL METAKEYs allowed
61
62 result=`printf "0 foo 17.0\n1 0 672 0 0 834188619F4D943FD0F4B1336F428BD4AC06171FEABA66BD2356BC9593F0ECD643F0E4B748C670D7750DFDE75DC9F1D8F65AB1026F5ED2A176466FBA4167CC567A2085ABD070C1545B180BDA86020E275EA9335F509C57786F4ED2378EFFF331869B856DDE1C05C461E4EECAF0E2FB97AF77B7BC2AD1B34C12992E45F5D1254BBF0C3FB224ABB3E8859594A83B6CA393ED81ECAC9221CE6BC71A727BCAD87DD80FC0834B87BADB5CB8FD3F08BEF90115A8DF1923D7CD9529729F27E1B8ABD83C4CF8818AE10257162E0057A658E265610B71F9BA4B365A20C70578FAC65B51B91100392171BA12A440A5E93C4AA62E0C9B6FC9B68F953514AAA7831B4B2C31C4\n" | timeout 3 socket localhost 32755` && exit 1
63 test $? = 124
64 test -z "$result" # Not even the ID should be sent when the first packet contains illegal data
65
66 # No splicing allowed
67
68 $tinc $c2 stop
69 $tinc $c2 del ExperimentalProtocol
70 $tinc $c2 start $r2
71
72 ./splice foo localhost 32754 bar localhost 32755 17.7 &
73 sleep 3
74 test `$tinc $c1 dump reachable nodes | wc -l` = 1
75 test `$tinc $c2 dump reachable nodes | wc -l` = 1
76 kill $!
77
78 $tinc $c2 stop
79 $tinc $c1 stop
80
81 # Test splicing again with legacy protocol
82
83 $tinc $c1 set ExperimentalProtocol no
84 $tinc $c2 set ExperimentalProtocol no
85
86 $tinc $c1 start $r1
87 $tinc $c2 start $r2
88
89 ./splice foo localhost 32754 bar localhost 32755 17.0 &
90 sleep 3
91 test `$tinc $c1 dump reachable nodes | wc -l` = 1
92 test `$tinc $c2 dump reachable nodes | wc -l` = 1
93 kill $!
94
95 # Clean up
96
97 $tinc $c2 stop
98 $tinc $c1 stop