2016-09-11 6 views
1

Meine Frage ist ähnlich zu diesem question, aber ich habe meine Antwort nicht erhalten.Ändern der Berechtigung eines Programms in Linux

Ich versuche, einen Richter zu entwerfen.

Die Benutzer des Online-Bewertungssystems reichen ihren Quellcode ein, dann das Serverprogramm kompiliert und führt es aus. So muss das Serverprogramm den Server sicher halten.

Und es gibt eine Menge Dinge, die ein Benutzer verwenden kann, um Änderungen am Server vorzunehmen.

Wie kann ich die Berechtigung eines Programms ändern? Der kompilierte Code kann nichts anderes tun als etwas zu drucken!

P.S: Suche nach verdächtigen Wörtern ist keine gute Idee. Zum Beispiel kann der Benutzer den folgenden Befehl anstelle des Wortes verwenden system in C++:

#define glue(a,b) a ## b 
glue(sys,tem) ("rm *"); //DO NOT RUN THIS CODE 

So Benutzer tatsächlich den folgenden Code verwendet, ohne das Wort mit der system:

system ("rm *"); //DO NOT RUN THIS CODE 
+2

führen Sie sie auf VM-es oder Container, die im laufenden Betrieb erstellt wurden. –

Antwort

1

Sie können sie in einem Lauf chroot Gefängnis, mit Benutzer-ID auf niemand oder einige Nonce-Konto festgelegt, wenn niemand wirklich etwas Bedeutendes tun kann. (Sie können su oder sudo dafür verwenden.) Oder sogar in ihrer eigenen VM. Verlegen Sie die Ausgabe in eine Datei und lesen Sie sie aus Ihrem Beurteilungsprogramm.

2

Das sind zwei Optionen für Sie: die, die Sie gerade untersuchen - versuchen, Ihren Compiler zu machen, alias der Server-Prozess, der den vom Benutzer bereitgestellten Quellcode ausführt, erkennt "Exploits". Und das könnte hart sein. Wenn Sie Benutzern erlauben, Ihnen C++ - Quellcode zu senden, gibt es viel Dinge, die möglich werden. Ich nehme an, dass Sie einige echte C++ Gurus brauchen würden, um diese Lösung sogar "halbwegs sicher" zu bekommen.

Also, Option zwei: Sie müssen diese Benutzer bereitgestellten Eingabe innerhalb einer Art Sandbox ausführen. Beispiele könnten sein:

  1. Ein Docker Behälter (aber sicher: ein nicht-privilegierten Behälter, von einem Benutzer ausgeführt, nicht root)
  2. Eine virtuelle Maschine

Wenn Sie es ernst meinen, was Sie tun, würden Sie wahrscheinlich zuerst auf Option 2 konzentrieren (denn das gibt Ihnen viel Nutzen, bei mittleren Kosten); aber Sie wollen definitiv auch in Option 1 schauen (weil man davon lernen könnte viel).

Verwandte Themen