Wykonywanie kodu napisanego przez użytkownika

0

Cześć,
Chcę wykonać coś w stylu Halite (w dużym uproszczeniu):
"Halite is an artificial intelligence challenge, created by Two Sigma. Participants write bots using the programming language of their choice to compete in an original online multiplayer game."

W moim przypadku każdy z graczy kierowałby jedną postacią. Na razie widze to tak, że użytkownikowi będzie wystawiony jeden interfejs funkcyjny. Będzie on wykonywany dla każdego gracza jednorazowo na początku każdej klatki symulacji. Na wejściu gracz będzie dostawał 'stan świata' i na wyjściu poda ruch jaki wykonuje (1 klatka == 1 możliwy ruch).

Tylko brakuje mi wiedzy jak takie coś wykonać żeby:

  • użytkownik mógł pisać w dowolnym języku/wspieranych byłoby kilka najpopularniejszych języków (trzeba tworzyć jakieś dllki? albo coś takiego?)
  • użytkownik nie wpisał mi jakichś bubli w kodzie typu sys.exit itd.

Jakie macie pomysły na te dwa problemy? Widzicie jeszcze jakieś problemy o których zapomniałem? Taki koncept wykonywania kodu ma jakąś nazwę? bo nie wiem co googlać

2

Zag. nr 2. To historycznie nosiło nazwę Jail, obecnie częściej Sandbox

Językiem w pełni do tego zdolnym bez żadnych ceregieli jest Lua, dobrze się robi sandbox do Groovy (a więc już klimaty Javy).
Językiem niezdolny do jakiegokolwiek zdrowego sandboxowania jest Python w wersji > 1 (wiec 2 i 3)

Stawiam, są szanse na sandboxowanie kilku interpreterów JavaScriptu

A sama procedura osadzenia (wbudowania) języka w coś większego z ang nazywa się **embedded **language

Zwykle języki uznawane powszechnie za "dobre" (bogata biblioteka standardowa, pełne możliwości systemowe) są dokładnie z tego powodu złymi językami do wbudowywania

Re "kilka najpopularniejszych języków" większość z nich nie da się osadzić z jakimkolwiek poziomem bezpieczeństwa. Np tzw "interpretery C", to są interpretery tak wykastrowanego języka, ze nie wypada tego nazywać C.

2

Na https://www.codingame.com/ masz mnóstwo takich gierek - ten rodzaj gry nazywa się "bot programming" https://www.codingame.com/multiplayer/bot-programming , możesz im wysłać własną https://www.codingame.com/contribute/community
Wszystko o czym mówisz mają ogarnięte więc możesz się skupić na zrobieniu samego wyzwania. No i masz gwarantowaną pulę graczy
Robienie tego wszystkiego od zera chyba nie ma sensu

1

może użyć WebAssembly?

1

(a WebAssembly daje sandbox oraz można go używać AFAIK nie tylko w przeglądarce) — LukeJL 3 minuty temu

Tak. Ale wszelkie "sandboxy" dużego języka są za cenę jego wykastrowania. Tzn rdzeń języka (prawdopodobnie *) ) zostaje, ale jest prawdziwa jatka z biblioteką standardową.

*) taki sandboxowany C, gdzie wszechmogące wskaźniki już takie nie są - czy to nadal C ?)

można dowolny język, jeśli skompilować go razem z jego wirtualną maszyną.

A jaka jest maszyna wirtualna C? Ewentualna jakby była (przykład: z bezpiecznymi wskaźnikami), to już nie jest C.

O dobrym i niedobrym sanboxowaniu to myślę od lat dwudziestu (oczywiście nie ciągle, ale powtarzalnie od czasu do czasu)

1

Myślę że nie ma co nawet myśleć o "sandboxowaniu" poszczególnych języków, to wręcz nierealne do zrobienia dla kilkunastu języków programowania. tylko po prostu odpalić normalnie kod w sandboksie w sensie wirtualnej maszynie utworzonej na krótko z minimalnymi uprawnieniami i brakiem dostępu do sieci. Nadal jest małe ryzyko że ktoś znajdzie jakiegoś exploita i wyjdzie poza wirtualkę, ale myślę że środowiska na których jest odpalany kod też można na wszelki wypadek odizolować, tak żeby w najgorszym przypadku padł tylko jeden node uruchamiający kody

AnyKtokolwiek napisał(a):

Re "kilka najpopularniejszych języków" większość z nich nie da się osadzić z jakimkolwiek poziomem bezpieczeństwa. Np tzw "interpretery C", to są interpretery tak wykastrowanego języka, ze nie wypada tego nazywać C.

na codingame masz do wyboru:

Bash
C
C#
C++
Clojure
D
Dart
F#
Go
Groovy
Haskell
Java
Javascript
Kotlin
Lua
ObjectiveC
OCaml
Pascal
Perl
PHP
Python3
Ruby
Rust
Scala
Swift
TypeScript
VB.NET

nie są to wykastrowane wersje języków, to nie jest nawet dobra ścieżka żeby to zrobić

1

Odpalenie C w maszynie wirtualnej to jedno, OK. Odpala sie cały proces i coś tam ze skutkami / wynikami odpalenia działamy.
Np takie są realia webowym środowisk kompilacyjno-wykonawczych. Da się odpalić pińcet+ języków? da się.

Ale to jest głęboko odmienne od " jeden interfejs funkcyjny. Będzie on wykonywany dla każdego gracza jednorazowo na początku każdej klatki symulacji. " czyli strzelnianie setkami eventów w innym języku w jakiejś maszynie stanowej.

2
  1. Robisz SDK pod języki które wspierasz i dajesz tam obsługę API tych twoich botów, a ludzie klepią swoje boty na bazie tego SDK. Czyli robisz libkę gdzie user ma np. funkcje makeMove a pod spodem ta twoja libka generuje z tego jakiś RESTowy request.
  2. Najprościej będzie zrobić totalną izolacje, tzn to co wrzucił ci user odpalasz w sandboxie, jakims nsjailu na przykład i to komunikuje sie RESTem z resztą systemu i nie ma znaczenia co user tam da w kodzie, bo najwyżej dostanie RCE w sandboxie
0

Dzięki wszystkim za odpowiedz, plan jest taki, że będę wrzucał symulacje do sandboxa na innej maszynie(jeszcze nie wiem czy całą symulacje czy tylko kod użytkownika, zależy jak szybko się to będzie wykonywać). Jak coś złego się stanie to zwale na twórców sandboxa :p

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.