Isso seria hacky, mas se fosse um executável vinculado dinamicamente, você poderia configurar um pré-carregamento global em /etc/ld.so.preload
, o que acionaria apenas um gancho de log se detectasse que você estava no executável correto.
Algo como:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define TARGET "/some_executable"
__attribute__((constructor))
static void
logger(int argc, char** argv){
/*catch own argv right here and parent's later from /proc */
static char buf[sizeof(TARGET)];
readlink("/proc/self/exe", buf, sizeof(buf)-1);
if ( 0==strcmp(TARGET, buf)){
/* ... */
syslog(/*...*/);
}
}
A desvantagem óbvia desta abordagem é que ela atrasa um pouco a execução de cada executável vinculado dinamicamente em seu sistema, mas minhas medições indicam que o atraso é bem pequeno (< 1ms em que fork + exec custa cerca de 2ms).
Quanto ao problema de permissão removida, você pode ter um pequeno binário setuid-root que lerá e ecoará incondicionalmente seus arquivos proc dos avós (o arquivo status
, provavelmente), possivelmente se e somente se seu pai for o executável cujos pais você deseja registrar. Você poderia, então, gerar esse executável setuid dentro de seu gancho de logging para obter as informações sobre o pai executável (avô do auxiliar setuid).