Linux 中的檔案權限

大家好。 我們正在積極投入工作,並已經準備在一月推出許多強大的產品。 其中,大家最喜歡的新課程已經宣布招生。 《Linux 管理員》。 在發布之前,我們通常會分享有用資料的翻譯。

Linux 中的檔案權限

檔案權限提供了 SUID 執行檔的安全替代方案,但乍看之下似乎有點令人困惑。


我們都知道二進制 SUID從安全角度來看是錯誤的決定。 幸運的是,如果您的應用程式需要一些有限的權限,有一種更有效的方法,稱為 文件權限.

如果您想避免詳細閱讀上面的文章,我會節省您一些時間:本質上,檔案權限允許以 root 身分執行的進程,因此允許執行某些操作來保留某些有限的功能 這個清單當它們放棄特權並由非特權用戶運行時。 這意味著,如果攻擊者設法使用緩衝區溢位或其他漏洞攻擊進程,他們將無法利用該進程實際需要的某些最低權限之外的任何內容。

權限對於通常始終以 root 身分運行的服務來說非常有用,但是命令列實用程式呢? 幸運的是,只要您安裝了正確的實用程序,這也是受支援的。 如果您使用 Ubuntu,您將需要該軟體包 libcap2-bin。 您還需要運行一個非古老的核心(從版本 2.6.24).

這些函數允許將權限與執行檔關聯起來,類似於設定 SUID 位,但僅限於一組特定的權限。 公用事業 setcap 用於新增和刪除檔案的權限。

第一步是選擇您需要的權限。 為了本文的目的,我假設有一個名為的網路診斷工具 tracewalk,應該能夠使用 原始套接字。 這通常需要應用程式以 root 身份運行,但是在查看時 清單 原來只需要許可 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強制其庫優先於系統庫被調用,因此可以使用與調用應用程式相同的權限執行自己的任意程式碼。

就這樣。 有關課程計劃的更多詳細信息,請訪問 網路研討會將於 24 月 XNUMX 日舉行。

來源: www.habr.com

添加評論