2014 年 9 月揭露的 Shellshock (CVE-2014-6271, CVE-2014-7169) 是 Bash 歷史最嚴重漏洞,影響版本 1.14 至 4.3。攻擊者透過惡意構造的環境變數函數定義,在 Bash 啟動時執行任意代碼。本文提供標準檢測命令、各發行版修復指令、驗證方法與緩解策略。
Bash 允許在環境變數中定義函數:
env x='() { :;}; echo vulnerable' bash -c "echo test"
() { :;}:合法函數定義 (空函數); echo vulnerable:函數定義後的額外命令
env x='() { :;}; echo VULNERABLE' bash -c "echo test"
# 易受攻擊輸出:
VULNERABLE
test
# 已修補輸出:
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'x'
test
env X='() { (a)=>\' bash -c "echo date"; cat echo
# 易受攻擊:執行 date 命令並建立 echo 檔案
# 已修補:報錯不執行
# CVE-2014-7186 (紅帽發現)
bash -c 'true <
| 發行版 | 修復命令 | 驗證套件版本 |
|---|---|---|
| Debian / Ubuntu / Mint | apt update && apt install --only-upgrade bash | dpkg -l bash | grep ^ii |
| RHEL / CentOS / Fedora / Rocky / Alma | yum update bash / dnf update bash | rpm -q bash |
| openSUSE | zypper update bash | rpm -q bash |
| Arch / Manjaro | pacman -Syu bash | pacman -Q bash |
| Alpine | apk upgrade bash | apk info bash |
| Gentoo | emerge --ask --verbose sys-apps/bash | equery l bash |

圖 1:Debian 修補前檢測顯示 VULNERABLE

圖 2:CentOS 修補前檢測顯示 VULNERABLE

圖 3:Debian 修補後不再輸出 VULNERABLE

圖 4:CentOS 修補後不再輸出 VULNERABLE
# 安裝替代 shell
apt install dash zsh fish # 或對應套件管理器
# 修改關鍵服務 Shebang
# #!/bin/bash → #!/bin/dash (dash 不受影響)
# 或系統層面 (謹慎)
# dpkg-reconfigure dash # Debian/Ubuntu 設定 /bin/sh 指向 dash
ForceCommand 改用內建命令或編譯二進制mod_cgi 避免傳遞用戶輸入至環境變數
# ModSecurity 規則範例
SecRule REQUEST_HEADERS|REQUEST_BODY|ARGS_NAMES|ARGS_VALUES \
"()\s*{" "id:1000001,phase:2,block,msg:'Shellshock Attack Attempt'"
wget https://ftp.gnu.org/gnu/bash/bash-5.2.tar.gz
tar xzf bash-5.2.tar.gz
cd bash-5.2
./configure --prefix=/usr --bindir=/bin --without-bash-malloc
make -j$(nproc)
make install
# 需極度謹慎,可能破壞系統相容性
#!/bin/bash
# shellshock_scan.sh - 掃描主機 Bash 版本與漏洞狀態
check_host() {
local host=$1
ssh "$host" '
bash_version=$(bash --version | head -1)
vuln1=$(env x="() { :;}; echo VULN" bash -c "echo test" 2>/dev/null | grep -c VULN)
vuln2=$(env X="() { (a)=>\'" bash -c "echo date" 2>/dev/null | grep -c date)
echo "$(hostname)|$bash_version|CVE-2014-6271:$vuln1|CVE-2014-7169:$vuln2"
'
}
# 批量掃描
for host in server{1..50}; do
check_host "$host" &
done
wait
unattended-upgrades (Debian/Ubuntu) 或 dnf-automatic (RHEL/Fedora) 確保安全更新及時應用#!/bin/sh (指向 dash)、避免 CGI 使用 BashShellshock 是「環境變數傳遞代碼」這一設計缺陷的極端體現。核心防禦只有一條:**立即更新 Bash 至修補版本**。輔以最小化暴露面、WAF 規則、自動化合規掃描。十年過去,仍有舊系統在運行易受攻擊的 Bash,**定期掃描、持續修補**是唯一正解。