djm@openbsd.org | dd36932 | 2017-04-30 23:34:55 +0000 | [diff] [blame] | 1 | # $OpenBSD: integrity.sh,v 1.23 2017/04/30 23:34:55 djm Exp $ |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 2 | # Placed in the Public Domain. |
| 3 | |
| 4 | tid="integrity" |
Damien Miller | edb1af5 | 2014-05-15 15:07:53 +1000 | [diff] [blame] | 5 | cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 6 | |
Damien Miller | 0dc3bc9 | 2013-02-19 09:28:32 +1100 | [diff] [blame] | 7 | # start at byte 2900 (i.e. after kex) and corrupt at different offsets |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 8 | tries=10 |
Damien Miller | 0dc3bc9 | 2013-02-19 09:28:32 +1100 | [diff] [blame] | 9 | startoffset=2900 |
Darren Tucker | a955041 | 2013-11-07 15:21:19 +1100 | [diff] [blame] | 10 | macs=`${SSH} -Q mac` |
Damien Miller | 846dc7f | 2013-01-12 22:46:26 +1100 | [diff] [blame] | 11 | # The following are not MACs, but ciphers with integrated integrity. They are |
| 12 | # handled specially below. |
Damien Miller | 8a073cf | 2013-11-21 14:26:18 +1100 | [diff] [blame] | 13 | macs="$macs `${SSH} -Q cipher-auth`" |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 14 | |
Darren Tucker | 91af05c | 2013-05-17 13:16:59 +1000 | [diff] [blame] | 15 | # avoid DH group exchange as the extra traffic makes it harder to get the |
| 16 | # offset into the stream right. |
| 17 | echo "KexAlgorithms diffie-hellman-group14-sha1,diffie-hellman-group1-sha1" \ |
| 18 | >> $OBJ/ssh_proxy |
| 19 | |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 20 | # sshd-command for proxy (see test-exec.sh) |
Damien Miller | bd58853 | 2015-02-25 16:58:22 -0800 | [diff] [blame] | 21 | cmd="$SUDO sh ${SRC}/sshd-log-wrapper.sh ${TEST_SSHD_LOGFILE} ${SSHD} -i -f $OBJ/sshd_proxy" |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 22 | |
| 23 | for m in $macs; do |
| 24 | trace "test $tid: mac $m" |
| 25 | elen=0 |
| 26 | epad=0 |
| 27 | emac=0 |
dtucker@openbsd.org | e5c7ec6 | 2017-01-06 02:26:10 +0000 | [diff] [blame] | 28 | etmo=0 |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 29 | ecnt=0 |
| 30 | skip=0 |
Tim Rice | f9e2060 | 2013-02-26 20:27:29 -0800 | [diff] [blame] | 31 | for off in `jot $tries $startoffset`; do |
| 32 | skip=`expr $skip - 1` |
Damien Miller | 9fec296 | 2012-12-12 12:10:10 +1100 | [diff] [blame] | 33 | if [ $skip -gt 0 ]; then |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 34 | # avoid modifying the high bytes of the length |
| 35 | continue |
| 36 | fi |
Damien Miller | edb1af5 | 2014-05-15 15:07:53 +1000 | [diff] [blame] | 37 | cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 38 | # modify output from sshd at offset $off |
Damien Miller | 1e657d5 | 2013-02-26 18:58:06 +1100 | [diff] [blame] | 39 | pxy="proxycommand=$cmd | $OBJ/modpipe -wm xor:$off:1" |
markus@openbsd.org | 9e1777a | 2015-03-24 20:19:15 +0000 | [diff] [blame] | 40 | if ${SSH} -Q cipher-auth | grep "^${m}\$" >/dev/null 2>&1 ; then |
Damien Miller | edb1af5 | 2014-05-15 15:07:53 +1000 | [diff] [blame] | 41 | echo "Ciphers=$m" >> $OBJ/sshd_proxy |
Damien Miller | 8a073cf | 2013-11-21 14:26:18 +1100 | [diff] [blame] | 42 | macopt="-c $m" |
| 43 | else |
Damien Miller | edb1af5 | 2014-05-15 15:07:53 +1000 | [diff] [blame] | 44 | echo "Ciphers=aes128-ctr" >> $OBJ/sshd_proxy |
| 45 | echo "MACs=$m" >> $OBJ/sshd_proxy |
Damien Miller | 8a073cf | 2013-11-21 14:26:18 +1100 | [diff] [blame] | 46 | macopt="-m $m -c aes128-ctr" |
| 47 | fi |
Darren Tucker | 34035be | 2013-05-17 14:47:51 +1000 | [diff] [blame] | 48 | verbose "test $tid: $m @$off" |
djm@openbsd.org | dd36932 | 2017-04-30 23:34:55 +0000 | [diff] [blame] | 49 | ${SSH} $macopt -F $OBJ/ssh_proxy -o "$pxy" \ |
Damien Miller | 8a073cf | 2013-11-21 14:26:18 +1100 | [diff] [blame] | 50 | -oServerAliveInterval=1 -oServerAliveCountMax=30 \ |
Darren Tucker | dfea3bc | 2013-05-17 09:31:39 +1000 | [diff] [blame] | 51 | 999.999.999.999 'printf "%4096s" " "' >/dev/null |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 52 | if [ $? -eq 0 ]; then |
| 53 | fail "ssh -m $m succeeds with bit-flip at $off" |
| 54 | fi |
Tim Rice | f9e2060 | 2013-02-26 20:27:29 -0800 | [diff] [blame] | 55 | ecnt=`expr $ecnt + 1` |
dtucker@openbsd.org | 331b8e0 | 2016-03-04 02:48:06 +0000 | [diff] [blame] | 56 | out=$(egrep -v "^debug" $TEST_SSH_LOGFILE | tail -2 | \ |
Darren Tucker | dfea3bc | 2013-05-17 09:31:39 +1000 | [diff] [blame] | 57 | tr -s '\r\n' '.') |
Damien Miller | 43d3ed2 | 2014-07-02 17:01:08 +1000 | [diff] [blame] | 58 | case "$out" in |
Tim Rice | f9e2060 | 2013-02-26 20:27:29 -0800 | [diff] [blame] | 59 | Bad?packet*) elen=`expr $elen + 1`; skip=3;; |
markus@openbsd.org | 31821d7 | 2015-01-19 20:42:31 +0000 | [diff] [blame] | 60 | Corrupted?MAC* | *message?authentication?code?incorrect*) |
Tim Rice | f9e2060 | 2013-02-26 20:27:29 -0800 | [diff] [blame] | 61 | emac=`expr $emac + 1`; skip=0;; |
| 62 | padding*) epad=`expr $epad + 1`; skip=0;; |
Darren Tucker | 9504ea6 | 2017-04-28 14:33:43 +1000 | [diff] [blame] | 63 | *Timeout,?server*) |
| 64 | etmo=`expr $etmo + 1`; skip=0;; |
Damien Miller | 43d3ed2 | 2014-07-02 17:01:08 +1000 | [diff] [blame] | 65 | *) fail "unexpected error mac $m at $off: $out";; |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 66 | esac |
| 67 | done |
Darren Tucker | 9504ea6 | 2017-04-28 14:33:43 +1000 | [diff] [blame] | 68 | verbose "test $tid: $ecnt errors: mac $emac padding $epad length $elen timeout $etmo" |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 69 | if [ $emac -eq 0 ]; then |
| 70 | fail "$m: no mac errors" |
| 71 | fi |
Darren Tucker | 9504ea6 | 2017-04-28 14:33:43 +1000 | [diff] [blame] | 72 | expect=`expr $ecnt - $epad - $elen - $etmo` |
Damien Miller | 1fb593a | 2012-12-12 10:54:37 +1100 | [diff] [blame] | 73 | if [ $emac -ne $expect ]; then |
| 74 | fail "$m: expected $expect mac errors, got $emac" |
| 75 | fi |
| 76 | done |