Opening code from GitHub in VSCode? It can be dangerous (video, 8 minutes)
Kacper Szurek, in his latest YouTube video, addresses an incredibly important topic related to programming security and the risks that come with trusting unknown code. He illustrates a scenario where we open a directory on our disk containing the file 'secret.txt,' which holds sensitive information. When we open a folder in Visual Studio Code, we are asked about trusting its authors. Kacper points out that many users do not realize what consequences granting this trust can entail. Indeed, malicious code can give attackers access to data that should remain confidential.
In the video, Kacper simulates an attack showing how clicking on the trust button immediately sends the content of 'secret.txt' to a malicious server controlled by criminals. Furthermore, he explains that the reason for this automatic action lies in the 'tasks.json' file, which assigns various tasks to opened folders. It contains dangerous commands that can be executed without conscious user interaction, raising questions about our safety while using tools like Visual Studio Code.
Kacper also emphasizes that through improper settings in 'tasks.json', potential attackers can hide the actions of malicious code. By setting the 'reveal' parameter to 'never', the user will never see a new terminal window that could alert them to dangerous commands. This demonstrates how easily one can fall victim to cyberattacks, even when we feel we are operating in a secure environment.
It is also worth noting that Kacper plans to launch his first course on programming security, titled 'Safe Programmer.' The course will be available not only for programmers but also for testers and everyone interested in learning the basics of web application security. With a rich curriculum consisting of 17 hours of recordings and over 100 practical exercises, Kacper is confident that he will help participants delve into the world of secure coding.
In conclusion, Kacper reminds us that even a simple interaction with a new folder can lead to disaster, and a lack of caution against new code is a significant mistake. As of the writing of this article, Kacper Szurek's video has reached 16,061 views and received 778 likes, illustrating that this topic is gaining increasing attention within the IT security community. It is important to follow his channel to stay updated on the best practices in programming security.
Toggle timeline summary
-
Introduction to the concept of a secret folder on your disk.
-
Explaining the implications of unauthorized access to your files.
-
Downloading unknown code from the internet.
-
Discussing Visual Studio Code's prompt about trusting folder authors.
-
Demonstrating how data can be leaked from the secret file.
-
Discussion on the potential commands used by attackers.
-
Introduction to an upcoming security course.
-
Highlighting tasks.json and its role in executing commands.
-
Understanding how commands are executed automatically.
-
The danger of exploitation through simple user actions.
-
Manipulating the secret file to demonstrate data theft.
-
Potential risks when dragging and dropping code into Visual Studio Code.
-
Instructions on managing workspace trust settings.
-
Final thoughts on the importance of understanding folder trust.
Transcription
Na początku wyobraźmy sobie, że na twoim dysku otwartym znajduje się katalog sekret, a w nim plik sekret.txt. Tutaj znajdują się jakieś tajne dane, które nie chcemy, aby trafiły w niepożądane ręce. Jeżeli ktoś będzie w stanie poznać zawartość tego pliku, to oznacza to, że raczej na 100% jest również w stanie poznać zawartość dowolnego pliku czy folderu na naszym komputerze. Teraz pobieramy jakiś kod z internetu. Nie wiemy, kto jest jego twórcą, ale interesuje nas, jak wygląda ten kod. Przeciągamy więc pobrany folder do Visual Studio Code, aby go otworzyć. I co? Wtedy program pyta nas, czy ufamy autorom tego folderu. I dużo osób nie rozumie, dlaczego Visual Studio Code zadaje właśnie takie pytanie. Czy ufamy autorom danych plików? Spróbuję ci wytłumaczyć, dlaczego to pytanie jest istotne. Po prawej stronie mam tutaj otwarty kanał Discorda. Symulujemy, że jest to kanał należący do przestępców, którzy chcą ukraść zawartość naszego tajnego pliku. Zaraz zobaczysz, że gdy tylko wyrażę zgodę i kliknę w niebieski przycisk, to automatycznie pojawi się tutaj kolejna wiadomość i w jej treści podanie zostana zawartość naszego tajnego pliku. Sprawdźmy, jak to wygląda. Klikam w niebieski guzik i co? I automatycznie została wysłana zawartość tego pliku do serwera kontrolowanego przez atakujący. Równocześnie możesz tutaj zauważyć, że otworzyło mi się nowe okno terminala. Tutaj znajduje się komenda, która została zdefiniowana wcześniej przez przestępców. To właśnie ta komenda jest odpowiedzialna za kradzież zawartości pliku secret.txt i wysłania jej na ten konkretny kanał na Discordzie. Skoro oglądasz ten materiał, to pewno interesujesz się bezpieczeństwem. 18 września rozpoczynam sprzedaż mojego pierwszego technicznego kursu. Bezpieczny programista. To szkolenie nie tylko dla programistów, ale również dla testerów o programowanie i wszystkich innych osób, które chcą poznać podstawy bezpieczeństwa aplikacji webowych. Zatem niezależnie, czy jesteś programistą, testerem, czy może po prostu chcesz się przewranżowić, to kurs dla ciebie. 17 godzin nagrań, 170 lekcji i ponad 100 ćwiczeń praktycznych, które pozwolą ci wejść w świat bezpieczeństwa. Wszystko oczywiście tłumaczone prostym i zrozumiałym językiem. Zapisz się więc na listę oczekujących, aby otrzymać powiadomienie o starcie sprzedaży. Link znajdziesz w opisie tego filmu. Do zobaczenia. Ale jak to możliwe, że to wszystko stało się automatycznie? Przecież ja kliknąłem tylko, że ufam autorom tego folderu, a nie, że chcę automatycznie uruchamiać jakieś komenty. Wszystko to z powodu specjalnego pliku. Visual Studio Code wspiera katalog, który nazywa się .vscode. W tym katalogu może się znajdować plik tasks.json. W tym pliku definiujemy zadania, które mogą zostać wykonane, kiedy tylko użytkownik otworzy dany projekt, czyli otworzy dany folder. Tutaj definiujemy nazwę tego konkretnego zadania. W naszym wypadku jest to buildproject, aby zmylić programistę, że jest to jakieś istotne zadanie. I te zadania możemy też uruchomić ręcznie. Wystarczy na klawiaturze wcisnąć kombinację ctrl plus shift plus p i wpisać w tym oknie tekst run task. Następnie z listy wybieramy zadanie, które zostało wcześniej zdefiniowane w tym pliku. W naszym wypadku jest to po prostu buildproject. I zauważ, kiedy wybrałem to nasze zadanie po raz kolejny, została wykonana komenda, która jest zdefiniowana w pliku tasks.json. Jeszcze gdy przyjdziemy teraz do serwera kontrolowanego przez atakujący, widać tutaj ponownie, że jeszcze raz została wysłana zawartość tego pliku. Ponieważ zawartość tego pliku nie zmieniła się, mamy dwie takie same wiadomości. Ale jak to się stało, że ta komenda została uruchomiona automatycznie? To dlatego, że w tym zadaniu zdefiniowaliśmy dodatkowy parametr run on ustawiony na wartość folder open. Jak widzisz, kiedy najadę na niego myszką, to Visual Studio Code automatycznie podpowiada mi, co to znaczy. Tak możemy dowiedzieć się, że kiedy zadanie ma ustawioną taką wartość, zostanie uruchomione automatycznie. Kiedy tylko zostanie otwarty folder z danym zadaniem. To dlatego, kiedy tylko kliknęliśmy niebieski guzik, to ta komenda została wykonana automatycznie bez naszej dodatkowej zgody. Możesz teraz pomyśleć, ok, ale ja się na to nie nabiorę, ponieważ kiedy tylko to zadanie było wykonywane, to od razu zauważyłaś, że otworzyło się nowe okno terminala. Na pewno byś je przerwała, przerwał wykonywanie tej złośliwej komendy. Niestety nie mam dla ciebie dobrych informacji, ponieważ w tym pliku tasks.json możemy jeszcze zdefiniować dodatkowe parametry i jednym z nich jest reveal ustawione na wartość never. Jak można wyczytać z opisu, kiedy ustawimy tą wartość na never, to wtedy nie zostanie otworzone nowe okno terminala. W ten sposób potencjalny atakujący może ukryć wykonywanie komendy, która jest wykonywana właśnie podczas otwarcia edytora. Zapiszmy sobie to zadanie i wyłączmy teraz Visual Studio Code. Teraz zmienimy jeszcze zawartość naszego tajnego pliku, np. wpisując tutaj same jedynki, aby pokazać Ci, że rzeczywiście zawartość tego pliku jest wysyłana do serwera kontrolowanego przez atakujących. Otwieram teraz jeszcze raz Visual Studio Code, no i wtedy program automatycznie otworzy mi wcześniej otwarty projekt. Zauważ, że kiedy tylko otworzę Visual Studio Code, to automatycznie powinna się tu pojawić nowa wiadomość wysłana przez bota z zawartością naszego tajnego pliku. Uruchamiam więc Visual Studio Code i co się dzieje? Praktycznie od razu pojawia mi się tutaj zawartość naszego tajnego pliku. Zauważ, że tym razem w oknie terminala nie ma jakiejś zawartości, która mogłaby wzbudzić naszą czujność. To dość przerażające, bo może się okazać, że tylko przeciągając jakiś folder czy kawałek kodu do Visual Studio Code i wciskając niebieski guzik, ktoś może np. zarazić nasz komputer złośliwym oprogramowaniem lub wykraść jakieś nasze tajne pliki. Co ciekawe, można też przejść i sprawdzić, jakim folderom już w przeszłości zaufaliśmy. Ponownie wciskam kombinację klawiszy CTRL plus SHIFT plus P, tym razem wybieram opcję Manage Workspace Trust i tutaj otwiera mi się okno i na samym dole tej podstrony widzimy, jakie foldery już są przez nas zaufane. Więc jeżeli ponownie otworzysz dany folder w Visual Studio Code, to wtedy aplikacja już nie zapyta cię, czy ma zaufać zawartości tego folderu. Od razu wykona jakiś kod, jeżeli tylko jest on zdefiniowany w pliku tasks.json. Tutaj też możemy usunąć jakiś folder z zaufanych, klikając w guzik X po prawej stronie. Warto więc sprawdzić, jakim folderom nadaliśmy takie uprawnienia.