Posso eseguire un binario Linux senza che sia impostato il bit di autorizzazione di esecuzione?


25

Esiste un modo per eseguire un file binario eseguibile su Linux che non ha impostato il bit di esecuzione? chmod +xnon è un'opzione.

Ad esempio, le autorizzazioni possono essere r--r--r--solo.

Esecuzione di script è possibile senza impostare il bit di esecuzione e messa in uno shebang passando sorgente all'interprete, ad esempio bash script.sho python script.py.

Quindi c'è qualcosa del genere execute abinaryfileche carica il codice oggetto in memoria e lo esegue?


3
fare una copia e chmod un'opzione?
TiCL

No, mi chiedo se c'è un modo per eseguire un binario in un ambiente in cui non è possibile impostare il bit di autorizzazione (sul file dato o su eventuali copie di esso ...)
Tom

Risposte:


36

Puoi usare /lib/ld*.so come interprete ELF, in questo modo:

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

Il nome attuale differisce da un'architettura all'altra. Alcuni nomi sono /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2e /lib/ld-2.7.so. Probabilmente puoi trovarlo singolarmente come /lib/ld*.


ottime informazioni ..... comunque cosa significa ld?
Vineet Menon,

@VineetMenon ldè il linker / caricatore del programma. Trova e carica le librerie condivise utilizzate dal programma, quindi lo esegue. ld-linuxgestisce i binari ELF.
Daniel Beck

Ok, cosa succede se /lib/ld-linux.so.2non è eseguibile (è anche possibile?)
LawrenceC

@ultrasawblade AFAIK, solo i file eseguibili .sopossono essere caricati ed ld-linuxè abbastanza importante.
Daniel Beck

Su Ubuntu a 64 bit lo è/lib64/ld-linux-x86-64.so.2
Tor Klingberg,

1

No. Almeno, non allo stesso modo. Stai ancora eseguendo un binario quando fai la cosa di Python. Python è + x. Dovresti compilare qualcosa che può caricare un file ed eseguirlo.

TiCL dovrebbe dare una risposta alla sua risposta perché è il modo migliore di procedere.


Sì, capisco che "python" è un binario in quell'istanza. Quello che speravo fosse che la "compilazione di qualcosa che potesse caricare un file ed eseguirlo" esistesse già ...
Tom

@ Tom Troverai programmi C che possono leggere un binario in memoria ed eseguirlo. Tuttavia, non so se Python sia abbastanza basso da farlo in modo C.
nuovo123456

0

La execsyscall del kernel Linux fallisce EACCESse il file non è eseguibile

Mentre puoi farlo sh myprog.sh , provando a eseguire il programma perché ./myprog.shnon funziona, da quando lo fai:

Questo può essere verificato 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);
}

e myprog.sh:

#!/bin/sh
echo worked

Se myprog.shnon è eseguibile, mainnon riesce con:

execve: Permission denied
13
13

Testato in Ubuntu 17.10, gcc -std=c99.

POSIX 7 menziona che a:

Le funzioni exec, ad eccezione di fexecve (), falliranno se:

[EACCES] L'autorizzazione di ricerca viene negata per una directory elencata nel prefisso del percorso del nuovo file di immagine di processo, oppure il nuovo file di immagine di processo nega l'autorizzazione di esecuzione.

Ulteriori motivazioni sono disponibili all'indirizzo: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.