請問自 macOS 10.11 開始引入的系統完整性保護(Rootless)的實現方式和優缺點?


謝邀。

————————

一句話總結,即使是root用戶,將無法對以下路徑有寫和執行許可權:

/System

/bin

/sbin

/usr (except /usr/local)

只有Apple自身簽名的軟體(含命令行工具)可以。

————————

詳細說明:

先簡單介紹一下OS X的許可權系統吧

OS X 的內核XNU,一個由Mach,BSD,IOKit混合的內核,所以它的許可權管理系統類似UNIX的BSD

簡單的小知識(用過Linux的可以跳過)

1. 一個用戶(user)對於一個文件有三種狀態,可讀(r)、可寫(w)、可執行(x),一個文件會有一個所屬用戶,所屬用戶組。還會有文件屬主許可權、同組用戶許可權、其他用戶許可權這三種標識符用來定義一個文件對一個用戶的許可權集合。

2. 為了達到多個用戶的許可權管理,每個用戶會在一個或者多個用戶組(group)中,一個用戶組可以有多個用戶

3. root用戶是一個特殊用戶(超級用戶),擁有對所有文件的rwx許可權(可讀可寫可執行)

4. UNIX系統是純粹基於文件的,換言之你的網路讀取,驅動程序,分區表什麼的其實都會以文件的形式存在

複雜的小知識

OS X 內置會有staff wheel admin這三種常見的用戶組,分別介紹一下

1. staff : 所有創建用戶都會屬於這個用戶組,提供最基本的對該用戶目錄~/*(/User/*)的rwx許可權,其他的一般只有r或者rx許可權。比如我建立一個用戶叫做lizhuoli,那麼我會在一個staff組裡面,對/User/lizhuoli/*有rwx許可權。

2. admin :默認創建的所有用戶也會屬於這個admin用戶組,在它裡面的用戶可以通過

su

或者

sudo

切換到root用戶,只要執行以後輸入這個用戶的密碼即可,而不需要知道root密碼。

3. wheel :唯一只擁有一個用戶root,意思是root用戶的專屬用戶組。

小說明

1. 以前

在OS X 10.11之前的版本,你一旦創建一個用戶,那麼你就自動屬於staff和admin用戶組,這樣,你要執行一個高許可權操作,比如安裝一些.pkg文件,需要對/System、/Library、/usr等文件夾的寫入許可權(一般是安裝那種高許可權程序,比如JDK會默認安裝在/Library/Java中),就會提示你輸入當前用戶的密碼,這時候系統會自動切換到root用戶執行,然後執行完切換回來(終端執行sudo xxx同理)

舉個例子:

lizhuolideMacBook:~ lizhuoli$ groups
staff everyone localaccounts _appserverusr admin
...

這樣就存在一個問題,一旦你的Mac的某一個用戶密碼被盜取,那麼黑客就擁有了root賬戶的許可權,甚至可以改動你的其他用戶,這是有潛在風險的。而且更可怕有些惡意軟體先引誘你打開允許任何來源,然後再彈窗讓你授權以管理員許可權,它就相當於一個root用戶可以為所欲為了~比如偷偷的加幾個進程監聽你的所有網路鏈接呀,劫持鍵盤輸入呀~各種……

2. 現在

OS X 10.11 加入了Rootless,默認創建的用戶還是屬於admin用戶組,也能切換到root用戶,但是加以了限制,結果是一旦你執行su 或者 sudo切換到root用戶

你的這個root用戶不再是真正的root用戶(對所有文件有rwx)

你的這個root用戶不再是真正的root用戶(對所有文件有rwx)

你的這個root用戶不再是真正的root用戶(對所有文件有rwx)

重要的話說三遍!

bash-3.2# whoami
root
touch /usr/test
touch: test: Operation not permitted

現在你雖然用 whoami 看到自己明明是root用戶了,但是不能有對/System /usr等文件夾的寫入許可權,甚至將一些原來的所屬用戶組為admin的文件夾的許可權全部改為了wheel(比如對/usr/local,在10.11之前都是屬於當前用戶:admin用戶組的,啟用Rootless會變成root:wheel)。這樣防止了黑客入侵,病毒修改,一些惡意軟體的篡改文件許可權的行為。(不過話說Homebrew — The missing package manager for OS X應該也要更新了,因為Rootless下面Homebrew的安裝路徑/usr/local都是root:wheel的……)

當然,你也可以禁用Rootless,不過這就多了一份被惡意軟體攻擊的潛在威脅。建議此時打開Mac App Store 和被認可的開發者或者純粹的Mac App Store限制。

小結論

嘛,防止了大部分惡意軟體想通過單純的引導用戶,輸入自己的密碼點擊確定來直接切換到root做一些違法的事情。也可以防止黑客黑了一個用戶然後就有root許可權可以肆意妄為的情況,不過對於真正的黑客來說


防止用戶誤操作,或者防止一些軟體能直接獲取到root許可權對系統造成危害。

說白了就是不想讓用戶去碰涉及系統內核的一些東西。把用戶當傻子培養是蘋果一貫策略。

sudo和su到root許可權都不能對一些文件造成更改了。

想更改也很簡單。重啟,開機按住cmd+r,進入恢復模式的終端。然後使用命令csrutil disable關閉rootless。


我翻譯了一下Quora上Eldad Eilam 的回答,原文Can someone elaborate on the OS X 10.11 feature called "rootless"?

定義問題

Rootless討論的前提是假定root賬戶是OS X(或者其他Unix系統)中對抗惡意程序保護操作系統的最後一道防線。意思是一個應用程序一旦獲得了root賬戶許可權,將會獲得系統的無限的許可權。就可以進行實時修改、修改磁碟、替換任何系統文件等。

目前,許多傳統的Unix操作系統中,root賬戶都是被強密碼保護著的。這裡的問題在於大部分的OS X系統基本上是單用戶系統,也就是不存在單獨的root賬戶密碼,root密碼就是管理員賬戶的密碼。簡單來說,蘋果通過以下途徑來獲取root許可權:

大部分用戶會毫不猶豫的輸入密碼,都不會想他們到底授權了什麼行為。更重要的是,授權給了什麼應用程序。可以說,對於一般的無經驗用戶,他們沒有時間和專業知識來考慮這個問題。他們不會意識到他們一旦輸入了密碼,請求的進程就會獲得root許可權。

什麼是系統集成保護(System Integrity Protection)?

使用了系統集成保護,蘋果決定第三方應用有一些永遠不會被允許的事情。從某些層面來講,這種保護和iOS更像了。第三方應用相比起來更受限制。這就是rootless一詞的由來,系統在某種程度上限制了管理員賬號的許可權。

rootless特性使得某些操作只有蘋果的應用可以被許可(通過代碼簽名來判斷)。所以第三方應用即使是運行在root許可權中,有一些操作也無法完成。在我的測試中我注意到了以下幾點:

  1. /System文件夾下的所有文件都不能被蘋果應用意外的程序修改(例如各種安裝器和升級部件)
  2. 當前的API例如task_for_pid不能在系統進程下被調用了。這意味著以前注入系統進程(Finder、Messages或者系統內核)的程序都不能用了。
  3. 有意思的是,rootless依然允許已簽名的KEXT內核拓展被載入。問題是KEXT可以進行許多無限制的系統及操作。

總結

Rootless機制的目的很明顯是改進安全性和可靠性,使得惡意軟體以及木馬很難滲透進系統。我很確信他將成為許多惡意軟體開發者的一個挑戰,不過我也很確定人們會發現這一機制很多薄弱的環節。

這個特性對於一些合法的軟體有很多副作用。對此,蘋果提供了一種方法使得用戶可以關閉這個特性,但這需要用戶以恢復模式啟動(開機按住Command+R)

如果想了解更多,可以參考蘋果的WWDC session視頻。


rootless 違反了FreeBSD的精神,不過蘋果估計也是為了保護用戶吧


推薦閱讀:

這些小技巧讓你的Mac用得更順手(三)| Mac小技巧
「MacBetter」主編使用頻次最高的 20 個 OS X 應用 - 開發者篇
Office for Mac 2016 不兼容 OS X El Capitan,這鍋該誰背?

TAG:Mac | macOS | 蘋果公司AppleInc | Rootless |