Come limitare dlopen () da o verso determinati percorsi?

6

Se voglio disabilitare l'esecuzione dei programmi su un filesystem, posso usare l'opzione di montaggio noexec .

Tuttavia, questo non funziona con le librerie dinamiche caricate attraverso dlopen() . Allora, qual è il modo di farlo con nacl o seccomp? (questo è per sandboxing bytecode non affidabile, non voglio che gli utenti siano in grado di eseguire librerie condivise che hanno caricato)

Allo stesso tempo, le librerie come gconv devono essere in grado di eseguire i loro moduli .so .
fork () ing o exec () uting di altri programmi a livello di programmazione è già disabilitato.

    
posta user2284570 14.08.2016 - 19:13
fonte

1 risposta

-1

However, this doesn’t works with dynamic libraries.

Funziona con le librerie dinamiche. Se un oggetto condiviso si trova su una partizione montata con l'opzione noexec, non può essere caricata, altrimenti noexec sarebbe abbastanza inutile.

$ grep -E '/tmp |ext4' /proc/mounts
/dev/mapper/root_crypt / ext4 rw,nodev,noatime,data=ordered 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,noatime,size=2031200k 0 0
$ cat > main.c
#include <stdio.h>

void main(void)
{
        printf("%d\n", getpid());
}
$ gcc -o main main.c
$ ./main
4950
$ cat > shared.c
int getpid(void)        
{
        return 1;
}
$ gcc -shared -fPIC -o shared.so shared.c
$ LD_PRELOAD=./shared.so ./main
1
$ mv shared.so /tmp
$ LD_PRELOAD=/tmp/shared.so ./main
ERROR: ld.so: object '/tmp/shared.so' from LD_PRELOAD cannot be preloaded (failed to map segment from shared object): ignored.
4978

Se si desidera utilizzare seccomp per impedire l'esecuzione di oggetti condivisi non fidati, è possibile farlo limitando le chiamate a mmap() , mprotect() e ovviamente execve() . Assicurati che il processo non possa mappare nulla con PROT_EXEC . Limitare i file non è sufficiente, perché qualsiasi dato arbitrario può essere passato a mmap() attraverso un descrittore di file e mprotect() può modificare le autorizzazioni di pagine arbitrarie di memoria per renderle eseguibili. Inoltre, poiché questo esempio è una lista nera piuttosto che una lista bianca, devi anche negare l'accesso ad alcuni argomenti ptrace() , perché possono essere usati per uscire da una sandbox seccomp.

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(mmap), 1,
    SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
if (rc == -1)
    goto out;

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCESS), SCMP_SYS(mprotect), 1,
    SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
if (rc == -1)
    goto out;

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCESS), SCMP_SYS(execve), 0);
if (rc == -1)
    goto out;

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
    SCMP_A0(SCMP_CMP_EQ, PTRACE_POKEUSER));
if (rc == -1)
    goto out;

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
    SCMP_A0(SCMP_CMP_EQ, PTRACE_SETREGS));
if (rc == -1)
    goto out;

rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
    SCMP_A0(SCMP_CMP_EQ, PTRACE_SETREGSET));
if (rc == -1)
    goto out;

Ci sono probabilmente dei modi per aggirare questo snippet di seccomp che non ho pensato, quindi questo è solo per darti un'idea di quello che serve.

Non ho mai usato NaCl, quindi non posso dire come limitare l'esecuzione con esso.

    
risposta data 15.08.2016 - 09:27
fonte

Leggi altre domande sui tag