大家好。 我們正在積極投入工作,並已經準備在一月推出許多強大的產品。 其中,大家最喜歡的新課程已經宣布招生。
檔案權限提供了 SUID 執行檔的安全替代方案,但乍看之下似乎有點令人困惑。
我們都知道二進制
如果您想避免詳細閱讀上面的文章,我會節省您一些時間:本質上,檔案權限允許以 root 身分執行的進程,因此允許執行某些操作來保留某些有限的功能
權限對於通常始終以 root 身分運行的服務來說非常有用,但是命令列實用程式呢? 幸運的是,只要您安裝了正確的實用程序,這也是受支援的。 如果您使用 Ubuntu,您將需要該軟體包 libcap2-bin
。 您還需要運行一個非古老的核心(從版本 2.6.24).
這些函數允許將權限與執行檔關聯起來,類似於設定 SUID 位,但僅限於一組特定的權限。 公用事業 setcap
用於新增和刪除檔案的權限。
第一步是選擇您需要的權限。 為了本文的目的,我假設有一個名為的網路診斷工具 tracewalk
,應該能夠使用 CAP_NET_RAW
.
假設您位於二進位檔案所在的目錄中 tracewalk
,您可以像這樣新增此權限:
sudo setcap cap_net_raw=eip tracewalk
暫時忽略後綴 =eip
對於解決方案,我將在幾秒鐘內討論這個問題。 請注意,權限名稱是小寫的。 現在您可以檢查是否已正確配置權限:
setcap -v cap_new_raw=eip tracewalk
或者您可以列出為給定可執行檔設定的所有權限:
getcap tracewalk
作為參考,您也可以使用下列命令刪除可執行檔中的所有權限:
setcap -r tracewalk
此時,您應該能夠以非特權用戶身份運行可執行文件,並且它應該能夠使用原始套接字,但不具有根用戶擁有的任何其他特權。
那麼這個奇怪的後綴是什麼意思呢? =eip
? 這需要對權限的性質有一定的了解。 每個進程都有三組權限 - 有效、可繼承、允許:
- 有效的 權限是定義進程實際可以執行的操作的權限。 例如,它無法處理原始套接字,如果
CAP_NET_RAW
不在有效集中。 - 可用的 權限是流程使用適當的呼叫請求時被允許擁有的權限。 它們阻止進程實際執行任何操作,除非專門編寫該進程來請求所述許可。 這允許編寫進程以僅在實際需要時將關鍵權限新增至有效集。
- 可繼承 權限是可以在產生的子程序的可存取集中繼承的權限。 手術期間
fork()
或clone()
子進程總是會取得父進程權限的副本,因為此時它仍在執行相同的可執行檔。 當下列情況時使用可繼承集exec()
(或等效的)被調用以用另一個可執行檔替換可執行檔。 此時,進程的可用集合被可繼承集屏蔽,以獲得將用於新進程的可存取集。
所以實用性 setcap
允許我們為給定的可執行檔獨立添加這三組權限。 請注意,群組的含義對於檔案權限的解釋略有不同:
- 可用的 檔案權限是可執行檔案始終可用的權限,即使呼叫該檔案的父進程沒有這些權限。 它們曾經被稱為「強制」許可證。
- 遺傳 檔案權限定義了一個附加掩碼,該掩碼也可用於從呼叫程序的集合中刪除權限。 除了呼叫進程的繼承集之外,它們還適用,因此僅當該權限同時存在於兩個集中時才會繼承該權限。
- 有效的 檔案權限實際上只是一個位,而不是一個集合,如果設定了,則表示整個可用集合也被複製到新進程的有效集合中。 這可用於向未專門編寫來請求權限的進程新增權限。 由於它是一位,所以如果您為任何權限設定它,則必須為所有權限設定它。 您可以將其視為遺留位,因為它用於允許不支援權限的應用程式使用權限。
當透過指定權限時 setcap
三個字母 e
, i
и p
與...有關 有效、可繼承、可獲取 分別設定。 所以,早期的規範:
sudo setcap cap_net_raw=eip tracewalk
....表示分辨率 CAP_NET_RAW
必須新增到可用且可繼承的集合中,也必須設定有效位元。 這將覆蓋之前對該文件設定的任何權限。 若要一次設定多個權限,請使用逗號分隔的清單:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
首先,檔案功能不適用於符號連結 - 您必須將它們套用到二進位檔案本身(即符號連結的目標)。
其次,它們不適用於解釋腳本。 例如,如果您想要向某個 Python 腳本指派權限,則必須將其指派給 Python 解譯器本身。 顯然,這是一個潛在的安全問題,因為使用該解釋器執行的所有腳本都將具有指定的權限,儘管這仍然比使其成為 SUID 要好得多。 最常見的解決方法似乎是用 C 或等效語言編寫一個單獨的可執行文件,可以執行必要的操作並從腳本調用它。 這類似於 Wireshark 使用的方法,它使用二進位文件 /usr/bin/dumpcap
執行特權操作:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
第三,如果使用環境變量,檔案權限將被停用 LD_LIBRARY_PATH
出於明顯的安全原因(1)。 這同樣適用於 LD_PRELOAD
, 據我所知。
1. 由於攻擊者顯然可以替換標準庫之一併使用 LD_LIBRARY_PATH
強制其庫優先於系統庫被調用,因此可以使用與調用應用程式相同的權限執行自己的任意程式碼。
就這樣。 有關課程計劃的更多詳細信息,請訪問
來源: www.habr.com