flawopen.com/Command Injection/Java Runtime.exec()
Apakah Java Runtime.exec() mencegah Command Injection?
Runtime.exec(String) tidak menjalankan shell secara implisit, sehingga operator shell tidak otomatis ditafsirkan sebagai sintaks shell. Namun, string tetap dipecah menjadi program dan argumen; teks yang tidak tepercaya dapat mengubah argumen yang diterima program tujuan. ProcessBuilder memperjelas batas argumen, tetapi setiap nilai tetap harus divalidasi dan executable serta opsi yang diizinkan harus dibatasi.
// Input pengguna digabungkan ke string perintah Runtime.getRuntime().exec( "approved-tool --input " + filename );
// Executable tetap dan argumen terpisah; validasi filename dahulu String safeName = validateFilename(filename); new ProcessBuilder( "/opt/app/bin/approved-tool", "--input", safeName ).start();
Injeksi shell dan injeksi argumen berbeda
Sejak Java 18, Oracle mendeprecasi Runtime.exec(String) karena rawan kesalahan dan merekomendasikan exec(String[]) atau ProcessBuilder. Overload string memecah token berdasarkan whitespace, sehingga argumen seperti path yang mengandung spasi dapat terpisah. Runtime.exec(String) tidak otomatis menjalankan sh atau shell lain; dokumentasi Oracle menyatakan overload string tunggal mengubah string perintah menjadi array argumen. Ini mencegah metakarakter shell umum berfungsi sebagai sintaks shell, tetapi input tetap berisiko: tokenisasi dapat membuat argumen tambahan dan program tujuan dapat menafsirkan argumen sebagai opsi. ProcessBuilder menerima daftar string berisi executable dan argumen; pada platform umum setiap elemen menjadi batas argumen. Tetapkan executable, validasi nilai sesuai tata bahasa program tujuan, dan tolak atau tangani dengan aman nilai yang tampak seperti opsi. Gunakan -- hanya jika dokumentasi program menjamin perilakunya. Jangan menjalankan shell secara eksplisit, seperti sh -c, dengan data yang tidak tepercaya.
Pertanyaan umum
Tidak. Overload ini mengurangi risiko injeksi shell, tetapi injeksi argumen tetap mungkin. Program tujuan dapat menafsirkan input penyerang sebagai opsi atau nama file. Gunakan ProcessBuilder dengan executable tetap dan argumen terpisah, lalu validasi setiap nilai sesuai program tujuan.
Tidak. ProcessBuilder menyusun daftar program dan argumen lalu memulai proses; ia tidak memeriksa keamanan atau validitasnya. Terapkan allowlist dan validasi di aplikasi serta ikuti aturan argumen yang didokumentasikan program tujuan.