How to Program with AI and Avoid Problems? (film, 14m)
In the latest episode of Kacper Szurek's channel, dedicated to programming security, the focus is on the potential dangers of using code editors, specifically the Cursor tool. Kacper highlights that while these editors facilitate code generation and command execution, users risk losing important files inadvertently if commands are executed automatically. The episode begins by explaining how Cursor not only generates commands but also executes them, raising security concerns in the process.
Kacper points out that in its default settings, the editor asks the user for confirmation before executing any command, which theoretically offers some level of protection against unauthorized actions. However, when the YOLO mode is activated, commands are executed automatically, heightening the risk for users. Additionally, Kacper explains the concept of prompt injection, which involves injecting extra instructions into a command. This type of attack could lead to situations where a command meant to delete files is executed instead of the intended one.
Kacper emphasizes the importance of scrutinizing the rules and their content before utilizing them, stating that it’s crucial to check what they include. He illustrates this point with examples of how malicious rules can impact a project, such as situations involving environment variables stored in a .env file. He warns that when YOLO mode is active, commands are performed without the user's consent, making the environment even more perilous.
As the episode continues, Kacper introduces viewers to the security mechanisms offered by the Cursor editor. Users have the option to disable file deletion, where every such command requires confirmation. He discusses successful detection of malicious commands, noting that even attempts to encode harmful commands were successfully blocked by the editor. Nevertheless, Kacper cautions that not all security mechanisms are foolproof, drawing attention to the potential risks associated with command encryption.
In conclusion, Kacper summarizes that security in programming is a complex process. He recommends that novice programmers familiarize themselves with the basics and utilize virtual machines to minimize the risk of losing important data. Additionally, he draws attention to planning costs when using cloud services and the importance of security measures like hard limits. Finally, Kacper encourages viewers to share their experiences with programming using AI and to check out his paid course on web application security. This episode has garnered 9797 views and 394 likes to date, demonstrating growing viewer engagement with the channel at the time of writing this article.
Toggle timeline summary
-
Introduction about using a code editor and risks of removing files without consent.
-
Discussion on Cursor editor and its ability to generate code and assist users.
-
Security concerns regarding automatic command execution in Cursor.
-
Introduction of YOLO mode in Cursor for automatic command execution.
-
Explanation of prompt injection, illustrating a potential security risk.
-
Importance of verifying external rules used in code editors.
-
Illustration of how `.env` files can be exposed via improper command execution.
-
Cursor's protective features against file deletion and malicious commands.
-
Discussion of limitations of Cursor's security measures against sophisticated threats.
-
Importance of version control systems in programming for safeguarding projects.
-
Using a trusted command list to enhance security while coding.
-
Highlighting potential exploits in command options that bypass security.
-
Risks associated with using package managers and executing scripts during installation.
-
Discussion on the possibility of AI hallucinations leading to unsafe package suggestions.
-
Exploration of MCP servers and their role in expanding the capabilities of AI models.
-
Demonstration of how a BMI calculator utilizes external tools for functionality.
-
Risks connected with API keys exposed in applications.
-
Advice on implementing spending limits when using cloud services.
-
Benefits of using VPS for predictable cost management in web hosting.
-
Call to action for audience engagement regarding AI utilization in coding.
-
Invitation to learn more about secure web application development through a course.
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.