Shell-Script

Bash 腳本 arg0 漏洞?

  • June 8, 2017

是否可以在執行腳本時顯式更改 shell 腳本(bash 腳本)的 $0 參數?

考慮以下腳本:

readonly SCRIPT_HELP="$(cat <<EOF 
Usage: $(basename "$0") [-h]
EOF 
)" 

echo "${SCRIPT_HELP}"

是否可以將其他內容作為參數 0 傳遞給此 bash 腳本,以便$(basename...使用某些使用者提供的程式碼(可能有害)執行評估?

通常,如果可以利用參數 0 在特定的 shell 腳本中沒有正確清理的事實?

決定$0應該是什麼是微不足道的。只需創建一個連結:

$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"

echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF

在這種特殊情況下,不,我不認為可以利用它來獲得任何巨大的優勢。"$0"並且SCRIPT_HELP在使用時被引用(在嵌套命令替換和 heredocs 中,但仍然被引用),並且它們沒有被eval編輯。

$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF

$0可以是腳本呼叫者想要的任何東西。這是腳本的路徑,呼叫者可以在任何位置複製或連結到腳本。

然而,這本身並不是一個漏洞,除非腳本以比其呼叫者更多的權限執行。除非腳本執行檔具有特權,否則呼叫者可以執行不同的程序。如果呼叫者本身俱有特權並且可以被說服傳遞不同的$0.

如果腳本以特權執行,那麼$0可能取決於用於提升特權的方法。如果腳本是通過指向 setuid 執行檔的符號連結呼叫的,那麼$0它可能是任意的(但是大多數係統拒絕 setuid 執行檔)。

儘管在這種特殊情況下的大多數情況下都缺乏安全隱患,但您的腳本對於任意$0. 中的雙引號"$0"導致值按原樣使用(而未加引號的$0會將其視為萬用字元模式列表)。但是當basename命令將該值視為參數時,它將根據該值是否以 a 開頭而對其進行不同的處理-。如果該值以 a 開頭-(並且不僅僅是-),那麼它是一個選項。至少對於 GNU basename,非選項參數是強制性的,因此使用以開頭的單個參數呼叫它-只會導致錯誤。但這對於其他一些命令來說是一個更大的問題. 要處理任意值,包括以 開頭的值,請在參數之前-放置--以指示後面沒有更多選項:basename -- "$0".

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