O código relevante está na linha 224 do mod_evasive.c:
if (sys_command != NULL) {
snprintf(filename, sizeof(filename), sys_command, text_add);
system(filename);
}
Agora, vamos verificar man 3 system
:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c command,
and returns after the command has been completed. During execution of the
command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
Podemos ver, então, que o comando especificado está sendo executado dentro de um shell. É certo que a documentação de system(3)
é confusa neste ponto, mas certamente podemos ver o que está acontecendo e fazer as inferências apropriadas - ele está sendo executado no shell padrão do usuário, não simplesmente /bin/sh
. / p>
A solução correta é relativamente simples: basta substituir a chamada system(3)
por fork(2)
e execve(2)
(ou algo substancialmente similar). Se preferir não fazer isso, você também pode escrever um shell muito pequeno e restritivo para bloquear as coisas apropriadamente.
Coincidentemente, esta questão me levou a verificar novamente, e você ficará satisfeito em saber que um usuário com a capacidade de escrever um arquivo .htaccess não pode assumir a sua caixa apenas em virtude de ser mod_evasive instalado ( RSRC_CONF
é a configuração correta, por isso, parabéns ao autor de mod_evasive nesse ponto). No entanto, dado como você descreveu sua configuração, há uma excelente chance de que, no mínimo, qualquer usuário com a capacidade de executar código como Apache (por exemplo, com exceção de mod_su*
ou algo semelhante, qualquer um que possa executar PHP, Perl, CGI , etc.), pode banir você do seu próprio servidor usando o IPTables.