Como faço para dissecar uma mensagem do SELinux SYSCALL?

3

Então, eu tenho esse trio de entradas de log de auditoria

type=AVC msg=audit(1488396169.095:2624951): avc:  denied  { setrlimit } for  pid=16804 comm="bash" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process
type=SYSCALL msg=audit(1488396169.095:2624951): arch=c000003e syscall=160 success=no exit=-13 a0=1 a1=7ffe06c17350 a2=2 a3=7fea949f3eb0 items=0 ppid=15216 pid=16804 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="bash" exe="/usr/bin/bash" subj=system_u:system_r:httpd_t:s0 key=(null)
type=EOE msg=audit(1488396169.095:2624951):

Na linha AVC, é fácil ver imediatamente que um processo bash com o contexto system_u:system_r:httpd_t:s0 foi negado para definir um limite de recursos.

Na linha SYSCALL, um rápido google para syscall = 160 indica que é uma chamada setrlimit() , que faz jive. O que eu não sei é qual recurso foi solicitado para ser modificado. Quais recursos ele estava tentando modificar?

    
por Michael Mol 01.03.2017 / 20:50

2 respostas

1

Portanto, neste caso, já sabemos que o syscall em questão é setrlimit . Uma pesquisa por setrlimit revela que há uma função da biblioteca C com o mesmo nome que envolve o syscall.

A documentação da função indica que o primeiro argumento ("a0 "na linha SYSCALL do log de auditoria) indica o recurso em questão, mas o manual nos informa apenas os nomes dos símbolos, não o valor numérico. No entanto, nos informa que os símbolos são definidos no arquivo de cabeçalho sys/resource.h . No entanto, esse arquivo não contém os valores reais.

Para obter os valores numéricos, verificamos em sysdeps/unix/sysv/linux/bits/resource.h . Lá, encontramos as várias macros RLIMIT_ definidas.

Olhando para esses, podemos descobrir qual recurso tentou ser modificado. Neste caso, a0 = 1, e a macro correspondente a 1 acaba por ser RLIMIT_FSIZE.

    
por 01.03.2017 / 21:53
0

É um pouco diferente. O AVC diz que você tem bash processo em execução e está tentando definir rlimit em si mesmo ou em alguns de seus filhos, o que é bastante comum para um shell.

O que está errado é que o bash está sendo executado com o contexto SELinux de httpd service, o que não é permitido fazer isso. Não é permitido, porque httpd é daemon voltado para rede e se houver algum bug, você não quer permitir que invasores brinquem com isso.

Isso geralmente é causado pelo fato de que bash foi iniciado a partir do httpd de alguma forma (o que nunca é uma boa ideia fazer).

A partir dessas mensagens, você não saberá qual recurso está sendo modificado. O SELinux possui apenas o recurso setrlimit , que permite ou nega a modificação de quaisquer limites. Ao procurar por argumentos, você precisaria de alguma ferramenta diferente, como:

  • SystemTap para investigar chamadas do sistema e seus argumentos
  • Lendo o código-fonte
  • A executar o seu script em gdb ou a anexar gdb ao processo em execução.
por 01.03.2017 / 21:12