Sitemap

Software Security Testing

8 min readDec 6, 2023

--

Keamanan Data & Perangkat Lunak — Chapter 10

Press enter or click to view image in full size
source : nordvpn.com

Reliability vs Security Dalam Software System

Memiliki sistem yang reliable (fungsional bekerja, performance baik) saja tidaklah cukup, aspek keamanan juga perlu dipertimbangkan. Ini sebabnya kebanyakan testing (Testing QA tradisional) hanya berbicara tentang fungsional dan non fungsional testing, tapi sangat jarang membahas security testing. Padahal software tidak akan reliable jika belum secure.

Apa itu Security Testing? Apa Bedanya dengan Testing Biasa?

Software harus diuji terhadap hal tak terduga dan tak diketahui. Dalam konteks security, software harus tetap bekerja dengan baik meskipun sedang berhadapan dengan serangan berbahaya. Perbedaan yang paling jelas antara software safety dan software security yaitu adanya kehadiran musuh atau penyerang yang berniat untuk menghancurkan sistem.

Namun dalam security testing juga terdapat dilema yaitu QA biasanya berada di bawah tekanan untuk menyelesaikan sekumpulan pengujian fitur, kendala biaya dan waktu, security testing sangat bergantung pada sdm yang ahli dan berpengalaman.

Dan kenyataanya dalam dunia software hanya ada 2 opsi yang bisa dipilih dari 3 yaitu Usability, Security, dan Cost.

Prinsip Testing (OWASP WSTG

Tidak ada Silver Bullet, berpikir strategis bukan taktis, test lebih awal dan lebih sering, lakukan secara otomatis, pahami scope dari security, mindset harus benar, memahami subjek siapa yang akan menjadi calon korban (principal). Test source code jika memungkinkan (TDD).

Vulnerability Life Cycle

Press enter or click to view image in full size

Sebuah sistem sebaiknya segera dilakukan patch sebelum masuk ke fase exploit (tahap 4).

Tujuan Security Testing

  1. Menguji fungsionalitas requirement security.
  2. Menguji perlindungan serangan pada sistem atau organisasi.

Bagaimana dan Dimana meletakkan Security Testing?

  1. Security test dilakukan ketika 80% SDLC hampir selesai sebelum release. Masalahnya memperbaiki masalah itu mahal. Atau,
  2. Security test dilakukan saat unit test, integration test, dan system testing. Pendekatan ini lebih baik, karena developer dilibatkan dan testing dijalankan lebih dalam.

Dunia Security Testing

System testing umumnya dilakukan oleh tim QA dan Acceptance dilakukan oleh calon user. Unit dan Integration Test dilakukan secara whitebox, Acceptance biasanya Blackbox atau Greybox. Penetration testing di awal dilakukan secara Blackbox (misalnya menggunakan spider) untuk menemukan sesatu yang fishy, setelah ditemukan baru fokus untuk melihat kode di bagian itu, testing seperti inilah yang dinamakan dengan Greybox.

Teknik fuzz dilakukan untuk menemukan informasi tersembunyi pada web, Mutation dilakukan untuk menguji kualitas pengujian software, Fault Injection dilakukan dengan menginjeksi fault untuk meningkatkan reliability.

Architecture Flaws

Pada dasarnya di software engineering ada 2 kesalahan :

  1. Security flaw. Terjadi di desain, requirement.
  2. Security bug. Terjadi di koding.

Kebanyakan OWASP Top 10 terkait dengan security bug. Architecture flaw lebih tingkat tinggi.

Fault Injection

Test ini bertujuan untuk meningkatkan coverage test dengan menggunakan fault pada path test code. Tujuan melakukan testing umumnya adalah menguji apakah kondisi tersebut benar atau salah (assert the requirement), kemudian menemukan error.

Contoh skenario fault injection pada studi kasus shopping cart misalnya dengan memasukkan jumlah item dengan nilai minus (-), skenario ini dilakukan untuk mengetahui seperti apa respon dari sistem jika ada fault pada input. Fault injection sebenarnya bukan hanya digunakan untuk kebutuhan security namun juga reliability. Fuzz testing juga bisa digunakan pada fault injection.

Jenis Fault Injection

  1. Merubah source code seperti mutation testing.
  2. Binary instrumentation.
  3. API Input testing dengan test harness.
  4. Network input testing.
  5. Code insertion. (contohnya menambahkan kode di interpreter PHP)
  6. State corruption.
  7. Fatal Exception.

Contoh Fault Model untuk Web App

  • Server : manipulasi state, access control, serangan backend (malicious input).
  • Client : bypass input restriction, state manipulation, abuse active content.
  • Network

Mutation Testing

Membuat versi gagal dari program dengan secara otomatis merubah statement program, tujuannya adalah memastikan apakah test suite dapat mendeteksi defect buatan tersebut.

Destructive Testing

Memverifikasi software berfungsi dengan baik bahkan jika diberi input yang tidak valid, sehingga membuat ketahanan validasi input dan error management routine.

Fuzz Testing

Teknik yang otomatis dan semi otomatis. Dengan menyediakan data invalid, unexpected dan random pada input program dengan jumlah besar. Kemudian program dipantau.

Regression Testing vs Fuzz Testing

Perbedaannya adalah pada regression menggunakan normal input sedangkan fuzz menggunakan abnormal input. Keduanya memiliki tujuan yang sama yaitu mencari badness (kejelekan), dan sama-sama otomatis dan semi otomatis.

Testing Security Dalam Unit Test

Keuntungan pengujian security di unit test adalah pengujian dapat dilakukan sangat sering dan isu diidentifikasi dengan cepat, serta menjadi tes yang paling rinci artinya cakupan tes tinggi. Namun perlu diketahui bahwa tidak banyak security vulnerability yang dapat diuji pada tahap ini.

Contoh unit test menggunakan JUnit. Misalnya kita punya method dari class Shopping Cart seperti berikut.

public void addItem(Item item, booleaninStock) {
CartItemcartItem = (CartItem) itemMap.get(item.getItemId());
if (cartItem== null) {
cartItem= new CartItem();
cartItem.setItem(item);
cartItem.setQuantity(0);
cartItem.setInStock(inStock);
itemMap.put(item.getItemId(), cartItem);
itemList.getSource().add(cartItem);
}
cartItem.incrementQuantity();
}

Kemudian lakukan pengujian dengan skenario

  1. Sebuah keranjang (cart) baru memiliki 0 item di dalamnya.
  2. Menambahkan satu item baru membuat item tersebut berada di keranjang.
  3. Menambahkan satu item baru membuat keranjang memiliki total 1 item di dalamnya.
  4. Menambahkan dua item membuat item tersebut berada di keranjang.
  5. Menambahkan dua item membuat keranjang memiliki total 2 item di dalamnya.
  6. Tes apakah menambahkan sebuah item yang null menyebabkan exception dan tidak ada apapun yang dimasukkan ke keranjang.

Pada skenario nomor 6 merupakan contoh penerapan security dalam unit testing. Sehingga kode unit testing menjadi seperti berikut :

public class CartTestextends TestCase{

public CartTest(String testName) {
super(testName);
}

protected void setUp() throws Exception {
//Code here will be executed before every testXXXmethod
}

protected void tearDown() throws Exception {
//Code here will be executed after every testXXXmethod
}

public void testNewCartHasZeroItems() {
// Test code goes here
}

public void testAddSingleItem() {
// Test code goes here
}

public void testAddTwoItems() {
// Test code goes here
}

public void testAddNullItem() {
// Test code goes here
}
}

Detail dari method testAddTwoItems adalah sebagai berikut

public void testAddTwoItems() {
Cart instance = new Cart();
booleanisInStock = true;

//First add an item
Item item = new Item();
item.setItemId("item01");
instance.addItem(item, isInStock);

//Test adding a second item
Item item2 = new Item();
item2.setItemId("item02");
instance.addItem(item2, isInStock);

//Check whether item01 is in the cart
boolean result = instance.containsItemId("item01");
assertTrue("First item is in cart", result);

//Check whether item02 is in the cart
result = instance.containsItemId("item02");
assertTrue("Second item is in cart", result);

//Check that there are 2 items in the cart
assertEquals("2 items in cart", instance.getNumberOfItems(), 2);
}

Method diatas merupakan Use Case Test atau pengujian terhadap use case. Sedangkan method testAddNullItem di bawah ini merupakan Abuse Case Test atau pengujian terhadap abuse case, berikut adalah implementasi dari kode.

public void testAddNullItem(){
Cart instance = new Cart();
boolean isInStock = true;

try{
instance.addItem(null,isInStock);
fail("Adding a null item did not throwan exception");
}catch(RuntimeExceptionexpected){
assertTrue("null Item caught",true);
assertEquals("Null not in cart",instance.getNumberOfItems(),0);
}
}

Aspek Security Lainnya dalam Unit Test

  1. Validasi input dan Encoding.
  2. Enkripsi.
  3. User dan Session Management.
  4. Handling Error dan Exception.
  5. Auditting dan Logging.

Testing Security Dalam Integration Test

Bisa menggunakan container atau mock object (data dummy). Dengan menggunakan mock object maka tidak perlu query data real ke database, misalnya gunakan fake API. Keuntungan mock object adalah tidak ada kontainer di atasnya.

Get Radinal Dwiki Novendra, S.T., M.T.’s stories in your inbox

Join Medium for free to get updates from this writer.

Dan JUnit bisa digunakan di Integration Test, bukan hanya untuk Unit Test. Berikut adalah contoh Integration Test.

public class TestAccessControlextends ServletTestCase{
public void beginUnprivilegedUserAccessControl(WebRequesttheRequest) {
theRequest.setAuthentication(new BasicAuthentication("user", "password"));
}

public void testUnprivilegedUserAccessControl() throws IOException, javax.servlet.ServletException{
AdminServletadmin = new AdminServlet();
admin.doGet(request, response);
}

public void endUnprivilegedUserAccessControl(WebResponsetheResponse) throws IOException{
assertTrue("Normal users must not be able to access /admin", theResponse.getStatusCode() == 401)
}
}

Keuntungan Testing Security pada Integration Test

  1. Bisa diuji pada application server.
  2. Banyak security vulnerability yang bisa diuji, contohnya Injection, Authentication dan Authorization flaws.

Kekurangan Testing Security pada Integration Test

  1. Tidak bisa dieksekusi sesering Unit Test.
  2. Terdapat overhead kontainer karena menjalankan application server.
  3. Beberapa vulnerability tidak dapat diuji dengan mudah, contohnya XSS, URL filtering yang dioperasikan oleh web server atau firewall.

Aspek Security dalam Integration Test

  1. Dependency
  2. Architecture Flaw. Contoh : kurangnya randomness, tidak ada autentikas, tidak ada compartments, dan race condition.

Testing Security Dalam Acceptance Test

Melakukan pengujian pada API eksternal, agnostik terhadap bahasa, dan ada 2 pilihan tools yaitu :

  • Include HTTP client dan HTML parser, contohnya HTTPUnit, jWebUnit, dll.
  • Drive instance dari web browser, contohnya Selenium, WATIR, dll.

Contohnya menguji HTML Injection dengan jWebUnit

public class XSSinSearchFieldTestextends WebTestCase{
public void setUp() throws Exception {
getTestContext().setBaseUrl("http://example.corsaire.com/ispatula/");
}

public void testHtmlInjection() throws Exception {
beginAt("/index.html");
assertLinkPresentWithText("Enter the Store");
clickLinkWithText("Enter the Store");
assertFormPresent("searchForm");
setFormElement("query", "<a id=\"injection\" href=\"http://www.google.com>Injection</a>");
submit();
assertLinkNotPresent("injection");
}

public XSSinSearchFieldTest(String name) {
super(name);
}
}
Press enter or click to view image in full size

Keuntungan Testing Security pada Sytem Testing

  1. Full testing pada eksternal API.
  2. Konsultan bisa menggunakan tools untuk membuat skrip vulnerability.

Kekurangan Testing Security pada Sytem Testing

  1. Tes coverage rendah.
  2. Developer tidak terlibat dalam testing.

4 Class Serangan Security

Dependencies, Unanticipated User Input, Expose Design Vulnerabilities, Expose Implementation Vulnerabilities

Teknik Dalam Security Testing

  1. OS Hardening
  2. Vulnerability Scanning
  3. Penetration Testing
  4. Port Scanning dan Service Mapping
  5. Firewall Rule Testing
  6. SQL Injection
  7. Cross Site Scripting (XSS)
  8. Parameter Manipulation
  9. Denial of Service Testing
  10. Command Injection
  11. Network Scanning
  12. Password Cracking
  13. Ethical Hacking
  14. File Integrity Testing
  15. Wireless LAN Testing
  16. Buffer Overflow Testing
  17. Format String Testing
  18. Random Data Testing
  19. Radom Mutation Testing
  20. Session Hijacking
  21. Phising
  22. URL Manipulation
  23. IP Spoofing
  24. Packet Sniffing
  25. Virtual Private Network Testing
  26. Social Engineering

Web Application Security Standard

https://github.com/OWASP/wstg/tree/master/checklist

Keterangan Lainnya

  1. Saat development jangan lupa code review dan walkthrouh (review dokumen dengan peers).
  2. Saat deployment jangan lupa penetration testing, dan configuration management testing.
  3. Saat maintenance dan operation jangan lupa review manajemen operasional, cek kesehatan, dan rubah verifikasi.
  4. Hal yang harus dipersiapkan dalam pentest yakni proses dan prosedur testing, perjanjian larangan pengungkapan informasi rahasia (non-disclosure agreement), dan RoE (rule of engagement) atau aturan keterlibatan.

Kesimpulan

  1. Tools dan teknik pengujian yang ada dapat digunakan untuk pengujian keamanan dalam siklus hidup pengembangan.
  2. Pelatihan keamanan untuk developer adalah investasi yang bagus.
  3. Isu security sebaiknya diidentifikasi di awal.
  4. Kode sumber menjadi subjek untuk pengujian lebih dalam.
  5. Kepatuhan terhadap Web App Security Standard sebaiknya dilakukan.

--

--