¿Puedo ejecutar un binario de Linux sin establecer el bit de permiso de ejecución?

25

¿Hay alguna manera de ejecutar un archivo binario ejecutable en Linux que no tenga el bit de ejecución establecido? chmod +xno es una opinión.

Por ejemplo, sus permisos pueden ser r--r--r--únicos.

Es posible ejecutar scripts sin establecer el bit de ejecución y poner un shebang pasando la fuente al intérprete, por ejemplo, bash script.sho python script.py.

Entonces, ¿hay algo así execute abinaryfileque cargará el código objeto en la memoria y lo ejecutará?

Tom
fuente
3
hacer una copia y chmod una opción?
TiCL
No, me pregunto si hay una manera de ejecutar un binario en un entorno donde no se puede establecer el bit de permiso (en el archivo dado o en cualquier copia de él ...)
Tom

Respuestas:

35

Puede usar /lib/ld*.so como intérprete ELF, de esta manera:

$ cp /bin/ls /tmp/ls
$ chmod a-x /tmp/ls
$ /lib/ld-linux.so.2 /tmp/ls

El nombre real difiere de una arquitectura a otra. Algunos nombres incluyen /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2y /lib/ld-2.7.so. Probablemente pueda encontrarlo singularmente como /lib/ld*.

Dolda2000
fuente
gran información ... de todos modos, ¿qué significa ld?
Vineet Menon
@VineetMenon ldes el enlazador / cargador de programas. Encuentra y carga las bibliotecas compartidas utilizadas por el programa, y ​​luego lo ejecuta. ld-linuxmaneja binarios ELF.
Daniel Beck
Ok, ¿y si /lib/ld-linux.so.2no es ejecutable (¿es eso posible?)
LawrenceC
@ultrasawblade AFAIK, solo .sose pueden cargar s ejecutables , y ld-linuxes algo importante.
Daniel Beck
En Ubuntu de 64 bits es/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

No. Al menos, no de la misma manera. Todavía está ejecutando un binario cuando hace lo de Python. Python es + x. Necesitaría compilar algo que pueda cargar un archivo y ejecutarlo.

TiCL debe hacer que su respuesta sea una respuesta porque es la mejor manera de hacerlo.

Pablo
fuente
Sí, entiendo que "python" es un binario en ese caso. Lo que esperaba es que el "compilar algo que puede cargar un archivo y ejecutarlo" ya existía ...
Tom
@ Tom Encontrará programas en C que pueden leer un binario en la memoria y ejecutarlo. Sin embargo, no sé si Python es lo suficientemente bajo como para hacerlo de la manera C.
nuevo123456
0

La execsyscall del kernel de Linux falla EACCESsi el archivo no es ejecutable

Si bien puede hacerlo sh myprog.sh, tratar de ejecutar el programa como ./myprog.shno puede funcionar, ya que cuando lo hace:

Esto se puede verificar con main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

y myprog.sh:

#!/bin/sh
echo worked

Si myprog.shno es ejecutable, mainfalla con:

execve: Permission denied
13
13

Probado en Ubuntu 17,10, gcc -std=c99.

POSIX 7 menciona que en:

Las funciones ejecutivas, excepto fexecve (), fallarán si:

[EACCES] Se denegó el permiso de búsqueda para un directorio que figura en el prefijo de ruta del nuevo archivo de imagen de proceso, o el nuevo archivo de imagen de proceso niega el permiso de ejecución.

Se pueden encontrar más razones en: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli 新疆 改造 中心 996ICU 六四 事件
fuente