Implementasi Thread dan Multithread Server

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:
  1. Sebuah kelas meng-implements interface Runnable, menyediakan metode run() di dalamnya yang akan dieksekusi oleh thread nantinya. Obyek dari kelas ini merupakan obyek Runnable.
  2. 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().
  3. Metode start() pada obyek Thread yang dibuat sebelumnya dipanggil. Metode start() tersebut kembali segera setelah suatu thread dilahirkan (berhasil dibuat).
  4. 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
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:
  1. 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.
  2. Sub-kelas ini dapat memanggil suatu konstruktur Thread secara eksplisit untuk menginisialisasi thread, menggunakan metode super().
  3. 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]
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)


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.

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

 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
• 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. 

Implementasi Eksploitasi RPC

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
 

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”

B. Eksploitasi Protokol RPC menggunakan Program

   • 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.

C.  Eksekusi Kode

  •  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.



  • Pengikut