Parece que, por escrito (2019-02-08), isso é impossível .
E até strace
erra .
Editar: Linus Torvalds fala sobre isso aqui , analisando também possíveis (mas comentadas) soluções alternativas no código strace
que examinam diretamente as instruções feitas no binário. Este código foi removido aqui como parte do patchset que menciono abaixo. Ele diz It works, but is too complicated, and strictly speaking, unreliable
, mas não está claro para mim em quais casos o "estritamente falando, não confiável" se aplica, se isso é apenas no caso de um executável multi-thread reescrevendo-se em tempo de execução (portanto não adequado para proibir determinados syscalls para casos de uso de segurança), ou também em outros casos.
Edit: A parte "não confiável" foi adicionada em este commit .
Edit: Eu tentei a implementação do opcode-peeking do strace (versão v4.25
), e suspeito que ele estava bugado: Ao ativar esse caminho de código, alterando esta linha para #if 0
e esta linha para #elif 1
, não são impressas syscalls porque scno
não está definido. Eu adicionei scno = x86_64_regs.orig_rax;
após esta linha para fazer isso funcionar.
Veja a apresentação Como fazer o strace feliz slide 2, problema 2:
There is no reliable way to distinguish between x86_64 and x86 syscalls.
Detalhes mostrados nos slides 4-6. Há uma solução proposta a ser adicionada ao kernel:
Extend the ptrace API with PTRACE_GET_SYSCALL_INFO request
Mas esta solução não é mesclada ao kernel.
O conjunto de caracteres é chamado ptrace: add PTRACE_GET_SYSCALL_INFO request
e que ainda está sendo trabalhado em janeiro de 2019 . Espero que em breve seja mesclado.
strace
já tem suporte para desde o release 4.26 (mas ele não deve funcionar a menos que você aplique o patch do kernel manualmente):
Implemented obtainment of system call information using
PTRACE_GET_SYSCALL_INFO
ptrace API.