压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

Linux系統(tǒng)systemd-journald服務(wù)本地提權(quán)漏洞分析預(yù)警

摘要

Qualys安全公司在systemd-journald中發(fā)現(xiàn)了3個(gè)漏洞

  • CVE-2018-16864、CVE-2018-16865:內(nèi)存破壞
  • CVE-2018-16866:信息泄露(越界讀)

Qualys安全公司表示,利用CVE-2018-16865 和 CVE-2018-16866 ,在10分鐘左右獲取了運(yùn)行在i386體系結(jié)構(gòu)上的Linux的root權(quán)限,在70分鐘左右獲取了運(yùn)行在amd64體系結(jié)構(gòu)上的Linux的root權(quán)限(該EXP未發(fā)布)。如果systemd以-fstack-clash-protection標(biāo)志編譯,則漏洞無法利用(因?yàn)榉乐沽硕褩_突,通過下面的分析。就可以知道,漏洞利用的核心就是堆棧沖突)。

systemd-journald服務(wù)介紹

systemd-journald 是一個(gè)收集并存儲(chǔ)各類日志數(shù)據(jù)的系統(tǒng)服務(wù)。 它創(chuàng)建并維護(hù)一個(gè)帶有索引的、結(jié)構(gòu)化的日志數(shù)據(jù)庫, 并可以收集來自各種不同渠道的日志:

  • 通過 kmsg 收集內(nèi)核日志
  • 通過 libc 的 syslog接口收集系統(tǒng)日志
  • 通過本地日志接口 sd_journal_print 收集結(jié)構(gòu)化的系統(tǒng)日志
  • 捕獲服務(wù)單元的標(biāo)準(zhǔn)輸出(STDOUT)與標(biāo)準(zhǔn)錯(cuò)誤(STDERR)
  • 通過內(nèi)核審計(jì)子系統(tǒng)收集審計(jì)記錄

CVE-2018-16864

分析

函數(shù)dispatch_message_real()(journal/journald-server.c)通過將每個(gè)字段轉(zhuǎn)換為格式為“<field-name> = <field-value>”的字符串來寫入日志。這些字符串是使用basic/string-util.h中定義的strjoina()函數(shù)構(gòu)造的,其使用alloca()在棧上分配結(jié)果字符串。

如果攻擊者能夠通過構(gòu)造較長的字符串,來使得棧與其他內(nèi)存區(qū)域產(chǎn)生沖突,那么就有可能覆蓋其他區(qū)域的數(shù)據(jù),導(dǎo)致崩潰或代碼執(zhí)行。

在特殊的情況下,一個(gè)程序可能有一個(gè)很大的cmdline(可以通過/proc/<pid>/cmdline讀取)造成堆棧沖突,從而造成systemd-journald崩潰或代碼執(zhí)行。

enter description here

enter description here

利用

首先,從一個(gè)cmdline小的進(jìn)程,發(fā)送一個(gè)大的、優(yōu)先級(jí)高的消息給journald。這個(gè)消息強(qiáng)制一個(gè)大的寫 /var/log/journal/的操作(1MB與2MB之間),并強(qiáng)制創(chuàng)建一個(gè)短暫的線程調(diào)用fsync等待從內(nèi)存寫入磁盤的操作完成(重點(diǎn):該線程的棧區(qū)域是在mmap區(qū)域中分配)

接下來,創(chuàng)建一些進(jìn)程(32到64個(gè))寫大文件(1MB — 8MB)到 /var/tmp/中.這些進(jìn)程使得journald中調(diào)用fsync的線程能夠存活更久,讓我們更能容易利用該漏洞。

最后,通過一個(gè)進(jìn)程發(fā)送一個(gè)小的,低優(yōu)先級(jí)的消息到j(luò)ournald。其cmdline非常大的(128MB左右,為棧區(qū)與 mmap 區(qū)域的距離),使得調(diào)用alloca()函數(shù)時(shí),能夠覆蓋掉journald中調(diào)用fsync()線程的棧空間,從而造成代碼執(zhí)行。

CVE-2018-16865

分析

journal-file.c中的journal_file_append_entry()函數(shù)通過alloca()分配一個(gè)EntryItem結(jié)構(gòu)數(shù)組,其條目數(shù)可以由本地攻擊者控制。

通過直接訪問UNIX域套接字(默認(rèn)位于/run/systemd/journal/socket),攻擊者可以向套接字發(fā)送許多條目,從而使得 alloca() 函數(shù)分配EntryItem結(jié)構(gòu)數(shù)組覆蓋其他內(nèi)存區(qū)域。進(jìn)而造成systemd-journald崩潰或權(quán)限提升。

enter description here

利用

首先跳躍到libc的讀寫段并覆蓋一個(gè)函數(shù)指針。但是這并不簡單,從“for”循環(huán)(在journal_file_append_entry()中)調(diào)用的函數(shù)可能會(huì)破壞掉在目標(biāo)函數(shù)指針下方的字節(jié), 因此會(huì)覆蓋可能崩潰或死鎖的重要libc變量。因此,我們有時(shí)必須稍微改變我們的alloca()跳躍,以避免覆蓋這些重要變量。

我們想用另一個(gè)函數(shù)或ROP鏈的地址覆蓋我們的目標(biāo)函數(shù)指針,但不幸的是,在“for”循環(huán)中調(diào)用的函數(shù)的棧幀(在journal_file_append_entry()中)不包含我們控制的任何數(shù)據(jù)。但是,寫入alloca()ted“items”的64位“哈希”值是由jenkins_hashlittle2()生成的,這是一個(gè)非加密哈希函數(shù):我們可以很容易地找到一個(gè)短字符串哈希到指定值(將覆蓋我們的目標(biāo)函數(shù)指針的地址),也是valid_user_field()(或journal_field_valid())。

為了完成我們的利用,我們需要journald的棧指針,以及l(fā)ibc讀寫段中目標(biāo)函數(shù)指針的地址,因此我們需要一個(gè)信息泄露漏洞。

CVE-2018-16866

分析

journald-syslog.c中的syslog_parse_identifier()函數(shù)沒有正確解析以”:”結(jié)尾的日志字符串,返回超出原始字符串限制的指針。從而使得攻擊者可以利用該漏洞泄露systemd-journal進(jìn)程的內(nèi)存地址。

利用

從journald泄漏堆棧地址或mmap地址:

首先,發(fā)送一個(gè)較大的本地消息到/run/systemd/journal/socket中;journald會(huì)調(diào)用mmap(),將我們的消息映射到內(nèi)存,然后調(diào)用malloc()分配大量的iovec結(jié)構(gòu):大多數(shù)結(jié)構(gòu)指向我們已經(jīng)mmap()的消息,但是有少數(shù)指向棧(在 dispatch_message_real()).iovec數(shù)組的內(nèi)容在調(diào)用free()由heap hole保存(在journald 中處理完我們的消息后)

接下來,發(fā)送大量的syslog信息到/run/systemd/journal/dev-log;journald為了接受我們的大量消息,會(huì)調(diào)用realloc()從而獲取剛剛保存iovec數(shù)組的heap hole(其中仍然保存著mmap和棧指針)

最后,我們發(fā)送一個(gè)利用CVE-2018-16866的大型syslog消息: journald在其服務(wù)器緩沖區(qū)(在先前包含iovec數(shù)組的堆塊中)接收到大型消息,如果我們仔細(xì)選擇消息的大小,并將其結(jié)束符“:”放置在剩余的mmap或堆棧指針前面,然后我們可以泄漏這個(gè)指針(它被錯(cuò)誤地解讀為我們信息的正文)

CVE-2018-16865 與 CVE-2018-16866的結(jié)合造成任意代碼執(zhí)行

通過 CVE-2018-16866 我們可以獲得libc的地址,然后利用CVE-2018-16865我們可以改寫libc中的__free_hook函數(shù)指針為system函數(shù)的地址,從而造成任意代碼執(zhí)行。

詳細(xì)過程參考資料4

影響版本

CVE-2018-16864 于 2013 年 4 月引入(systemd v203),并在 2016 年 2 月可利用(systemd v230)。

CVE-2018-16865 于 2011 年 12 月引入(systemd v38),在 2013 年 4 月可利用(systemd v201)。

CVE-2018-16866 于 2015 年 6 月引入(systemd v221),于 2018 年 8 月無意中被修復(fù)。

已知受影響的Linux 發(fā)行版有:Debian,Red Hat,Ubuntu。請(qǐng)自行查看自己系統(tǒng)中的systemd版本是否受影響。

時(shí)間線

2018-11-26:Qualys安全公司向紅帽發(fā)送漏洞報(bào)告

2018-12-26:Qualys安全公司向linux-distros@…nwall.發(fā)送補(bǔ)丁

2019-01-09:Qualys安全公司協(xié)調(diào)發(fā)布時(shí)間

2019-01-16:360CERT發(fā)布預(yù)警分析

資料

1.CVE-2018-16864

https://bugzilla.redhat.com/show_bug.cgi?id=1653855

2.CVE-2018-16865

https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16865

3.CVE-2018-16866

https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16866

4.Openwall

https://www.openwall.com/lists/oss-security/2019/01/09/3

5.Stack Clash

https://www.qualys.com/2017/06/19/stack-clash/stack-clash.txt

原文鏈接:?https://www.anquanke.com/post/id/169761?

上一篇:提升DNS安全 限制DDoS攻擊

下一篇:利用分塊傳輸?shù)醮蛩蠾AF