9 March 2007

Lembur Memperbaiki Celah Keamanan CSRF

Posted under: at 05:00

Cross Site Request Forgery atau CSRF (dilafalkan ‘sea-surf’) adalah sebuah celah keamanan dimana aplikasi web terlalu mempercayai sebuah request walaupun request tersebut bukan berasal dari inisiatif pengguna. Celah keamanan ini belakangan menjadi populer akibat bobolnya daftar kontak pada layanan email Gmail.

Kalau ada yang heran mengapa blog ini tidak diperbaharui sejak kurang lebih satu setengah bulan yang lalu, itu karena saya terpaksa lembur memperbaiki berbagai macam aplikasi yang pernah saya buat sejak bertahun-tahun yang lalu. Ternyata sebagian besar aplikasi yang pernah saya buat memiliki celah keamanan CSRF ini :(.

Penjelasan

Celah keamanan CSRF ternyata juga menjangkiti WordPress jaman baheula yang memotori blog ini. Saya tidak tahu apakah di versi terbaru hal ini sudah diperbaiki. Tetapi untuk memudahkan menjelaskan tentang celah keamanan CSRF ini, mari kita gunakan contoh blog saya ini.

Salah satu fungsi dari panel administrasi WordPress adalah menghapus tulisan. Sebagai contoh, ketika saya membuka menu ‘Posts’, saya disuguhkan fungsi ‘Delete’. Jika saya klik maka akan tampil konfirmasi, dan jika saya iyakan, maka saya akan dibawa ke URL semisal http://priyadi.net/wp-admin/post.php?action=delete&post=1. URL tersebut akan menghapus posting pertama dari blog ini. (sebenarnyaposting pertama tersebut yang dibuat saat instalasi WordPress sudah saya hapus sejak dulu)

Karena semua orang dapat memiliki blog berbasis WordPress dan mengetahui URL dasar dari blog ini, maka semua orang bisa mengetahui URL untuk menghapus tulisan tersebut. Hanya saja, untuk dapat benar-benar menghapus sebuah tulisan di blog saya, yang mengakses URL tersebut harus melakukan login terlebih dahulu, atau dengan kata lain saya sendiri.

Sekarang yang menjadi masalah hanyalah bagaimana membuat saya mengakses URL tersebut tanpa saya sadari. Ternyata bukanlah hal yang terlalu sulit, cukup buat sebuah halaman web dengan isi sebagai berikut:

<img src="http://priyadi.net/wp-admin/post.php?action=delete&post=1" />

Dan suruh saya untuk mengaksesnya. Jika berhasil, saya akan mendapatkan sebuah halaman web yang berisi ‘gambar rusak’. Dan saya tidak akan menyadari jika saya baru saja menghapus tulisan pertama saya kecuali jika saya melihat kode sumber dari halaman tersebut. Dan walaupun saya mengetahuinya, hal tersebut sudah terlambat.

Selain metoda di atas, ada banyak metoda lain untuk melakukannya, termasuk juga untuk request POST dan untuk menghilangkan ‘gambar rusak’ tersebut.

Kalau saya perhatikan, celah CSRF ini baru populer akhir-akhir ini. Dan dengan demikian sangat banyak contoh kode pemrograman baik di Internet dan di buku-buku memiliki celah keamanan ini.

Solusi untuk pengakses

Celah keamanan ini terletak di sisi aplikasi yang berjalan di server. Dan dengan demikian tidak dapat sepenuhnya ditanggulangi di sisi client. Walaupun demikian, ada baiknya pengguna meminimalkan dampak akibat celah keamanan ini. Cara-cara praktis yang menurut saya dapat sedikit banyak mencegah dampak dari celah keamanan ini adalah sebagai berikut:

  • Jangan lupa melakukan log out setelah usai menggunakan layanan di Internet.
  • Gunakan perambah (browser) yang berbeda untuk mengakses layanan yang anda percayai (web mail dan semacamnya) dan untuk keperluan menjelajah Internet.
  • Mematikan fungsi third party cookies. (sebenarnya saya tidak tahu persis apakah ini akan berfungsi atau tidak)

Solusi untuk pembuat program di sisi server

Banyak pihak yang menyarankan untuk membatasi masa berlaku cookie sampai misalnya 5 atau 10 menit. Solusi yang mudah, tetapi juga sangat mengganggu dan tidak sepenuhnya menutup celah keamanan ini.

Satu-satunya cara yang efektif adalah membuat URL untuk melakukan fungsi penting sulit ditebak oleh orang lain. Sebagai contoh URL untuk menghapus tulisan di blog ini di atas dapat dimodifikasi menjadi misalnya http://priyadi.net/wp-admin/post.php?action=delete&post=1&x=15eb0de86bb6edff65bb3c3786c21b08824eb5ed.

Variabel ‘x’ tersebut adalah hasil fungsi SHA1 dengan ‘adonan’ berupa nomor tulisan (variabel ‘post’) dan sebuah variabel rahasia yang hanya diketahui oleh aplikasi di server tersebut. Jika variabel ‘x’ tersebut tidak ada atau berbeda daripada yang seharusnya, maka aplikasi akan menolak untuk melakukan penghapusan. Karena orang lain tidak mengetahui isi variabel rahasia tersebut, maka ia tidak dapat dengan mudah menebak URL tersebut.

Solusi lain yang bersifat ‘sapu jagat’ adalah dengan menggunakan wildcard hostname. Wildcard hostname memungkinkan kita membuat sembarang hostname yang merujuk ke IP yang sama. Sebagai contoh, URL tersebut di atas dapat kita modifikasi menjadi misalnya http://h437429741748977.priyadi.net/wp-admin/post.php?action=delete&post=1. Di sini ‘h437429741748977′ merupakan nomor acak yang dibuat pada saat pengguna melakukan login. Karena nomor tersebut acak dan cookie kita buat hanya berlaku pada domain acak tersebut, maka orang lain akan kesulitan untuk menebak URL yang tepat.

Tetapi cara yang paling tepat untuk membuat URL sulit untuk ditebak tentunya tergantung dari masing-masing aplikasi.

***

Akhir kata, saya ucapkan selamat berlembur…

145 Responses

Trackback: Use this URI to trackback this entry. Use your web browser's function to copy it to your blog posting.

Comment RSS: You can track conversation in this page by using this page's Comments RSS (XML)

Gravatar: You can have a picture next to each of your comments by getting a Gravatar.

Leave a Comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Warning: Comments carrying links to questionable sites will be removed!