Come si verifica che uno script Python sia una pura funzione matematica?

0

Ho un progetto Python che carica dinamicamente script Python da una serie di directory specificate ed esegue una funzione prevista su di essi (il framework si aspetta un nome di funzione che richiede un certo numero di parametri, ma l'implementazione è sconosciuta). Per aumentare la sicurezza di questa applicazione, vorrei analizzare gli script per assicurarmi che siano solo funzioni matematiche e, quindi, non interagire con componenti di sistema come HDD / SDD, rete, database, ecc. questo è possibile anche in Python?

    
posta josiah 28.07.2016 - 18:00
fonte

3 risposte

2

Temo che questo non sia possibile. Dopo tutto, il tuo problema si riduce a chiedere "questo codice è dannoso?", E potremmo rispondere in modo affidabile a questa domanda, quindi il malware non esisterà più.

Potresti mitigare questo problema permettendo agli utenti di creare il loro script usando un insieme di funzioni permesse che consideri sicure (anche se nulla è totalmente sicuro e potrebbero esserci bug in quelle funzioni che permettono di fare cose malvagie) e solo consentire determinati argomenti (numeri interi e riferimenti a variabili definite in precedenza) per complicare ulteriormente il compito di un aggressore (non possono semplicemente passare una stringa a una funzione vulnerabile, ma un'altra cosa su cui devono lavorare). Ovviamente avrai bisogno di fare tutto questo lato server di validazione, non fare affidamento sul Javascript lato client per far rispettare questo.

Un'altra opzione sarebbe accettare qualsiasi codice (con un limite di dimensioni ragionevole) ed eseguirlo in una VM senza accesso alla rete e che può solo comunicare con l'host attraverso una porta seriale emulata per ottenere i dati e restituirne il risultato ( puoi fornire funzioni di supporto nel tuo ambiente come get_input e set_output che utilizzerebbero internamente la porta seriale per comunicare con l'host.Potresti renderlo ancora più sicuro eseguendo le macchine virtuali su macchine separate fisicamente che sono considerate non affidabili e solo loro avere una porta seriale per parlare con il mondo esterno: in questo modo, anche se vengono sfruttati, l'aggressore avrà difficoltà a utilizzarli.

    
risposta data 28.07.2016 - 18:15
fonte
1

In aggiunta a ciò che ha detto André, penso che la whitelisting sarebbe la soluzione migliore.

Alcune risorse che potrebbero aiutarti link O più nello specifico link Poiché include alcune funzionalità di whitelist.

Se ti piacerebbe trovare la tua soluzione, potresti trovare o costruire (dato che Python è uno spazio bianco non sarebbe troppo difficile) un parser python che usa alcune regex magic e cosa no, solo consentire determinati codici in un determinato script.

    
risposta data 28.07.2016 - 18:29
fonte
1

Possibile: forse. Fattibile: sembra improbabile. Limitare semplicemente le importazioni non renderà sicuro il sistema. Avrai bisogno di analizzare lo script e cercare elementi come exec ()

Il più grande roadblock è che è davvero difficile sapere che sei riuscito a bloccare tutte le operazioni pericolose.

Se non ti puoi fidare degli script, penso che il modo più sicuro per andare sia usare un linguaggio specificamente creato per quello che vuoi fare o creare da te. Cercare di limitare l'uso di un linguaggio generico a ciò che è noto per essere sicuro sembra un compito Sisifea. Quello che vuoi veramente è un linguaggio di espressione matematica, giusto?

Ecco un codice per darti un'idea di ciò che stai affrontando:

e = eval

g = e("glo" + "bals")

f = chr(101)
f += chr(120)
f += chr(101)
f += chr(99)
f += chr(102)
f += chr(105)
f += chr(108)
f += chr(101)

b = getattr(g()["__" + "builtins" + "__"], f)

print b

b("badstuff.py")

Se non puoi preoccuparti di eseguirlo, la stampa b mostra:

<built-in function execfile> 

Questo è proprio quello che mi è venuto in mente in pochi minuti. Chiaramente è necessario limitare l'uso di globals, eval, exec, execfile ma non pretendo che questo elenco sia completo.

    
risposta data 28.07.2016 - 19:49
fonte

Leggi altre domande sui tag