Come posso controllare un eseguibile per assicurarmi che non sia dannoso?


10

Mi chiedevo se esiste uno strumento o una tecnica per eseguire un eseguibile in un ambiente isolato, magari in una macchina virtuale. Mentre il programma è in esecuzione, voglio essere in grado di controllare l'applicazione, ovvero vedere tutto ciò che l'eseguibile sta facendo (accesso ai file e alla rete).

In questo modo voglio essere in grado di verificare se l'eseguibile è dannoso, ovvero esegue operazioni che non dovrebbe (leggere / scrivere su file, ascoltare / connettersi alle porte di rete, ...).

Non mi dispiacerebbe qualcosa con un'interfaccia grafica.


2
@EliahKagan: Se capisco bene la domanda, l'OP chiede "uno (strumento) in cui posso vedere tutto ciò che l'eseguibile sta facendo" - immagina se puoi eseguire sandbox somebinarye il sandboxprogramma immaginario registra tutti i file somebinaryletti o scritti, tutti IP / porte connesse, dati trasferiti ecc. Sarebbe una cosa utile avere, vorrei anche sapere se esiste qualcosa del genere (e, in realtà, senza tale strumento osservare un programma in esecuzione in una macchina virtuale sarebbe inutile come te non posso dire quello che fa lì). Buona domanda.
Sergey,

2
Domanda pertinente su UL.SE che ho posto prima: come posso monitorare i file aperti di un processo in tempo reale? (non solo sui file, anche sulla rete) Ricorda che quando lo vedi accadere, il danno si è già verificato.
gertvdijk,

2
Ho fatto una domanda su meta per quanto riguarda la chiusura di questa domanda: meta.askubuntu.com/questions/5871/… - Non credo che avrebbe dovuto essere chiuso.
Sergey,

Risposte:


10

è uno strumento o forse una macchina virtuale per eseguire un eseguibile al suo interno

Sì, questo si chiama virtualizzazione dell'applicazione .

LXC (Linux Containers) è uno strumento comunemente usato per configurarlo. Ti consente di configurare una rete completamente separata per questa applicazione e la "sandbox" in una sorta di macchina virtuale, proprio come un chroot. Ciò è principalmente a fini di sicurezza (una "prigione"), non proprio per il controllo.

Penso che sia un po 'fuori dallo scopo della domanda spiegare i contenitori LXC completi e come controllarli esattamente. Di seguito è riportato un po 'su come iniziare, però.

Mentre il programma è in esecuzione, voglio essere in grado di vedere tutto ciò che sta eseguendo (accesso ai file e alla rete).

Questo può essere realizzato usando stracee ho posto la stessa domanda su Unix e Linux:

Come risposto lì, si riduce sostanzialmente a

strace -t -e trace=open,close,read,getdents,write,connect,accept command-here

Importante: una volta che lo vedi accadere, il danno è già avvenuto.


Contenitore dell'applicazione LXC

Da questo articolo . Si riduce a:

  1. lxc-macvlan.conf file di configurazione:

    # example as found on /usr/share/doc/lxc/examples/lxc-macvlan.conf
    # Container with network virtualized using the macvlan device driver
    lxc.utsname = alpha
    lxc.network.type = macvlan
    lxc.network.flags = up
    lxc.network.link = eth0 # or eth2 or any of your NICs
    lxc.network.hwaddr = 4a:49:43:49:79:bd
    lxc.network.ipv4 = 0.0.0.0/24
    
  2. Inizia usando lxc-execute:

    sudo lxc-execute -n bash-test2 -f lxc-macvlan.conf /bin/bash
    

Si noti che LXC offre sia contenitori di sistema che di tipo applicativo. Stai cercando contenitori per applicazioni qui.


1
LXC non è ancora pronto ed è attualmente non sicuro. Ad esempio, /sysnon viene virtualizzato e le modifiche apportate al /syscontenitore vengono apportate a /sysquelle dell'host. Facendo una rapida ricerca sul Web, ci sono alcuni articoli che documentano come "fuggire" da un contenitore. LXC sarà una buona soluzione al problema, ma attualmente non lo è e non dovrebbe essere utilizzato come strumento di sicurezza.
Andrea Corbellini,

1
A proposito, la configurazione di esempio pubblicata non utilizza le lxc.mountopzioni. Ciò significa che l'intero file system dell'utente è accessibile dall'eseguibile eseguibile.
Andrea Corbellini,

10

Quello che stai cercando è uno strumento che mostra come un programma interagisce con il sistema (più specificamente, con il kernel). I programmi interagiscono con il sistema usando syscalls. Esempi di syscalls sono:

  • open - usato per aprire un file;
  • reade write- usato per leggere / scrivere da / verso un descrittore di file;
  • connect - utilizzato per collegare una presa a un peer;
  • molti, molti altri (vedi man syscalls).

Il punto è: i syscalls possono essere tracciati usando ptrace(2). Quindi, in sostanza, stai cercando strumenti costruiti intorno ptrace. Uno di questi strumenti è strace(1), che è un'applicazione terminale che accetta un comando come argomento e genera:

  • il sistema chiama il programma sta chiamando;
  • gli argomenti usati per creare i syscalls;
  • il risultato dei syscalls.

L'output è in stile C. Ecco un esempio:

$ strace cat test
execve("/bin/cat", ["cat", "test"], [/* 55 vars */]) = 0
/* ... */
open("test", O_RDONLY)                 = 3
/* ... */
read(3, "hello\n", 32768)               = 6
write(1, "hello\n", 6)                  = 6
read(3, "", 32768)                      = 0
/* ... */

Qui vedi che cat teststa aprendo un file chiamato test, leggendo il suo contenuto ( hello) e posizionandolo sull'output standard.

stracepuò produrre molto output, quindi assicurati di leggere la sua pagina man ( man strace), in particolare la documentazione -edell'output che ti permetterà di vedere solo le syscalls che ti interessano.

Sfortunatamente, non sono a conoscenza di alternative grafiche o di facile utilizzo. Se vuoi cercarli, ptracedovrebbe essere una delle tue parole chiave di ricerca.


Per quanto riguarda l'isolamento, ci sono molte tecnologie là fuori. Chroot, container Linux (che sono attualmente in fase di sviluppo e incompleti), virtualizzazione del software e paravirtualizzazione sono i più utilizzati. Tuttavia, questo è un argomento troppo ampio per essere discusso. Suggerirei di aprire una nuova domanda se desideri avere maggiori dettagli.


5

Dai un'occhiata a AppArmor . È possibile aggiungere un profilo limitato per un eseguibile e metterlo in modalità "lamentarsi", in cui le azioni saranno consentite ma registrate, che secondo me soddisfa i tuoi requisiti.

Ma nota che questo non è abbastanza. Un intelligente binario dannoso potrebbe essere in grado di rilevare che è sotto osservazione e non eseguire azioni dannose tranne quando non viene osservato.

AppArmor va oltre e consente a un'applicazione di essere limitata per sempre solo alle operazioni approvate. Le app che finiscono in Ubuntu Software Center vengono fornite con profili AppArmor.


5

Come hai identificato, una macchina virtuale sarebbe meglio fornire isolamento, in particolare se hai motivo di credere che un eseguibile sia dannoso in primo luogo. Ma anche questo non è perfetto, poiché le vulnerabilità nella piattaforma di virtualizzazione (sia hardware che software) possono essere sfruttate da codice dannoso per esplodere. Ecco un esempio di vulnerabilità della virtualizzazione del mondo reale: http://www.kb.cert.org/vuls/id/649219


1

Potresti creare uno scatto .

Gli snap sono "confinati dal sistema operativo e da altre app attraverso meccanismi di sicurezza, ma possono scambiare contenuti e funzioni con altri snap secondo criteri dettagliati controllati dall'utente e impostazioni predefinite del sistema operativo". (da http://snapcraft.io/docs/snaps/intro )

Questi forniscono un ulteriore isolamento oltre ad AppArmor, ad esempio usando anche seccomp .

Inoltre, uno snap può essere autonomo per una facile distribuzione e aggiornamenti atomici sul sistema.


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.