Esecuzione di codice Python non attendibile

2

Ho un piccolo router OpenWRT, sul quale desidero eseguire un demone che è uno script python. Tuttavia, anche se è open-source e plain Python, non mi fido ancora di questo e vorrei isolarlo dal resto del sistema il più possibile. Deve fare quanto segue:

  • Vincola e ascolta su una singola porta TCP
  • Leggi / scrivi alcuni file nella sua directory di lavoro

Oltre a questo, non dovrebbe essere in grado di fare nulla. Ho pensato di fare quanto segue:

  • Avvia uno script wrapper come root, collega la porta, quindi rilascia l'appartenenza al gruppo e rilascia un nuovo utente prima di import ing ed esegui lo script effettivo
  • Eseguilo in chroot

Mi sono perso qualcosa che avrebbe aiutato a farlo funzionare in modo più sicuro?

    
posta matega 01.01.2015 - 15:38
fonte

2 risposte

2

Ecco alcune cose che prenderei in considerazione:

  • Rivedi il codice
  • Crea un nuovo utente non privilegiato e usalo per eseguire lo script (su una porta superiore a 1023) e usa IPtables per reindirizzare il traffico a bassa porta sulla tua porta di accesso.
  • Guarda qualcosa come i controlli delle risorse per impedire all'utente / script di legare risorse (come aprire un milione di handle di file)

I privilegi di chroot e di rilascio sono anche buone opzioni, purché si mantenga aggiornato il sistema operativo host.

    
risposta data 01.01.2015 - 22:41
fonte
1

I privilegi di chroot e rilascio sono un approccio ragionevole. Per correggere un po 'la tua descrizione:

  1. Come root, chroot in una struttura di directory contenente solo il minimo necessario.
  2. Come root, collega la porta, se è inferiore a 1024. Un software come tcpd può essere utile in quella fase. Nota che per le porte superiori a 1024, non è necessario eseguire il binding come root.
  3. Privilegi di rilascio, ovvero passa a un gruppo dedicato, quindi passa a un utente dedicato.
  4. Esegui (come in execve in C o exec in shell) lo script Python.

Un utile passo aggiuntivo per la sicurezza sarebbe limitare l'accesso alla rete tramite lo script dedicato. Ad esempio, potresti voler impedire che ascolti su altre porte o apra le connessioni in uscita al telefono di casa. Ovviamente quanto puoi limitare e lasciare che faccia il suo lavoro dipende da cosa dovrebbe fare. Linux può limitare l'accesso alla rete per ID utente con iptables -m owner ( esempio ).

Linux offre meccanismi di sicurezza aggiuntivi (spazi dei nomi, SELinux, AppArmor, ecc.) e l'esecuzione in una macchina virtuale aggiungerebbe un ulteriore livello di sicurezza, ma questi non saranno probabilmente disponibili su un sistema embedded con poche risorse come un piccolo router.

Per maggiore sicurezza, puoi eseguire un sandbox di Python - ma non sembra essere una sandbox Python funzionante in questo momento.

    
risposta data 04.01.2015 - 00:45
fonte

Leggi altre domande sui tag