diff --git a/scripts/harkaq/harkaq-exec.c b/scripts/harkaq/harkaq-exec.c index 686c123d..886daa86 100644 --- a/scripts/harkaq/harkaq-exec.c +++ b/scripts/harkaq/harkaq-exec.c @@ -131,6 +131,17 @@ static const int SYSCALLS_DENEGADAS[] = { __NR_setns, }; +// TECHO DE LA LISTA, y por qué no es un detalle: `jt`/`jf` de la BPF clásica son `__u8`. En la +// forma de abajo el salto más largo mide n+3, así que a partir de ~252 entradas el desplazamiento +// DA LA VUELTA y el filtro deja de decir lo que dice este fichero — sin error y sin aviso. Hoy son +// 25 y sobra sitio; el riesgo es que agregar syscalls a una denylist es exactamente lo que uno +// hace sin pensarlo. Esto no genera código: es un portón de compilación. +// (SDD 25 T17 midió además que la longitud de esta lista NO cuesta nada en ejecución — el bitmap +// de acción constante del kernel la hace plana —, así que no hay ningún motivo de rendimiento +// para recortarla ni para reordenarla.) +_Static_assert(sizeof(SYSCALLS_DENEGADAS) / sizeof(SYSCALLS_DENEGADAS[0]) <= 250, + "la denylist pasa el techo de salto de la BPF clasica (__u8): partir el filtro"); + // Arma e instala el filtro. Devuelve 0 si quedó puesto, -1 si el kernel no lo aceptó. static int poner_seccomp(void) { const int n = (int)(sizeof(SYSCALLS_DENEGADAS) / sizeof(SYSCALLS_DENEGADAS[0]));