Najpopularniejszy ( jedyny ? ) sposób na tworzenie aplikacji desktop’owych w JS to Electron. Niestety, wbrew pozorom wrzucenie stworzonej wersji webowej do Electron to nie jest najlepszy pomysł…
Rozmawiamy na temat bezpieczeństwa w Electron. Nasza krótka przygoda z Electron’em zupełnie nas nie zaskoczyła i na szczęście szybko się skończyła.
Zapraszam do wysłuchania nowego odcinka.
Marek Piechut
Witam, panie Bartku.
Bartek Witczak
Witam, panie Marku.
Bartek Witczak
Czyżby znowu był czas, kiedy ty przygotowałeś temat?
Marek Piechut
Tak jest i temat jest bardzo osobisty. Muszę się do czegoś przyznać Bartku! Zgrzeszyłem sromotnie. Mianowicie z powodu braku jakichkolwiek innych właściwie możliwości musiałem użyć electrona.
Bartek Witczak
To będzie ciężka rozmowa.
Marek Piechut
Czuję się z tym paskudnie. Mniej więcej wrażenia są takie jak oczekiwałem.
Bartek Witczak
Tak jak się spodziewaliśmy, mniej więcej i całe szczęście, że ten projekt umarł w bardzo wczesnej fazie, więc nie musiałeś długo znosić katuszy.
Marek Piechut
Tak, ale musiałem użyć elektrona dlatego, że musieliśmy wspierać na desktopie wszystkie trzy popularne platformy świata, czyli Linux, Windows i MacOS. No i poza elektronem właściwie chyba tylko QT jest jedynym takim frameworkiem, który jest w miare wspierany i działa dobrze i jest popularny i można nim pisać na wszystkie trzy platformy. No i niestety tak się skończyło. Bardzo chciałem użyć react native, ale okazało się, że Linux niet i musiałem użyć elektrona. Temat tej rozmowy nie będzie tak do końca związany stricte z elektronem, elektronem i tym co my tam o nim myślimy i tak dalej. Tylko, po tym jak zacząłem pracę z tym elektronem okazało się, że jeżeli piszesz aplikacje desktopową to wcześniej czy później będziesz potrzebował dostępu do jakichś zasobów systemu operacyjnego. No chyba, że Twoja aplikacja jest po prostu stroną internetową, ale to wtedy nie bardzo ma po co być aplikacją. W naszym przypadku było tak, że była potrzeba dostępu do portów USB. Chcieliśmy programować programowalne klawiatury przez przez USB. No i tam oczywiście zapis na dysku i tym podobne rzeczy. No i co się okazało? Okazało się tak, że po pierwsze Elektron od paru wersji robi boundry pomiędzy tą warstwą systemową a warstwą tej aplikacji, prezentacji, czyli calle systemowe w stylu dostęp do dysku itd. Nie mogą być bezpośrednio wykonywane ze strony, czy z JS w stronie i dziękujemy im za to. Bardziej mnie zastanawia, dlaczego robi to dopiero od paru wersji.
Bartek Witczak
Jednym słowem wcześniej było jeszcze gorzej.
Marek Piechut
Wcześniej po prostu można było wszystko i równocześnie jednym tchem, jak wcześniej można było wszystko, na tej samej stronie były próbki kodu i przykłady pokazane jak ładować swoją stronę, swoją aplikację, zdalnie, jak mieć ładowanie kodu tej aplikacji zdalnie przez net. Czyli ładujemy sobie po prostu źródło w JS całej aplikacji gdzieś tam z zewnątrz robimy po http, ładujemy aplikację i tak dalej. I ta sama aplikacja równocześnie ma dostęp nieograniczony do maszyny użytkownika. I to dopiero się zmieniło niedawno. I co ciekawe, to się zmieniło i chwała im za to, ale gdziekolwiek zaczynasz szukać informacji na temat tego jak działać pomiędzy tą aplikacją webową, nie oszukujmy się, to jest aplikacja webowa, która robi UI, a system operacyjny to pierwszy, drugi, trzeci, czwarty przykład to jest przykład, który z powrotem włącza ten brak zabezpieczeń pomiędzy warstwą jedna i drugą, czyli całkowicie otwiera dostęp do natywnych API stronie internetowej, którą ładujemy. I to mocno mnie uderzyło, coś takiego, że w ogóle można jednym tchem dawać komuś dostęp do systemu plików, do urządzeń itd. i na tej samej stronie mówić że on sobie może swoją aplikację załadować z netu. Jak w ogóle można dawać ludziom, ludziom coś takiego? To mnie właśnie też bardzo tak zastanowiło nad tematem: czy w związku z tym, że teraz jest ten React native na desktopie, electron jest od jakiegoś czasu i po prostu frontendowi developerzy zaczynają pisać aplikacje desktopowe. Czy oni w ogóle są przygotowani na jakieś takie, wiesz czy mają jakieś elementarne podstawy w ogóle bezpieczeństwa takich systemów?
Bartek Witczak
Zobacz, że tutaj jest podobny element do samego React native. Najpierw jak pamiętam zaczynaliśmy pisać webowe, nie webowe tylko mobilne aplikacje przy użyciu React native i tam jakby bardzo dużo patternów jest takich zabranych z tego web’a, tak w stylu Reduks’y, takie rzeczy, które do końca nie mają sensu na tych urządzeniach takich końcowych, w stylu telefon, w stylu tablet, takie rzeczy. Zupełnie nie ma tej świadomości. Pytanie, czy ona jakby jest potrzebna, albo w ogóle, kiedy jest potrzebna, że tak naprawdę ten telefon to jest urządzenie, czy desktop, takie, które mogłyby działać offline. I tam troszkę rzeczy lokalne rozwiązuje się trochę w inny sposób, niż to się rozwiązuje na Web’ie
Marek Piechut
No tak, bo to są te rzeczy właśnie wiesz w stylu, że jak już jesteś na telefonie, no to właśnie masz ten system plików, masz bazę danych, która jest tam SQ light’em we wszystkich chyba telefonach świata, więc ona jest in memory, dostęp do niej jest bardzo szybki, za darmo bo to jest proces, dostęp, tam nie ma żadnej komunikacji sieciowej itd. A tych trzymasz jak świr w reduksie 500 mega jase’onów.
Bartek Witczak
No i wiesz, że to jest jakby w jakimś sensie pokłosie tego, że wszyscy opowiadają, że pisanie tych aplikacji, powiedzmy natywnych, czyli aplikacji mobilnych czy tych aplikacji desktopowych to jest to samo co pisanie tych aplikacji webowych.
Marek Piechut
No tak, ale wracając, kierując się bardziej w stronę tego mojego problemu bezpieczeństwa typowo, bo to wydaje mi się, bo to też nie każdy może ma tego właśnie świadomość, i też chodzi o to trochę w moim pytaniu. Czy deweloperzy webowi mają tego świadomość, że do tej pory wszystko chroniło ich przed wszelkimi problemami bezpieczeństwa, to znaczy zarówno aplikacje webowe, przeglądarka tworzy sandbox, tam nie masz możliwości dostępu do systemu itd. Jak cokolwiek miałoby jakąkolwiek możliwość włączyć kamerę to wyskoczy Ci: popatrz, na pewno się zgadzasz it. Jest izolacja pamięci między tabami, więc te taby między sobą nawet nie mogą gadać itd. Wszystko jest rozwiązane. Jak weźmiemy sobie iPhona to też na Androidzie też nie masz możliwości za dużo napsuć. Piszesz sobie tę aplikację ona Jak działa sandbox. Dobra na Androidzie.
Bartek Witczak
To już nie przesadzaj. Na Androidzie to możesz zajrzeć tam w trzewia.
Marek Piechut
Ale teoria jest taka, że masz ten sandbox i jeżeli coś zepsujesz w kodzie aplikacji to na zepsujesz tej aplikacji nie masz szans raczej haseł użytkownika wykraść, coś takiego zrobić. Taka jest teoria. Teraz trafiamy w świat desktopa, gdzie tych wszystkich sandbox ów nie ma. One powstały dużo później. Ktoś mówi Ci, że Ty masz robić remote code exsecution bez żadnych ograniczeń, które mają wjazd do całego systemu plików użytkownika. No i można wymyśleć 10 000 różnych ataków bardzo zabawnych, którymi przejmujesz całkowitą kontrolę nad tym komputerem. Nie tam, wiesz, man-in-the-middle, ukraść domenę itd. Proste nawet rzeczy. W stylu, że kradniesz domenę i wiesz możesz komuś podkraść, DNS itd. I na tym DNS przemapowanie na swoją domenę i teraz nagle…
Bartek Witczak
Dobra, ale to Ty w ogóle mówisz o takich bardzo złożonych elementach w sensie takim, że jakby ta aplikacja jest napisana powiedzmy, że z dobrymi zamiarami, tak i te ataki są przez osoby trzecie.
Marek Piechut
Ja nie mówię o tym, że ktoś studenta do firmy puścił i student coś tam wrzucił.
Bartek Witczak
No dobra, ale zobacz, że jest jeszcze cała ta kwestia odnośnie pakietów, które są na NPM. Ty instalujesz pakiety, nie wiesz co one robią i jakby teraz nagle zaczyna się zabawa na urządzeniu.
Marek Piechut
Ale wiesz, ja mówię nawet o takich rzeczach, gdzie jeżeli zakładamy, że ja robię “remote code execution” bez sandbox-a żadnego, bez niczego. I on ma wjazd do systemu plików. I teraz ja jestem w stanie podszywać się pod te domeny i tak dalej, i tym podobne rzeczy. Praktycznie mam nieograniczone możliwości zrobienia komuś bardzo złego dnia, pokasować wszystkie pliki na dysku. Cuda, cuda. To pokazywane jako wielka zaleta elektroda, że Ty możesz właśnie ten zdalny kod ładować itd.
Bartek Witczak
No ale mnie się wydaje, że to jest kwintesencja tego, że teraz ma być szybko i teraz nie trzeba jakby się niczego uczyć, tylko po prostu będziemy to samo mogli robić na wielu platformach i w każdej przestrzeni. Tak? Czyli to jest wielka zaleta, bo ty możesz wziąć tego elektrona i tak naprawdę nie interesuj się tym, jakie rzeczy możesz tam popsuć czy cokolwiek. Tylko zobacz, że możesz uruchomić teraz swoją stronę. Tam możesz ten kod, który już raz napisałeś, więc teraz możesz go wykorzystać i teraz możesz robić wszystko, także będziesz miał aplikację desktopową.
Marek Piechut
Bardziej mi chodzi o to, że ja rozumiem use case takich rzeczy itd. Tylko bardziej bym oczekiwał, że ludzie, którzy tworzą narzędzia, tworzą tego elektrona itd. Że oni trochę więcej namysłó włożą w to wszystko, bo dla mnie te rzeczy, że ty odpalasz zdalny kod, to one powinny być za tysiącem jakichś dźwigni, które ty na pewno musisz, wiesz, 5 razy potwierdzić, że tak na pewno będę ładował kod zdalnie, jestem pewny i tam wiesz, rozumiem konsekwencje itd. A tam po prostu jest: a stronę z tego URL, o fajnie, zobacz nie muszę teraz już wiesz, nie będziemy musieli robić update przez AppStore.
Bartek Witczak
Chyba sam nie wierzysz w to co mówisz, bo chyba sam wiesz jak wygląda to całe środowisko. I jakby to nie jest, według mnie, ten etap, chociaż i tak jak mówimy już teraz jest lepiej.
Marek Piechut
Teraz trochę lepiej, bo tam jest jakaś warstwa izolacji. Tylko mówię jakby pierwsze przykłady, które znajdujesz, jak wykonywać coś przez tą warstwę izolacji, to są stylu, to udostępni wszystko. A no, świetny pomysł.
Bartek Witczak
Ja nie jestem zdziwiony specjalnie tym. Ty pewnie też nie jesteś.
Marek Piechut
No nie jestem. Myślę o tych rzeczach, że chyba elektron też nie jest nowym pomysłem wcale. Wcześniej był ten seater, tam, tam było kilka takich takich podejść, robienia aplikacji w ten sposób. Nawet Firefox w sumie był takim framework’iem do robienia aplikacji. Tam robiło się UI w tym XUL-u i pisało się w JS KOD itd. Były desktopowe aplikacje napisane na Firefoksie, ale nigdzie tam też nie było tego, że ty odpalać ten kod z zewnątrz. To było wiesz na zasadzie, że ty pakowałeś tą aplikację, aplikacja faktycznie była zapakowana, ten kod był wgrzany w środek i to nigdy tam nie uderzało gdzieś do sieci.
Bartek Witczak
No dobra. No to jaki jest jakikolwiek inny racjonalny powód, dlaczego te rzeczy są robione, poza tym żeby było szybko?
Marek Piechut
No nie wiem, szczerze mówiąc. Znaczy szczerze mówiąc, nie widzę bardzo powodu innego, niż: nie lubimy review w apple.
Bartek Witczak
No właśnie. Ale nawet nie, bo według mnie to nie jest do końca to, że nie lubimy review Apple, tylko to jest bardziej akcja w stylu: no dobra, my tą aplikację mamy napisaną już webowo. No to teraz po prostu odpalimy u nas lokalnie i nazwiemy to aplikacja desktopowa.
Marek Piechut
No tak, tylko bardziej mi chodzi o to, że wtedy byłoby warto zbundlować tą aplikacje webową.
Bartek Witczak
No tak, ale jak jej nie zbundlujesz to masz jeszcze mniej pracy i jeszcze możesz ominąć wiele rzeczy plus możesz ominąć aktualizacje przez użytkowników plus możesz powiedzieć, że słuchajcie, my teraz możemy dostarczać po prostu continue delivery, bo ludzie będą ściągali te rzeczy.
Marek Piechut
Możesz. A potem może skończyć tak, jak taki portal, jakaś alternatywa dla Vimeo kiedyś, która pozwalała hostować własne wideo i on tam po kilku latach upadł, potem domena gdzieś tam komuś wygasła i ktoś ją kupił i zrobił tam stronę z filmami dla dorosłych i wszystkie “embedowane” video, z tego zamieniły się w filmy dla dorosłych. Takie rzeczy się dzieją. To wcale nie jest takie pewne, że jak dzisiaj odpalasz aplikacje i nawet autor wiesz, zadba o te wszystkie rzeczy itd. ale ładuję kod zdalnie, to, że jutro tam nie będzie jakiegoś wesołego wiesz psikusa i nawet nie z winy jakichś złośliwych rzeczy, tylko właśnie takich, że ktoś kiedyś przejmie np. domenę po jakimś upadłym startupie itd.
Bartek Witczak
Tak, tylko po prostu ja uważam, że w jakimś sensie popularność elektrona i tego, że dużo aplikacji desktopowych jest pisane w elektronie bierze się właśnie z takich rzeczy. Że my możemy bardzo szybko, prawie bez żadnego kosztu zrobić aplikacji webowych, aplikacje desktopowe, nie będziemy musieli tego szczególnie zmieniać. Jeszcze jak będziemy wydawali te aktualizacje na web, to nasza aplikacja desktopowa też się aktualizuje.
Marek Piechut
Tak, automatycznie.
Bartek Witczak
I tu się pojawią problemy po prostu, że jak to się stanie pewnie na tyle popularne, że komuś się będzie chciało nagle: no dobra, to schylmy się, zróbmy tam jakiś atak i zobaczymy czy coś z tego będziemy mogli ugrać.
Marek Piechut
No tak, to jakby szanse są duże. Są ludzie, którzy próbują takie rzeczy robić. Także ja chciałbym zwrócić uwagę też wszystkim, którzy piszą aplikacje webowe.
Bartek Witczak
Tak, że sandbox to jest mimo wszystko bardzo duża ochrona i to daje bardzo dużo tych rzeczy, które przeglądarka ma w sobie. Czy to Cookies, czy jakieś takie rzeczy. One są w pewien sposób zaprojektowane i one dają dosyć dużo takiej ochrony już bez żadnego myślenia na około.
Marek Piechut
Tak, to, że przeglądarka cię ogranicza w tym, co możesz robić, to jest bardzo duża zaleta. Dla ciebie, że ty nie będziesz w stanie łatwo, chcąco, bądź niechcący wysadzić komuś komputera w powietrze, ukraść mu dostępu do kont itd. Jakby, ktoś wykonał za ciebie tę pracę, że zamknął ci te różne drogi. No i warto o tym myśleć pisząc aplikacje desktopowe, gdzie właśnie w desktopie ten świat jest zupełnie odwrotny. Znaczy wiesz, na mobilce jeszcze jesteś zabezpieczony, ale w desktopie już robisz co chcesz.
Bartek Witczak
Dokładnie. I tutaj jakby w 100% się z Tobą zgadzam, że to odpowiedzialność raczej powinna leżeć po stronie electrona i dlatego w jakimś sensie lubimy iOS’a, że tamten soundbox jest naprawdę dobry i tam jest dosyć trudno wyrządzić komuś krzywdę, jak się bardzo nie postarasz, tak. Dodatkowo review i inne takie rzeczy sprawiają, że ta platforma jest bezpieczna, ale nie bezpieczna jakby dla nas, tylko bezpieczna dla tego końcowego użytkownika.
Marek Piechut
I to jest nie do końca możliwe niestety na Macu, szczególnie, że bardzo wiele aplikacji omija App Store, co też rozumiem, bo ten App Store nie jest jakimś tam panaceum na wszystko i koszty ma ogromne. Ale to, że ściągasz aplikacje poza App Store sprawia, że one już nie są soundbox’owane w żaden sposób.
Bartek Witczak
Dokładnie. No dobra, no to taki krótki odcinek, trochę na temat świadomości tego wszystkiego, jak to wygląda, jak to może wyglądać i po prostu na co warto zwrócić uwagę.
Marek Piechut
Tak, bo na desktopie nie do końca jest tak, jak w przeglądarce.
Bartek Witczak
No a konsekwencje, są dosyć duże.