liveperson, java nashorn, remote code execution

LivePerson to popularna platforma oferująca możliwość integracji funkcji typu 'live chat' na swojej stronie internetowej. Oferuje ona również możliwość tworzenia czegoś co nazywane jest 'AI-powered chatbots' czyli botów, które po odpowiednim zaprogramowaniu/ustawieniu będą potrafiły same obsługiwać klientów i odpowiadać na często zadawane pytania - wszystko to może być zbudowane przy pomocy narzędzia, które nazywane jest "Conversation Builder" i jest dostępne z poziomu przeglądarki na serwerach firmy LivePerson.

Dosyć ciekawym rozwiązaniem na którym się skupiłem jest możliwość programowania swojego bota przy pomocy JavaScript z wykorzystaniem specjalnych funkcji. Poniżej przykład wyświetlania tego co użytkownik napisał w oknie czatu do bota.

var response = botContext.getCurrentUserMessage();
botContext.sendImmediateReply('I think you said, ' + response);

Możemy również wykonywać dowolny kod JavaScript typu pętle, instrukcje warunkowe a następnie przekazywać to bezpośrednio do bota i wyświetlać użytkownikowi.

Dowolność wykonywania kodu JavaScript w tym kontekście szczególnie mnie zainteresowała właśnie pod względem bezpieczeństwa takich rozwiązań ponieważ był wykonywany po stronie serwera co teoretycznie stwarzało potencjalne zagrożenie.

Po wykonaniu specjalnego kawałka kodu stwierdziłem, że warto się temu bliżej przyjrzeć..

Widzimy tutaj, że kod JavaScript jest tak naprawdę wykonywany przez maszynę Javy a następnie zwracany jest wynik - czyli taki Java sandbox dla JavaScript.

W tym momencie zacząłem przeszukiwać internet czy istnieje możliwość "wyskoczenia" czy też obejścia takiego zabezpieczenia aby wykonać kod Javy dzięki czemu byłbym w stanie wykonywać polecenia na systemie hosta - jak się okazuje można i nie było to szczególnie skomplikowane ;-)

this.engine.factory.scriptEngine.eval('java.lang.Runtime.getRuntime().exec("whatever")')

Używany był tutaj Nashorn Sandbox który do wersji 0.1.19 posiadał błąd umożliwiający tego typu atak - sandbox escape.

13.05.2020 - zgłoszenie do LivePerson.
14.05.2020 - podziękowanie za zgłoszenie znalezionego błędu.