Encontré un comportamiento sorprendente en Ubuntu 14.04 cuando lo uso strace
en un ejecutable, sobre el que no tengo permiso de lectura. Me pregunto si esto es un error o si algún estándar exige este comportamiento oscuro.
Primero, veamos qué sucede cuando inicio un ejecutable ordinario en segundo plano y lo adjunto. Como se esperaba, esto funciona:
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
Siguiente trato con un ejecutable, que no tengo permisos de lectura en:
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
No se permite adjuntar a este proceso en ejecución:
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Esto también es lo que esperaría. Otorgar permiso de ejecución sin permiso de lectura no serviría de mucho, si simplemente pudiera adjuntar un depurador al proceso y efectivamente tener permisos de lectura en el ejecutable de esa manera.
Pero si inicio el ejecutable bajo un proceso ya trazado, se me permite hacerlo:
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
Esto es inesperado para mi. ¿Es esto un error de seguridad, o es una característica exigida por un estándar?
EPERM
parece venir de get_dumpable()
(utilizado también para comprobar si se permite el volcado de memoria, por lo que "dumpable") llamada de __ptrace_may_access()
llamada a partir ptrace_attach()
de kernel/ptrace.c
.
execve
llamadas, los permisos de lectura del archivo ejecutado no se verifican nuevamente si el proceso ya se ha rastreado. Su pregunta es si eso es un error de seguridad o una característica obligatoria (si este último, todavía lo consideraría un error de seguridad, solo un error de seguridad de la especificación).