Como o “kernel. *” spoofing do syslog é evitado?

4

Estou encontrando instâncias do syslog-ng escrevendo lixo, seguidas por uma linha em branco kernel.emerg em um dos nossos ambientes de produção. Exemplo de um:

Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <Q▒b
+\c 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <;E0
Dec 21 00:14:56 someserver [syslog-ng.err] Error processing log message: <▒"▒l
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒▒▒e▒F
Dec 21 00:14:57 someserver [syslog-ng.err] Error processing log message: <▒▒
Dec 21 00:14:58 someserver [kernel.emerg]

A linha kernel.emerg é particularmente preocupante para mim. De acordo com man 3 syslog :

       LOG_KERN
              kernel messages (these can’t be generated from user processes)

Isto parece sugerir que o recurso do kernel não pode ser falsificado. Posso ver onde o sistema chama a si próprio pode impedir esse spoofing, mas estou correto ao pensar que não há nada que impeça um processo de escrever diretamente para /dev/log e falsificar um recurso de kernel ? Eu quero dizer que a única coisa que poderia realmente parar esse spoofing seria o daemon syslog diferenciando entre se obteve uma mensagem de /proc/kmsg vs. outras fontes.

  • Distro é RHEL5.5. A versão do kernel é 2.6.18-194.8.1.el5 . Estes não são fatores que eu ainda tenho controle; me considera repreendido.
  • O daemon syslog é um pacote syslog-ng 3.1.4 criado pela empresa (32 bits e em execução em um kernel de 64 bits, mas eu não diria que isso está relacionado).
  • Há algumas postagens de listas de discussão que encontrei no Google, sugerindo que mudanças no kmsg no kernel 3.5 podem criar erros de saída como este, mas definitivamente não é o caso aqui.

As mensagens não estão vindo da rede. Esta é a única fonte definida:

source s_syslog {
# message generated by Syslog-NG
internal();
# standard Linux log source (this is the default place for the syslog()
# function to send logs to)
unix-stream("/dev/log");
# messages from the kernel
file("/proc/kmsg" program_override("kernel: "));
};
    
por Andrew B 21.12.2013 / 06:57

1 resposta

1

Pelo Guia de Administradores do syslog-ng ( link ), o recurso do kernel (pelo menos como definido por padrão) lê diretamente de / proc / kmsg, que não pode ser gravado em userland.

(Isso é da memória, mas eu tenho certeza que o RHEL 5.5 não precisa de klogd ou mesmo de ksymoops para saída de símbolo para endereço; verifique seus documentos sobre isso, no entanto ...)

Se você está preocupado (veja meu comentário acima) sobre algum processo desonesto, prefixando a string literal "kernel:" em sua mensagem, você sempre pode adicionar um filtro que removeria a string "kernel:" no início de qualquer mensagem recebida para ter certeza. Como alternativa, defina / proc / kmsg como uma fonte separada com um destino separado.

EDIT: Olhando mais para essa seção:

"Nota

Se a mensagem não tiver um cabeçalho de syslog adequado, o syslog-ng tratará as mensagens recebidas dos arquivos enviados pelo recurso do kern. Use as opções default-facility e default-priority na definição de origem para designar um recurso diferente, se necessário. "

    
por 21.12.2013 / 08:17