Seccomp
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Seccomp, que significa Modo de Computação Segura, é um recurso de segurança do kernel Linux projetado para filtrar chamadas de sistema. Ele restringe processos a um conjunto limitado de chamadas de sistema (exit()
, sigreturn()
, read()
e write()
para descritores de arquivo já abertos). Se um processo tentar chamar qualquer outra coisa, ele é encerrado pelo kernel usando SIGKILL ou SIGSYS. Esse mecanismo não virtualiza recursos, mas isola o processo deles.
Existem duas maneiras de ativar o seccomp: através da chamada de sistema prctl(2)
com PR_SET_SECCOMP
, ou para kernels Linux 3.17 e superiores, a chamada de sistema seccomp(2)
. O método mais antigo de habilitar o seccomp escrevendo em /proc/self/seccomp
foi descontinuado em favor do prctl()
.
Uma melhoria, seccomp-bpf, adiciona a capacidade de filtrar chamadas de sistema com uma política personalizável, usando regras do Berkeley Packet Filter (BPF). Esta extensão é aproveitada por softwares como OpenSSH, vsftpd e os navegadores Chrome/Chromium no Chrome OS e Linux para filtragem de chamadas de sistema flexível e eficiente, oferecendo uma alternativa ao systrace, que agora não é mais suportado para Linux.
Neste modo, o Seccomp somente permite as syscalls exit()
, sigreturn()
, read()
e write()
para descritores de arquivo já abertos. Se qualquer outra syscall for feita, o processo é encerrado usando SIGKILL
Este modo permite filtrar chamadas de sistema usando uma política configurável implementada com regras do Berkeley Packet Filter.
Seccomp-bpf é suportado pelo Docker para restringir as syscalls dos contêineres, diminuindo efetivamente a área de ataque. Você pode encontrar as syscalls bloqueadas por padrão em https://docs.docker.com/engine/security/seccomp/ e o perfil seccomp padrão pode ser encontrado aqui https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Você pode executar um contêiner docker com uma política de seccomp diferente com:
Se você quiser, por exemplo, proibir um contêiner de executar algum syscall como uname
, você pode baixar o perfil padrão de https://github.com/moby/moby/blob/master/profiles/seccomp/default.json e apenas remover a string uname
da lista.
Se você quiser ter certeza de que algum binário não funcione dentro de um contêiner docker, você pode usar strace para listar os syscalls que o binário está usando e, em seguida, proibi-los.
No exemplo a seguir, os syscalls de uname
são descobertos:
Se você está usando Docker apenas para iniciar um aplicativo, você pode perfilá-lo com strace
e apenas permitir as syscalls que ele precisa
Para ilustrar o recurso Seccomp, vamos criar um perfil Seccomp desabilitando a chamada de sistema “chmod” conforme abaixo.
No perfil acima, definimos a ação padrão como "permitir" e criamos uma lista negra para desabilitar "chmod". Para ser mais seguro, podemos definir a ação padrão como "descartar" e criar uma lista branca para habilitar seletivamente chamadas de sistema. A saída a seguir mostra a chamada "chmod" retornando erro porque está desabilitada no perfil seccomp.
O seguinte output mostra o “docker inspect” exibindo o perfil:
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)