Ringkasan & Hubungan ke Vault
Sementara Web Application Firewall (WAF) menganalisis ancaman secara eksternal pada layer HTTP data plane, RASP (Runtime Application Self-Protection) berjalan di dalam proses runtime aplikasi untuk memantau eksekusi kode secara langsung. Catatan ini mendefinisikan arsitektur integrasi RASP dengan waf-reverse-proxy-deepdive untuk perlindungan menyeluruh.
Daftar Isi
- Arsitektur RASP vs WAF
- Instrumentasi Tingkat Sistem (Rust LD_PRELOAD Hooking)
- Instrumentasi Panggilan Fungsi Aplikasi (Exec/Eval/SQL)
- Integrasi WAF + RASP Feedback Loop
- Koneksi ke Vault
1. Arsitektur RASP vs WAF
WAF memeriksa payload dari luar sebelum mencapai aplikasi (inspection at perimeter), sehingga rentan dilewati oleh teknik obfuscation atau serangan yang memanfaatkan modifikasi state internal aplikasi. RASP ditempelkan langsung ke dalam proses aplikasi untuk mendeteksi apakah payload tersebut memicu aksi berbahaya di dalam CPU/Memory runtime (inspection at execution).
Client Request
│
▼
┌──────────────┐
│ WAF │ (Menganalisis payload HTTP terenkripsi/obfuskasi)
└──────┬───────┘
│
▼
┌──────────────┐
│ Web Server │ (Node.js / JVM / Python / Go)
│ ┌────────┐ │
│ │ RASP │ │ (Menangkap call stack runtime dari fungsi sensitif)
│ │ Agent │ │
│ └────────┘ │
│ │ │
│ ▼ │
│ App Logic │ ──> Akses database / System call `execve`
└──────────────┘
2. Instrumentasi Tingkat Sistem (Rust LD_PRELOAD Hooking)
Untuk bahasa yang di-compile secara native atau interpreter yang memanggil library dinamis C, RASP dapat di-inject tanpa memodifikasi kode sumber aplikasi menggunakan mekanisme pemuatan dinamis LD_PRELOAD.
Berikut adalah contoh agen RASP kecil (<10MB) berbasis Rust yang meng-override fungsi sistem execve untuk mendeteksi Command Injection.
2.1 Konfigurasi Cargo.toml
[package]
name = "jarswaf-rasp-agent"
version = "0.1.0"
edition = "2021"
[lib]
name = "jarswaf_rasp"
crate-type = ["cdylib"] # Mengompilasi menjadi .so dinamis
[dependencies]
libc = "0.2"
lazy_static = "1.4"2.2 Kode Sumber Hooking (src/lib.rs)
use std::ffi::{CStr, CString};
use std::os::raw::{c_char, c_int};
use lazy_static::lazy_static;
// Definisikan tipe tanda tangan untuk fungsi asli `execve`
type ExecveFn = unsafe extern "C" fn(*const c_char, *const *const c_char, *const *const c_char) -> c_int;
lazy_static! {
// Cari alamat memori dari fungsi `execve` asli di libc menggunakan dlsym
static ref ORIGINAL_EXECVE: ExecveFn = unsafe {
let fn_name = CString::new("execve").unwrap();
let original = libc::dlsym(libc::RTLD_NEXT, fn_name.as_ptr());
std::mem::transmute(original)
};
}
#[no_mangle]
pub unsafe extern "C" fn execve(
pathname: *const c_char,
argv: *const *const c_char,
envp: *const *const c_char,
) -> c_int {
let path = CStr::from_ptr(pathname).to_string_lossy();
// Analisis perilaku berbahaya (Mendeteksi shell spawn ilegal dari web server)
if path.contains("/bin/sh") || path.contains("/bin/bash") {
eprintln!("[RASP WARNING] Deteksi eksekusi shell mencurigakan: {}", path);
// Pilihan RASP: Blokir langsung eksekusi sistem dengan mengembalikan error ijin ditolak
*libc::__errno_location() = libc::EACCES;
return -1;
}
// Teruskan ke fungsi `execve` asli jika dianggap aman
(*ORIGINAL_EXECVE)(pathname, argv, envp)
}Kompilasi dan jalankan aplikasi web dengan menyuntikkan library RASP:
cargo build --release
# Injeksi ke proses aplikasi Node.js/Python
LD_PRELOAD=./target/release/libjarswaf_rasp.so node server.js3. Instrumentasi Panggilan Fungsi Aplikasi (Exec/Eval/SQL)
Untuk runtime bahasa tingkat tinggi (managed runtimes), agen RASP meng-override API internal (Monkey Patching) untuk menangkap eksekusi fungsi rentan:
- Node.js (V8 Engine): Meng-override fungsi
child_process.exec,eval, danvm.runInContext. - Python (CPython VM): Menggunakan
sys.settrace()atau membungkus fungsios.systemdansubprocess.Popen. - Java (JVM): Menggunakan Java Agent (Bytecode Manipulation) via library ASM atau ByteBuddy untuk mendeteksi panggilan JDBC query SQL, memvalidasi input sebelum diteruskan ke database driver.
4. Integrasi WAF + RASP Feedback Loop
Menggabungkan WAF di perimeter dan RASP di runtime menciptakan sistem pertahanan adaptif (Adaptive Threat Intelligence):
- Telemetry Sharing: RASP mendeteksi upaya SQLi yang berhasil lolos dari filter WAF (misal karena pengkodean khusus). RASP mengirimkan telemetri anomali beserta query yang terpicu ke WAF.
- Auto-Blocking: WAF menerima sinyal deteksi dari RASP, menganalisis IP asal request tersebut, lalu secara otomatis memasukkan IP tersebut ke dalam distributed blocklist jarsWAF (menggunakan Gossip protocol) untuk diblokir total di tingkat edge node sebelum request masuk kembali.
- Double Verification: Jika WAF mendeteksi request dengan tingkat kecurigaan menengah (medium confidence anomaly score), WAF dapat menyematkan header tak terlihat
X-jarsWAF-Trace: verifyke downstream. RASP yang melihat header ini akan memperketat kebijakan deteksi (strict auditing mode) pada alur pemrosesan request tersebut di memori aplikasi.
5. Koneksi ke Vault
| Catatan | Hubungan |
|---|---|
| waf-reverse-proxy-deepdive | Data plane jarsWAF yang bekerja sama dengan RASP agent untuk memblokir IP penyerang. |
| hardware-hacking-re | Teknik modifikasi runtime dan reverse engineering biner serupa. |
| jarswaf-plan | Dokumen perencanaan utama jarsWAF tempat subsistem RASP dideklarasikan sebagai prioritas #8. |