Bash
ln /path/to/file -i
在 setuid 腳本中做了什麼?
我正在使用 setuid 權限製作一個 Bash 腳本,但它不起作用。所以我在這裡找到了我的解決方案:
現在我的腳本工作正常(我在 cpp 中重寫了它)。
為了滿足我對為什麼純 Bash shell 不起作用的好奇心,我閱讀了這個連結: http: //www.faqs.org/faqs/unix-faq/faq/part4/section-7.html(由這個答案引用:https ://unix.stackexchange.com/a/2910 )。在那個網站上,我遇到了以下情況:
$ echo \#\!\/bin\/sh > /etc/setuid_script $ chmod 4755 /etc/setuid_script $ cd /tmp $ ln /etc/setuid_script -i $ PATH=. $ -i
我不明白第四行,它的內容是
ln /etc/setuid_script -i
.該命令有什麼作用?
ln
我在手冊中讀過這-i
只是“互動式”標誌(詢問您是否要覆蓋現有文件)。那麼為什麼ln /etc/setuid_script -i
後面跟著PATH=.
並-i
讓我的shell執行/bin/sh -i
呢?
該程式碼
ln /etc/setuid_script -i
旨在創建指向-i
在目前目錄中呼叫的文件的硬連結。ln -- /etc/setuid_script -i
如果您使用的是 GNU 工具,您可能需要說明才能完成這項工作。shell 可以通過 3 種不同的方式獲取執行命令。
- 從一個字元串。
sh -c "mkdir /tmp/me"
與-c
標誌一起使用。- 從一個文件。利用
sh filename
- 從終端,使用
sh -i
或sh
。從歷史上看,當你有一個
foo
從#!/bin/sh
核心開始呼叫的 shell 腳本時,它會用一個文件名呼叫它,即/bin/sh foo
,告訴它使用第二種讀取命令的方式。如果你給它一個文件名,-i
那麼核心就會呼叫/bin/sh -i
,你會得到第三種方式。還有比賽條件。就這樣被利用了。
- 呼叫系統
exec
呼叫來啟動腳本。- 核心看到文件是SUID,並相應地設置程序的權限。
- 核心讀取文件的前幾個字節以查看它是什麼類型的執行檔,找到
#!/bin/sh
並因此看到它是 /bin/sh 的腳本。- 攻擊者替換腳本。
- 核心將目前程序替換為 /bin/sh。
- /bin/sh 打開文件名並執行命令。
這是經典的TOCTTOU(檢查時間到使用時間)攻擊。步驟 2 中的檢查是針對與步驟 6 中使用的文件(在 open 呼叫中)不同的文件。
這兩個錯誤通常在這些天得到修復。