a3245fbb434e6e84489914352566c22b38adfb1a
[shellsnippets/shellsnippets.git] / bashcheck
1 #!/bin/bash
2
3 warn() {
4         if [ "$scary" == "1" ]; then
5                 echo -e "\033[91mVulnerable to $1\033[39m"
6         else
7                 echo -e "\033[93mFound non-exploitable $1\033[39m"
8         fi
9 }
10
11 good() {
12         echo -e "\033[92mNot vulnerable to $1\033[39m"
13 }
14
15 tmpdir=`mktemp -d -t tmp.XXXXXXXX`
16
17 [ -n "$1" ] && bash=$(which $1) || bash=$(which bash)
18 echo -e "\033[95mTesting $bash ..."
19 $bash -c 'echo "Bash version $BASH_VERSION"'
20 echo -e "\033[39m"
21
22 #r=`a="() { echo x;}" $bash -c a 2>/dev/null`
23 if [ -n "$(env 'a'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
24         echo -e "\033[91mVariable function parser active, maybe vulnerable to unknown parser bugs\033[39m"
25         scary=1
26 elif [ -n "$(env 'BASH_FUNC_a%%'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
27         echo -e "\033[92mVariable function parser pre/suffixed [%%, upstream], bugs not exploitable\033[39m"
28         scary=0
29 elif [ -n "$(env 'BASH_FUNC_a()'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
30         echo -e "\033[92mVariable function parser pre/suffixed [(), redhat], bugs not exploitable\033[39m"
31         scary=0
32 elif [ -n "$(env '__BASH_FUNC<a>()'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
33         echo -e "\033[92mVariable function parser pre/suffixed [__BASH_FUNC<..>(), apple], bugs not exploitable\033[39m"
34         scary=0
35 else
36         echo -e "\033[92mVariable function parser inactive, bugs not exploitable\033[39m"
37         scary=0
38 fi
39
40
41 r=`env x="() { :; }; echo x" $bash -c "" 2>/dev/null`
42 if [ -n "$r" ]; then
43         warn "CVE-2014-6271 (original shellshock)"
44 else
45         good "CVE-2014-6271 (original shellshock)"
46 fi
47
48 pushd $tmpdir > /dev/null
49 env x='() { function a a>\' $bash -c echo 2>/dev/null > /dev/null
50 if [ -e echo ]; then
51         warn "CVE-2014-7169 (taviso bug)"
52 else
53         good "CVE-2014-7169 (taviso bug)"
54 fi
55 popd > /dev/null
56
57 $($bash -c "true $(printf '<<EOF %.0s' {1..80})" 2>$tmpdir/bashcheck.tmp)
58 ret=$?
59 grep AddressSanitizer $tmpdir/bashcheck.tmp > /dev/null
60 if [ $? == 0 ] || [ $ret == 139 ]; then
61         warn "CVE-2014-7186 (redir_stack bug)"
62 else
63         good "CVE-2014-7186 (redir_stack bug)"
64 fi
65
66
67 $bash -c "`for i in {1..200}; do echo -n "for x$i in; do :;"; done; for i in {1..200}; do echo -n "done;";done`" 2>/dev/null
68 if [ $? != 0 ]; then
69         warn "CVE-2014-7187 (nested loops off by one)"
70 else
71         echo -e "\033[96mTest for CVE-2014-7187 not reliable without address sanitizer\033[39m"
72 fi
73
74 $($bash -c "f(){ x(){ _;};x(){ _;}<<a;}" 2>/dev/null)
75 if [ $? != 0 ]; then
76         warn "CVE-2014-6277 (lcamtuf bug #1)"
77 else
78         good "CVE-2014-6277 (lcamtuf bug #1)"
79 fi
80
81 if [ -n "$(env x='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
82         warn "CVE-2014-6278 (lcamtuf bug #2)"
83 elif [ -n "$(env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
84         warn "CVE-2014-6278 (lcamtuf bug #2)"
85 elif [ -n "$(env 'BASH_FUNC_x()'='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
86         warn "CVE-2014-6278 (lcamtuf bug #2)"
87 else
88         good "CVE-2014-6278 (lcamtuf bug #2)"
89 fi
90
91 rm -rf $tmpdir