Bash 從哪個版本刪除特權?
我一直在嘗試進行一些緩衝區溢出攻擊,並且我認為我可以使用
system("/bin/bash")
它來獲取 root shell。然後我閱讀了
system()
.它說:
system()
事實上,在/bin/sh
bash 版本 2 的系統上,具有 set-user-ID 或 set-group-ID 特權的程序無法正常工作,因為 bash 2 在啟動時會放棄特權。我正在攻擊的系統有一個 bash 版本 4.3,當我使用 a 時
system("/bin/bash")
,我沒有獲得 root 權限(當然我正在攻擊的初始程序以 root 權限開始)。我的問題是:系統會僅在 bash 版本 2 上放棄特權,還是會為任何版本 > 2 的 bash 放棄特權?編輯:
/bin/bash
只是放棄特權,而/bin/dash
或/bin/sh
不。閱讀@StéphaneChazelas 的評論後,EDIT2:
- 檢查此連結以獲取有關 bash 刪除權限的更多解釋和準確性。
-p
選項可用於確保在 bash 生成時保持特權。
目前版本
最新版本的 bash 將放棄特權,除非它以
-p
. 從描述特權模式的bash(1)部分:如果 shell 以不等於實際使用者(組) id 的有效使用者(組) id 啟動,並且未提供**-p選項,**
$$ … $$有效使用者 id 設置為真實使用者 id。如果在啟動時提供了**-p**選項,則不會重置有效使用者 ID。關閉此選項會導致有效使用者和組 ID 設置為真實使用者和組 ID。
歷史版本
你問“從哪個版本……?”。自活動 git 儲存庫(版本 1.70)中可用的最早修訂版以來,您引用的部分
system()
一直沒有改變。這是在 2004 年簽入的,評論表明它最後一次修改是在 2001 年。Bash 版本 3 於 2004 年發布。這意味著 bash 2 將是當時的目前/最新版本。如此有效,它在說“…bash 版本 2 或更高/更新”,即。從第 2 版開始就是這種情況。
為了自己確認,你可以嘗試建構一些中間版本並測試它們,或者查閱 bash git 儲存庫。負責的線路是:
if (running_setuid && privileged_mode == 0) disable_priv_mode ();
這些從2.0 版開始就存在了。回顧1.14.7 版本,bash 只會在特權模式被顯式禁用時放棄特權
+p
:case 'p': if (on_or_off == '+') { setuid (current_user.uid); setgid (current_user.gid); current_user.euid = current_user.uid; current_user.egid = current_user.gid; }