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.
Imagine pedir a um assistente de escritório para imprimir um documento chamado 'relatorio.pdf'. A injeção de comando ocorre quando alguém fornece o nome 'relatorio.pdf; whoami', e o assistente entrega o bilhete inteiro ao terminal, fazendo-o imprimir o relatório e ler o crachá de administrador.
Web Application SecurityCWE-918.CWE-918Defense-in-DepthO aplicativo aceita nomes de host diagnósticos, nomes de arquivo ou flags diretamente de uma requisição HTTP ou formulário de usuário.
O backend constrói uma string de comando shell usando concatenação direta ou formatação em vez de um vetor de argumentos separado.
O invasor injeta metacaracteres shell como ';', '&&', '|' ou crases (ex: '127.0.0.1; id') para quebrar o contexto pretendido do comando.
O shell do sistema operacional executa o comando anexado com todos os privilégios do processo web em execução.
// 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()
}