Linux Sudo 權限繞過漏洞安全通告

發布時間 2019-10-15

漏洞編號和級別


CVE編號:CVE-2019-14287,危險級別:高危,CVSS分值:官方未評定


影響版本


Sudo 1.8.28之前的所有版本


漏洞概述


Sudo 的全稱是“superuserdo”,它是Linux系統管理指令,允許用戶在不需要切換環境的前提下以其它用戶的權限運行應用程序或命令,通常是以 root 用戶身份運行命令,以減少 root 用戶的登錄和管理時間,同時提高安全性。


該漏洞是 sudo安全策略繞過問題,可導致惡意用戶或程序在目標 Linux 系統上以 root 身份執行任意命令,即使 “sudoers configuration” 明確禁止該 root訪問權限也不例外。


利用該漏洞要求用戶具有 sudo 權限,從而以任意用戶 ID 運行命令。一般而言,這意味著用戶的 sudoers 條目在 Runas 規范中具有特殊值 ALL。Sudo 支持在 sudoers 策略允許的情況下,以用戶指定的名稱或用戶 ID 運行命令。例如,如下 sudoers 條目允許 id 命令以任意用戶身份運行,因為它包含 Runas 規范中的關鍵字ALL。


myhost alice = (ALL) /usr/bin/id


用戶不僅能夠以其它合法用戶身份運行該 id 命令,還能使用 #uid 語法以任意用戶 ID 運行該命令,例如:


sudo -u#1234 id -u


將返回1234,然而,sudo 在運行命令前用戶修改用戶 ID 的setresuid(2) 和 setreuid(2)系統調用將特殊對待用戶 ID為-1(或其未簽名的等同值 4294967295)而且并不會修改該值的用戶 ID。因此,


sudo -u#-1 id -u



sudo -u#4294967295 id -u


實際上會返回 0。這是因為 sudo命令本身就已經以用戶 ID 為0 運行,因此當 sudo 試圖將用戶 ID 修改成 -1時,不會發生任何變化。這就導致 sudo 日志條目將該命令報告為以用戶 ID 為 4294967295而非 root (或者用戶ID為 0)運行命令。此外,由于通過–u 選項指定的用戶 ID 并不存在于密碼數據庫中,因此不會運行任何 PAM 會話模塊。


如果sudoers 條目被寫入允許用戶以除 root 身份以外的用戶身份運行命令,則可利用該 bug 繞過該限制。例如,給定如下 sudoers 條目:


myhost bob = (ALL, !root) /usr/bin/vi


用戶 bob 被允許以除了 root以外的其它用戶身份運行 vi。然而,由于存在該漏洞,bob 實際上能夠通過運行 sudo –u#-1 vi 的方式以 root 身份運行 vi,從而違反了安全策略。只有Runas 規范中存在關鍵字 ALL 的sudoers 條目受影響。例如,如下sudoers 條目并不受影響:


myhost alice = /usr/bin/id


在這個例子中,alice僅被允許以 root身份運行 id 命令。任何以其它用戶身份運行該命令的嘗試都將遭拒絕。


此漏洞是管理員在配置文件中用了ALL關鍵詞后造成的。但默認的sudo配置文件不受影響。


漏洞驗證


復現環境:




當/etc/sudoers文件存在如下形式的配置會導致漏洞的產生:





修復建議


官方已經推出安全更新,請更新至1.8.28版本:https://www.sudo.ws/download.html。


以下為各廠商給出的公告及建議:


Red Hat Enterprise Linux / CentOS

https://access.redhat.com/security/cve/CVE-2019-14287


Ubuntu

https://people.canonical.com/~ubuntu-security/cve/2019/CVE-2019-14287.html


SUSE / openSUSE

https://www.suse.com/security/cve/CVE-2019-14287.html


參考鏈接


https://www.sudo.ws/alerts/minus_1_uid.html