Jak programować z AI i nie narazić się na problemy? (film, 14m)
W najnowszym odcinku Kacpra Szurka, prowadzącego kanał poświęcony bezpieczeństwu w programowaniu, poruszony jest temat potencjalnych zagrożeń wynikających z używania edytorów kodu, a zwłaszcza narzędzia Cursor. Kacper zwraca uwagę na fakt, że mimo iż edytory te ułatwiają generowanie kodu oraz wykonywanie różnych komend, to w przypadku automatycznego uruchamiania poleceń, użytkownik może nieświadomie stracić ważne pliki. Odcinek startuje od wytłumaczenia, jak działa Cursor, który potrafi generować nie tylko komendy, ale także je wykonuje, co budzi wątpliwości natury bezpieczeństwa.
Kacper informuje, że w standardowym ustawieniu edytor prosi użytkownika o potwierdzenie przed wykonaniem każdej komendy, co teoretycznie powinno zapewnić pewną ochronę przed nieautoryzowanym działaniem. Jednak po włączeniu tzw. YOLO mode, polecenia są wykonywane automatycznie, co zwiększa ryzyko dla użytkowników. Dodatkowo Kacper tłumaczy zjawisko prompt injection, które polega na wstrzyknięciu dodatkowych instrukcji. Taki atak mógłby prowadzić do sytuacji, w której komenda usuwająca pliki zostałaby wykonana zamiast zamierzonej komendy.
Kacper zwraca uwagę na bezpieczeństwo używanych reguł i ich treści, podkreślając, że zanim zaczniemy z nich korzystać, należy dokładnie sprawdzić, co one zawierają. W odcinku przedstawia przykłady, jak złośliwe reguły mogą wpłynąć na nasz projekt. Zostało to zilustrowane przykładem z plikiem .env, który zawiera zmienne środowiskowe. Kacper zwraca uwagę, że w przypadku, kiedy aktywowany jest YOLO mode, komendy są realizowane bez naszej zgody, co czyni całą sytuację jeszcze bardziej niebezpieczną.
Podczas dalszej części odcinka Kacper wprowadza widzów w zagadnienie mechanizmów zabezpieczeń, jakie oferuje edytor Cursor. Użytkownik ma możliwość ochrony przed usuwaniem plików, gdzie każda taka komenda wymaga potwierdzenia. Kacper podaje również przykład udanej detekcji złośliwych komend, które mimo wysiłku udanemu kodowania głęboko złośliwej komendy, zostały przez edytor zablokowane. Mimo to, Kacper przestrzega przed tym, że nie wszystkie mechanizmy zabezpieczeń są niezawodne i zwraca uwagę na ryzyko związane z szyfrowaniem komend.
Na zakończenie odcinka Kacper podsumowuje, że bezpieczeństwo w programowaniu to kompleksowy proces. Zaleca, by początkujący programiści zapoznali się z podstawami i użyli maszyn wirtualnych, aby minimalizować ryzyko usunięcia ważnych danych. Warto również zwrócić uwagę na planowanie kosztów korzystania z usług chmurowych oraz możliwości zabezpieczeń, takich jak twarde limity. Na koniec Kacper zachęca do dzielenia się swoimi doświadczeniami w programowaniu z wykorzystaniem AI oraz do korzystania z jego płatnego kursu na temat bezpieczeństwa w kontaktach z aplikacjami webowymi. Odcinek zgromadził 9797 wyświetleń oraz 394 polubienia, co pokazuje jego rosnące zainteresowanie wśród widzów, w chwili pisania tego artykułu.
Toggle timeline summary
-
Wprowadzenie dotyczące korzystania z edytora kodu i ryzyk związanych z usuwaniem plików bez zgody.
-
Omówienie edytora Cursor i jego zdolności do generowania kodu oraz wspierania użytkowników.
-
Obawy dotyczące bezpieczeństwa związane z automatycznym wykonywaniem poleceń w edytorze Cursor.
-
Wprowadzenie trybu YOLO w edytorze Cursor do automatycznego wykonywania poleceń.
-
Wyjaśnienie wstrzykiwania promptów, ilustrujące potencjalne ryzyko bezpieczeństwa.
-
Znaczenie weryfikacji zewnętrznych reguł używanych w edytorach kodu.
-
Ilustracja, jak pliki `.env` mogą być ujawnione przez niewłaściwe wykonywanie poleceń.
-
Funkcje ochronne Cursor przed usuwaniem plików i złośliwymi poleceniami.
-
Omówienie ograniczeń zabezpieczeń Cursor wobec zaawansowanych zagrożeń.
-
Znaczenie systemów kontroli wersji w programowaniu dla ochrony projektów.
-
Użycie zaufanej listy poleceń w celu zwiększenia bezpieczeństwa podczas kodowania.
-
Podkreślenie potencjalnych luk w opcjach poleceń, które omijają zabezpieczenia.
-
Ryzyko związane z używaniem menedżerów pakietów i wykonywaniem skryptów podczas instalacji.
-
Omówienie możliwości 'halucynacji' AI prowadzących do niebezpiecznych sugestii dotyczących pakietów.
-
Badanie serwerów MCP i ich roli w rozszerzaniu możliwości modeli AI.
-
Demonstracja, w jaki sposób kalkulator BMI wykorzystuje narzędzia zewnętrzne do działania.
-
Ryzyka związane z ujawnionymi kluczami API w aplikacjach.
-
Porady dotyczące wprowadzania limitów wydatków przy korzystaniu z usług w chmurze.
-
Zalety korzystania z VPS w celu przewidywalnego zarządzania kosztami w hostingu internetowym.
-
Zachęta do zaangażowania publiczności w kwestii wykorzystania AI w kodowaniu.
-
Zaproszenie do nauki więcej o bezpiecznym rozwijaniu aplikacji internetowych poprzez kurs.
Transcription
Wyobraź sobie, że edytor kodu usuwa ważne pliki z twojego dysku i robi to bez twojej zgody. Jak to możliwe? Jak się przed tym ochronić? O tym opowiem w tym odcinku. Zaczniemy od edytora Cursor, który jest popularnym wyborem wśród osób, które chcą rozpocząć swoją przygodę z programowaniem. Nie tylko generuje kod, ale może także pomóc z popularnymi problemami użytkowników terminala. Zamiast używać wyszukiwarki, możesz poprosić go o wygenerowanie komendy. Tak jak tutaj, gdzie chciałem zobaczyć proces, który używa najwięcej RAMu. Cursor nie tylko przygotował odpowiednią komendę, ale także ją wykonał w moim systemie operacyjnym, a potem zinterpretował wyniki. Z perspektywy bezpieczeństwa, automatyczne wykonywanie komend może być niebezpieczne. Dlatego w standardowej konfiguracji edytor przed wykonaniem komendy prosi użytkownika o jej potwierdzenie. Tak jak tutaj, gdzie stworzenie nowego katalogu wymagało kliknięcia w przycisk. Kilka miesięcy temu firma wprowadziła tryb YOLO mode, zwany również trybem autorun. Znajdziesz go w ustawieniach edytora. Po jego włączeniu komendy są wykonywane automatycznie i nie muszą już być potwierdzane. Jeśli chcesz używać tego trybu, to warto wiedzieć jak działa prompt injection, czyli wstrzyknięcie dodatkowej instrukcji, która może wpłynąć na generowaną odpowiedź. Prosty przykład. Prosisz o stworzenie katalogu, ale wstrzyknięta instrukcja sprawia, że model zignoruje Twoją prośbę i w zamian wygeneruje komendę, która usuwa pliki. Taka sytuacja jest teoretycznie możliwa, bo edytor można dostosować do swoich wymagań wykorzystując specjalne reguły. W internecie jest wiele reguł, które dostosowują działanie narzędzia do różnych popularnych języków programowania. Jednak zanim ich użyjesz, warto sprawdzić ich treść. To ważne, bo reguła może zawierać złosiwe elementy. Na ekranie widzisz teraz przykład takiej hipotetycznej reguły. Teraz każda konwersacja jest kończona wyrazem kanapka. Przekonałem więc czat do wyświetlenia dodatkowego wyrazu, który nie jest powiązany z moją prośbą. Reguły są zazwyczaj długie i mogą zawierać wiele liniek tekstu. Ukrycie dodatkowego zdania, które może mieć wpływ tylko na niektóre Twoje czynności wcale nie jest takie trudne. Tutaj przykład, jak przy pomocy reguły można wykraść potencjalnie tajne dane. Plik .env zawiera zmienne środowiskowe. To popularny sposób na przechowywanie różnych sekretów i kluczy API. Proszę więc edytor, aby sprawdził, czy dany projekt zawiera taki plik. A następnie generuje komendę, która go wysyła do kontrolowanego przeze mnie serwera. Efekt? Wszystko działa tak jak dawniej, z jednym małym szczegółem. Na końcu kursor sprawdza, czy w projekcie istnieje odpowiedni plik, a następnie wysyła go do mojego serwera. Jeżeli użytkownik ma włączony tryb YOLO, to wszystko wykona się automatycznie bez jego zgody. Widzisz więc, jak ważne jest, aby sprawdzić z jakich reguł korzystamy. Kursor zawiera pewne zabezpieczenia, które moim zdaniem warto włączyć. Pierwsze z nich to ochrona przed usuwaniem plików. Teraz komendy, które usuwają pliki, wymagają naszego potwierdzenia. Gdy poprosiłem o usunięcie konkretnego pliku, kursor wykrył o jaki plik mi chodzi, ale zanim go usunął, poprosił mnie o akceptację. Co ciekawe, edytor posiada wbudowane zabezpieczanie, które chroni przed potencjalnie niebezpiecznymi komendami. Działa ono zaskakując dobrze. Tutaj próbowałem oszukać mechanizm, kodując złośliwą komendę algorytmem base64. Pomimo tego kursor wykrył, że w tej komendzie znajduje się instrukcja RM, która jest niebezpieczna i zablokował taką akcję. Pamiętaj jednak, że to nie jest idealne zabezpieczenie. W tym wypadku, aby ją ominąć, wystarczyło użyć szyfrowania. Losowy klucz sprawił, że czat już nie wie, co jest w środku, więc pozwolił na wykonanie komendy, która usuwała pliki, pomimo tego, że włączone było zabezpieczenie, bo nie potrafił wykryć, że ta komenda usuwa dane. Jeżeli dopiero rozpoczynasz swoją przygodę z programowaniem, warto zapoznać się z koncepcją systemów kontroli wersji. W ten sposób możesz zapisać historię zmian w swoim projekcie i jeśli przestanie on działać, zawsze możesz wrócić bezpiecznie do poprzedniej wersji. Druga opcja, która moim zdaniem jest warta uwagi, to lista zaufanych komend. Zazwyczaj podczas programowania wykorzystujemy kilka popularnych narzędzi, takich jak npm czy git. Możemy więc pozwolić, aby agent wykonywał te komendy bez naszej zgody. Dzięki temu komendy, które uznaliśmy zabezpieczne, wykonują się bez naszej akceptacji. Jednak to kanał o bezpieczeństwie, dlatego pokażę Ci, jak czasami można obejść to zabezpieczenie. Komendy zazwyczaj posiadają opcje, które modyfikują ich działanie. Czasami przyłączniki te można wykorzystać w inny sposób niż przewidział to autor programu. Przykładem może być polecenie git grep. Komenda ta pozwala na poszukiwanie informacji w repozytorium na podstawie wyrażenia regularnego. Użyłem tutaj prostego wyrażenia, które poszukuje cyfr. To dlatego wyświetliły się tylko te linijki, które zawierają cyfry. Ale git grep może zwrócić wiele wyników i ich przeglądanie w terminalu niekoniecznie jest wygodne. Dlatego twórcy stworzyli opcję, która pozwala ustawić dodatkowy program, w którym mają się wyświetlić pasujące pliki. Może to być np. edytor tekstu, tak jak w przykładzie na ekranie. Ten mechanizm jednak możemy użyć do wykonania dowolnej komendy. Git nie sprawdza jaką wartość podaliśmy w przyłączniku. Możemy tutaj podać cokolwiek. Mechanizm ten można więc wykorzystać do ominięcia zabezpieczeń. W przykładzie wykona się nie tylko komenda git grep, ale też komenda huemai. Ale ta komenda wykona się tylko, jeśli git grep znajdzie choć jeden wynik. Dlatego jako wyrażenie regularne używam tutaj kropki. Oznacza ona znajdź jeden dowolny znak. To wyrażenie pasuje do dowolnego pliku, co sprawia, że moja komenda na pewno się wykona. Zobacz, jak taki hipotetyczny atak wygląda w praktyce. W ustawieniach jako dozwolona komenda widnieje tylko wartość git. Jednak kursor wykonał komendę pwd bez pytania mnie o zgodę. Dlaczego? Bo z jego perspektywy wykonywał komendę git grep, a to mógł wykonać bez zgody użytkownika. Git to nie jedyny sposób, w jakim można uruchomić kod na twoim komputerze. Inny przykład to menadżery paczek. Komenda npm install nie tylko kopiuje pliki, ale także standardowo wykonuje tzw. skrypty. Autor paczki może ustalić dowolny kod, który ma się wykonać na przykład po zainstalowaniu danej biblioteki. W uproszczeniu więc npm install może uruchomić dowolną komendę zdefiniowaną w pliku package.json. To często metoda wykorzystywana przez twórców złośliwych paczek, którzy tworzą wiele paczek, które podszywają się pod popularne biblioteki. Ale ich nazwa różni się na przykład tylko jedną literką. Wspominam o tym, bo sztuczna inteligencja czasami halucynuje. Może więc przez przypadek podać ci nazwę biblioteki, która nie istnieje albo co gorsza biblioteki, która jest złośliwa. Tutaj pomóc mogą specjalne strony, które specjalizują się w analizowaniu zależności, tak jak ta, którą widzisz teraz na ekranie. Innym sposobem na ograniczenie ryzyka takiego ataku jest globalne wyłączenie instalacji skryptów. Wtedy pliki nadal się kopiują, ale skrypty nie są już wykonywane. Jednak to nie jest opcja dla każdego, bo wtedy niektóre biblioteki po prostu przestaną działać. W ostatnim czasie coraz więcej mówi się także o serwerach MCP. To dodatkowe serwery, w których trzeba skonfigurować ustawienia. Dzięki nim modele mają teraz dostęp do zewnętrznych źródeł i narzędzi. Mogą więc wykonywać bardziej zaawansowane operacje. Pokażę ci to na podstawie prostego kalkulatora BMI. Mam tutaj dodany serwer, który udostępnia narzędzie, które liczy właśnie BMI. Teraz zadając pytanie o wskaźnik masy ciała, kursor sprawdzi, czy nie posiada jakieś narzędzi, które mogłyby mu pomóc w tym problemie. Prawidłowo wykrył, że może połączyć się z narzędziem, które służy właśnie do tego celu. Przekazał więc wagę oraz wzrost, wykorzystując odpowiednie parametry, a następnie przeanalizował wynik, który narzędzie zwróciło. Obecnie pojawia się coraz więcej narzędzi, które pozwalają na korzystanie z popularnych usług. Bez problemu znajdziesz serwer, który pozwala połączyć się z twoją pocztą i automatycznie pobrać ostatnie wiadomości e-mail. Albo serwer, który potrafi połączyć się z twoją bazą danych, co umożliwia bezpośrednie wykonywanie zapytań z poziomu czatu. To tylko kwestia czasu, aż pojawią się złośliwe serwery, które będą kradły te dane. Skoro narzędzie ma mieć dostęp do twoich informacji, no to musisz mu przekazać klucz API, który to umożliwia. Jeśli ktoś pozna taki klucz, może zrobić wszystko, na co on pozwala. Czyli na przykład przeczytać twoje maile. Warto o tym pamiętać, jeśli decydujemy się na wykorzystanie małopopularnego serwera, który ma zarządzać ważnymi dla nas danymi. Warto też pamiętać, że jeden serwer może udostępniać wiele narzędzi, a te mogą wpływać na niektóre nasze zapytania. Spróbuję ci to pokazać na przykładzie. Stworzyłem prosty serwer, który posiada narzędzie sugerujące nazwę paczki do instalacji na podstawie opisu użytkownika. Teraz, gdy zapytałem o paczki powiązane z błędami kurs, kursor wykrył, że ma dostęp do narzędzia, które może mu pomóc z tym pytaniem. Wywołał więc moje narzędzie, które w odpowiedzi zwróciło mu listę paczek. Ale ponieważ to symulacja złośliwego serwera, część z tych paczek jest złośliwa. Tak oto złośliwe narzędzie podpowiedziało złośliwą paczkę kurs minus typescript. Teraz już wiesz, dlaczego w opcjach istnieje dodatkowa funkcja blokująca automatyczne łączenie się z takimi narzędziami. Jest tylko kwestią czasu, jak zaczną się pojawiać takie złośliwe serwery, a to tylko jeden z wielu sposobów, w którym możesz korzystać. Ten film nie ma Cię zniechęcić do programowania z użyciem AI. Wręcz przeciwnie, zachęcam do eksperymentowania. Ale warto zadbać o swoje bezpieczeństwo, zwłaszcza jeżeli dopiero się uczymy. Jednym z rozwiązań jest użycie maszyn wirtualnych. Istnieje kilka programów na rynku, np. VMware Workstation lub VirtualBox. W dużym skrócie maszyna wirtualna to taki komputer w Twoim komputerze, z osobnym wirtualnym dyskiem twardym, który rozwiązuje wiele problemów. Przez przypadek usuniesz niewłaściwy plik? Nic się nie stało. Twój główny komputer dalej działa i wszystkie pliki są bezpieczne. Uruchomisz jakąś złośliwą paczkę? Nie ma ona dostępu do zdjęć, które przechowujesz na swoim komputerze, oczywiście zakładając prawidłową konfigurację. Ale to nie wszystko, bo maszyny posiadają też opcję migawek. W dowolnym momencie możesz zapisać stan uruchomionego komputera. Zapiszą się wtedy wszystkie pliki i uruchomione programy. Jeśli coś pójdzie nie po Twojej myśli, to zawsze możesz wrócić do zapisanego wcześniej snapshota. Jakieś pliki przez przypadek zostały usunięte? No to mogą się pojawić ponownie. A Ty wrócisz dokładnie do tego samego stanu, w którym zrobiono taką migawkę. W ten sposób minimalizujesz ryzyko, że sztuczna inteligencja przez przypadek wykona jakąś komendę, której nie da się łatwo cofnąć. Ale stworzenie projektu to dopiero początek. Pewno chcesz się nim pokonać, ale nie możesz. Pamiętaj, że to Ty jesteś odpowiedzialny, odpowiedzialna za jego bezpieczeństwo. Niestety nie jestem Ci w stanie podać prostej instrukcji, jak zabezpieczyć swoją aplikację przed atakami. Bezpieczeństwo to skomplikowany proces, ale na pewno warto zainteresować się podstawami. Na przykład tym, jak bezpiecznie przechowywać sekrety. Niektóre błędy mogą mieć poważniejsze konsekwencje. Użycie sztucznej inteligencji gwarantuje uzyskanie bezpiecznego kodu. Oczywiście możesz poprosić o analizę kodu pod względem bezpieczeństwa i dobrych praktyk, ale koniec końców to od Ciebie zależy, czy ten kod będzie bezpieczny. W przypadku hobbystycznych projektów Twoim głównym zmartwieniem może być drenaż Twojego portfela. Problem ten może się pojawić zwłaszcza, jeśli zamierzasz skorzystać z usług chmurowych, do których podpinasz swoją kartę płatniczą. Takie usługi mają wiele zalet. Między innymi dobrze się skalują, mogą dostosować się nawet do dużego ruchu na stronie. Jednak z perspektywy początkującej osoby to nie do końca dobre, bo to Ty płacisz za wszystkie wykorzystane zasoby. Ktoś może Ci zrobić psikusę i wyśle miliony żądeń do Twojej małej strony, a rachunek przyjdzie do Ciebie. Sytuacja robi się jeszcze gorsza, jeżeli komuś uda się wykraść klucze API, które wykorzystujesz w swojej aplikacji. Pozna Twój klucz do usług AWS? W zależności od konfiguracji możesz spróbować za jego pomocą uruchomić np. drogie serwery, za które to Ty zapłacisz. Dlatego ważne jest, aby chronić swój portfel. Zanim podepniesz swoją kartę, to sprawdź, czy usługa, z której zamierzasz skorzystać, posiada opcje tzw. twardych limitów. W takim wypadku, po przekroczeniu ustalonej przez Ciebie kwoty, usługa po prostu przestanie działać. To zdecydowanie lepsze rozwiązanie, niż wysoki rachunek za nieoczekiwanie wysokie złożycie. Innym sposobem może też być używanie zwykłych serwerów VPS, gdzie płacisz stałą, miesięczną opłatę za określone zasoby, czyli RAM, procesor i dysk. Tutaj nie ma automatycznego skalowania, więc koszty są stałe. Zwróć jednak uwagę, ile transferu otrzymujesz miesięcznie w ramach swojej płatności. Niektóre firmy po przekroczeniu określonej w umowie wartości mogą naliczać Ci dodatkowe opłaty za każdy dodatkowy gigabajt. Napisz w komentarzu, czy używasz AI do tworzenia swojego kodu. A jeśli chcesz dowiedzieć się więcej na temat bezpiecznego tworzenia aplikacji webowych, sprawdź mój płatny kurs Bezpieczny Programista. Interesujesz się bezpieczeństwem? Masz jakieś pytania? Dołącz do naszego kanału na Discordzie.