SlideShare a Scribd company logo
1 of 22
Download to read offline
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
2.1

4

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

4

2.1.2

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

5

2.1.3

Clickjacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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
2.3

4

2.1.1

2.2

JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Nodejs

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 perusahaan 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 kemampuan 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 menggunakan model event-driven dan non-blocking I/O (asynchronous). Sebenarnya model tersebut
sebelumnya sudah ada yang mengimplementasikan, yaitu Event Machine yang dibuat dengan 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 sangat 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 lainnya [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 aplikasi 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 menggunakan utilitas yang bernama npm. Npm ini merupakan utilitas untuk mengelola paket
modul/komponen yang disertakan saat instalasi nodejs, dengan npm pengembang bisa mengunduh 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 mempercepat penyelesaian aplikasi.
Sekarang proyek nodejs ini sepenuhnya didukung dan dikelola oleh Joyent, Inc. Semua
orang bisa berkontribusi untuk pengembangannya karena kode sumber dari peranti pengembang 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 suatu 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 dokumen 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 dalam 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 adanya 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 pengembang 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 konten 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 memanipulasi DOM (Document Object Model ) dalam peramban web untuk melakukan fungsifungsi 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 pihakpihak 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. Dengan 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 merugikan 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 kemanan 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 untuk mengembangkan suatu mesin penginterpretasi JavaScript sendiri. Mesin yang mereka
kembangkan kemudian dikenal dengan nama V8. Mesin V8 ini mengkompilasi kode JavaScript 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
10

}) . listen (8080) ;
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 dasar 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 konfigurasinya. 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 informasi 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 HTTPOnly. 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 peramban 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 “nostrore, no-cache”.
Pada nodejs, telah disediakan modul untuk mengatasi opsi header apa yang akan diberikan 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 pelanggaran 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
4

res . locals . csrftoken = req . session . _csrf ;
}) ;

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 penting, 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 tersebut 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 JavaScript. 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 menerima 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 merupakan 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 filesystem. 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 filesystem 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
24
25

res . end ( data ) ;
}) ;
}) . listen (8080) ;

11
Listing 7: Kode insecure_server.js
Ketika web server berjalan dan diakses pada halaman http://localhost:8080, maka server 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 insecure_server.js. Bahkan apabila ditelusuri lebih lanjut, ternyata kode diatas bisa untuk mengakses 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 peramban 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
2

http . createServer ( function ( req , res ) {
// 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 ’

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

: lookup + serve ;
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 merespon 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
2

http . createServer ( function ( req , res ) {
// 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 pengembang. 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 reverseproxy 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
10

res . end () ;
}) . 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 menerima 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 diatas 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 mendapatkan pustaka/modul yang dibutuhkannya. Meskipun nodejs dilengkapi dengan pustaka yang
sangat lengkap seperti pustaka untuk berinteraksi dengan filesystem dan networking, namun 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 benarbenar 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 mempunyai 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 repository.

17
3

Kesimpulan

Seperti pada peranti pengembang lainnya, nodejs mempunyai beberapa kerentanan dan
celah keamanan. Celah kemanan dan kerentanan tersebut mengancam properti dasar dalam konsep security yaitu confidentiality, integrity dan availability. Berdasarkan penjelasan
sebelumnya, properti availability tampaknya menjadi properti yang sangat rentan dan mempunyai 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 diperhatikan, 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 cermat 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. Paradigma 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. Düüna, “Analysis of node.js platform web application security,” Master’s 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.
pers.

Stannard.
[Online].

(2011,
Available:

12)

Intro

to

nodejs

for

.net

develo-

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

More Related Content

What's hot (6)

Modul MySQL TIngkat Lanjut
Modul MySQL TIngkat LanjutModul MySQL TIngkat Lanjut
Modul MySQL TIngkat Lanjut
 
Tutorial Ci indonesia
Tutorial Ci indonesiaTutorial Ci indonesia
Tutorial Ci indonesia
 
Ci indonesia
Ci indonesiaCi indonesia
Ci indonesia
 
Ci 1
Ci 1Ci 1
Ci 1
 
Pemanfaatan sql server dengan vb6
Pemanfaatan sql server dengan vb6Pemanfaatan sql server dengan vb6
Pemanfaatan sql server dengan vb6
 
Modul praktikum database programing
Modul praktikum database programingModul praktikum database programing
Modul praktikum database programing
 

Similar to Analisis Keamanan Nodejs sebagai platorm aplikasi web

Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniterMembangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
Beni Krisbiantoro
 
Laporan praktikum modul 3
Laporan praktikum modul 3Laporan praktikum modul 3
Laporan praktikum modul 3
Devandy Enda
 
Laporan pemrograman visual3
Laporan pemrograman visual3Laporan pemrograman visual3
Laporan pemrograman visual3
Fenty Hidayati
 
Isman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication FoundationIsman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication Foundation
Isman Subarkah
 

Similar to Analisis Keamanan Nodejs sebagai platorm aplikasi web (20)

Web Interaktif
Web InteraktifWeb Interaktif
Web Interaktif
 
Tugas[1] 0317-[tryanita]-[1411511676]
Tugas[1] 0317-[tryanita]-[1411511676]Tugas[1] 0317-[tryanita]-[1411511676]
Tugas[1] 0317-[tryanita]-[1411511676]
 
Rekayasa web
Rekayasa webRekayasa web
Rekayasa web
 
Seminar Web 2.0 Security - Undip Semarang - Nov 2007
Seminar Web 2.0 Security - Undip Semarang - Nov 2007Seminar Web 2.0 Security - Undip Semarang - Nov 2007
Seminar Web 2.0 Security - Undip Semarang - Nov 2007
 
Tugas2 krisna muktiandika-1511510347
Tugas2 krisna muktiandika-1511510347Tugas2 krisna muktiandika-1511510347
Tugas2 krisna muktiandika-1511510347
 
Rpp pemrog-web-kd-01
Rpp pemrog-web-kd-01Rpp pemrog-web-kd-01
Rpp pemrog-web-kd-01
 
Frame work php
Frame work phpFrame work php
Frame work php
 
Tugas 2 - 0317-mukhlis abdilah-1411511213
Tugas 2 - 0317-mukhlis abdilah-1411511213Tugas 2 - 0317-mukhlis abdilah-1411511213
Tugas 2 - 0317-mukhlis abdilah-1411511213
 
Makalah Mobile Programming
Makalah Mobile ProgrammingMakalah Mobile Programming
Makalah Mobile Programming
 
Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniterMembangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
Membangun Aplikasi SMS dengan Gammu dan PHP Framework CodeIgniter
 
Membuat Aplikasi dengan Framework Hybrid Flutter dengan Database Server Docker
Membuat Aplikasi dengan Framework Hybrid Flutter dengan Database Server DockerMembuat Aplikasi dengan Framework Hybrid Flutter dengan Database Server Docker
Membuat Aplikasi dengan Framework Hybrid Flutter dengan Database Server Docker
 
Node.js
Node.jsNode.js
Node.js
 
MEMBANGUN SERVER VIDEO STREAMING BERBASIS CLOUD DENGAN ViMP
MEMBANGUN SERVER VIDEO STREAMING BERBASIS  CLOUD DENGAN ViMPMEMBANGUN SERVER VIDEO STREAMING BERBASIS  CLOUD DENGAN ViMP
MEMBANGUN SERVER VIDEO STREAMING BERBASIS CLOUD DENGAN ViMP
 
tugas APS
tugas APStugas APS
tugas APS
 
Laporan praktikum modul 3
Laporan praktikum modul 3Laporan praktikum modul 3
Laporan praktikum modul 3
 
Travel
TravelTravel
Travel
 
Travel
TravelTravel
Travel
 
Nordrassil project web pembangkit ddl dan kode sumber aplikasi basis data
Nordrassil project  web pembangkit ddl dan kode sumber aplikasi basis dataNordrassil project  web pembangkit ddl dan kode sumber aplikasi basis data
Nordrassil project web pembangkit ddl dan kode sumber aplikasi basis data
 
Laporan pemrograman visual3
Laporan pemrograman visual3Laporan pemrograman visual3
Laporan pemrograman visual3
 
Isman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication FoundationIsman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication Foundation
 

Analisis Keamanan Nodejs sebagai platorm aplikasi web

  • 1. Analisis Keamanan Pada Nodejs Sebagai Platform Aplikasi Web Oleh : Irfan Aris Nur Hakim / 23512129 MAGISTER INFORMATIKA INSTITUT TEKNOLOGI BANDUNG 2013
  • 2. 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 2.1 4 Cross-site scripting (XSS) . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.2 Cross-site request forgery (CSRF) . . . . . . . . . . . . . . . . . . . . 5 2.1.3 Clickjacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 2.3 4 2.1.1 2.2 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strategi mebuat server nodejs yang handal . . . . . . . . . . . . . . . 16 Nodejs NPM (Nodejs Package Manager ) . . . . . . . . . . . . . . . . . . . . . . . . . 17 3 Kesimpulan 18 4 Referensi 19 i
  • 3. Daftar Gambar 1 Logo nodejs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Event-loop pada nodejs. [8] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 ii
  • 4. 1 Pendahuluan 1.1 Sekilas Tentang Nodejs Sekitar awal tahun 2009, seorang pengembang dari Joyent yang merupakan sebuah perusahaan 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 kemampuan 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 menggunakan model event-driven dan non-blocking I/O (asynchronous). Sebenarnya model tersebut sebelumnya sudah ada yang mengimplementasikan, yaitu Event Machine yang dibuat dengan 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 sangat 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 lainnya [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 aplikasi 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 menggunakan utilitas yang bernama npm. Npm ini merupakan utilitas untuk mengelola paket modul/komponen yang disertakan saat instalasi nodejs, dengan npm pengembang bisa mengunduh modul atau komponen yang biasanya bersifat reusable code yang diperlukan untuk 1
  • 5. 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 mempercepat penyelesaian aplikasi. Sekarang proyek nodejs ini sepenuhnya didukung dan dikelola oleh Joyent, Inc. Semua orang bisa berkontribusi untuk pengembangannya karena kode sumber dari peranti pengembang 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 suatu 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 dokumen 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 dalam 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
  • 6. 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 adanya 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
  • 7. 2 Nodejs Sebagai Platform Aplikasi Web 2.1 JavaScript Saat ini JavaScript merupakan bahasa yang paling populer digunakan oleh para pengembang 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 konten 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 memanipulasi DOM (Document Object Model ) dalam peramban web untuk melakukan fungsifungsi 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 pihakpihak 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. Dengan 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
  • 8. 2.1.2 Cross-site request forgery (CSRF) Cross-site request forgery merupakan tipe serangan lainnya yang umumnya sangat merugikan 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 kemanan 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 untuk mengembangkan suatu mesin penginterpretasi JavaScript sendiri. Mesin yang mereka kembangkan kemudian dikenal dengan nama V8. Mesin V8 ini mengkompilasi kode JavaScript 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
  • 9. 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 10 }) . listen (8080) ; 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 dasar 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 konfigurasinya. 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 informasi 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 HTTPOnly. 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
  • 10. 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 peramban 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 “nostrore, no-cache”. Pada nodejs, telah disediakan modul untuk mengatasi opsi header apa yang akan diberikan 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
  • 11. Modul express dilengkapi dengan beberapa fungsi untuk mencegah terjadinya pelanggaran 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 4 res . locals . csrftoken = req . session . _csrf ; }) ; 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 penting, 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
  • 12. 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 tersebut 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
  • 13. 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 JavaScript. 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 menerima 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 merupakan 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
  • 14. 2.2.4 Filesystem exploits Salah satu API dari nodejs yang sangat penting adalah kemampuan akses ke dalam filesystem. 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 filesystem 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 24 25 res . end ( data ) ; }) ; }) . listen (8080) ; 11
  • 15. Listing 7: Kode insecure_server.js Ketika web server berjalan dan diakses pada halaman http://localhost:8080, maka server 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 insecure_server.js. Bahkan apabila ditelusuri lebih lanjut, ternyata kode diatas bisa untuk mengakses 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 peramban 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 2 http . createServer ( function ( req , res ) { // 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 ’ 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 : lookup + serve ;
  • 16. 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 merespon 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 2 http . createServer ( function ( req , res ) { // 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 pengembang. 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
  • 17. 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
  • 18. 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 reverseproxy 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 10 res . end () ; }) . 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
  • 19. 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 menerima 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
  • 20. 2.3 NPM (Nodejs Package Manager ) Merupakan utilitas yang sangat membantu para pengembang dalam membangun aplikasi diatas 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 mendapatkan pustaka/modul yang dibutuhkannya. Meskipun nodejs dilengkapi dengan pustaka yang sangat lengkap seperti pustaka untuk berinteraksi dengan filesystem dan networking, namun 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 benarbenar 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 mempunyai 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 repository. 17
  • 21. 3 Kesimpulan Seperti pada peranti pengembang lainnya, nodejs mempunyai beberapa kerentanan dan celah keamanan. Celah kemanan dan kerentanan tersebut mengancam properti dasar dalam konsep security yaitu confidentiality, integrity dan availability. Berdasarkan penjelasan sebelumnya, properti availability tampaknya menjadi properti yang sangat rentan dan mempunyai 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 diperhatikan, 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 cermat 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. Paradigma 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
  • 22. 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. Düüna, “Analysis of node.js platform web application security,” Master’s 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. pers. Stannard. [Online]. (2011, Available: 12) Intro to nodejs for .net develo- 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