Bash 腳本 arg0 漏洞?
是否可以在執行腳本時顯式更改 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 開頭-
(並且不僅僅是-
),那麼它是一個選項。至少對於 GNUbasename
,非選項參數是強制性的,因此使用以開頭的單個參數呼叫它-
只會導致錯誤。但這對於其他一些命令來說是一個更大的問題. 要處理任意值,包括以 開頭的值,請在參數之前-
放置--
以指示後面沒有更多選項:basename -- "$0"
.