FlawOpen

flawopen.com/SSRF/SSRF pada Node.js fetch()

Apakah fetch() Node.js mencegah SSRF?

CWE-918: Server-Side Request ForgeryReferensi keamanan Node.js
Penjelasan sederhana

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.

SSRF (CWE-918)Server meminta tujuan yang dipilih atau dipengaruhi pemanggil tak tepercaya, melintasi batas kepercayaan jaringan.
Daftar tujuan yang diizinkanPemetaan tetap dari pilihan pengguna seperti providerId ke origin yang ditetapkan aplikasi; jangan menerima URL sembarang.
Validasi redirectRespons dapat menunjukkan tujuan kedua. Mengikuti redirect otomatis dapat melewati pemeriksaan yang hanya diterapkan pada URL awal.
DNS rebindingNama host dapat mengarah ke IP berbeda. Memeriksa DNS sekali lalu membiarkan klien mengulang resolusi menciptakan celah TOCTOU.

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

Step 1

Pemanggil memengaruhi URL

Endpoint menerima URL utuh atau data untuk membangunnya, misalnya alamat pratinjau gambar.

Step 2

Server mengirim permintaan

Klien HTTP memakai jalur jaringan, DNS, proxy, dan identitas proses server.

Step 3

Redirect mengubah tujuan

Fetch mengikuti redirect secara default. Tujuan awal yang lolos pemeriksaan dapat memberi Location ke host terlarang.

Step 4

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

Rentan
// Jangan ambil URL sembarang dari pemanggil.
const response = await fetch(userProvidedUrl);
Lebih aman
// 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

Pertanyaan umum

Apakah memblokir localhost dan IP private sudah cukup?

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.

Apakah IMDSv2 menghilangkan SSRF?

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

Jelajahi topik keamanan dan analisis insiden terkait:Direktori keamanan lengkap →
Lihat juga Pemalsuan request sisi server (SSRF, CWE-918): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com SSRF dan Metadata Cloud: Risiko dan Pertahanan Bot PR AI: Cegah SSRF — flawopen.com