Linux işletim sistemimizin Kernel’in de  çıkan root exploitler (Son günlerde ard arda 2.4 /2.6 çekirdekleri exploit edildi.) serverin güvenliği gereği devamli compile/patch edilebilmesi sorununu ortaya çıkarıyor.

En son çıkan güvenlik bildirisinde Linux Centos/Redhat’ın tüm kernellerini etkileyen Local Root Exploit yayınlandı. Aşağıda belirtilen kernel sürümleri, bu açıklıktan etkilenmiyor.

CentOS 5.3 (2.6.18-128.7.1.el5) is not vulnerable
Red Hat Enterprise Linux 5.3 (2.6.18-128.7.1.el5) is not vulnerable
Red Hat Enterprise Linux 4.8 (2.6.9-89.0.9.EL) is not vulnerable

Referans/Exploit : http://milw0rm.com/exploits/9545

Serverda açıklığı meydana getirecek kodu derleyen bir kullanıcı  bu kodu çalıştırdığında serveri manipule edip  root kullanıcısının yetkilerini elde edebiliyor. Aşağıda virtual bir linux server da yaptığım test’i görebilirsiniz.

[ender@localhost tmp]$ gcc -Wall -o root root.c-rwxrwxr-x 1 ender ender 6698 Oct 13 14:10 root-rwxrwxrwx 1 ender ender 9409 Oct 13 14:10 root.c
[ender@localhost tmp]$ ./root
sh-3.2# id

uid=0(root) gid=0(root) groups=500(elmameta) context=root:system_r:unconfined_t:s0-s0:c0.c1023

main(void)
{
char *addr;
int out_fd, in_fd;
char template[] = “/tmp/tmp.XXXXXX”;

#if defined(__i386__) || defined(__x86_64__)

uid = getuid(), gid = getgid();
#endif

Kernel’in Hızlıca Patchlenmesi

Linux kerneliniz için güncelleştirmelerin bir an evvel yapılmasını öneririm. Centos ve bir çok sitedeki mirror listlerden derlenmiş kerneli çekebiliriz. Mevcut yum update repository’niz de fixlenmis kernel olmayabilir. Bu durumda serverin repository’lerini ayarlamamız gerekecektir.

[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# vi CentOS-Update.repo

Vi editörüm ile yeni update dosyamızı hazırlayalım. CentOS-Update.repo isimli dosya oluşturup içine aşağıdaki satırları girmemiz gerekiyor.

name=CentOS-$releasever – Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/$releasever/updates/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

Yukarıdaki paylaşımlı ftp sitesinde Centos sistemlerin patchlenmiş son kerneli mevcut olduğundan (kernel-2.6.18-128.7.1.el5.src.rpm 24-Aug-2009) “baseurl= ” kısmını editledim.

Orjinal Adres : http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/updates/

Dosyayı :wq ile (vi editorune özgü olan komut ) kaydedip çıkalım. Shell konsolumuzda :

[root@localhost yum.repos.d]# yum update kernel
* updates: ftp-stud.fht-esslingen.de
updates

Patchlenen kernel bu bölümde gözükecektir. Bu işlem sonrası :

uname -r

Parametresi ile yeni kernelinizin versiyonunu görebilirsiniz.

[root@localhost yum.repos.d]# uname -r
2.6.18-128.7.1.el5

Serverdaki çok riskli açıklık bu patch ile birlikde yerini şimdlik sessizliğe bıraktı. Bir süreliğine safe durumdayız.

Sisteme çekilmiş tüm update ve install loglarını aşağıdaki komut ile gorebilirsiniz :

[root@localhost ~]# cat /var/log/yum.log
Sep 08 02:07:44 Updated: kernel-headers – 2.6.18-128.7.1.el5.i386
Sep 08 02:15:39 Installed: kernel-devel – 2.6.18-128.7.1.el5.i686

Felaket’i Önlemek İçin Başka Ne Tür Önlemler Alınabilir ?

1) Server Updateleri’nin çekilmesi.

2) Linux’u web server olarak kullanıyorsanız veya paylaşımlı shell hesabı veriyorsanız, sistem dizinlerinin permissionlarını güvenli şekilde set etmeniz  olacaktır.

Serverda chmod 777 (Full yetki) ile set edilen dizinlerinin “execute” yetkisinin kaldırılması gerekir.

Aşağıdaki dosya sistemleri Linux sistemlerde default olarak chmod 777 olarak gelmektedir.

/tmp
/dev/shm
/var/tmp

3) *nix sistemler genel de web server olarak kullanıldığından, bir lamerin sunucuya backconnect (Reverse Connection) olabileceğini göz ardı edilmemesi gerekir. Konu çok uzayacak böyle,  Reverse Connection ataklarıdan korunma yöntemlerini  bir başka gün güzel bir çalışma ile ele alalım. Burada diyeceğim serverda IPtables firewall varsa içerden dışarıya tüm portların kapatılmasıdır. Bu durumda php veya perl, python ile sunucuyu bypass eden birisi root yetkilerini elde etmek için servera backconnect olamayıp son vuruşu yapamayacaktır.

“Destination, Any, Close” mantığı ile oluşturulacak bir rule sayesinde içerden dışarı tüm bağlantılar kapatılır.

Php ile programlanmış bir script de “Reverse Connection Anatomisi” :

cf(“/tmp/bd.c”,$port_bind_bd_c);
$blah = ex(“gcc -o /tmp/bd /tmp/bd.c”);
@unlink(“/tmp/bd.c”);
$blah = ex(“/tmp/bd “.$_POST[‘port’].” “.$_POST[‘bind_pass’].” &”);
cf(“/tmp/bdpl”,$port_bind_bd_pl);
$p2=which(“perl”);
if(empty($p2)) $p2=”perl”;
$blah = ex($p2.” /tmp/bdpl “.$_POST[‘port’].” &”);
$_POST[‘cmd’]=”ps -aux | grep bdpl”;
$port_bind_bd_c
$port_bind_bd_pl

reverse-connection-code

Encode edilen C#, perl kodları