日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分析|CVE-2021-3156-sudo堆溢出高危漏洞

發布時間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析|CVE-2021-3156-sudo堆溢出高危漏洞 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編輯前言

Qualys的安全研究人員于1月13日發文稱,攻擊者無需知道用戶密碼即可成功利用此漏洞,在眾多基于 Linux 的發行版本中獲得最高的 root 權限。受影響的 Sudo 漏洞版本包括從 1.8.2 到 1.8.32p2 的經典版本,以及從 1.9.0 到 1.9.5p1 所有穩定版本。

調試方式

首先從github下載代碼:

https://github.com/sudo-project/sudo/archive/SUDO_1_9_5p1.tar.gz

編譯

tar xf sudo-SUDO_1_9_5p1.tar.gz cd sudo-SUDO_1_9_5p1/ mkdir build cd build/ ../configure --enable-env-debug make -j sudo make install

調試(請以root方式執行gdb)

gdb --args sudoedit -s '\' `perl -e 'print "A" x 65536'`

gdb加載執行后進程會crash,這時候就可以對有漏洞的源碼位置下斷點,因為漏洞diamante貌似是動態加載的,直接下斷點下不到,crash之后就可以下了

斷點命令:

b ../../../plugins/sudoers/sudoers/sudoers.c:964 b ../../../plugins/sudoers/sudoers/sudoers.c:978

漏洞成因

調試用poc:

sudoedit -s '\' 112233445566

?

漏洞位于 set_cmnd 函數中,關鍵代碼如下:

/* Alloc and build up user_args */ for (size = 0, av = NewArgv + 1; *av; av++) size += strlen(*av) + 1;if (size == 0 || (user_args = malloc(size)) == NULL) {if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) {for (to = user_args, av = NewArgv + 1; (from = *av); av++) {while (*from) {if (from[0] == '\\' && !isspace((unsigned char)from[1])) //關鍵邏輯!!!from++;*to++ = *from++;}*to++ = ' ';}*--to = '\0';}

進入該函數時NewArgv的結構如下:

NewArgv[0]: sudoexit

NewArgv[1]: \

NewArgv[2]: 112233445566

首先會計算NewArgv 1-2兩個參數的長度 2 + 13 = 15.

因此user_args分配的內存大小為 15 字節。

然后會把NewArgv 1-2的數據拷貝到user_args里面。

拷貝過程中如果from[0]為\,且from[1]不是空格就會from++。

if (from[0] == '\\' && !isspace((unsigned char)from[1])) //關鍵邏輯!!!from++;

所以在處理NewArgv[1]時,from[0]就是\,from[1]為\x00,會通過這個判斷讓from++,然后后面會再次from++。

*to++ = *from++;

之后from就指向了NewArgv[1]字符串\x00后面一個字符的位置,我們看看調試時NewArgv[1]后面是什么。

可以看到NewArgv[1]?(0x5c 0x00)后面緊跟著的是NewArgv[2](?0x31 0x31 ...),所以此時 from 執行的就是 NewArgv[2]?的開頭。

?

從而會再次進入while循環把NewArgv[2]拷貝到user_args。

?

然后處理NewArgv[2]會再次把NewArgv[2]拷貝到user_args。

?

因此最終結果就是 NewArgv[2]?被拷貝了兩次,實際的寫入數據長度為26字節。

這個漏洞是一個堆溢出,不過寫的數據需要是非\x00,如果user_args分配的內存比較小(比如15字節)的話,其后面是unsorted bin,如果分配的比較大的話(使用原始的poc)其后面跟的是top chunk,感覺都不是很好利用。

感覺需要花一些事件捋一捋代碼的邏輯,看看有沒有什么其他的想法。

修改NewArgv[1]和NewArgv[2]的長度可以控制user_args堆塊后面的空閑堆塊的大小。

此外到達漏洞代碼的poc構造過程也很精彩,這部分可以去發布漏洞的博客查看。

參考鏈接:

https://blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit

總結

以上是生活随笔為你收集整理的分析|CVE-2021-3156-sudo堆溢出高危漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。