您好,登錄后才能下訂單哦!
本篇內容主要講解“Linux包管理器snap本地提權漏洞分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux包管理器snap本地提權漏洞分析”吧!
snap是一個Linux系統上的包管理軟件。在Ubuntu18.04后默認預安裝到了系統中。2019年2月13日,Chris Moberly公開了利用snap包管理工具的服務進程snapd中提供的REST API服務因對請求客戶端身份鑒別存在問題從而提權的漏洞細節。下面是利用已公開的exp進行提權成功后的截圖。
利用該漏洞可以讓普通用戶偽裝成root用戶向snapd提供的REST API發送請求。攻擊者利用精心構造的安裝腳本或Ubuntu SSO可以讓并不具有sudo權限的普通用戶獲得執行sudo的權限,從而獲得提升到root用戶權限的能力,達到本地提權的效果。
snapd是snap包管理器的一個服務進程。它以root用戶權限在后臺運行,并允許普通用戶以UNIX套接字的方式與其進行通信,并提供服務,其中一些特權操作需要鑒別用戶身份(uid)才能執行。其中獲取客戶端信息的代碼最終會使用ucrednetGet(如下)函數來獲取客戶端用戶id,在該函數中會把字符串remoteAddr按";"分割后尋找"uid="字符串來判斷當前用戶的uid,通常情況下,remoteAddr大致為“ pid=5100;uid=1002;socket=/run/snapd.socket;@”這樣的格式。從代碼邏輯可以看出,后面出現的"uid="結果會覆蓋前面得到的uid。攻擊者利用這一點即可通過構造UNIX socket綁定地址,例如"/tmp/sock;uid=0;"。達到偽裝root用戶發出請求的目的。進而通過snapd執行一些特權操作達到提權的目的。
func ucrednetGet(remoteAddr string) (pid uint32, uid uint32, socket string, err error) {
...
for _, token := range strings.Split(remoteAddr, ";") {
var v uint64
...
} else if strings.HasPrefix(token, "uid=") {
if v, err = strconv.ParseUint(token[4:], 10, 32); err == nil {
uid = uint32(v)
} else {
break
}
目前漏洞細節已經披露,官方也在2.37.1中予以修復。Ubuntu用戶可以通過apt update && apt-get install snap ,將snap升級至最新版本予以修復。
到此,相信大家對“Linux包管理器snap本地提權漏洞分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。