2015-02-08 12 views
5

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.

+1

Bardzo interesujące pytanie. Może to być nietypowy temat, ponieważ prosi o wskazówki do zasobów zewnętrznych. –

+1

Czy brałeś pod uwagę PNaCl? –

+0

@ 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

Odpowiedz

1

Naprawdę chciałbym dodać komentarz, jednak Stack-Overflow mnie powstrzymuje. Więc dodam to jako odpowiedź. Być może będzie to przydatne.

Możesz spróbować spojrzeć na https://github.com/andoma/vmir. Pracowałem z nią trochę z nadzieją na sandboxing arbitralny kod C++/swift. Myślę, że możliwe byłoby stworzenie "bezpiecznego" tłumacza/JIT.

Możesz kontrolować wszystkie funkcje, które są wywoływane. Możesz kontrolować dostęp do pamięci. Więc ... Zasadniczo myślę (i mam nadzieję), że mogę zmodyfikować JIT i interpreter na tyle, że mogę odrzucić kod, który z natury nie jest bezpieczny, i wprowadzić granice pamięci/ograniczenia funkcji.

Posiadanie oddzielnych procesów ala PNaCL jest oczywistym wyborem dla sandboxingu, ale narzut jest znaczny. Uważam, że sandboxing odbywa się zgodnie z procesem.

+0

To brzmi interesująco, jednak twój README mówi o obciążeniu runtime. Zastanawiam się, czy istnieje, gdzieś, odpowiedź dotycząca bezpieczeństwa osiągnięty przez kompilator (hostowane w domu), a nie przez piaskownicy – tkiwi

+0

@tikwi Zastanawiam się, czy można spojrzeć na java lub C# skompilowany do kodu maszyny. (z niestandardową ścieżką klasy systemowej). Aspekty zbierania śmieci w językach są niefortunne, ale ... – iamacomputer

Powiązane problemy