權限提升(privilege escalation)
想像一名上班族,本應只能用自己的辦公桌。權限提升就是這名員工找到拿到萬能鑰匙的辦法的那一刻——也許某道門被頂著開、也許警衛能被騙——於是他突然走進高階主管套房、檔案室、任何地方。在電腦裡也一樣:一個一開始只有有限權限的攻擊者,利用某個瑕疵取得了他本不該擁有的更高權限,往往一路升到完整的管理員或核心控制。
它有兩種風味。垂直提升是爬到更有權力的層級——一般使用者變成 root 或管理員,或使用者模式的程式碼奪得核心控制。水平提升是橫向移動到同一層級的另一個帳號——藉由冒充另一名使用者去讀他的私密檔案。垂直那種通常是大獎,因為 root 或核心權限意味著攻擊者無所不能:關掉防禦、讀光所有資料、裝後門程式、長期潛伏。提升通常會接續在更早的立足點之上:攻擊者先讓某段低權限程式碼跑起來(譬如透過木馬,或網路服務裡的緩衝區溢位),再用第二個臭蟲——一個有瑕疵的 setuid 程式、一個核心漏洞、一個設定錯的權限——從那個立足點提升到完整控制。這正是為什麼最小權限原則如此核心:若每個元件都只用它所需的最小權力執行,那麼攻破其中一塊的攻擊者所得甚少,能利用的提升路徑也少得多。
權限提升是多數嚴重入侵的關鍵樞紐,因為「初始存取」本身往往幾乎無害——損害是在攻擊者提升之後才來。對防守者誠實的一點是:提升類臭蟲到處都有、又很容易被低估:一個有瑕疵的 setuid 執行檔、一個有記憶體臭蟲的核心驅動程式、或一條過於寬鬆的 sudo 規則,都可能把鑰匙交給攻擊者。縮小攻擊面(更少的特權程式)、即時修補、沙盒,以及連 root 都能加以限制的強制存取控制框架,存在的目的都是讓「從立足點到控制」這關鍵的第二步盡可能困難。
攻擊者利用網頁伺服器的臭蟲,落腳成低權限的 www-data 使用者——他能做的事不多。接著他利用一個核心漏洞以 root 身分執行程式碼:現在他能讀每一個檔案、關掉記錄、裝後門程式。第一個臭蟲是立足點;第二個是讓它變得危險的提升。
立足點加提升:是第二步把「存取」變成了「控制」。
初始存取本身往往幾乎無害;真正的損害來自隨後的提升。這正是為什麼最小權限如此重要——它同時縮小了「一個立足點能換得什麼」以及「往上的路徑有幾條」。