2009-06-18 11 views
10

Ho passato più di qualche ora a umiliarmi sullo ACM ICPC's problem set archive e mi sono chiesto come il giudice online sia in grado di compilare ed eseguire codice sorgente da qualsiasi utente e impedire attacchi dannosi al proprio sistema.In che modo il giudice ACM ICPC online previene attacchi dannosi?

I file binari compilati funzionano da una sorta di sandbox limitato? Come si dovrebbe fare per impostare questo tipo di sandbox? Quale sistema operativo utilizzeresti? Come varcheresti un eseguibile compilato dall'utente?

risposta

7

È possibile eseguirlo in una prigione chroot di Linux o collegarlo a una libc che non implementa alcun I/O di file.

+0

Che cos'è esattamente un carcere di chroot? –

+3

È un ambiente disponibile in alcuni sistemi UNIX che consente l'esecuzione di un programma senza alcun accesso al file system completo. I processi in esecuzione all'interno della prigione vedono una determinata sottodirectory come directory principale e non possono accedere a nulla al di fuori di essa. In particolare, una chiamata di sistema imposta la directory radice fasulla e tutti i processi figli la ereditano. – thirtyseven

0

Penso che non eseguano alcun codice. A volte esiste questo errore "Funzione limitata" quando si tenta di leggere o scrivere un file "ofstream" & "ifstream" in C++

6

I programmi vengono eseguiti in un carcere chroot con un tempo di esecuzione limitato. I computer Judge sono distribuiti su un numero di server per aiutare a prevenire un singolo punto di errore o attacchi DOS.

Sono un amministratore del concorso regionale.

+0

potresti approfondire cosa è una prigione chroot? –

+0

Sarebbe bello se qualcuno potesse spiegarlo un po 'di più. Tutte le librerie richieste in fase di esecuzione da gcc devono essere incluse in quell'area? – Terminal

4

Il modo semplice per formare sandbox (presupponendo Linux come sistema operativo server, che è comune per ACM) è l'uso di chroot (antico) o di alcune patch del kernel. Ci sono alcune tecniche di sandboxing più avanzate nel kernel ora, ad esempio:

  • seccomp - Linux 2.6.12+ - processo può chiedere OS utilizzando speciale prset chiamata, per limitare le capacità di processo: in uscita, lettura e scrittura già file aperti. Il sistema operativo si rifiuterà di fare qualsiasi altra chiamata di sistema che isola in modo efficace il programma dal mondo esterno. E non c'è modo di ripristinare queste funzionalità. (Questa soluzione può rompere alcune lingue progressive come Python, Perl, Ruby ecc che vuole caricare alcuni plugin in fase di esecuzione.) Isolamento

  • namespace - cgroups. chroot è un programma per modificare (isolare) solo lo spazio dei nomi del filesystem, e ci sono altri spazi dei nomi, ad es. rete o processo. Usando i cgroup possiamo limitare più del possibile usando solo chroot.

Alcune patch del kernel, scritto per i giudici on-line, per esempio * ejudge.ru ha patch per 2.6.38.8, 3.4.15, 3.7.5; e anche alcune soluzioni per Windows. (Il sito in russo.) Penso che questo sistema possa essere usato in alcuni concorsi in Russia, non sono sicuro di circa 1/4 ACM ICPC.

Alcuni sistemi di giudice utilizzano il syscall ptrace() - in altre parole, agiscono come debugger per il programma testato e Judge può controllare tutte le syscalls e possono annullare qualsiasi di esse senza passarle nel kernel.

E ci sono sistemi di giudice open source, ad es. https://openjudge.net/ (libsandbox)

Problemi correlati