偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一個(gè)整數(shù)+1,攻破了Linux內(nèi)核!

系統(tǒng) Linux
在IDT表項(xiàng)中拆分成三部分存儲(chǔ)。高32位平時(shí)都是0xFFFFFFFF,指向的是咱們內(nèi)核空間中的中斷處理函數(shù)?,F(xiàn)在變成了0x00000000,那整個(gè)函數(shù)入口地址不就指向了用戶(hù)態(tài)地址空間了嗎?

帝國(guó)危機(jī)

夜幕降臨,喧囂褪去,繁忙的Linux帝國(guó)漸漸平靜了下來(lái),誰(shuí)也沒(méi)有想到,一場(chǎng)危機(jī)正在悄然而至......

“咚咚!”,帝國(guó)安全部長(zhǎng)辦公室的敲門(mén)聲,打破了夜晚的寧?kù)o。

“部長(zhǎng),剛剛發(fā)現(xiàn)有程序在修改passwd文件”,原來(lái)是文件系統(tǒng)部門(mén)的小黑到訪(fǎng)。

安全部長(zhǎng)眉頭一緊,這passwd文件可非比尋常,里面記錄了系統(tǒng)中所有用戶(hù)的信息,但0.1ms之后,緊鎖的眉頭便舒展開(kāi)來(lái)。

“這有什么大驚小怪的?只要有root權(quán)限,這是允許的嘛!”,安全部長(zhǎng)沒(méi)有抬頭,繼續(xù)看著每天的系統(tǒng)日志。

“部長(zhǎng),重點(diǎn)在于這程序不是從系統(tǒng)調(diào)用進(jìn)入內(nèi)核,而是從中斷入口進(jìn)來(lái)的”

安全部長(zhǎng)愣了一下,約莫0.2ms之后,放下了手里的日志,站了起來(lái)。

“你是說(shuō),他是通過(guò)中斷描述符表(IDT)進(jìn)來(lái)的?”

小黑點(diǎn)了點(diǎn)頭。

圖片

“小王,你趕緊跟他過(guò)去IDT看一下,調(diào)查清楚速來(lái)報(bào)我”,部長(zhǎng)對(duì)著一旁的助理說(shuō)到。

助理點(diǎn)了點(diǎn)頭,準(zhǔn)備出發(fā),剛走到門(mén)口,又被部長(zhǎng)叫住了。

“等等!此事非同小可,我還是親自去一趟吧”

IDT修改謎案

安全部長(zhǎng)隨即出發(fā),來(lái)到IDT所在的地方,這里一切如舊,未見(jiàn)有何異樣。

部長(zhǎng)指著這中段描述符表問(wèn)道:“他是從哪道門(mén)進(jìn)來(lái)的?”

“4號(hào)”,這時(shí),看守IDT大門(mén)的白發(fā)老頭聞?dòng)嵶吡诉^(guò)來(lái)回答到。

“奇怪了,IDT表中的函數(shù)入口,都是我們操作系統(tǒng)安排好了的,講道理沒(méi)有哪一個(gè)會(huì)去修改passwd文件才對(duì)”,部長(zhǎng)看著這些表項(xiàng),低頭自語(yǔ)。

圖片

“部長(zhǎng),這我得跟您匯報(bào)一下,那小子進(jìn)來(lái)之前,把第四項(xiàng)的入口地址高32位改成了0x00000000,進(jìn)來(lái)之后他才給恢復(fù)成了0xFFFFFFFF”,老頭說(shuō)完,拿出了IDT表項(xiàng)的結(jié)構(gòu)圖展了開(kāi)來(lái):

圖片

部長(zhǎng)聽(tīng)完猛的一抬頭,“這入口地址是64位的,在IDT表項(xiàng)中拆分成三部分存儲(chǔ)。高32位平時(shí)都是0xFFFFFFFF,指向的是咱們內(nèi)核空間中的中斷處理函數(shù)。現(xiàn)在變成了0x00000000,那整個(gè)函數(shù)入口地址不就指向了用戶(hù)態(tài)地址空間了嗎?”

小黑和助理都不敢說(shuō)話(huà),大家都知道這后果有多嚴(yán)重,天知道那家伙利用內(nèi)核權(quán)限執(zhí)行了用戶(hù)空間的什么代碼。

“不對(duì),在他進(jìn)來(lái)之前,一個(gè)用戶(hù)空間的程序怎么能改IDT的內(nèi)容呢?他沒(méi)權(quán)限訪(fǎng)問(wèn)才對(duì),你是不是看錯(cuò)了?”

“我沒(méi)有看錯(cuò),他改的是時(shí)候,我還特地留意了一下他的調(diào)用堆棧,不是在用戶(hù)空間,是從內(nèi)核空間的函數(shù)——perf_swevent_init方向來(lái)的”,老頭說(shuō)到。

整數(shù)+1的悲劇

部長(zhǎng)二話(huà)沒(méi)說(shuō),又帶著大家直奔perf_swevent_init函數(shù)而去。

圖片

“老伯,您可還記得具體是哪個(gè)位置?”,部長(zhǎng)問(wèn)到。

“就是從那個(gè)19行那個(gè)static_key_slow_inc函數(shù)過(guò)來(lái)的”

圖片

“讓我看一下”,助理擠到前面來(lái),想在部長(zhǎng)面前露一手。

“嗯,這個(gè)static_key_slow_inc?做的事情是把一個(gè)整數(shù)執(zhí)行了原子+1操作。不過(guò)它操作的是perf_swevent_enabled數(shù)組,跟IDT八桿子打不到一塊兒去,怎么能修改到IDT呢?”,助理摸了摸頭,往后退了兩步,瞧著是沒(méi)看出什么問(wèn)題。

“不見(jiàn)得!”,部長(zhǎng)仍然是緊鎖著眉頭,開(kāi)口說(shuō)到,“你們看,它是通過(guò)event_id這個(gè)數(shù)字作為下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)組元素,要是這個(gè)event_id出錯(cuò)訪(fǎng)問(wèn)越界,指向IDT,也不是沒(méi)有可能?。 ?/p>

助理趕緊掃了一眼event_id,隨后便露出了失望的表情,“不會(huì)的,第9行有檢查,你看,超過(guò)8以后就會(huì)通不過(guò)檢查”

圖片

圖片

線(xiàn)索在這里被切斷了,本來(lái)指望在perf_swevent_init這個(gè)函數(shù)這里尋找IDT被修改之謎,看來(lái)要無(wú)功而返了。

不知不覺(jué),時(shí)間已經(jīng)很晚了,部長(zhǎng)一行決定先回去,再?gòu)拈L(zhǎng)計(jì)議。

部長(zhǎng)走了幾步,見(jiàn)助理沒(méi)有跟上來(lái),便回頭叫了他一聲。

“部長(zhǎng)請(qǐng)留步,我好像感覺(jué)哪里不太對(duì)勁”,助理此刻也皺起了眉頭。

“你發(fā)現(xiàn)了什么?”,部長(zhǎng)和小黑他們又走了回來(lái)。

“部長(zhǎng),你看第3行,這個(gè)event_id?是一個(gè)int型的變量,也就是說(shuō)這是一個(gè)有符號(hào)數(shù)。”,助理說(shuō)到。

“有符號(hào)數(shù)怎么了?”,小黑也忍不住開(kāi)口問(wèn)了。

“如果······”

“如果?event_id變成了一個(gè)負(fù)數(shù),它將能越界訪(fǎng)問(wèn)數(shù)組,并且還能通過(guò)第9行的大小檢查!”,沒(méi)等助理說(shuō)完,部長(zhǎng)道破了玄機(jī)!

眾人再一次將目光聚集在了這個(gè)event_id?上,打算看一下第三行給它賦值的event->attr.config是個(gè)什么來(lái)頭。

首先是perf_event?中的attr成員變量:

struct perf_event {
// ...
struct perf_event_attr attr;
// ...
};

接著是perf_event_attr?中的config成員變量:

struct perf_event_attr {
// ...
__u64 config;
// ...
};

看到最后,部長(zhǎng)和助理都倒吸了一口涼氣,這config?竟然是個(gè)64位無(wú)符號(hào)整數(shù),把它賦值給一個(gè)int型變量不出問(wèn)題就怪了!

見(jiàn)大家都不說(shuō)話(huà),小黑撓了撓頭,弱弱的問(wèn)到:“怎么了,你們?cè)趺炊疾徽f(shuō)話(huà),這有什么問(wèn)題嗎?”

助理把小黑拉到一邊,“問(wèn)題大了,你看我要是把一個(gè)值為0xFFFFFFFF的config?賦值給event_id,event_id會(huì)變成什么?”

“負(fù),負(fù),負(fù)1?”

圖片

“沒(méi)錯(cuò),有符號(hào)數(shù)的最高位是用來(lái)標(biāo)記正負(fù)的,如果這個(gè)config最高位為1,后面的位經(jīng)過(guò)精心設(shè)計(jì),不僅能瞞天過(guò)海騙過(guò)那里第9行的驗(yàn)證,還能將某個(gè)位置的數(shù)字進(jìn)行一個(gè)原子+1操作?!?,助理繼續(xù)說(shuō)道。

“不錯(cuò)嘛小王,有進(jìn)步!”,不知何時(shí)部長(zhǎng)也走了過(guò)來(lái),被部長(zhǎng)這么一夸,助理都有些不好意思了。

“聽(tīng)了半天,不就是越界把某個(gè)地方的數(shù)加了1嘛,有什么大不了的?”,小黑一臉不屑的樣子。

助理一聽(tīng)連連搖頭,“你可不要小瞧了這個(gè)加1的行為,要是加在某些敏感的地方,那可是要出大事的!“

小黑有些疑惑,“比如說(shuō)呢?”

“比如記錄中斷和異常的處理函數(shù)的IDT?,又比如記錄系統(tǒng)調(diào)用的sys_call_table,這些表中的函數(shù)地址都位于帝國(guó)內(nèi)核空間,要是這個(gè)加1,加的不是別人,而是這些表中的函數(shù)地址,那可就麻煩了?!?,助理繼續(xù)說(shuō)到。

“我聽(tīng)明白了,可是就算加個(gè)1,也應(yīng)該不是什么大問(wèn)題吧?”

助理嘆了口氣,“看來(lái)你還是不明白,我以這次被修改的IDT表為例,給大家再看一下表中的表項(xiàng)——中斷描述符的格式”

圖片

“IDT中的中斷/異常處理函數(shù)的地址不是一個(gè)完整的64位,而是拆成了幾部分,其中高32位我給大家紅色標(biāo)示出來(lái)了,在64位Linux帝國(guó),內(nèi)核空間的地址高32位都是0xFFFFFFFF,如果······”

“如果利用前面的event_id數(shù)組下標(biāo)越界訪(fǎng)問(wèn),把這個(gè)地方原子+1,那就變成了0,對(duì)不對(duì)?”,小黑總算明白了。

真相大白

安全部長(zhǎng)為助理的精彩分析鼓起了掌,“不錯(cuò)不錯(cuò),大家都很聰明!事到如今,我們來(lái)復(fù)盤(pán)一下吧!”

第一步:精心設(shè)計(jì)一個(gè)config值,從應(yīng)用層傳入內(nèi)核空間的perf_swevent_init函數(shù)

第二步:利用內(nèi)核漏洞,把一個(gè)64位無(wú)符號(hào)數(shù)賦值給一個(gè)int型變量,導(dǎo)致變量溢出為一個(gè)負(fù)數(shù)。

第三步:利用溢出的event_id越界訪(fǎng)問(wèn)perf_swevent_enabled,指向IDT的表項(xiàng),將第四項(xiàng)中斷處理函數(shù)的高32位進(jìn)行原子+1

第四步:修改后的中斷處理函數(shù)指向了用戶(hù)空間,提前在此安排惡意代碼

第五步:應(yīng)用層執(zhí)行int 4匯編指令,觸發(fā)4號(hào)中斷,線(xiàn)程將進(jìn)入內(nèi)核空間,以至高權(quán)限執(zhí)行提前安排的惡意代碼。

事情總算是水落石出,安全部長(zhǎng)回去之后就把這問(wèn)題上報(bào),修復(fù)了這個(gè)漏洞,將event_id?的類(lèi)型從int?修正為u64,這一次的危機(jī)總算解除了。

責(zé)任編輯:武曉燕 來(lái)源: 編程技術(shù)宇宙
相關(guān)推薦

2021-06-11 17:12:25

勒索軟件攻擊數(shù)據(jù)泄露

2020-11-10 07:11:23

Linux內(nèi)核補(bǔ)丁

2021-03-22 09:57:51

AI 數(shù)據(jù)人工智能

2021-05-26 07:53:58

Linux運(yùn)維Linux系統(tǒng)

2009-09-11 08:44:36

2023-02-27 12:53:14

Linux內(nèi)核

2021-02-20 11:34:43

Linux內(nèi)核指針

2021-07-06 14:36:05

RustLinux內(nèi)核模塊

2023-07-25 15:17:38

Linux操作系統(tǒng)開(kāi)發(fā)

2025-05-15 14:37:17

AI生成模型

2011-09-30 14:02:36

2018-10-15 10:10:41

Linux內(nèi)核補(bǔ)丁

2009-08-18 11:01:51

2017-05-18 16:52:44

阿里云人工智能NASA計(jì)劃

2013-11-05 09:58:39

Linux內(nèi)核

2023-09-28 13:21:32

2014-07-24 14:35:26

Linux內(nèi)核模塊

2021-03-11 12:19:39

Linux運(yùn)維Linux系統(tǒng)

2025-05-15 09:12:27

2025-03-07 08:30:00

pwruLinux網(wǎng)絡(luò)包追蹤
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)