Piszę ciężki komputerowo kod dla serwera (w C/C++). W pętlach wewnętrznych muszę wywoływać miliony razy niektóre zewnętrzne funkcje użytkownika, więc muszą one działać natywnie szybko, a ich wywołanie nie powinno mieć więcej narzutu niż wywołanie funkcji C. Za każdym razem, gdy otrzymuję funkcję użytkownika, w formie źródłowej, automatycznie skompiluję ją na plik binarny i będzie ona dynamicznie powiązana z kodem głównym.Czy istnieje język programowania oparty na LLVM, który może zagwarantować szybkie pliki binarne bezpieczne dla piaskownicy?
Te funkcje będą używane tylko jako proste jądra matematyczne, np. w peudo-C:
Function f(double x) ->double {
return x * x;
}
lub z dostępem do tablicy:
Function f(double* ar, int length) ->double {
double sum = 0;
for(i = 0 to length) {
sum = sum + ar[i];
}
return sum;
}
lub z podstawowymi wywołań bibliotecznych matematyki:
Function f(double x) ->double {
return cos(x);
}
Jednak muszą być bezpieczne dla serwera. Jest OK, jeśli zatrzyma (Kompletność Turinga), ale nie wtedy, gdy dostęp proces pamięć, że nie jest ich własnym, jeśli robią System wzywa, jeżeli powodują one przepełnienie stosu lub uogólniać, to niepożądany dla zewnętrznego kod do "być w stanie zhakować kod serwera".
Więc moje pytanie: błądzę, jeśli istnieje bezpieczny język z interfejsem LLVM, (bez wskaźników itp., Z ustalonym sprawdzaniem dla tablic/stosów, izolacja wywołań systemowych), bez kary prędkości (w odniesieniu do przełożonych, śmieciarze), z których mogę korzystać. LLVM nie jest konieczne, ale jest preferowane.
Spojrzałem na Mozillas "Rust", ale nie wydaje się być wystarczająco bezpieczny [rust-dev].
Jeśli nie ma takiego języka, moją opcją zastępczą jest użycie maszyny NodeJS Sandboxed VM.
Uważam, że taki język, jeśli jest prosty, jest możliwy, ale czy istnieje?
Rodzaj języka nie ma znaczenia. Byłby to zabawny język o uproszczonym designie i łatwym do udowodnienia bezpieczeństwie.
EDYCJA: W odniesieniu do wywołań systemowych i szkodliwych zależności, dla dowolnego języka, powinno być łatwe wyizolowanie ich za pomocą zwykłego bash. Po prostu spróbuj utworzyć wyprodukowany plik .bc bez bibliotek. Jeśli się nie powiedzie, plik .bc ma zależności, więc upuść go. Ponieważ LLVM IR są całkowicie nieszkodliwe, jedyną rzeczą, którą powinien zagwarantować język, jest dostęp do pamięci.
Bardzo interesujące pytanie. Może to być nietypowy temat, ponieważ prosi o wskazówki do zasobów zewnętrznych. –
Czy brałeś pod uwagę PNaCl? –
@ 500-InternalServerError Dziękuję za komentarz. Myślę, że byłoby to jednak pouczające i nadal zasada nie jest dokładnie moim przypadkiem, ponieważ pytam o istnienie czegoś, co nie jest zbyt powszechne. – tkiwi