是否有可能導致解釋器無限循環?
我正在考慮可能的拒絕服務攻擊場景,其中腳本通過遞歸呼叫自身作為解釋器導致系統資源中斷。
原理如下:
該腳本在其第一行以
#!
shabang 的形式指定其自身的絕對路徑作為其自己的解釋器。系統核心將根據其支持,在
execve
系統呼叫期間自動呼叫解釋器,將解釋器添加到參數向量中。此類呼叫將耗盡系統中設置的程序參數 ( ) 大小的限制
{ARG_MAX}
,從而導致(可能是孤立的)失敗。實驗
我創建了 2 組不同的攻擊向量,
- 第一個,呼叫自己
#!/usr/local/bin/recurse
- 第二個,互相呼叫。
#!/usr/local/bin/recurse-1
#!/usr/local/bin/recurse-2
我已經在 macOS Big Sur 11.5.2 上測試了這兩個攻擊向量。當我使用 來檢查退出狀態時
echo $?
,它顯示 0,這意味著程序已成功完成。問題。
現代作業系統是否已針對此類攻擊進行了修補?有這方面的研究論文嗎?
在 Linux 上,我得到以下資訊:
hashbang 行 ( give ) 上有一個不存在的解釋器的
execve()
腳本ENOEXEC
:$ cat brokenhashbang.sh #!/bin/nonexisting echo hello $ ./brokenhashbang.sh bash: ./brokenhashbang.sh: /bin/nonexisting: bad interpreter: No such file or directory
帶有遞歸 hashbang (
ELOOP
) 的腳本:$ cat /tmp/recursivehashbang.sh #!/tmp/recursivehashbang.sh echo hello $ /tmp/recursivehashbang.sh bash: /tmp/recursivehashbang.sh: /tmp/recursivehashbang.sh: bad interpreter: Too many levels of symbolic links
具有現有但不可執行的解釋器 (
EACCESS
) 的腳本:$ cat noexechashbang.sh #!/etc/passwd echo "hello?" $ ./noexechashbang.sh bash: ./noexechashbang.sh: /etc/passwd: bad interpreter: Permission denied
不僅僅是 Bash:Dash、ksh 和 zsh 給出了類似的錯誤。
如果腳本沒有 hashbang,或者 hashbang 指向一個其他不可執行的文件(需要有
+x
,你會得到ENOEXEC
),那麼行為會有所不同。Bash 將文件本身作為 shell 腳本執行,而 zsh 似乎在內部查看是否有 hashbang 行,然後嘗試啟動該解釋器,或者使用/bin/sh
. 在 ENOEXEC 上通過 shell 執行腳本是POSIX 指定的 shell和/函式的execlp()``execvp()
行為。(對於不存在解釋器的情況,Dash 只是給出了令人困惑的
dash: 1: ./brokenhashbang.sh: not found
,就好像腳本本身不存在一樣。但我認為這是來自底層系統呼叫的相同錯誤,並且 Dash 太簡單而無法檢查哪個文件失去了。 )無論如何,我看不出這裡的攻擊是什麼,因為如果他們正在執行您選擇的命令,您已經可以做任何您喜歡的事情。不是通過為腳本提供一個不存在的解釋器,而是一個工作的解釋器。