Artículo técnico-divulgativo del desarrollador Stephen Kell en el que reflexiona sobre la instrumentación de llamadas al sistema en el espacio de usuario de Linux sobre x86-64. Partiendo de su biblioteca libsystrap, que actualmente sustituye cada syscall por la instrucción ud2 (provocando una doble trampa: primero SIGILL y luego la ejecución dentro del manejador), el autor repasa las líneas de investigación recientes que evitan esa penalización: el concepto de "instruction punning" de Liteinst, la herramienta E9Patch y, sobre todo, la técnica zpoline, que reemplaza la syscall de dos bytes por un call *%rax y mapea código en la página baja de memoria, protegida con memory protection keys de Intel y validada mediante una tabla hash de direcciones de retorno. Kell señala limitaciones reales de zpoline: muchos procesadores carecen de MPK, la validación de retorno añade sobrecarga y mapear la página baja exige privilegios en Linux; además, un valor alto en %rax provoca comportamiento indefinido en lugar de un ENOSYS limpio. A partir de ahí plantea su propia exploración: explotar la segmentación x86 (instrucciones lcall) y la tabla LDT modificable con modify_ldt() para encadenar de forma indirecta la syscall a código de instrumentación. Aunque confiesa que la idea no cuajó como esperaba, describe los near-miss y detalla la diferencia entre saltos indirectos por registro y por memoria (ff d0 frente a ff 10) y el papel de los selectores de segmento de 16 bits. El texto se publica en su blog humprog.org con el tono desenfadado de "rambles" y divagaciones técnicas, y deja la puerta abierta a continuaciones futuras.
Reflexiones sobre instrumentación de llamadas al sistema en x86-64 Linux
Fuentes:
Rambles around computer science
