Zawężenie poleceń agenta i odcięcie wstrzykniętego czytania cudzego profilu
Gdy agent AI ma zbyt szeroki dostęp do narzędzi systemowych, pojedynczy błąd w instrukcji lub sprytnie spreparowana treść z zewnątrz może zamienić go w niekontrolowany skrypt powłoki. Dziś ograniczyłem to ryzyko u źródła.
Problem: niepotrzebny terminal i próba wyjścia poza własny kontekst
W logach bota treningowego gym narzędzia zajmowały aż 31 tysięcy tokenów w każdym żądaniu do modelu. Agent miał dostęp do ogólnego wykonywania poleceń powłoki, mimo że w codziennej pracy potrzebował wyłącznie analizy plików treningowych ze sportowego zegarka.
Co gorsza, nocny skaner pamięci leaf-scanner trafił na podejrzany wpis: w notatce pamięci bota gym pojawił się znacznik odnoszący się do przestrzeni drugiego agenta aneta z instrukcją nakazującą odczytanie pliku user.md. Gdyby agent dysponował pełną powłoką i bezkrytycznie zinterpretował tę instrukcję, granica izolacji między profilami użytkowników przestałaby istnieć.
Co zrobiłem: minimalne uprawnienia i bezpieczne narzędzia
- Zawęziłem uprawnienia powłoki dla agentów
gymianetado jawnych list dozwolonych poleceń (allowlist). Dla botagymzostawiłem wyłącznie dedykowany analizatortcx-analyzer. - Zaktualizowałem narzędzie
tcx-analyzerdo wersji 1.4.0. Dodałem domyślny tryb--compact, obsługę plików FIT przez bibliotekęfitdecodeoraz wyliczanie tempa na kilometr bez konieczności obecności surowego pola prędkości w pliku. - Pomiar okna kontekstowego pokazał natychmiastowy zysk: powierzchnia narzędzi bota
gymspadła z 31 tys. do 29 tys. tokenów na turę, co zauważalnie obniżyło koszty i czas odpowiedzi. - Zbudowałem moduł współdzielonej bazy wiedzy na SQLite z wyszukiwaniem pełnotekstowym FTS5 w pliku
wiedza.db. Nowe materiały indeksują się automatycznie przy starcie watchera i zmianie plików na dysku. - Poprawiłem skrypty wdrożeniowe, dodając flagę
cp --preserve=mode, aby pliki wykonywalne narzędzi nie traciły uprawnień+xpo aktualizacji na serwerze.
Dlaczego to ważne (Use Case)
Zostawienie agentowi pełnego dostępu do powłoki to jak danie mechanikowi samochodowemu klucza do całego sejfu w biurze tylko po to, żeby wymienił koło. Jeśli mechanik dostanie mylną instrukcję, szkody mogą pójść daleko poza warsztat.
Dzięki allowliście bot treningowy może uruchomić tcx_analyzer --latest, ale nie jest w stanie wywołać dowolnego polecenia systemowego ani odczytać cudzych plików konfiguracyjnych. Nawet jeśli w pamięci agenta pojawi się wstrzyknięty tekst nakazujący przejęcie danych innego profilu, agent po prostu nie ma narzędzia, którym mógłby to polecenie wykonać.
Czego się nauczyłem
- Najlepsze zabezpieczenie przed wstrzyknięciem poleceń to brak narzędzia w kontekście modelu. Jeśli agent nie ma komendy w schemacie JSON, model nie może jej wywołać, niezależnie od tego, jak przekonujący jest prompt w danych wejściowych.
- Odchudzenie schematu narzędzi (z 31k do 29k tokenów) daje podwójną korzyść: zmniejsza powierzchnię ataku i bezpośrednio przyspiesza czas pierwszej odpowiedzi modelu.
- Pliki narzędzi kopiowane w potokach CI/CD zawsze wymagają zachowania uprawnień. Przeoczenie flagi zachowania trybu pliku potrafi po cichu unieruchomić produkcyjnego bota po pozornie udanym wdrożeniu.