FlawOpen

flawopen.com/Path Traversal/Node.js path.join()

Apakah Node.js path.join() mencegah Path Traversal?

Halaman referensi
Jawaban singkat

Tidak. path.join() menormalkan segmen path, tetapi tidak mencegah .. keluar dari direktori yang dimaksud. Resolve kandidat path terhadap direktori dasar, lalu pastikan path relatif tetap berada di dalamnya. Pemeriksaan leksikal ini tidak dengan sendirinya membatasi symlink sistem berkas.

MASIH RENTAN
const filePath = path.join(
  BASE_DIR, userFilename
);
// userFilename = "../../etc/passwd"
// still escapes BASE_DIR
DIPERBAIKI — pemeriksaan containment leksikal
const base = path.resolve(BASE_DIR);
const resolved = path.resolve(base, userFilename);
const relative = path.relative(base, resolved);

if (
  relative === '' ||
  relative === '..' ||
  relative.startsWith('..' + path.sep) ||
  path.isAbsolute(relative)
) {
  throw new Error("Invalid path");
}

Mengapa path.join() saja tidak cukup

path.join() menggabungkan segmen dengan pemisah platform lalu menormalkan hasilnya. Normalisasi tidak menolak .. karena segmen itu valid di banyak path. Menggabungkan ../../etc/passwd dengan direktori dasar tetap dapat menghasilkan path di luar direktori; join() bukan pemeriksaan containment.

Tanya jawab

Apakah path.normalize() membantu?

path.normalize() menyelesaikan segmen .. dan . dalam string, tetapi tidak memastikan hasilnya tetap di dalam direktori dasar yang diizinkan. Bandingkan path.relative(base, resolved) dan tolak hasil kosong jika file diwajibkan, .., awalan .. diikuti path.sep, atau hasil relatif absolut.

Apakah pemeriksaan ini mencegah symlink keluar?

Tidak. path.resolve() dan path.relative() membandingkan string path, bukan mengikuti symlink sistem berkas. Jika penyerang dapat membuat atau mengganti symlink di bawah direktori dasar, validasi target filesystem yang sebenarnya dan gunakan pola akses yang mencegah race antara pemeriksaan dan penggunaan. Batasi izin tulis pada pohon direktori jika memungkinkan.

Referensi

Lihat juga Path traversal (CWE-22): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com PHP include() dan jalur yang dikendalikan pengguna Perbaikan Path Traversal Python os.path.join() Apa itu kerentanan Zip Slip?