Security

是否有可能導致解釋器無限循環?

  • August 23, 2021

我正在考慮可能的拒絕服務攻擊場景,其中腳本通過遞歸呼叫自身作為解釋器導致系統資源中斷。

原理如下:

該腳本在其第一行以#!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 太簡單而無法檢查哪個文件失去了。 )

無論如何,我看不出這裡的攻擊是什麼,因為如果他們正在執行您選擇的命令,您已經可以做任何您喜歡的事情。不是通過為腳本提供一個不存在的解釋器,而是一個工作的解釋器。

引用自:https://unix.stackexchange.com/questions/665701