make warnings less scary on systems with prefix patch and add clarification to docs
authorHanno <hanno@gentoo.org>
Thu, 2 Oct 2014 06:43:57 +0000 (08:43 +0200)
committerHanno <hanno@gentoo.org>
Thu, 2 Oct 2014 06:43:57 +0000 (08:43 +0200)
README.md
bashcheck

index 685fda7..7165e3d 100644 (file)
--- a/README.md
+++ b/README.md
@@ -7,8 +7,25 @@ background
 ==========
 
 The Bash vulnerability that is now known as Shellshock had an incomplete
-fix at first. There are currently 4 public and one supposedly non-public
-vulnerability.
+fix at first. There are currently 6 public vulnerabilities.
+
+interpreting results
+====================
+
+There's been some confusion how to interpret the results of this script
+and some people got scared by warnings on systems that didn't have any
+explitable bugs.
+
+The most important fix you need is one of the prefix/suffix-patches. Upstream
+patch number for this is bash042-050 and bash043-027 (patches for older
+versions also available). This patch was originally created by RedHat
+developer Florian Weimer and a modified version was applied by Bash
+developer Chet Ramey.
+
+Once you have this prefix patch all other vulnerabilities are not exploitable.
+They are still bugs that should be fixed, but there is nothing to worry
+about.
+
 
 usage
 =====
index 2b76e05..8f0f2be 100755 (executable)
--- a/bashcheck
+++ b/bashcheck
@@ -1,65 +1,88 @@
 #!/bin/bash
 
-[ -n "$1" ] && bash=$(which $1) || bash=$(which bash)
+warn() {
+       if [ "$scary" == "1" ]; then
+               echo -e "\033[91mVulnerable to $1\033[39m"
+       else
+               echo -e "\033[93mFound non-explitable $1\033[39m"
+       fi
+}
+
+good() {
+       echo -e "\033[92mNot vulnerable to $1\033[39m"
+}
 
+[ -n "$1" ] && bash=$(which $1) || bash=$(which bash)
 echo -e "\033[95mTesting $bash ..."
 echo $($bash --version | head -n 1)
 echo -e "\033[39m"
 
+#r=`a="() { echo x;}" $bash -c a 2>/dev/null`
+if [ -n "$(env 'a'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
+       echo -e "\033[91mVariable function parser active, maybe vulnerable to unknown parser bugs\033[39m"
+       scary=1
+elif [ -n "$(env 'BASH_FUNC_a%%'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
+       echo -e "\033[92mVariable function parser pre/suffixed [%%, upstream], bugs not explitable\033[39m"
+       scary=0
+elif [ -n "$(env 'BASH_FUNC_a()'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
+       echo -e "\033[92mVariable function parser pre/suffixed [(), redhat], bugs not explitable\033[39m"
+       scary=0
+elif [ -n "$(env 'BASH_FUNC_<a>%%'="() { echo x;}" $bash -c a 2>/dev/null)" ]; then
+       echo -e "\033[92mVariable function parser pre/suffixed [<..>%%, apple], bugs not explitable\033[39m"
+       scary=0
+else
+       echo -e "\033[92mVariable function parser inactive, bugs not explitable\033[39m"
+       scary=0
+fi
+
 
 r=`env x="() { :; }; echo x" $bash -c "" 2>/dev/null`
 if [ -n "$r" ]; then
-       echo -e '\033[91mVulnerable to CVE-2014-6271 (original shellshock)\033[39m'
+       warn "CVE-2014-6271 (original shellshock)"
 else
-       echo -e '\033[92mNot vulnerable to CVE-2014-6271 (original shellshock)\033[39m'
+       good "CVE-2014-6271 (original shellshock)"
 fi
 
 cd /tmp;rm echo 2>/dev/null
 env x='() { function a a>\' $bash -c echo 2>/dev/null > /dev/null
 if [ -e echo ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-7169 (taviso bug)\033[39m"
+       warn "CVE-2014-7169 (taviso bug)"
 else
-       echo -e "\033[92mNot vulnerable to CVE-2014-7169 (taviso bug)\033[39m"
+       good "CVE-2014-7169 (taviso bug)"
 fi
 
 $($bash -c "true $(printf '<<EOF %.0s' {1..80})" 2>/tmp/bashcheck.tmp)
 ret=$?
 grep -q AddressSanitizer /tmp/bashcheck.tmp
 if [ $? == 0 ] || [ $ret == 139 ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-7186 (redir_stack bug)\033[39m"
+       warn "CVE-2014-7186 (redir_stack bug)"
 else
-       echo -e "\033[92mNot vulnerable to CVE-2014-7186 (redir_stack bug)\033[39m"
+       good "CVE-2014-7186 (redir_stack bug)"
 fi
 
 
 $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
 if [ $? != 0 ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-7187 (nested loops off by one)\033[39m"
+       warn "CVE-2014-7187 (nested loops off by one)"
 else
        echo -e "\033[96mTest for CVE-2014-7187 not reliable without address sanitizer\033[39m"
 fi
 
 $($bash -c "f(){ x(){ _;};x(){ _;}<<a;}" 2>/dev/null)
 if [ $? != 0 ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-6277 (lcamtuf bug #1) [no patch]\033[39m"
+       warn "CVE-2014-6277 (lcamtuf bug #1)"
 else
-       echo -e "\033[92mNot vulnerable to CVE-2014-6277 (lcamtuf bug #1)\033[39m"
+       good "CVE-2014-6277 (lcamtuf bug #1)"
 fi
 
 if [ -n "$(env x='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-6278 (lcamtuf bug #2) [no prefix/suffix]\033[39m"
+       warn "CVE-2014-6278 (lcamtuf bug #2)"
 elif [ -n "$(env BASH_FUNC_x%%='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-6278 (lcamtuf bug #2) [prefix/%%-suffix]\033[39m"
+       warn "CVE-2014-6278 (lcamtuf bug #2)"
 elif [ -n "$(env 'BASH_FUNC_x()'='() { _;}>_[$($())] { echo x;}' $bash -c : 2>/dev/null)" ]; then
-       echo -e "\033[91mVulnerable to CVE-2014-6278 (lcamtuf bug #2) [prefix/()-suffix]\033[39m"
+       warn "CVE-2014-6278 (lcamtuf bug #2)"
 else
-       echo -e "\033[92mNot vulnerable to CVE-2014-6278 (lcamtuf bug #2)\033[39m"
+       good "CVE-2014-6278 (lcamtuf bug #2)"
 fi
 
 
-r=`a="() { echo x;}" $bash -c a 2>/dev/null`
-if [ -n "$r" ]; then
-       echo -e "\033[93mVariable function parser still active, maybe vulnerable to unknown parser bugs\033[39m"
-else
-       echo -e "\033[92mVariable function parser inactive, likely safe from unknown parser bugs\033[39m"
-fi