Anda di halaman 1dari 22

Analisis Keamanan Pada Nodejs Sebagai Platform

Aplikasi Web

Oleh : Irfan Aris Nur Hakim / 23512129

MAGISTER INFORMATIKA

INSTITUT TEKNOLOGI BANDUNG

2013
Daftar Isi

1 Pendahuluan 1

1.1 Sekilas Tentang Nodejs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 Tren Aplikasi Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.3 Keamanan Aplikasi Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Nodejs Sebagai Platform Aplikasi Web 4

2.1 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.1 Cross-site scripting (XSS) . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.2 Cross-site request forgery (CSRF) . . . . . . . . . . . . . . . . . . . . 5

2.1.3 Clickjacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 Nodejs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2.1 Konfigurasi modul express yang aman untuk aplikasi web . . . . . . . 6

2.2.2 Penanganan error pada nodejs . . . . . . . . . . . . . . . . . . . . . . 8

2.2.3 Run-time server poisoning . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2.4 Filesystem exploits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.2.5 Whitelisting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.2.6 Konfigurasi server nodejs . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.2.7 Strategi mebuat server nodejs yang handal . . . . . . . . . . . . . . . 16

2.3 NPM (Nodejs Package Manager ) . . . . . . . . . . . . . . . . . . . . . . . . . 17

3 Kesimpulan 18

4 Referensi 19

i
Daftar Gambar

1 Logo nodejs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 Event-loop pada nodejs. [8] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

ii
1 Pendahuluan

1.1 Sekilas Tentang Nodejs

Sekitar awal tahun 2009, seorang pengembang dari Joyent yang merupakan sebuah peru-

sahaan perangkat lunak dan infrasturktur Cloud yaitu Ryan Dahl menginsiasi pembuatan

sebuah peranti pengembang yang berjalan pada sisi server dan bekerja untuk melayani

aplikasi berbasis Cloud. Peranti pengembang tersebut didesain supaya mempunyai kemam-

puan dalam melayani aplikasi berbasis Cloud dengan handal, efisien dan terukur. Peranti

pengembang tersebut kemudian diberi nama node atau nodejs [1].

Gambar 1: Logo nodejs

Nodejs ditulis dengan bahasa pemrograman C++ dan JavaScript dengan menggunak-

an model event-driven dan non-blocking I/O (asynchronous). Sebenarnya model tersebut

sebelumnya sudah ada yang mengimplementasikan, yaitu Event Machine yang dibuat de-

ngan Ruby dan Twisted dengan pyhton [2, 3]. Dengan kedua model tersebut nodejs dinilai

sangat cocok untuk aplikasi web yang membutuhkan pola interaksi terhadap data yang sa-

ngat intensif dan secara real-time. Peranti pengembang ini diadopsi berdasarkan dari mesin

JavaScript yang telah dibuat oleh Google untuk peramban web-nya (Google Chorme) yaitu

V8 tetapi dengan menambahkan beberapa pustaka seperti libUV dan pustaka internal lain-

nya [4]. Pada beberapa bulan terakhir nodejs sangat populer dikalangan pengembang dan

menjadi salah satu proyek yang paling banyak diikuti disalah satu situs penyedia layanan

untuk penyimpanan kode program yaitu github.com [5].

JavaScript menjadi bahasa pemrograman yang utama apabila akan mengembangkan apli-

kasi berbasis Cloud dengan nodejs, baik itu di sisi server maupun di sisi client. JavaScript

merupakan bahasa pemrograman yang sangat familiar bagi kebanyakan pengembang aplikasi

web. Oleh karena itu, tingkat pengadopsian dari nodejs sebagai alternatif dalam membangun

aplikasi berbasis Cloud ini sangatlah tinggi.

Dalam mengembangkan aplikasi dengan memanfaatkan nodejs, pengembang bisa meng-

gunakan utilitas yang bernama npm. Npm ini merupakan utilitas untuk mengelola paket

modul/komponen yang disertakan saat instalasi nodejs, dengan npm pengembang bisa meng-

unduh modul atau komponen yang biasanya bersifat reusable code yang diperlukan untuk

1
aplikasinya. Siapa saja bisa dengan mudah menambahkan modul pada repositori npm tanpa

terkecuali. Utilitas ini menjadi salah satu faktor bagi para pengembang untuk membangun

aplikasi diatas nodejs karena sangat memudahkan dalam pengembangan aplikasi dan mem-

percepat penyelesaian aplikasi.

Sekarang proyek nodejs ini sepenuhnya didukung dan dikelola oleh Joyent, Inc. Semua

orang bisa berkontribusi untuk pengembangannya karena kode sumber dari peranti pengem-

bang ini bersifat terbuka. Versi terakhir dari nodejs ini sudah mencapai versi 0.10.7 dan

sudah banyak sekali digunakan oleh perusahaan-perusahaan besar penyedia layanan di Cloud

seperti Microsoft, Yahoo, LinkedIn, Ebay dll.

1.2 Tren Aplikasi Web

Apabila kita melihat tren perkembangan dari aplikasi web, umumnya saat ini aplikasi web

dikembangkan supaya layanannya mempunyai pola interaksi yang real-time dan melibatkan

pengaksesan data yang sangat intensif. Pola interaksi real-time ini maksudnya adalah su-

atu layanan yang memungkinkan para pengguna layanan aplikasi web menerima informasi

terbaru sesaat setelah informasi tersebut diterbitkan dengan tanpa memerlukan pengecekan

secara periodik oleh pengguna terhadap server. Contohnya adalah aplikasi web twitter yang

layanannya memberikan fasilitas microblogging, disana pengguna yang mengakses twitter

akan terus mendapatkan limpahan informasi tanpa harus melalui inisiasi terlebih dahulu

dari penggunanya.

Pada paradigma transaksi web konvensional, desain awalnya adalah seluruh bagian doku-

men akan dimuat atau dikirim dalam satu request. Sedangkan pada pola interaksi real-time,

ketika informasi baru tersedia maka server akan langsung mengirimnya terhadap client yang

tentunya itu merupakan sebagian kecil fragmen dokumen. Hal tersebut bisa mencegah da-

lam pemakaian bandwidth yang berlebihan dan biasanya koneksi HTTP yang dibuat bersifat

long-term. Apache HTTP Server merupakan contoh dari peranti pengembang yang didesain

untuk melayani pengiriman seluruh dokumen dalam satu request daripada membuat koneksi

yang bersifat long-term untuk keperluan pola interaksi real-time.

Sudah banyak teknologi yang diperkenalkan demi mencapai tujuan tersebut baik itu

teknologi dari sisi server, maupun di sisi client. Teknologi pada sebagian besar perangkat

lunak server seperti Apache HTTP Server modelnya menggunakan thread. Sehingga untuk

setiap request yang diterima maka akan dibuat satu thread untuk melayaninya. Thread

tentunya memakai sumber daya dari sistem, kemudian beberapa thread bisa berjalan pada

satu waktu secara bersamaan. Untuk memenuhi aplikasi web real-time, maka thread harus

2
dibuat terus hidup untuk mendukung koneksi long-term yang telah dibuat oleh seorang

client. Tentunya jumlah thread yang dapat hidup tadi terbatas tergantung sumber daya

sistem yang tersedia. Sehingga apabila terjadi jumlah request yang melebihi kemampuan

server maka request tersebut akan ditahan dulu sampai ada thread yang tersedia kembali

dan hal ini menyebabkan layanan menjadi kurang baik karena ada blocking yang terjadi.

Nodejs dengan event-driven modelnya memberikan mekanisme berbeda, nodejs ini hanya

berjalan dengan menggunakan single thread saja dan tidak mendelegasikan thread untuk

merespon request dari client. Dengan event-driven ini, nodejs merespon hanya berdasarkan

pada suatu event tertentu saja misalnya event request. Model perangkat lunak server seperti

ini memungkinkan untuk melayani request yang terus menerus pada satu waktu bersamaan.

Dengan memperhatikan desain dan arsitekturnya tersebut, nodejs dibuat bertujuan untuk

menjadi peranti pengembang pada sisi server untuk membangun suatu aplikasi web real-time

yang sangat cepat dan ringan.

Pada sisi client untuk aplikasi web khususnya peramban web, sekarang sudah dilengkapi

dengan teknologi-teknologi baru yang mendukung untuk aplikasi web real-time. Mulai dari

dukungan terhadap HTML5, kemudian web-socket, web-worker, dll. Tentunya dengan ada-

nya teknologi baru tersebut biasanya disertai dengan celah-celah baru di sisi keamanannya.

1.3 Keamanan Aplikasi Web

Sisi keamanan aplikasi web merupakan hal utama yang selalu menjadi perhatian bagi para

pengembang. Cakupan dari keamanan aplikasi web ini tidak hanya seputar aplikasinya itu

sendiri tetapi juga melibatkan beberapa komponen-komponen pendukung lainnya seperti

peranti pengembang yang berjalan dibawah aplikasi web tersebut, kemudian aspek arsitektur

dan konfigurasinya.

Nodejs adalah suatu teknologi baru dan terobosan karena bisa membuat JavaScript bisa

berjalan di sisi client maupun sisi server. Meskipun begitu sekarang nodejs sudah banyak

dipakai oleh industri untuk layanannya, namun sayangnya belum terlalu banyak tulisan yang

membahas tentang sisi keamanan dari aplikasi web yang berjalan diatas nodejs ini. Dengan

makalah ini diharapkan bisa dikemukakan beberapa hal terkait keamanan dari aplikasi web

yang harus diperhatikan ketika akan dibangun dengan nodejs sebagai back-end.

Kemudian pada sisi aplikasinya sendiri akan dibahas kembali tentang poin-poin penting

bagaimana standar keamanan suatu aplikasi web harus dipenuhi.

3
2 Nodejs Sebagai Platform Aplikasi Web

2.1 JavaScript

Saat ini JavaScript merupakan bahasa yang paling populer digunakan oleh para pengem-

bang aplikasi web. Mulai dikembangkan pada tahun 1995 oleh Netscape sebagai upaya

perbaikan dari peramban web-nya. JavaScript sangat cepat mendapat popularitas sebagai

bahasa scripting untuk peramban web, sampai akhirnya Microsoft mengadopsinya untuk

bisa berjalan di produk peramban web-nya yaitu Internet Explorer yang kemudian diberi

nama JScript. Demi menjaga standar pengembangan dari JavaScript ini, maka JavaScript

distandarisasi dengan standar ECMAScript-262. Pada awal tahun 2009, dibentuk proyek

CommonJS yang bertujuan untuk menspesifikasikan pustaka standar untuk pengembangan

JavaScript yang digunakan diluar peramban web.

Dengan menggunakan JavaScript ini peramban web yang awalnya hanya menyajikan kon-

ten statis HTML saja bisa berubah menjadi interaktif dan membuat perkembangan aplikasi

web ke tahap berikutnya. Pada pengembangan aplikasi web, JavaScript berperan sangat

penting pada aspek kemudahan dari penggunaan aplikasi. JavaScript bekerja dengan me-

manipulasi DOM (Document Object Model ) dalam peramban web untuk melakukan fungsi-

fungsi spesifik suatu apliaksi web.

Penggunaan JavaScript pada aplikasi web yang berjalan di sisi client pada peramban

web tidak hanya membawa keuntungan, tetapi seiring dengan penggunaanya JavaScript

membawa serta celah keamanan dan potensi pelanggaran yang bisa dieksploitasi oleh pihak-

pihak tertentu.

2.1.1 Cross-site scripting (XSS)

Merupakan permasalahan keamanan yang sudah umum terjadi pada aplikasi web. Cross-site

scripting (XSS) merupakan salah satu tipe celah keamanan yang memungkinkan penyerang

menyisipkan kode JavaScript miliknya kedalam suatu halaman yang diakses oleh pengguna

lainnya [6]. Teknik ini biasanya melanggar same-origin policy yang dimiliki peramban web

sehingga bisa menampilkan konten yang berasal bukan dari host asli.

Terjadi biasanya karena aplikasi web tidak memfilter setiap masukan secara benar. De-

ngan serangan jenis ini, penyerang bisa mendapatkan data sensitif dari seorang pengguna

misalnya session token yang telah terautentikasi dengan menyisipkan kode untuk mencuri

isi dari cookie user.

4
2.1.2 Cross-site request forgery (CSRF)

Cross-site request forgery merupakan tipe serangan lainnya yang umumnya sangat merugik-

an para pengguna aplikasi web. Berbeda dengan XSS, yang menginjeksi konten dari suatu

halaman dalam aplikasi web, CSRF ini mengeksploitasi kepercayaan yang sudah diberikan

oleh aplikasi web terhadap pengguna yang telah terautentikasi sebelumya. Intinya, celah ke-

manan CSRF ini memungkinkan seorang penyerang untuk melakukan tindakan yang tidak

diinginkan misalnya mengirim request ke server dengan memakai identitas user yang telah

terautentikasi tadi.

Demi mengatasi hal-hal seperti ini, pada bagian selanjutnya akan coba dijelaskan tentang

bagaimana konfigurasi dari web server yang berjalan diatas nodejs sehingga aplikasi web bisa

meminimalisir celah keamanan ini dieksploitasi.

2.1.3 Clickjacking

Dengan kempuan JavaScript dalam berinteraksi dengan properti-propertu yang dimiliki

peramban web dan memanipulasi tampilan suatu web. Saat ini banyak web yang malah

melakukan tindakan penipuan dengan tujuan mecuri data-data sensitif dari penggunanya.

Penipuan itu biasanya tidak disadari oleh korbannya karena biasanya prosesnya berjalan

dibelakang layar.

Clickjacking atau yang biasa dikenal dengan UI redress attack adalah dimana suatu

website melakukan trik terhadap penggunanya untuk melakukan aksi klik pada salah satu

bagian halamannya, saat klik itu dilakukan ternyata pengguna tidak sadar bahwa ada proses

lain yang ternyata dikerjakan di website yang lain yang biasanya pengguna tersebut sudah

memiliki session yang terautentikasi [6].

2.2 Nodejs

Saat Google menggarap perangkat lunak untuk peramban web, mereka memutuskan un-

tuk mengembangkan suatu mesin penginterpretasi JavaScript sendiri. Mesin yang mereka

kembangkan kemudian dikenal dengan nama V8. Mesin V8 ini mengkompilasi kode Java-

Script menjadi kode mesin terlebih dahulu sebelum dieksekusi, hal ini membuat performa

penginterpretasian JavaScript menjadi lebih baik.

Nodejs mempunyai pustaka untuk membuat web server dengan mudah yaitu pustaka

HTTP. Berikut contoh implementasi dari pustaka HTTP untuk sebuah web server sederhana

milik nodejs :

5
1 // muat modul http
2 var http = require ( http ) ;
3 // buat server dan bind ke port 8080
4 http . createServer ( function ( req , res ) {
5 res . writeHead (200 , {
6 Content - Type : text / plain
7 }) ;
8 res . end ( Hello World ) ;
9 }) . listen (8080) ;
10 console . log ( Server running at port 80 localhost ) ;

Listing 1: Kode program membuat web server pada nodejs.

Pustaka HTTP yang dimiliki oleh nodejs saat ini hanya menyediakan fungsi-fungsi da-

sar saja untuk membangun web server, oleh karena itu dalam membangun aplikasi web

yang kompleks dengan nodejs, saat ini sudah banyak disediakan modul yang menyediakan

fungsi-fungsi yang komplit. Salah satu modul tersebut yang sudah banyak digunakan untuk

membangun aplikasi web adalah modul Express. Modul ini meyediakan fungsi-fungsi seperti

templating, dynamic routing, middleware, penanganan session dan cookie, dll.

Yang harus diperhatikan ketika membangun aplikasi dengan modul express adalah konfi-

gurasinya. Fungsi-fungsi pada modul express diterapkan secara modular, begitu juga dengan

fungsi keamanannya. Ada beberapa fungsi keamanan yang telah disediakan oleh express dan

semuanya didefinisikan pada konfigurasinya, sehingga dengan konfigurasi yang benar aplikasi

web kita bisa berjalan dengan baik dan potensi-potensi pelanggaran kemanan pada aplikasi

web bisa dicegah.

2.2.1 Konfigurasi modul express yang aman untuk aplikasi web

Aplikasi web sekarang sudah lazim menggunakan session dan cookie untuk menyimpan in-

formasi seorang penggunanya dalam jangka waktu tertentu. Penangan session dan cookie

sudah bisa dilakukan dengan express, namun beberapa hal yang harus diperhatikan dalam

konfigurasinya adalah session dan cookie tadi harus mempuyai flag Secure dan HTTPO-

nly. Hal tersebut dimaksudkan supaya kedua properti tadi dikirimkan hanya lewat HTTPS.

Berikut contoh penerapannya :

1 app . use ( express . session ({


2 secret : " karakter - acak - untuk - kode - rahasia - session " ,
3 cookie : { httpOnly : true , secure : true }
4 }) ) ;

6
Listing 2: Konfigurasi session dan cookie yang aman pada Express

Hal lainnya adalah dengan kemanan Header, ada beberapa opsi pada header yang bisa

digunakan untuk membantu meningkatkan keamanan dari suatu aplikasi web [7]. Salah

satunya yaitu opsi X-Content-Type-Options, ketika server memberikan respon terhadap

request dari client maka berikan nilai nosniff pada opsi tadi. Opsi ini akan membuat

peramban web menghentikan tindakan menebak-nebak MIME-type dari file yang dilakukan

dengan content sniffing. Tanpa opsi ini, potensi resiko terjadinya cross-site scripting semakin

meningkat.

Selanjutnya opsi X-XSS-Protection, ini merupakan opsi header yang digunakan oleh per-

amban Internet Explorer versi 8 keatas. Apabila opsi ini diset dengan mode=block, maka

akan diinstruksikan supaya mode scripting filter pada peramban ini diaktifkan. Tentunya

ini sangat bermanfaat untuk mempersempit celah keamanan dari aplikasi web.

Opsi berikutnya yang harus menjadi perhatian adalah opsi X-Frame-Options, opsi ini

digunakan untuk mengindikasikan apakah peramban web diperbolehkan untuk menerima

dan menampilkan halaman dalam suatu elemen <frame> atau <iframe>. Seharusnya opsi

ini diset dengan nilai DENY sehingga dokumen yang berasal dari host yang berbeda akan

ditolak dan tidak dieksekusi. Hal ini mencegah terjadinya click-hijacking.

Untuk mengatur bagaimana suatu dokumen di-cache oleh peramban web atau proxy, bisa

digunaka opsi Cache-Control. Dengan opsi ini, segi privasi aplikasi bisa lebih ditingkatkan

yaitu dengan tidak melakukan caching pada dokumen yang bersifat sensitif dan rahasia.

Untuk memungkinkan hal tersebut bisa diset pada opsi Cache-Control dengan nilai no-

strore, no-cache.

Pada nodejs, telah disediakan modul untuk mengatasi opsi header apa yang akan dibe-

rikan ke client, modul yang bernama helmet ini bisa dipasang dan dikonfigurasikan pada

express. Berikut konfigurasi modul helmet pada express :

1 app . configure ( function () {


2 app . use ( helmet . c o n t e n t T y p e O p t i o n s () ) ;
3 app . use ( helmet . iexss () ) ;
4 app . use ( helmet . xframe () ) ;
5 app . use ( helmet . cacheControl () ) ;
6 }) ;

Listing 3: Konfigurasi modul helmet pada express untuk kemanan header yang dikirim ke

client.

7
Modul express dilengkapi dengan beberapa fungsi untuk mencegah terjadinya pelang-

garan terhadap web server, diantarnya fungsi untuk mencegah terjadinya cross-site request

forgery. Fungsi ini tidak secara default diaktifkan, tetapi harus secara manual dikonfigurasi

agar fungsi ini berjalan. Berikut listing kode bagaimana mengaktifkan fungsi ini :

1 app . use ( express . csrf () ) ;


2 app . use ( function ( req , res , next ) {
3 res . locals . csrftoken = req . session . _csrf ;
4 }) ;

Listing 4: Mengaktifkan fungsi csrf pada express.

Dengan fungsi csrf ini aktif, maka setiap request POST akan divalidasi dengan token csrf

yang dibuat di server. Sehingga ketika ada request dari client yang tidak mempunyai token

csrf atau token-nya tidak sama yang dibuat oleh server maka akan langsung ditolak.

Berdasarkan beberapa konfigurasi yang telah dijelaskan diatas, maka semuanya bisa

disatukan untuk membuat web server yang aman diatas nodejs dengan menggunakan modul

express.

2.2.2 Penanganan error pada nodejs

Manajemen penanganan error pada aplikasi web yang dibuat diatas nodejs sangatlah pen-

ting, karena apabila terjadi error baik itu disebabkan oleh bugs atau kesalahan pemrosesan

masukan maka aplikasi akan mengalami crash seketika. Hal ini disebabkan karena desain

dari nodejs-nya sendiri yang menggunakan event-loop pada single thread sebagai dasar dari

eksekusi aplikasi. Sehingga ketika terjadi error dalam sebuah iterasi event, maka event-loop

akan berhenti dan aplikasi tidak bisa lagi melayani request berikutnya.

Setiap pustaka atau modul pada nodejs sebenarnya dilengkapi dengan fungsi balikan

ketika suatu error terjadi, sehingga bisa ditangani dengan baik. Namun terkadang para

pengembang mengabaikan hal ini sehingga terjadi hal seperti diatas. Berikut contoh yang

baik dalam menangani error yang terjadi ketika membaca file pada disk :

1 var fs = require ( fs ) ;
2 fs . readFile ( / user / docs / something . txt , function ( err , data ) {
3 if ( err ) throw err ;
4 console . log ( data ) ;
5 }) ;

Listing 5: Contoh kode cara menanggulangi error pada nodejs

8
Gambar 2: Event-loop pada nodejs. [8]

Pada kode di atas ketika error terjadi misalnya karena file yang dibaca tidak ada atau

proses nodejs tidak mempunyai izin untuk membaca file yang dimaksud, maka error ter-

sebut akan ditangani sehingga aplikasi tidak mengalami crash yang menyebabkan aspek

Availability dari aplikasi tetap terpenuhi.

2.2.3 Run-time server poisoning

Nodejs sebagai web server berbeda dengan kebanyakan web server yang sudah ada dalam

hal proses melayani request dari client. Kebanyakan web server ketika menerima request dari

client, dia akan spawn suatu child process baru dan seterusnya semuanya berlangsung pada

child process itu sampai proses itu diterminasi. Sedangkan pada nodejs, berlaku event-loop

yang berjalan hanya pada satu thread saja yang akan menerima request, sehingga ketika

ada request dia akan dijalankan oleh proses yang sama. Ilustrasi dari bagaimana model dari

nodejs sebagai web server memproses request dari client bisa dilihat pada Gambar 2.

Celah kemanan terjadi ketika ada request dari client yang dengan sengaja mengubah

perilaku atau konfigurasi dari server. Dengan mengeksploitasi fungsi eval yang dimiliki

oleh JavaScript, akan diberikan proof-of-concept dari celah keamanan ini :

1 // kirim form untuk client


2 app . get ( / , function ( req , res ) {
3 res . send ( < form method =" POST " > +
4 < input name =" b i la ng a nP er t am a " > +
5 < input name =" bilanganKedua " > +
6 < input type =" submit " value =" submit "/ > </ form > ) ;
7 }) ;

9
8 // proses request post yang masuk
9 app . post ( / , function ( req , res ) {
10 var sum = eval ( req . body . b il a ng an P er t am a + + + req . body . bilanganKedua ) ;
11 res . send ( sum ) ;
12 }) ;
13
14 app . listen (8080) ;

Listing 6: Proof-of-cocept dari eksplotasi fungsi eval terhadap jalannya web server.

Sesuatu yang buruk akan terjadi apabila pada body yang dikirim terdapat kode Java-

Script. Hal ini disebabkan karena pada proses yang menerima request POST dari client

terdapat fungsi eval. Fungsi ini akan menginterpretasi seluruh argumen yang diberikan dan

langsung dijalankan pada proses yang sedang berlangsung. Berikut contoh request yang bisa

menyebabkan proses nodejs yang sedang berjalan mengalami perubahan :

curl -X POST -d " b il a ng a nP er t am a =1& bilanganKedua =2; app . get ( / newpath ,


function ( req , res ) { res . send ( voila ! ) ;}) ; " localhost :8080

Dengan request seperti diatas, maka akan terdapat suatu endpoint baru dari server yaitu

endpoint /newpath. Apabila diakses, endpoint ini akan mengembalikan respon berupa string

voila!.

Ekspolitasi ini bisa lebih advance lagi, yaitu dengan mengatahui letak fungsi yang me-

nerima request POST dalam proses. Untuk kasus ini diketahui letak fungsi yang menerima

POST dalam proses adalah pada app.routes.routes.post[0].callbacks[0]. Kemudian ditest

dengan mengirimkan data sebagai berikut :

curl -X POST -d " b il a ng a nP er t am a =1& bilanganKedua =2; app . routes . routes . post [0].
callbacks [0] = function ( req , res ) { res . send ( endpoint altered ! ) ;}; "

Semua request selanjutnya setelah mengirimkan data ini akan mengembalikan respon

endpoint altered!. Karena endpoint yang asli untuk menerima request POST di-overwrite

oleh fungsi yang tadi dieksekusi oleh fungsi eval.

Serangan semacam ini sangatlah berbahaya karena membuat pihak penyerang dapat

mempengaruhi tiga aspek utama dalam security. Aspek Confidentiality dan Integrity me-

rupakan target utama dimana penyerang bisa mengubah perilaku dari server dan membuat

suatu mekanisme agar penyerang dapat mengambil alih server. Sedangkan untuk aspek

Availability, penyerang bisa mengkonfigurasi ulang server sehingga membatasi ketersediaan

layanan bagi sebagaian pengguna [3].

10
2.2.4 Filesystem exploits

Salah satu API dari nodejs yang sangat penting adalah kemampuan akses ke dalam file-

system. Dengan memanfaatkan antarmuka pemrograman ini, pengembang bisa berinteraksi

dengan filesystem pada mesin server seperti membaca, memodifikasi bahkan menghapus file.

Salah satu yang harus diperhatikan oleh pengembang dalam menggunakan API file-

system ini adalah jangan sampai implementasinya malah menimbulkan celah keamanan.

Berikut akan dijelaskan tentang bagaimana potensi celah keamanan yang bisa terjadi ketika

mengimplementasikan API filesystem ini.

Contoh yang akan diambil disini adalah HTTP server sederhana diatas nodejs yang

fungsinya untuk melayani file statik. Diasumsikan letak proyek dari aplikasi ini pada suatu

folder dan berisi beberapa file yang nantinya akan diminta oleh client.

1 /* *
2 * contoh direktori proyek ,
3 * ~/ mac / node / in s ec ur e _s e rv er . js
4 * index . html
5 * ...
6 */
7
8 // panggil modul - modul yang diperlukan
9 var http = require ( http ) ;
10 var path = require ( path ) ;
11 var url = require ( url ) ;
12 var fs = require ( fs ) ;
13
14 // buat web server
15 http . createServer ( function ( req , res ) {
16 // tampung request , kemudian tentukan file mana yang akan dikembalikan ke
client
17 var lookup = url . parse ( decodeURI ( req . url ) ) . pathname ;
18 lookup = ( lookup === / ) ? / index . html : lookup ;
19 var f = content + lookup ;
20 console . log ( f ) ;
21 // proses membaca file berdasarkan request yang diminta
22 fs . readFile (f , function ( err , data ) {
23 res . end ( data ) ;
24 }) ;
25 }) . listen (8080) ;

11
Listing 7: Kode insecure_server.js

Ketika web server berjalan dan diakses pada halaman http://localhost:8080, maka se-

rver akan memberikan respon index.html. Tetapi apabila kita tes server tersebut dengan

mengirimkan request dengan utilitas curl seperti berikut :

curl localhost :8080/../ i n se cu r e_ s er ve r . js

Respon yang diberikan server adalah kode dari server itu sendiri yaitu file insecu-

re_server.js. Bahkan apabila ditelusuri lebih lanjut, ternyata kode diatas bisa untuk meng-

akses isi dari folder /etc/passwd dengan melakukan beberapa tebakan untuk menelusuri

path relative-nya :

curl localhost : 8 0 8 0 / . . / . . / . . / . . / . . / . . / i ns e cu re _ se r ve r . js

Tes dilakukan dengan menggunakan utilitas curl karena kalau dilakukan dengan per-

amban web seperti biasa, maka request serperti ini akan otomatis difilter. Kemudian server

kita perbaiki lagi dengan cara menambahkan akhiran terhadap semua file statik yang akan

disediakan untuk client, misalnya merubah index.html menjadi index.html-serve. Dengan

cara seperti itu ketika akan menelusuri isi folder dari sistem misalnya ingin mendapatkan

file /etc/passwd atau kode insecure_server.js, maka hasilnya tidak akan ditemukan karena

file-file tersebut tidak memiliki akhiran unik yang telah ditentukan tadi.

1 http . createServer ( function ( req , res ) {


2 // tampung request , kemudian tentukan file mana yang akan dikembalikan ke
client
3 var lookup = url . parse ( decodeURI ( req . url ) ) . pathname ;
4 lookup = ( lookup === / ) ? / index . html - serve : lookup + serve ;
5 var f = content + lookup ;
6 console . log ( f ) ;
7 // cek keberadaan file
8 fs . exists (f , function ( exists ) {
9 if (! exists ) {
10 res . writeHead (404) ;
11 res . end ( Page not found ) ;
12 return ;
13 }
14 // lanjutkan proses membaca file ...

12
15 }) ;

Listing 8: Penambahan akhiran untuk setiap file statik yang akan disediakan untuk client

Ditambahkan pula fungsi fs.exists untuk mengecek apakah file yang diminta ada atau

tidak di server, kalau tidak ada maka server mengembalikan respon dengan HTTP kode

404.

Sekarang ketika kode exploit tadi dieksekusi kembali, maka server akan merespon dengan

kode 404 yang menyatakan bahwa file tidak ditemukan di server karena request yang diminta

menjadi ../insecure_server.js-serve.

curl localhost :8080/../ i n se cu r e_ s er ve r . js -i

Kemudian apakah cara seperti ini sudah tepat?.

Ternyata teknik ini masih bisa disiasati, yaitu dengan menambahkan karakter %00 pada

parameter requestnya. Sehingga ketika exploit dieksekusi kembali maka server akan meres-

pon dengan kode server yaitu file insecure_server.js.

curl localhost :8080/../ i n se cu r e_ s er ve r . js %00/ index . html -i

Solusi dari celah kemanan seperti ini adalah dengan menggunakan fungsi path.normalize

yang dimiliki oleh modul path dari nodejs. Dengan fungsi ini, karakter relative path (../)

akan dibuang terdahulu sebelum diteruskan ke fungsi fs.readFile.

1 http . createServer ( function ( req , res ) {


2 // tampung request , kemudian tentukan file mana yang akan dikembalikan ke
client
3 var lookup = url . parse ( decodeURI ( req . url ) ) . pathname ;
4 lookup = path . normalize ( lookup ) ;
5 lookup = ( lookup === / ) ? / index . html : lookup ;
6 var f = content + lookup ;
7 console . log ( f ) ;

Listing 9: Penambahan fungsi path.normalize pada path url yang diterima server

Dari beberapa contoh diatas bisa kita dapatkan 2 jenis teknik untuk mengeksploitasi

server nodejs akibat implementasi yang kurang baik terhadap API filesystem oleh pengem-

bang. Yang pertama adalah relative directory traversal, yaitu memanfaatkan keyword ../

untuk proses penelusuran terhadap direktori yang seharusnya tidak dijinkan untuk diakses.

Kemudian yang kedua adalah poison null byte attack, dengan menggunakan karakter %00

13
yang notabene adalah URL hex code dari null byte. Sehingga ketika null byte ini sampai di

server maka node akan menganggap null terhadap bagian insecure_server.js, selanjutnya

ketika karakter-karakter ini masuk dalam proses pembacaan file, teryata yng dibaca bukan

bagian index.html tetapi bagian insecure_server.js sehingga yang dikirimkan sebagai respon

terhadap client adalah file kode dari server itu sendiri.

Implementasi teknik-teknik diatas bisa melalui berbagai bentuk, biasanya lewat POST

request ke server. Maka dari itu hal utama yang harus dilakukan lagi-lagi adalah memvalidasi

dan membersihkan seluruh data masukan yang dikirimkan oleh client. Perlakukan data dari

client sebagai data yang sangat berbahaya dan tidak terpercaya sampai proses validasi

sukses.

2.2.5 Whitelisting

Untuk nodejs yang diutilisasikan sebagai web server yang melayani file statik bisa diterapkan

teknik whitelisting. Pendekatan pengamanan dengan whitelisting ini tergolong sangat ketat,

dimana file yang akan dikirim dimasukan kedalam daftar terpercaya sehingga file-file selain

yang berada pada daftar tersebut tidak akan bisa diakses. Pendekatan whitelist ini bisa

dengan sederhana kita terapkan, yaitu misalnya dengan membuat daftar apa saja yang bisa

diakses oleh client kemudian daftar tersebut dipasangkan pada konfigurasi server -nya.

1 // contoh whitelisting
2 var whiteListing = [ index . html ,
3 style . css ,
4 script . js
5 ];
6 /* *
7 * saat menerima request , cek apakah request termasuk dalam whitelist atau
tidak .
8 */
9 if ( whitelist . indexOf ( lookup ) === -1) {
10 res . writeHead (404) ;
11 res . end ( Page not found ;
12 }

Listing 10: Contoh penggunaan whitelisting

Pasang whitelist ini pada server nodejs, sehingga ketika ada request dari client meminta

file yang tidak ada pada whitelist maka kemudian akan direspon dengan HTTP kode 404.

14
2.2.6 Konfigurasi server nodejs

Salah satu kesalahan yang sering dilakukan oleh para pengembang untuk menjalankan nodejs

adalah dengan menggunakan jenis pengguna dengan hak akses yang paling tinggi. Biasanya

ini dilakukan oleh para pengembang yang tidak ingin direpotkan ketika aplikasi mereka

dijalankan pada port yang khusus seperti port 80 atau 443.

Sebenarnya ini bisa diatasi dengan mengkonfigurasi proxy didepan server aplikasi web

[9]. Biasanya nginx digunakan untuk keperluan ini, dimana nginx berfungsi sebagai reverse-

proxy yang menerima semua request dan meneruskannya ke server aplikasi web.

Apabila tidak ingin repot dengan cara tadi, pada nodejs juga terdapat modul yang

digunakan khusus untuk proxy, yaitu http-proxy [10]. Dengan pendekatan ini, aplikasi web

server tidak harus berjalan pada port 80 atau 443 dan langsung terekspose ke jaringan

internet, namun port yang khusus tadi dipakai untuk proxy yang dibuat. Kemudian web

server aplikasi berjalan diselain port tersebut dan tidak langsung terekspose ke jaringan

internet. Sehingga antara proxy server dan web server berkomunikasi melalui jaringan lokal

saja.

1 var http = require ( http ) ,


2 httpProxy = require ( http - proxy ) ;
3 // Buat proxy server , dan berjalan pada port 80
4 httpProxy . createServer (9000 , localhost ) . listen (80) ;
5 // Buat target server yang berjalan di port 9000
6 http . createServer ( function ( req , res ) {
7 res . writeHead (200 , { Content - Type : text / plain }) ;
8 res . write ( request successfully proxied ! + \ n + JSON . stringify ( req .
headers , true , 2) ) ;
9 res . end () ;
10 }) . listen (9000) ;

Listing 11: Implementasi modul http-proxy untuk membuat proxy server sederhana

Berdasarkan listing kode diatas, maka setiap request yang masuk ke server pada port 80

akan langsung diteruskan ke port 9000 dimana disana terdapat web server aplikasi.

Pada bagian sebelumnya dijelaskan bahwa aplikasi nodejs selalu mengalami crash ketika

suatu error tidak ditangani dengan baik. Hal ini tentu sangat merepotkan apabila ketika

aplikasi web server crash dan layanan menjadi tidak tersedia maka secara manual harus

menghidupkannya lagi. Tetapi hal tersebut bisa ditangani dengan modul forever [11]. Modul

forever ini merupakan utilitas CLI (command-line interface) yang disediakan untuk nodejs

supaya proses suatu aplikasi nodejs dijalankan secara terus menerus, sehingga ketika terjadi

15
terminasi baik disengaja atau tidak maka forever akan bekerja untuk menghidupkan proses

itu kembali.

2.2.7 Strategi mebuat server nodejs yang handal

Terkadang sering ditemui keadaan dimana beban dari aplikasi web diluar batas kemampuan

sumber daya sistem untuk melayani. Akibat dari keadaan tersebut bisa membuat layanan

jadi mati dan tidak bisa diakses lagi. Penyebab beban yang tinggi tersebut salah satunya

adalah serangan DoS (denial of service), yang secara sengaja membuat server menjadi sibuk

dan akhirnya crash.

Sebenarnya penanggulangan DoS ini bisa dilakukan tidak pada layer aplikasinya, tetapi

pada layer dibawah aplikasi, seperti misal bagaimana konfigurasi jaringan yang nantinya

dipakai aplikasi atau pada proxy yang dipasang didepan aplikasi. Tetapi tetap saja sebagai

pencegahan apabila layer tadi ternyata DoS tidak bisa dideteksi dan ditanggulangi maka

harus dibuat mekanisme agar server bisa diakses dan aplikasi tetap hidup.

Untuk mencapai ini, bisa digunakan modul yang sudah tersedia di npm yaitu modul

toobusy. Berikut bagaimana cara implementasinya :

1 var toobusy = require ( toobusy ) ;


2 app . use ( function ( req , res , next ) {
3 if ( toobusy () ) res . send (503 , " Server Busy " ) ;
4 else next () ;
5 }) ;

Listing 12: Implementasi modul toobusy

Pada cuplikan kode diatas bisa diketahui bahwa modul toobusy ini akan memonitor

ketersediaan sumber daya sistem. Apabila sumber daya sistem memungkinkan untuk me-

nerima request, maka request akan diteruskan dan dieksekusi oleh server. Sebaliknya ketika

server sedang memiliki beban yang sangat besar, maka request akan dikembalikan dengan

HTTP status 503.

Pendekatan yang digunakan oleh modul ini untuk mengukur apakah suatu server nodejs

mengalami beban request yang sangat tinggi dan masuk ke dalam kategori too busy adalah

dengan mengukur lag yang terjadi pada event-loop.

16
2.3 NPM (Nodejs Package Manager )

Merupakan utilitas yang sangat membantu para pengembang dalam membangun aplikasi di-

atas nodejs. Berlaku seperti utilitas apt pada linux varian ubuntu dimana para pengembang

bisa mengunduh pustaka/modul yang dibutuhkan dalam membangun aplikasinya.

Terkadang suatu aplikasi web yang sangat kompleks menggunakan banyak sekali modul

untuk mengerjakan fungsi-fungsi tertentu dalam aplikasinya yang tidak disediakan langsung

oleh API dari nodejs, maka dengan npm ini pengembang bisa dengan mudah mendapatk-

an pustaka/modul yang dibutuhkannya. Meskipun nodejs dilengkapi dengan pustaka yang

sangat lengkap seperti pustaka untuk berinteraksi dengan filesystem dan networking, na-

mun banyak sekali modul yang dibutuhkan dalam membangun aplikasi web tidak tersedia.

Misalnya modul untuk koneksi antara aplikasi dengan basis data atau modul mem-parsing

data yang dikirim oleh client lewat protokol HTTP. Modul-modul seperti itu yang tidak

disediakan langsung oleh API nodejs dan harus dibuat sendiri oleh para pengembang.

Karena sifatnya terbuka dan semua orang bisa menerbitkan modulnya di repository npm,

maka menjadi hal yang sangat penting bagi pengembang untuk memilih modul yang benar-

benar sudah teruji dan banyak digunakan oleh pengembang lainnya. Disamping itu saat

ini nodejs masih dalam tahap pengembangan yang sangat intensif sehingga sangat sering

mengalami perubahan baik di sisi desain maupun implementasi. Modul yang sudah banyak

penggunanya biasanya selalu mengikuti perkembangan dari nodejs sehingga pengembang

akan mendapatkan modul yang paling terbaru berdasarkan versi nodejs yang terakhir.

Karena pada repository npm ini tidak ada mekanisme yang menjamin bahwa modul

yang ada pada npm telah terverifikasi dengan baik, maka sebelum memasang suatu modul,

sebaiknya pastikan/periksa/tes dahulu apakah modul tersebut mengandung potensi celah

keamanan atau mengandung kode yang membahayakan. Saat ini modul yang ada pada

repository npm jumlahnya lebih dari sepuluh ribu modul, dan kesemuanya bisa langsung

diunduh oleh para pengembang dengan mudah.

Hal yang harus diperhatikan selanjutnya adalah dalam mengeksekusi npm, sebaiknya

jangan menggunakan tipe pengguna dengan tingkat administrasi paling tinggi yang mem-

punyai akses penuh ke sistem tetapi lebih baik membuat user yang mempunyai privilage

khusus yang terbatas. Hal ini bertujuan untuk mencegah adanya malware atau kode yang

membahayakan yang bisa saja dipasang tanpa diketahui saat mengunduh modul dari repo-

sitory.

17
3 Kesimpulan

Seperti pada peranti pengembang lainnya, nodejs mempunyai beberapa kerentanan dan

celah keamanan. Celah kemanan dan kerentanan tersebut mengancam properti dasar da-

lam konsep security yaitu confidentiality, integrity dan availability. Berdasarkan penjelasan

sebelumnya, properti availability tampaknya menjadi properti yang sangat rentan dan mem-

punyai potensi besar untuk dilanggar. Hal ini terkait dengan buruknya penanganan error

yang terjadi pada proses utama event-loop sehingga menyebabkan proses nodejs crash secara

seketika.

Kesalahan konfigurasi pada aplikasi atau membiarkan konfigurasi pada setingan default

juga membawa potensi kerentanan yang bisa dieksploitasi. Salah satunya yaitu dengan

melakukan serangan DoS yang dapat menyebabkan server nodejs ekstra sibuk dan akhirnya

mengalami crash. Hal lain akibat keteledoran ini adalah besarnya potensi web server nodejs

untuk diserang dengan cross-site scripting dan cross-site requeset forgery yang biasanya

sangat merugikan pihak pengguna aplikasi web.

Penggunaan fungsi eval pada aplikasi menjadi salah satu hal yang harus sangat diper-

hatikan, karena pada penjelasan diatas penggunaan fungsi ini dapat mengancam integrity

dari aplikasi dimana dengan sedikit trik pada masukan yang diberikan terhadap aplikasi bisa

mengubah proses yang sedang berlangsung. Hal ini juga mendorong supaya proses validasi

masukan dilakukan secara baik dan ketat agar tidak terjadi keadaan seperti tadi.

Terakhir adalah dalam memanfaatkan utilitas npm, pengembang harus benar-benar cer-

mat dalam menentukan modul/pustaka yang dipakai dalam aplikasinya supaya tidak malah

menimbulkan kerentanan atau celah keamanan yang bisa terjadi.

Nodejs sampai saat ini masih dalam tahap pengembangan, perbaikan-perbaikan masih

terus dilakukan demi menjadikan nodejs sebuah peranti pengembang yang sempurna. Pa-

radigma baru dari nodejs yang membawa JavaScript ke sisi server dengan event-driven dan

asynchornous I/O sangatlah membantu dalam mengembangkan aplikasi web yang terukur,

berinteraksi secara real-time dan sangat bagus dalam akses data yang besar secara intensif.

18
4 Referensi

[1] (2013). [Online]. Available: http://www.nodejs.org

[2] A. Janmyr, A not very short introduction to node.js, 05 2011. [Online]. Available:

http://anders.janmyr.com/2011/05/not-very-short-introduction-to-nodejs.html

[3] K. Dna, Analysis of node.js platform web application security, Masters thesis,

Tallin University of Technology, 2012.

[4] B. P. D. P., Pengembangan aplikasi cloud computing menggunakan node.js, 5 2013,

online : https://github.com/bpdp/buku-cloud-nodejs.

[5] Popular starred repositories, 2013. [Online]. Available: https://github.com/popular/

starred

[6] A. K. Ben Vinegar, Third-party JavaScript, R. Gregoire, Ed. 20 Baldwin Road PO

Box 261 Shelter Island, NY 11964: Manning Publications Co., 2013.

[7] Ollie, Seven web server http headers that improve web application security

for free, 3 2012. [Online]. Available: http://recxltd.blogspot.com/2012/03/

seven-web-server-http-headers-that.html

[8] A. Stannard. (2011, 12) Intro to nodejs for .net develo-

pers. [Online]. Available: http://www.aaronstannard.com/post/2011/12/14/

Intro-to-NodeJS-for-NET-Developers.aspx

[9] A. Baldwin, Writing secure express.js apps, 12 2012. [Online]. Available:

http://blog.liftsecurity.io/post/37388272578/writing-secure-express-js-apps

[10] Node-http-proxy, 2010. [Online]. Available: https://github.com/nodejitsu/

node-http-proxy

[11] Forever. [Online]. Available: https://github.com/nodejitsu/forever

19