Wpis z mikrobloga

Chciałbym dać użytkownikom możliwość pisania kodu, który następnie będę kompilować po stronie serwera i wykonywać.
W jaki sposób mogę zabezpieczyć serwis po stronie serwera przed złośliwym użyciem funkcjonalności?

Potrafię sobie wyobrazić sytuację w której użytkownik np. poprzez refleksje wykona coś, czego wykonać nie powinien i wyśle sobie maila z wewnątrz kodu z informacjami, które zbierze.

Generalnie filtrowanie użytych usingów wydaje się być rozwiązaniem niespecjalnie bezpiecznym.

Czy Roslyn ma możliwość ograniczenia linkowanych bibliotek do tej z whitelisty?

Edit: coś a la Try .Net
#dotnet #dotnetcore #aspnetcore #csharp
  • 12
@FFF1243: Mam nadzieję, że to nie jedyne wyjście, bo:
a) ten kod może być odpalany przez długi czas
b) wielu użytkowników może mieć własny kod
c) każdy użytkownik może napisać i uruchomić wiele takich skryptów
d) kod powinien być w stanie korzystać z danych, które będę dostarczać (tu również dochodzi problem z bezpieczną komunikacją między instancjami)

Tworzenie i utrzymywanie osobnej instancji dla każdego użytkownika wydaje się być potwornie bolesne i zasobożerne.
@Hektorrr: roslyn ma opcje zaladowania tylko konkretnych dllek ale nie tedy droga. Ja bym pewnie szedl w strone zbudowania release pipelines i odpalenia kodu użytkownika w jakims kontenerze np. Console app w dockerze. Rezultat np. logujesz lokalnie po czym inject-ujesz do bazy albo wrzucasz na kolejke eventem. Ta opcja wydaje sie byc najbezpieczniejsza bo masz zupelnie odizolowane środowisko testowe.
@Hektorrr:
Kazdy z punktow ktore wymieniles nie rozni sie niczym pomiedzy sytuacjami gdzie odpalasz to na swoim serwerze, a w srodowisku izolowanym
a) Taki sam czas bylby odpalany na VM czy w dockerze jak i na twoim serwerze
b) Kazdy uzytkownik odpala to na tym samym izolowanym srodowisku,
c) ----||------
d) Tutaj tez w przypadku wyizolowania srodowiska jest latwiej zarzadzac bezpieczenstwem
@FFF1243:
Nie martwię się o czas czy zasobożerność tylko o infrastrukturę, którą musiałbym w tym wypadku implementować.

Zgadzam się, że izolowane środowiska wydają się najbezpieczniejszym rozwiązaniem (osobne kontenery per user + tylko i wyłącznie komunikacja typu event sourcing, bez dostępu do bazy).

Natomiast boli mnie już sam fakt pisania, debugowania i utrzymywania tego ( ͡° ʖ̯ ͡°)

Nie przychodzi mi też nic lepszego do głowy więc chyba
@Hektorrr:
nie znam szczegółów ale myśle, że niepotrzebne ci kontenery per user, mozesz wszystko wykonywac na jednym kontenerze, chyba ze zadań bedzie zbyt duzo a etapy kompilacji i uruchamiania zbyt wolne ale jedna maszyna może też robic ich pewnie kilka na raz więc może tej infrastruktury wcale nie bedzie tak duzo
@FFF1243:
Tutaj bardziej obawiam się złośliwych użytkowników, którzy byliby w stanie napisać kod, który uwali cały taki kontener z kodem innych użytkowników.
Sama obsługa takich skrajnych sytuacji i tak wymusi na mnie napisanie czegoś do automatyzacji deploymentu/restartu więc nie będzie mnie bolało stawiania kontenera per usera a pozwoli mi na zaoszczędzenie sobie i użytkownikom nerwów.
@Hektorrr:
Tez przez chwile pomyslalem o Kubernetesie ale nie wiem czy to nie jest strzelanie z armaty do muchy, poszukalbym jakis informacji w jaki sposob zaimplementowane sa jakiekolwiek kompilatory online, aplikacje typu leetcode itd. tego jest pelno w internecie a nie wydaje mi sie zeby kazdy stawial setki kontenerow do obslugi setki uzytkownikow
kompilatory online, aplikacje typu leetcode itd. tego jest pelno w internecie a nie wydaje mi sie zeby kazdy stawial setki kontenerow do obslugi setki uzytkownikow

@FFF1243:
Taka była moja pierwsza myśl i niczego nie znalazłem więc zapytałem na wykopie ( ͡° ͜ʖ ͡°)