fix typos
[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 [ -n "$1" ] && bash=$(which $1) || bash=$(which bash)
16 echo -e "\033[95mTesting $bash ..."
17 echo $($bash --version | head -n 1)
18 echo -e "\033[39m"
19
20 #r=`a="() { echo x;}" $bash -c a 2>/dev/null`
21 if [ -n "$(env 'a'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
22         echo -e "\033[91mVariable function parser active, maybe vulnerable to unknown parser bugs\033[39m"
23         scary=1
24 elif [ -n "$(env 'BASH_FUNC_a%%'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
25         echo -e "\033[92mVariable function parser pre/suffixed [%%, upstream], bugs not exploitable\033[39m"
26         scary=0
27 elif [ -n "$(env 'BASH_FUNC_a()'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
28         echo -e "\033[92mVariable function parser pre/suffixed [(), redhat], bugs not exploitable\033[39m"
29         scary=0
30 elif [ -n "$(env 'BASH_FUNC_<a>%%'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
31         echo -e "\033[92mVariable function parser pre/suffixed [<..>%%, apple], bugs not exploitable\033[39m"
32         scary=0
33 else
34         echo -e "\033[92mVariable function parser inactive, bugs not exploitable\033[39m"
35         scary=0
36 fi
37
38
39 r=`env x="() { :; }; echo x" $bash -c "" 2>/dev/null`
40 if [ -n "$r" ]; then
41         warn "CVE-2014-6271 (original shellshock)"
42 else
43         good "CVE-2014-6271 (original shellshock)"
44 fi
45
46 cd /tmp;rm echo 2>/dev/null
47 env x='() { function a a>\' $bash -c echo 2>/dev/null > /dev/null
48 if [ -e echo ]; then
49         warn "CVE-2014-7169 (taviso bug)"
50 else
51         good "CVE-2014-7169 (taviso bug)"
52 fi
53
54 $($bash -c "true $(printf '<<EOF %.0s' {1..80})" 2>/tmp/bashcheck.tmp)
55 ret=$?
56 grep -q AddressSanitizer /tmp/bashcheck.tmp
57 if [ $? == 0 ] || [ $ret == 139 ]; then
58         warn "CVE-2014-7186 (redir_stack bug)"
59 else
60         good "CVE-2014-7186 (redir_stack bug)"
61 fi
62
63
64 $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
65 if [ $? != 0 ]; then
66         warn "CVE-2014-7187 (nested loops off by one)"
67 else
68         echo -e "\033[96mTest for CVE-2014-7187 not reliable without address sanitizer\033[39m"
69 fi
70
71 $($bash -c "f(){ x(){ _;};x(){ _;}<<a;}" 2>/dev/null)
72 if [ $? != 0 ]; then
73         warn "CVE-2014-6277 (lcamtuf bug #1)"
74 else
75         good "CVE-2014-6277 (lcamtuf bug #1)"
76 fi
77
78 if [ -n "$(env x='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
79         warn "CVE-2014-6278 (lcamtuf bug #2)"
80 elif [ -n "$(env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
81         warn "CVE-2014-6278 (lcamtuf bug #2)"
82 elif [ -n "$(env 'BASH_FUNC_x()'='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
83         warn "CVE-2014-6278 (lcamtuf bug #2)"
84 else
85         good "CVE-2014-6278 (lcamtuf bug #2)"
86 fi
87
88