Bash

ln /path/to/file -i 在 setuid 腳本中做了什麼?

  • June 15, 2021

我正在使用 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 種不同的方式獲取執行命令。

  1. 從一個字元串。sh -c "mkdir /tmp/me"-c標誌一起使用。
  2. 從一個文件。利用sh filename
  3. 從終端,使用sh -ish

從歷史上看,當你有一個foo#!/bin/sh核心開始呼叫的 shell 腳本時,它會用一個文件名呼叫它,即/bin/sh foo,告訴它使用第二種讀取命令的方式。如果你給它一個文件名,-i那麼核心就會呼叫/bin/sh -i,你會得到第三種方式。

還有比賽條件。就這樣被利用了。

  1. 呼叫系統exec呼叫來啟動腳本。
  2. 核心看到文件是SUID,並相應地設置程序的權限。
  3. 核心讀取文件的前幾個字節以查看它是什麼類型的執行檔,找到#!/bin/sh並因此看到它是 /bin/sh 的腳本。
  4. 攻擊者替換腳本。
  5. 核心將目前程序替換為 /bin/sh。
  6. /bin/sh 打開文件名並執行命令。

這是經典的TOCTTOU(檢查時間到使用時間)攻擊。步驟 2 中的檢查是針對與步驟 6 中使用的文件(在 open 呼叫中)不同的文件。

這兩個錯誤通常在這些天得到修復。

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