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.