flawopen.com/SSRF/SSRF pada Node.js fetch()
Apakah fetch() Node.js mencegah SSRF?
Tidak. fetch() sisi server mengirim permintaan dari server. Jika pemanggil memilih tujuan, ia dapat mengarahkan server ke sistem yang tak dapat dijangkau langsung olehnya. Ibarat meminta kurir tepercaya mengantar paket tanpa memeriksa alamat. Risikonya bergantung pada jaringan, identitas, kebijakan URL, dan redirect.
providerId ke origin yang ditetapkan aplikasi; jangan menerima URL sembarang.Akar masalah: server memercayai tujuan pilihan pemanggil
Node.js fetch() adalah klien HTTP umum, bukan mesin kebijakan SSRF. Ia tidak membatasi jaringan yang boleh dijangkau; CORS browser tidak menjadi batas server. Parsing URL saja tidak cukup: host yang diizinkan dapat resolve ke alamat terlarang dan respons bisa mengalihkan ke host lain. Fitur yang mengambil avatar, webhook, dokumen, atau pratinjau dari URL pengguna dapat membuka risiko ini.
Cara permintaan melintasi batas kepercayaan
Pemanggil memengaruhi URL
Endpoint menerima URL utuh atau data untuk membangunnya, misalnya alamat pratinjau gambar.
Server mengirim permintaan
Klien HTTP memakai jalur jaringan, DNS, proxy, dan identitas proses server.
Redirect mengubah tujuan
Fetch mengikuti redirect secara default. Tujuan awal yang lolos pemeriksaan dapat memberi Location ke host terlarang.
Respons dapat membuka data yang terjangkau
Jika kebijakan dan jaringan mengizinkan, layanan internal atau metadata cloud dapat dijangkau. Ini bergantung pada lingkungan.
Pola Node.js yang rentan dan lebih aman
// Jangan ambil URL sembarang dari pemanggil.
const response = await fetch(userProvidedUrl);
// Pemanggil memilih kunci, bukan tujuan jaringan.
const destinations = new Map([
["status", new URL("https://status.example/")],
["docs", new URL("https://docs.example/")],
]);
const target = destinations.get(providerId);
if (!target) throw new Error("Unknown provider");
const response = await fetch(target, {
redirect: "error",
signal: AbortSignal.timeout(3000),
});
if (!response.ok) throw new Error("Upstream request failed");
Jika pengguna harus mengirim URL
Utamakan ID penyedia dan susun permintaan dari peta tujuan tetap. Jika URL publik sembarang wajib didukung, izinkan hanya skema dan port yang dibutuhkan; tolak user-info, loopback, private, link-local, dan alamat IPv4/IPv6 terlarang. Validasi semua hasil DNS dan pastikan koneksi memakai alamat yang tervalidasi tanpa lookup ulang yang tak diperiksa. Nonaktifkan redirect atau validasi tiap lompatan. Terapkan egress jaringan terpisah, termasuk blok metadata 169.254.169.254 dan alamat IPv6 yang diaktifkan. Batasi waktu, ukuran respons, dan konkurensi; jangan teruskan kredensial internal.
Daftar periksa pencegahan SSRF
- ✓Ganti URL sembarang dengan pemetaan tetap dari kunci penyedia tervalidasi ke tujuan milik aplikasi jika memungkinkan.
- ✓Wajibkan
https:dan port yang diharapkan; tolak kredensial URL, host tak terduga, IP literal, dan rentang terlarang. - ✓Nonaktifkan redirect memakai
redirect: "error"; jika perlu, validasi setiap tujuan sebelum terhubung. - ✓Validasi semua jawaban A/AAAA dan ikat koneksi ke alamat tervalidasi sambil mempertahankan verifikasi nama. Terapkan juga pada retry dan proxy.
- ✓Blokir loopback, private, link-local, serta jaringan metadata termasuk IPv6 melalui firewall/proxy egress. Jangan hanya mengandalkan pemeriksaan aplikasi.
- ✓Tetapkan batas waktu, byte respons, dan konkurensi; jangan teruskan cookie, header otorisasi, atau kredensial cloud.
- ✓Di AWS, wajibkan IMDSv2 dan batasi metadata sebagai pertahanan tambahan; ini bukan pengganti validasi URL dan egress.
Pertanyaan umum
Tidak. Redirect, variasi IPv4/IPv6, DNS rebinding, proxy, dan balapan antara resolusi dan koneksi dapat melewati pemeriksaan sederhana. Utamakan daftar tujuan tetap. Jika tujuan bebas diperlukan, validasi tiap IP, ikat koneksi ke hasil itu, dan tegakkan aturan yang sama pada egress jaringan.
Tidak. Token IMDSv2 mengurangi sebagian paparan, tetapi SSRF masih dapat menjangkau layanan internal lain atau metadata dengan konfigurasi berbeda. Pertahankan kontrol tujuan dan egress.
Sumber primer
- OWASP — Pencegahan SSRF
- Node.js — API fetch global
- Standar WHATWG Fetch — mode redirect
- AWS — Opsi layanan metadata instans EC2
- CWE-918 — Server-Side Request Forgery