學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>Linux教程>

linux操作系統(tǒng)漏洞

時(shí)間: 春健736 分享

  與Windows相比,Linux被認(rèn)為具有更好的安全性和其他擴(kuò)展性能。這些特性使得Linux在操作系統(tǒng)領(lǐng)域異軍突起,得到越來(lái)越多的重視。隨著Linux應(yīng)用量的增加,其安全性也逐漸受到了公眾甚或黑客的關(guān)注。那么,Linux是否真的如其支持廠商們所宣稱的那樣安全呢?下面大家與學(xué)習(xí)啦小編一起來(lái)學(xué)習(xí)一下吧。

  linux操作系統(tǒng)漏洞

  NTP安全漏洞

  在linux系統(tǒng)中NTP是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議,它可以使計(jì)算機(jī)對(duì)其服務(wù)器或時(shí)鐘源了,但有網(wǎng)友發(fā)現(xiàn)ntp存在安全問(wèn)題。

  CVE-2013-5211最早公布是2014年1月10日,由于NTP本身不會(huì)驗(yàn)證發(fā)送者的源ip地址。這就類似于DNS解析器使用的DRDoS(分布式反射型拒絕服務(wù)攻擊)。攻擊者HACK發(fā)送了一個(gè)偽造報(bào)文發(fā)送給NTP服務(wù)器Server A,將數(shù)據(jù)包中的源ip地址改成了受害者Client A的ip地址。NTP服務(wù)器Server A會(huì)響應(yīng)這個(gè)請(qǐng)求,相對(duì)于初始請(qǐng)求,響應(yīng)包發(fā)送的字節(jié)數(shù)是一個(gè)被放大的量,導(dǎo)致受害者Client A被dos攻擊。最高的兩個(gè)消息類型:REQ_MON_GETLIST 和REQ_MON_GETLIST_1,通過(guò)高達(dá)3660和5500的一個(gè)因素分別放大原始請(qǐng)求。

  【解決方案】:

  放大反射dos攻擊由CVE-2013-5211所致。且這漏洞是與molist功能有關(guān)。Ntpd4.2.7p26之前的版本都會(huì)去響應(yīng)NTP中的mode7“monlist”請(qǐng)求。ntpd-4.2.7p26版本后,“monlist”特性已經(jīng)被禁止,取而代之的是“mrulist”特性,使用mode6控制報(bào)文,并且實(shí)現(xiàn)了握手過(guò)程來(lái)阻止對(duì)第三方主機(jī)的放大攻擊。

  操作步驟:

  echo "disable monitor" >> /etc/ntp.conf

  重啟ntp服務(wù)

  驗(yàn)證:

  運(yùn)行 # ntpdc

  ntpdc> monlist

  ***Server reports data not found

  ntpdc>

  此時(shí)monlist已經(jīng)被禁止了,也不會(huì)影響其時(shí)間同步 ?;蛘咴谂渲梦募性黾右韵聝尚胁⒅貑tp服務(wù):

  restrict default kod nomodify notrap nopeer noquery

  restrict -6 default kod nomodify notrap nopeer noquery

  Linux操作系統(tǒng)內(nèi)核漏洞問(wèn)題

權(quán)限提升類漏洞

  一般來(lái)說(shuō),利用系統(tǒng)上一些程序的邏輯缺陷或緩沖區(qū)溢出的手段,攻擊者很容易在本地獲得Linux服務(wù)器上管理員權(quán)限r(nóng)oot;在一些遠(yuǎn)程的情況下,攻擊者會(huì)利用一些以root身份執(zhí)行的有缺陷的系統(tǒng)守護(hù)進(jìn)程來(lái)取得root權(quán)限,或利用有缺陷的服務(wù)進(jìn)程漏洞來(lái)取得普通用戶權(quán)限用以遠(yuǎn)程登錄服務(wù)器。目前很多Linux服務(wù)器都用關(guān)閉各種不需要的服務(wù)和進(jìn)程的方式來(lái)提升自身的安全性,但是只要這個(gè)服務(wù)器上運(yùn)行著某些服務(wù),攻擊者就可以找到權(quán)限提升的途徑。下面是一個(gè)比較新的導(dǎo)致權(quán)限提升的漏洞。

  do_brk()邊界檢查不充分漏洞在2003年9月份被Linux內(nèi)核開(kāi)發(fā)人員發(fā)現(xiàn),并在9月底發(fā)布的Linux kernel 2.6.0-test6中對(duì)其進(jìn)行了修補(bǔ)。但是Linux內(nèi)核開(kāi)發(fā)人員并沒(méi)有意識(shí)到此漏洞的威脅,所以沒(méi)有做任何通報(bào),一些安全專家與黑客卻看到了此漏洞蘊(yùn)涵的巨大威力。在2003年11月黑客利用rsync中一個(gè)未公開(kāi)的堆溢出與此漏洞配合,成功地攻擊了多臺(tái)Debian與Gentoo Linux的服務(wù)器。

  下面讓我們簡(jiǎn)單描述一下該漏洞。該漏洞被發(fā)現(xiàn)于brk系統(tǒng)調(diào)用中。brk系統(tǒng)調(diào)用可以對(duì)用戶進(jìn)程的堆的大小進(jìn)行操作,使堆擴(kuò)展或者縮小。而brk內(nèi)部就是直接使用do_brk()函數(shù)來(lái)做具體的操作, do_brk()函數(shù)在調(diào)整進(jìn)程堆的大小時(shí)既沒(méi)有對(duì)參數(shù)len進(jìn)行任何檢查(不檢查大小也不檢查正負(fù)),也沒(méi)有對(duì)addr+len是否超過(guò)TASK_SIZE做檢查。這樣我們就可以向它提交任意大小的參數(shù)len,使用戶進(jìn)程的大小任意改變以至可以超過(guò)TASK_SIZE的限制,使系統(tǒng)認(rèn)為內(nèi)核范圍的內(nèi)存空間也是可以被用戶訪問(wèn)的,這樣的話普通用戶就可以訪問(wèn)到內(nèi)核的內(nèi)存區(qū)域。通過(guò)一定的操作,攻擊者就可以獲得管理員權(quán)限。這個(gè)漏洞極其危險(xiǎn),利用這個(gè)漏洞可以使攻擊者直接對(duì)內(nèi)核區(qū)域操作,可以繞過(guò)很多Linux系統(tǒng)下的安全保護(hù)模塊。

  此漏洞的發(fā)現(xiàn)提出了一種新的漏洞概念,即通過(guò)擴(kuò)展用戶的內(nèi)存空間到系統(tǒng)內(nèi)核的內(nèi)存空間來(lái)提升權(quán)限。當(dāng)發(fā)現(xiàn)這種漏洞時(shí),通過(guò)研究我們就認(rèn)為內(nèi)核中一定還會(huì)存在類似的漏洞,果然幾個(gè)月后黑客們又在Linux內(nèi)核中發(fā)現(xiàn)與brk相似的漏洞。通過(guò)這次成功的預(yù)測(cè),更證實(shí)了對(duì)這種新型的概念型漏洞進(jìn)行研究很有助于安全人員在系統(tǒng)中發(fā)現(xiàn)新的漏洞。

  拒絕服務(wù)類漏洞

  拒絕服務(wù)攻擊是目前比較流行的攻擊方式,它并不取得服務(wù)器權(quán)限,而是使服務(wù)器崩潰或失去響應(yīng)。對(duì)Linux的拒絕服務(wù)大多數(shù)都無(wú)須登錄即可對(duì)系統(tǒng)發(fā)起拒絕服務(wù)攻擊,使系統(tǒng)或相關(guān)的應(yīng)用程序崩潰或失去響應(yīng)能力,這種方式屬于利用系統(tǒng)本身漏洞或其守護(hù)進(jìn)程缺陷及不正確設(shè)置進(jìn)行攻擊。

  另外一種情況,攻擊者登錄到Linux系統(tǒng)后,利用這類漏洞,也可以使系統(tǒng)本身或應(yīng)用程序崩潰。這種漏洞主要由程序?qū)σ馔馇闆r的處理失誤引起,如寫臨時(shí)文件之前不檢查文件是否存在,盲目跟隨鏈接等。

  下面,我們簡(jiǎn)單描述一下Linux在處理intel IA386 CPU中的寄存器時(shí)發(fā)生錯(cuò)誤而產(chǎn)生的拒絕服務(wù)漏洞。該漏洞是因?yàn)镮A386多媒體指令使用的寄存器MXCSR的特性導(dǎo)致的。由于IA386 CPU規(guī)定MXCSR寄存器的高16位不能有任何位被置位,否則CPU就會(huì)報(bào)錯(cuò)導(dǎo)致系統(tǒng)崩潰。為了保證系統(tǒng)正常運(yùn)轉(zhuǎn),在linux系統(tǒng)中有一段代碼專門對(duì)MXCSR的這個(gè)特性作處理,而這一段代碼在特定的情況下會(huì)出現(xiàn)錯(cuò)誤,導(dǎo)致MXCSR中的高16位沒(méi)有被清零,使系統(tǒng)崩潰。如果攻擊者制造了這種“極限”的內(nèi)存情況就會(huì)對(duì)系統(tǒng)產(chǎn)生DoS效果。

  攻擊者通過(guò)調(diào)用get_fpxregs函數(shù)可以讀取多媒體寄存器至用戶空間,這樣用戶就可以取得MXCSR寄存器的值。調(diào)用set_fpxregs函數(shù)可以使用用戶空間提供的數(shù)據(jù)對(duì)MXCSR寄存器進(jìn)行賦值。通過(guò)對(duì)MXCSR的高16位進(jìn)行清0,就保證了IA386 CPU的這個(gè)特性。如果產(chǎn)生一種極限效果使程序跳過(guò)這一行,使MXCSR寄存器的高16位沒(méi)有被清0,一旦MXCSR寄存器的高16位有任何位被置位,系統(tǒng)就會(huì)立即崩潰!

  因?yàn)槔眠@個(gè)漏洞攻擊者還需要登錄到系統(tǒng),這個(gè)漏洞也不能使攻擊者提升權(quán)限,只能達(dá)到DoS的效果,所以這個(gè)漏洞的危害還是比較小的。但是分析這個(gè)漏洞就沒(méi)有意義了嗎?其實(shí)由分析這個(gè)漏洞可以看出:Linux內(nèi)核開(kāi)發(fā)成員對(duì)這種內(nèi)存拷貝時(shí)出現(xiàn)錯(cuò)誤的情況沒(méi)有進(jìn)行考慮,以至造成了這個(gè)漏洞,分析了解了這個(gè)漏洞后,在漏洞挖掘方面也出現(xiàn)了一種新的類型,使我們?cè)谝院蟮拈_(kāi)發(fā)中可以盡量避免這種情況。

  接下來(lái)讓我們看一種Linux內(nèi)核算法上出現(xiàn)的漏洞。先來(lái)簡(jiǎn)單介紹一下這個(gè)漏洞,當(dāng)Linux系統(tǒng)接收到攻擊者經(jīng)過(guò)特殊構(gòu)造的包后,會(huì)引起hash表產(chǎn)生沖突導(dǎo)致服務(wù)器資源被耗盡。這里所說(shuō)的hash沖突就是指:許多數(shù)值經(jīng)過(guò)某種hash算法運(yùn)算以后得出的值相同,并且這些值都被儲(chǔ)存在同一個(gè)hash槽內(nèi),這就使hash表變成了一個(gè)單向鏈表。而對(duì)此hash表的插入操作會(huì)從原來(lái)的復(fù)雜度O(n)變?yōu)镺(n*n)。這樣就會(huì)導(dǎo)致系統(tǒng)消耗巨大的cpu資源,從而產(chǎn)生了DoS攻擊效果。我們先看一下在linux中使用的hash算法,這個(gè)算法用在對(duì)Linux route catch的索引與分片重組的操作中。在今年五月Rice University計(jì)算機(jī)科學(xué)系的Scott A. Crosby與Dan S. Wallach提出了一種新的低帶寬的DoS攻擊方法,即針對(duì)應(yīng)用程序所使用的hash算法的脆弱性進(jìn)行攻擊。這種方法提出:如果應(yīng)用程序使用的hash算法存在弱點(diǎn),也就是說(shuō)hash算法不能有效地把數(shù)據(jù)進(jìn)行散列,攻擊者就可以通過(guò)構(gòu)造特殊的值使hash算法產(chǎn)生沖突引起DoS攻擊。

  202

  203 static __inline__ unsigned rt_hash_code(u32 daddr, u32 saddr, u8 tos)

  204 {

  205 unsigned hash = ((daddr & 0xF0F0F0F0) >> 4) │

  206 ((daddr & 0x0F0F0F0F) << 4);

  207 hash ^= saddr ^ tos;

  208 hash ^= (hash >> 16);

  209 return (hash ^ (hash >> 8)) & rt_hash_mask;

  210 }

  以上的代碼就是Linux對(duì)ip包進(jìn)行路由或者重組時(shí)使用的算法。此算法由于過(guò)于簡(jiǎn)單而不能把route緩存進(jìn)行有效的散列,從而產(chǎn)生了DoS漏洞。下面我們來(lái)分析一下此函數(shù)。

  203行為此函數(shù)的函數(shù)名與入口參數(shù),u32 daddr為32位的目的地址,而u32 saddr為32位的原地址,tos為協(xié)議。

  205行-206行是把目標(biāo)地址前后字節(jié)進(jìn)行轉(zhuǎn)換。

  207行把原地址與tos進(jìn)行異或后再與hash異或然后再賦值給hash。

  208行把hash的值向右偏移16位然后與hash異或再賦值給hash。

  209行是此函數(shù)返回hash與它本身向右偏移8位的值異或,然后再跟rt_hash_mask進(jìn)行與操作的值。

  這種攻擊是一種較為少見(jiàn)的拒絕服務(wù)方式,因?yàn)樗昧讼到y(tǒng)本身的算法中的漏洞。該漏洞也代表了一種新的漏洞發(fā)掘的方向,就是針對(duì)應(yīng)用軟件或者系統(tǒng)使用的hash算法進(jìn)行漏洞挖掘。因此,這種針對(duì)hash表攻擊的方法對(duì)不僅對(duì)Linux,而且會(huì)對(duì)很多應(yīng)用軟件產(chǎn)生影響,比如說(shuō)Perl5在這個(gè)perl的版本中使用的hash算法就容易使攻擊者利用精心篩選的數(shù)據(jù),使用perl5進(jìn)行編程的應(yīng)用程序使用的hash表產(chǎn)生hash沖突,包括一些代理服務(wù)器軟件,甚至一些IDS軟件,防火墻等,因使用的是Linux內(nèi)核都會(huì)被此種攻擊影響。

  Linux內(nèi)核中的整數(shù)溢出漏洞

  Linux Kernel 2.4 NFSv3 XDR處理器例程遠(yuǎn)程拒絕服務(wù)漏洞在2003年7月29日公布,影響Linux Kernel 2.4.21以下的所有Linux內(nèi)核版本。

  該漏洞存在于XDR處理器例程中,相關(guān)內(nèi)核源代碼文件為nfs3xdr.c. 此漏洞是由于一個(gè)整形漏洞引起的(正數(shù)/負(fù)數(shù)不匹配)。攻擊者可以構(gòu)造一個(gè)特殊的XDR頭(通過(guò)設(shè)置變量int size為負(fù)數(shù))發(fā)送給Linux系統(tǒng)即可觸發(fā)此漏洞。當(dāng)Linux系統(tǒng)的NFSv3 XDR處理程序收到這個(gè)被特殊構(gòu)造的包時(shí),程序中的檢測(cè)語(yǔ)句會(huì)錯(cuò)誤地判斷包的大小,從而在內(nèi)核中拷貝巨大的內(nèi)存,導(dǎo)致內(nèi)核數(shù)據(jù)被破壞,致使Linux系統(tǒng)崩潰。

  漏洞代碼:

  static inline u32 *

  decode_fh(u32 *p, struct svc_fh *fhp)

  {

  int size;

  fh_init(fhp, NFS3_FHSIZE);

  size = ntohl(*p++);

  if (size > NFS3_FHSIZE)

  return NULL;

  memcpy(&fhp->fh_handle.fh_base, p, size); fhp->fh_handle.fh_size = size;

  return p + XDR_QUADLEN(size);

  }

  因?yàn)榇藘?nèi)存拷貝時(shí)在內(nèi)核內(nèi)存區(qū)域中進(jìn)行,會(huì)破壞內(nèi)核中的數(shù)據(jù)導(dǎo)致內(nèi)核崩潰,所以此漏洞并沒(méi)有證實(shí)可以用來(lái)遠(yuǎn)程獲取權(quán)限,而且利用此漏洞時(shí)攻擊者必須可以mount此系統(tǒng)上的目錄,更為利用此漏洞增加了困難。

  我們的目的在于通過(guò)這個(gè)漏洞的特點(diǎn)來(lái)尋找此種類型的漏洞并更好地修補(bǔ)它。大家可以看到,該漏洞是一個(gè)非常典型的整數(shù)溢出漏洞,如果在內(nèi)核中存在這樣的漏洞是非常危險(xiǎn)的。所以Linux的內(nèi)核開(kāi)發(fā)人員對(duì)Linux內(nèi)核中關(guān)于數(shù)據(jù)大小的變量都作了處理(使用了unsigned int),這樣就避免了再次出現(xiàn)這種典型的整數(shù)溢出。通過(guò)對(duì)這種特別典型的漏洞原理進(jìn)行分析,開(kāi)發(fā)人員可以在以后的開(kāi)發(fā)中避免出現(xiàn)這種漏洞。

  IP地址欺騙類漏洞

  由于tcp/ip本身的缺陷,導(dǎo)致很多操作系統(tǒng)都存在tcp/ip堆棧漏洞,使攻擊者進(jìn)行ip地址欺騙非常容易實(shí)現(xiàn)。Linux也不例外。雖然IP地址欺騙不會(huì)對(duì)Linux服務(wù)器本身造成很嚴(yán)重的影響,但是對(duì)很多利用Linux為操作系統(tǒng)的防火墻和IDS產(chǎn)品來(lái)說(shuō),這個(gè)漏洞卻是致命的。

  IP地址欺騙是很多攻擊的基礎(chǔ),之所以使用這個(gè)方法,是因?yàn)镮P自身的缺點(diǎn)。IP協(xié)議依據(jù)IP頭中的目的地址項(xiàng)來(lái)發(fā)送IP數(shù)據(jù)包。如果目的地址是本地網(wǎng)絡(luò)內(nèi)的地址,該IP包就被直接發(fā)送到目的地。如果目的地址不在本地網(wǎng)絡(luò)內(nèi),該IP包就會(huì)被發(fā)送到網(wǎng)關(guān),再由網(wǎng)關(guān)決定將其發(fā)送到何處。這是IP路由IP包的方法。IP路由IP包時(shí)對(duì)IP頭中提供的IP源地址不做任何檢查,認(rèn)為IP頭中的IP源地址即為發(fā)送該包的機(jī)器的IP地址。當(dāng)接收到該包的目的主機(jī)要與源主機(jī)進(jìn)行通信時(shí),它以接收到的IP包的IP頭中IP源地址作為其發(fā)送的IP包的目的地址,來(lái)與源主機(jī)進(jìn)行數(shù)據(jù)通信。IP的這種數(shù)據(jù)通信方式雖然非常簡(jiǎn)單和高效,但它同時(shí)也是IP的一個(gè)安全隱患,很多網(wǎng)絡(luò)安全事故都是由IP的這個(gè)缺點(diǎn)而引發(fā)的。

  黑客或入侵者利用偽造的IP發(fā)送地址產(chǎn)生虛假的數(shù)據(jù)分組,喬裝成來(lái)自內(nèi)部站的分組過(guò)濾器,這種類型的攻擊是非常危險(xiǎn)的。關(guān)于涉及到的分組真正是內(nèi)部的,還是外部的分組被包裝得看起來(lái)像內(nèi)部分組的種種跡象都已喪失殆盡。只要系統(tǒng)發(fā)現(xiàn)發(fā)送地址在自己的范圍之內(nèi),就把該分組按內(nèi)部通信對(duì)待并讓其通過(guò)。

656126