Multithreading mengacu kepada dua
atau lebih task (tugas, thread) yang berjalan (sedang dieksekusi) di dalam satu
program. Thread merupakan suatu path eksekusi independen di dalam program.
Banyak thread dapat nerjalan secara konkuren (berbarengan) di dalam program.
Setiap thread di dalam Java dibuat dan dikendalikan oleh kelas
java.lang.Thread. Suatu program Java dapat mempunyai banyak thread, dan
thread-thread ini dapat berjalan secara bersamaan, secara asinkron atau
sinkron.
Multithreading mempunyai beberapa
keuntungan, dibandingkan multiprocessing, di antaranya:
- Thread bersifat lightweight, sedangkan proses lebih berat. Perlu diketahui bahwa proses adalah program yang sedang berada di memory atau processor, sedang dieksekusi. Thread dapat diartikan sebagai anak dari proses.
- Thread-thread berbagi pakai ruang alamat yang sama dan karena itu dapat berbagi pakai data dan kode (instruksi)
- Context switching antar thread biasanya lebih murah daripada antar proses.
- Biaya komunikasi antar thread relatif lebih rendah daripada komunikasi antar proses.
- Thread memungkinkan task-task berbeda dikerjakan secara konkuren.
Kelas Thread merupakan turunan dari
kelas Object. Kelas Object sendiri mempunyai metode notify(), notifyAll() dan
wait(), sedangkan kelas Thread menyediakan metode sleep() dan yield().
Metode-metode ini akan sering digunakan dalam pengelolaan aplikasi banyak
thread.
Pembuatan Thread
Terdapat 2 (dua) cara membuat thread
di dalam Java:
- Mengimplementasikan interface Runnable (java.lang.Runnable)
- Menurunkan (extend) kelas Thread (java.lang.Thread)
Mengimplementasikan Interface
Runnable
Bentuk dasar (signature) dari
interface Runnable adalah
1
|
public interface Runnable {
|
|
2
|
void
run();
|
3
|
}
|
Pada pendekatan ini, kita harus
membuat sebuah kelas yang implementasi interface Runnable menggunakan kata
kunci implements Runnable. Kemudian dibuat instansiasi berupa suatu
obyek dari kelas itu. Kita perlu meng-override metode run() di dalam
kelas itu, satu-satunya metode yang perlu diimplementasikan. Metode run()
mengandung logika dari thread yang dibangun.
Prosedur pembuatan thread
berdasarkan pendekatan interface Runnable adalah sebagai berikut:
- Sebuah kelas meng-implements interface Runnable, menyediakan metode run() di dalamnya yang akan dieksekusi oleh thread nantinya. Obyek dari kelas ini merupakan obyek Runnable.
- Obyek dari kelas Thread dibuat dengan melewatkan obyek Runnable sebagai argumen ke konstruktur Thread. Obyek Thread sekarang mempunyai suatu obyek Runnable yang mengimplementasikan metode run().
- Metode start() pada obyek Thread yang dibuat sebelumnya dipanggil. Metode start() tersebut kembali segera setelah suatu thread dilahirkan (berhasil dibuat).
- Thread berakhir ketika metode run() berakhir, baik dengan penyelesaian normal atau dengan melempar suatu eksepsi tidak tertangkap (uncaught exception).
Di bawah ini adalah sebuah program
yang mengilustrasikan pembuatan thread menggunakan interfaca Runnable, bukan
meng-extend kelas Thread. Suatu thread dimulai ketika kita memanggil metode
start() pada obyek yang dibuat.
01
|
class RunnableThread implements
Runnable {
|
|
02
|
03
|
Thread runner;
|
|
04
|
05
|
public RunnableThread() { }
|
|
06
|
07
|
public RunnableThread(String threadName)
{
|
|
08
|
runner =
new Thread(this,
threadName); // (1) Buat thread baru.
|
09
|
System.out.println(runner.getName());
|
|
10
|
runner.start();
// (2) Memulai eksekusi thread tersebut.
|
11
|
}
|
|
12
|
13
|
public void
run() {
|
|
14
|
//Tampilkan
info tentang thread ini
|
15
|
System.out.println(Thread.currentThread());
|
|
16
|
}
|
17
|
}
|
|
18
|
19
|
public class RunnableExample {
|
|
20
|
21
|
public static void
main(String[] args) {
|
|
22
|
Thread
thread1 = new Thread(new RunnableThread(),
"thread1");
|
23
|
Thread thread2
= new Thread(new RunnableThread(),
"thread2");
|
|
24
|
RunnableThread
thread3 = new RunnableThread("thread3");
|
25
|
||
26
|
//Memulai
eksekusi thread.
|
27
|
thread1.start();
|
28
|
thread2.start();
|
29
|
try {
|
|
30
|
//delay
selama satu detik (1000 ms).
|
31
|
Thread.currentThread().sleep(1000);
|
|
32
|
} catch (InterruptedException e)
{ }
|
33
|
||
34
|
//Tampilkan
info tentang thread main (utama).
|
35
|
System.out.println(Thread.currentThread());
|
|
36
|
}
|
37
|
}
|
Keluaran dari Program di atas dapat
berupa:
thread3
Thread[thread1,5,main]
Thread[thread2,5,main]
Thread[thread3,5,main]
Thread[main,5,main]private
Thread[thread1,5,main]
Thread[thread2,5,main]
Thread[thread3,5,main]
Thread[main,5,main]private
Pendekatan ini harus digunakan jika
kelas yang menginstansiasi obyek thread diperlukan (sebagai parent) untuk
membuat kelas-kelas lain yang merupakan keturunannya. Pada kasus demikian, kita
tidak boleh menurunkan kelas Thread, harus mengimplementasikan Runnable.
Meng-Extend Kelas Thread
Prosedur pembuatan thread melalui
pendekatan penurunan kelas Thread adalah sebagai berikut:
- Membuat sebuah sub-kelas turunan dari kelas Thread, kemudian meng-override metode run() dari kelas Thread dan di dalamnya didefinisikan beberapa kode yang dieksekusi oleh thread.
- Sub-kelas ini dapat memanggil suatu konstruktur Thread secara eksplisit untuk menginisialisasi thread, menggunakan metode super().
- Metode start() yang telah diturunkan (secara otomatis) dari kelas Thread dipanggil agar thread segera berjalan.
Berikut ini adalah sebuah program
yang mengilustrasikan pembuatan thread dengan meng-extend kelas Thread sebagai
ganti mengimplementasikan interface Runnable. Metode start() digunakan untuk
mengeksekusi obyek thread yang dibuat.
01
|
class XThread extends
Thread {
|
|
02
|
03
|
XThread() { }
|
|
04
|
05
|
XThread(String threadName) {
|
|
06
|
super(threadName);
// Memulai thread.
|
07
|
System.out.println(this);
|
|
08
|
start();
|
09
|
}
|
|
10
|
11
|
public void
run() {
|
|
12
|
//Tampilkan
info tentang thread ini
|
13
|
System.out.println(Thread.currentThread().getName());
|
|
14
|
}
|
15
|
}
|
|
16
|
17
|
public class ThreadExample {
|
|
18
|
19
|
public static void
main(String[] args) {
|
|
20
|
Thread
thread1 = new Thread(new XThread(), "thread1");
|
21
|
Thread
thread2 = new Thread(new XThread(), "thread2");
|
|
22
|
23
|
// 2
thread diberikan nama default
|
|
24
|
Thread
thread3 = new XThread();
|
25
|
Thread
thread4 = new XThread();
|
|
26
|
Thread
thread5 = new XThread("thread5");
|
27
|
||
28
|
//Memulai
eksekusi thread
|
29
|
thread1.start();
|
30
|
thread2.start();
|
31
|
thread3.start();
|
32
|
thread4.start();
|
33
|
try {
|
|
34
|
//Metode sleep() dipanggil pada
thred main (utama), delay 1 detik.
|
35
|
Thread.currentThread().sleep(1000);
|
|
36
|
} catch (InterruptedException e) { }
|
37
|
||
38
|
//Tampilkan
info tentang thread main
|
39
|
System.out.println(Thread.currentThread());
|
|
40
|
}
|
41
|
}
|
Keluaran yang diperoleh dapat
berupa:
Thread[thread5,5,main]
thread1
thread5
thread2
Thread-3
Thread-2
Thread[main,5,main]
thread1
thread5
thread2
Thread-3
Thread-2
Thread[main,5,main]
Pada saat membuat thread, ada dua
alasan mengapa kita mengimplementasikan interface Runnable, bukan meng-extend
kelas Thread:
- Menurunkan kelas Thread berarti bahwa subclass tidak dapat diturunkan menjadi kelas lain lagi, sedangkan suatu kelas yang mengimplementasikan interface Runnable mempunyai opsi ini.
- Suatu kelas mungkin hanya diinginkan runnable, karena itu menurunkan Thread secara penuh merupakan pemborosan.
Contoh dari kelas anonim berikut
memperlihatkan bagaimana membuat sebuah thread dan langsung menjalankannya:
1
|
( new Thread() {
|
|
2
|
public
void run()
{
|
3
|
for(;;)
System.out.println(”Stop the world!”);
|
|
4
|
}
|
5
|
}
|
|
6
|
).start();
|
Remote Procedure Call
(RPC)
Definisi RPC
adalah suatu protokol yang menyediakan suatu
mekanisme komunikasi antar proses yang mengijinkan suatu program untuk berjalan
pada suatu komputer tanpa terasa adanya eksekusi kode sistem yang jauh
(remote system).
- RPC digunakan untk membangun
aplikasi klien server yang terdistribusi.
- Didasarkan pada memperluas konsep
konvensional dari suatu prosedur dimana nantinya
mempunyai alamat sama dengan lokasi
prosedur dipanggil.
- RPC mengasumsi keberadaan TCP atau
UDP untuk membawa pesan data dalam komniasi
suatu program.
- Protokol RPC dibangun diatas protokol eXternal Data Representasi
(XDR) yang merupakan sandar representasi
data dalam komunikasi remote.
- Protokol RPC mengijinkan pengguna untuk bekerja dengan remote sebagaimana bekerja dengan prosedur lokal.
- Protokol RPC mengijinkan pengguna untuk bekerja dengan remote sebagaimana bekerja dengan prosedur lokal.
Protocol Message RPC
•Didefinisikan dengan menggunakan deskripsi data XDR yang meliputi
struktur, enumerasi, dan union.
•Membutuhkan faktor-faktor pendukung :
1. Spesifikasi yang unik untuk tiap
procedure call
2. Respon message yang sesuai untuk
tiap message yang diminta.
3. Otentifikasi klien untuk tiap
layanan
Struktur Protokol
Message RPC
a. Call Message
• Dilakukan oleh klien, dimana
meminta server untuk mengeksekusi suatu prosedur.
• Terdapat nilai-nilai unsigned
integer yangdigunakan untuk mengidentifikasi prosedur remote, yang diminta:
1. Nomor Program
2. Nomor Versi dari Program
3. Nomor Prosedur
2. Nomor Versi dari Program
3. Nomor Prosedur
b.
Reply Message
• Dikirimkan
oleh server jaringan, bervariasi tergantung apakah call message yang diminta
klien diterima atau ditolak
•Mengandung informasi:
1. RPM mengeksekusi call
message dengan sukses
2. Implementasi remote tidak
sesuai dengan protokol yang digunakan (versi yang lebih tinggi atau lebih rendah ditolak)
3. Program remote tidak
tersedia pada sistem remote
4. Program remote tidak
mendukung versi yang diminta klien
5. Nomor prosedur yang
diminta tidak ada
Fitur dalam RPC
1. Batching Calls
Mengijinkan klien
untuk mengirim message calls ke server dalam jumlah besar secara berurutan.
2. Broadcasting Calls
Menijinkan klien
untuk mengirimkan paket data ke jaringan dan menunggu balasan dari network.
3. Callback Procedures
Mengijinkan
server untuk bertindak sebagai klien dan melakukan RPC callback ke proses yang dijalankan klien.
4. Select Subrutin
Memeriksa
deskripsi suatu file dan messages dalam antrian untuk melihat apakah siap
dibaca atau ditulis, atau ditahan. (mengijinkan server untuk menginterupsi
suatu aktivitas)
Otentifikasi RPC
•
Otentifikasi adalah proses yang digunakan untuk mengidentifikasi server dan
klien pada RPC.
• Bagian-bagian
otentifikasi RPC, yaitu :
1.Protokol Otentifikasi RPC
2.Otentifikasi NULL
Digunakan
pada sistem dimana pemanggil RPC tidak mengetahui identitasnya sendiri dan
server tidak membutuhkan identitas pemanggil
3.Otentifikasi UNIX
Digunakan
pada prosedur remote dalam sistem UNIX
4.Otentifikasi
Data Encryption Standard
Membutuhkan
keyserv daemon yang harus berjalan baik di sisi server maupun klien.
5.
Protokol Otentifikasi DES
Meliputi
protokol penanganan DES pada proses otentifikasi RPC.
6.
Enkripsi Diffie-Hellman
Digunakan
pada pembuatan kunci publik pada otentifikasi DES dengan 192-bit kunci.
• RPC tidak berhubungan dengan
kontrol akses terhadap layanan individual yang diberikan.
• Subsistem otentifikasi pada paket
RPC bersifat open-ended, yaitu beberapa otentifikasi dapatdiasosiasikan pada
RPC klien
Bahasa RPC
•
Merupakan bahasa yang dikembangkan dari bahasa XDR dengan penambahan program
definisi.
•
Implementasi layanan protokol dan rutin menggunakan command rpcgen, yang
bekorespondensi denga bahasa C.
Definisi dari bahasa RPC, yaitu :
1. Definition
File dengan
bahasa RPC memiliki beberapa definisi, diantaranya adalah : enum, struct,
union, typedef, const, dan program.
2. Structure
Struktur pada
bahasa RPC dideklarasikan seperti pada pendeklarasian struktur dalam bahasa C
3. Union
Union pada bahasa
RPC berbeda dengan bahasa C. Kemiripan lebih ditunjukkan dengan variasi pada
bahasa Pascal
4. Enumeration
Enumerasi pada
bahasa ini memiliki syntax yang sama dengan bahasa C.
5. TypeDef
Tipe Definisi (
Typedef ) pada bahasa ini memiliki syntax yang sama dengan typedef pada bahasa
C.
6. Constant
Constant pada
bahasa ini dapat digunakan jika variabel integer konstant dibutuhkan.
7. Programs
Program RPC
dideklarasikan dengan syntax berikut secara berurutan : programdefiniton,
version-list, version, procedure-list, procedure.
8. Declarations
Dalam bahasa ini, terdapat empat jenis tipe
deklarasi yaitu : simple declarations, fixed length
array declarations, variable- length declaration, dan pointer
declaration.
Lapisan RPC
1. Lapisan
Tertinggi
• Merupakan lapisan yang
bersentuhan langsung dengan sistem operasi, mesin, dan jaringan tempat RPC
berjalan.
• Jenis-jenis servis yang digunakan
pada layer ini:
Rutin
Description
1. rnusers
mengembalikan
jumlah user pada sistem remote
2. rusers
mengembalikan informasi mengenai user tertentu
3.
hevedisk memeriksa
keberadaan disk pada mesin remote
4.
rstats
melihat kinerja dari kernel remote
5.
rwall
menulis untuk menentukan mesin remote tertentu
6.
yppasswd mengupdate password dari
user dalam yellow pages
2. Lapisan
Menengah
• Merupakan implementasi dari RPC sesungguhnya.
• Layer ini merupakan layer yang digunakan untuk
semua program RPC
• Pada layer ini terdapat rutin-rutin mengenai
"registerrpc()", "callrpc", dan scv run.
- ”registerrpc() digunakan untuk memperoleh nomor unik dari tiap prosedur identifikasi dalam tiap sistem.
- ”callrpc()” digunakan untuk mengeksekusi prosedur remote
3. Lapisan Terendah
- ”registerrpc() digunakan untuk memperoleh nomor unik dari tiap prosedur identifikasi dalam tiap sistem.
- ”callrpc()” digunakan untuk mengeksekusi prosedur remote
3. Lapisan Terendah
• Merupakan lapisan yang mengatur
tentang socket dan sistem call.
• Lapisan ini tidak memberikan data
dan servis secara detail untuk dapat digunakan.
• Umumnya program yang dibuat untuk
lapisan ini merupakan program yang paling efisien.
•
Digunakan beberapa tools untuk melakukan eksploitasi pada RPC.
• Pada
contoh kasus ini, implementasi dilakukan pada LAN dengan host yang menggunakan
SO Microsoft Windows XP.
• Tahapan eksekusi
Eksploitasi :
1.Deteksi sistem yang memiliki kelemahan
2.Penyerangan terhadap sistem tersebut
3.Eksekusi kode pada sistem yang telah ter-remote
2.Penyerangan terhadap sistem tersebut
3.Eksekusi kode pada sistem yang telah ter-remote
A. Deteksi Sistem
• Tools yang digunakan pada
tahap ini adalah RPCScan v.2.03
• Software ini dapat mendetaksi sistem operasi yang
memiliki kelemahan yaitu pada layanan DCOM (Distributed Component Object Model)
• Sistem yang
masih mengaktifkan layanan DCOM akan diberi status ”Vulnerable” dan sebaliknya
akan diberi status ”DCOM Disabled”
• Pada tahap ini akan dilakukan eksploitasi
protokol RPC, agar terjadi kekeliruan penanganan message dari penyerang (host1)
ke sistem yang diserang (host2) sehingga host1 dapat melakukan eksekusi kode
pada host2.
• Tools
yang digunakan bernama “Kaht” .Program ini akan mengeksploitasi port 135 dari
sistem yang terserang.
• host1( IP 192.168.0.87) telah berhasil masuk kedalam
sistem remote pada host2 (IP 192.168.0.13). Keberhasilan eksploitasi ini juga
dapat dilihat pada kondisi port-port yang terhubung antara host 1 dan host 2.
• Sebelum tereksploitasi,
tidak ada port TCP pada host1 yang terhubung dengan saipapun. Setelah
ekploitasi pada host 2 berhasil dilakukan, maka terlihat bahwa pada port 135
terjadi koneksi / koneksi sedang berjalan dan tersambung ( Figure 3.3). Dengan
demikian, maka pengeksekusian kode pada host2 oleh host1 dapat dilakukan.
• Sampai
tahap ini, host1 hanya merupakan user dengan hak biasa saja.
• Berikutnya
adalah implementasi pengeksekusian kode misalnya membuat account user baru
dengan hak administrator.
• Tahap ini merupakan tahap eksekusi kode
yang diinginkan. Pada tahap ini host1 dapat melakukan apa saja. Pada contoh
kasus ini akan dicoba untuk membuat sebuah account baru dengan hak seorang
admin.
• Setelah masuk pada sistem host2, maka gunakan perintah
berikut untuk mengeksekusi pembuatan user baru : net user tom2 /add.
• Kemudian hak user ini
diubah menjadi hak Administrator : net localgroup Administrators tom2 /add
• Dengan demikian pada host2 akan didapatkan satu user baru
bernama "tom2" dengan hak seorang administrator.
Pencegahan Eksploitasi
RPC
• Beberapa
cara pencegahannya:
1. Memblokir port 135, 137,
138 dan 445 pada UDP dan port 135, 149, 445, dan 593 pada TCP melalui Firewall.
Disfungsikan COM Internet Services ( CIS ) dan RPC melalui HTTP yang
menggunakan port 80 dan 443 terutama pada jaringan remote yang menggunakan VPN
( Virtual Private Network ) atau sejenisnya.
2. Gunakan personal Firewall
seperti Internet Connection Firewall.
3. Blokir semua port sering
diekploitasi dengan menggunakan filter IPSEC.
4. Disfungsikan fitur DCOM
pada setiap komputer atau server. Disable DCOM on all affected machines
5. Khusus Sistem operasi
buatan Microsoft, selalu update security patch untuk meningkatkan keamanan
sistem operasi tersebut.