flawopen.com/command-injection/Kotlin
Learn how to fix Command Injection (CWE-78) in Kotlin. Side-by-side vulnerable vs secure code examples for ProcessBuilder with immutable list arguments.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-kotlin.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
// String template with Runtime.exec
fun checkHost(host: String) {
// Input: "8.8.8.8; id"
val cmd = "ping -c 1 $host"
Runtime.getRuntime().exec(arrayOf("sh", "-c", cmd))
}
// ProcessBuilder with discrete list of arguments
fun checkHost(host: String) {
// host is isolated as a single argument
val command = listOf("ping", "-c", "1", host)
ProcessBuilder(command).start()
}