Protect AI, skanowanie modeli i LLM Guard
Protect AI zajmowało się bezpieczeństwem łańcucha dostaw uczenia maszynowego: sprawdzaniem, czy pobrany model nie wykona kodu przy wczytaniu, i filtrowaniem tego, co wchodzi do modelu językowego oraz z niego wychodzi. Firma już nie istnieje samodzielnie, a z dwóch jej otwartych narzędzi tylko jedno jest dziś rozwijane.
Problem, który adresuje, bywa lekceważony, bo nie wygląda groźnie. Pobierasz plik z modelem z publicznego repozytorium i wczytujesz go dwiema linijkami kodu. W popularnym formacie ten plik jest programem, a nie danymi, więc wczytanie go oznacza jego wykonanie.
Firma zniknęła, narzędzia zostały
Palo Alto Networks ogłosiło zamiar przejęcia w kwietniu 2025, a transakcja zamknęła się dwudziestego drugiego lipca tego samego roku.
To nie był odosobniony przypadek. W tym samym roku SentinelOne kupiło Prompt Security, a Check Point przejął Lakerę: samodzielne firmy od bezpieczeństwa AI trafiły do dużych dostawców, a wraz z tym samodzielne wykupienie planu wszędzie ustąpiło rozmowie z handlowcem. Przy porównywaniu ofert z tego segmentu zakładaj, że cennika nie znajdziesz.
Produkty komercyjne trafiły do platformy Prisma AIRS: skaner modeli, testowanie napastnicze i obserwacja w czasie działania funkcjonują tam jako jej elementy. Sprzedaż idzie kanałem korporacyjnym tego dostawcy, więc cennika nie ma, a rozmowa zaczyna się od handlowca.
Dla programisty istotniejsze jest to, co zostało poza tą zmianą. Narzędzie do skanowania artefaktów modelu pozostaje otwarte na licencji Apache 2.0, a biblioteka do filtrowania promptów i odpowiedzi na licencji MIT. Obie da się wpiąć w projekt bez rozmowy z kimkolwiek.
Losy tych dwóch narzędzi się jednak rozeszły i to jest najważniejsza rzecz do sprawdzenia przed wyborem. Skaner artefaktów żyje: ostatnie wydanie nosi numer 0.8.8 i pochodzi z lutego 2026 roku. Biblioteka filtrująca została w lipcu 2026 roku zarchiwizowana na GitHubie, a jej opiekunowie napisali w pliku opisu wprost, że projekt i powiązane z nim modele nie są już rozwijane ani utrzymywane. Ostatnie wydanie w rejestrze pakietów to 0.3.16 z maja 2025 roku. Kod nadal się instaluje i nadal działa, natomiast nowych wykrywaczy, aktualizacji modeli klasyfikujących ani poprawek bezpieczeństwa już nie będzie.
To rozróżnienie warto trzymać w głowie przy czytaniu materiałów. Sporo tekstów opisuje możliwości platformy komercyjnej i nazywa je nazwą firmy, która już nie jest osobnym bytem, przez co łatwo pomylić to, co dostaniesz za darmo, z tym, za co trzeba zapłacić.
Na czym polega atak przez serializację
Warto to zrozumieć, bo bez tego skanowanie modeli wygląda na przesadną ostrożność.
Domyślny format zapisu obiektów w Pythonie nie przechowuje danych, tylko instrukcje odtworzenia obiektu. Wśród tych instrukcji jest możliwość wywołania dowolnej funkcji z dowolnymi argumentami. Wczytanie takiego pliku wykonuje te instrukcje, zanim zobaczysz cokolwiek na wyjściu.
Konsekwencja jest prosta i nieprzyjemna: plik z modelem pobrany z publicznego repozytorium może otworzyć połączenie na zewnątrz, odczytać zmienne środowiskowe z kluczami albo dopisać się do zadań uruchamianych cyklicznie. Dzieje się to w momencie wczytania, na koncie użytkownika, który je wczytał, i bez żadnego komunikatu.
Groźne jest szczególnie to, że model po takiej modyfikacji działa normalnie. Zwraca te same wyniki co oryginał, więc testy jakości niczego nie wykryją. Jedyne, co się zmieniło, dzieje się poza modelem.
Skala problemu wynika ze sposobu pracy. Pobieranie modeli z publicznych repozytoriów jest w tej dziedzinie codziennością, a nazwa repozytorium bywa jedyną weryfikacją. To jest ta sama klasa ryzyka co instalowanie pakietu o nazwie łudząco podobnej do popularnego, tyle że mniej osób o niej myśli.
Skaner modeli w praktyce
pip install modelscan
modelscan -p ./modele/klasyfikator.pklNarzędzie obsługuje kilka formatów artefaktów, między innymi zapisy z Pythona, formaty używane przez popularne biblioteki uczenia maszynowego i zapisane grafy modeli. Sprawdza, czy w pliku znajdują się wywołania zdolne wykonać kod, i zwraca listę znalezisk z poziomem ryzyka.
Skanowanie całego katalogu przed użyciem czegokolwiek wygląda tak:
modelscan -p ./modele --reporting-format json > raport.jsonWynik w postaci strukturalnej nadaje się do wpięcia w potok budowania. To jest właściwe miejsce dla tego narzędzia: nie ręczne uruchomienie raz na kwartał, tylko krok, który blokuje wdrożenie, gdy skan zwróci znalezisko o wysokim ryzyku.
Dwie rzeczy warto wiedzieć, zanim uznasz sprawę za zamkniętą. Skaner wykrywa znane wzorce niebezpiecznych wywołań, więc nie jest dowodem bezpieczeństwa, tylko odsiewaniem tego, co znane. Oraz: czysty wynik skanu mówi o kodzie w pliku, a nie o zachowaniu modelu, który może być wytrenowany tak, żeby dawać złe odpowiedzi na konkretne zapytania.
Format, który rozwiązuje problem u źródła
Skanowanie jest łataniem. Prawdziwym rozwiązaniem jest format zapisu, który przechowuje wyłącznie liczby.
Format bezpiecznych tensorów, przyjęty jako domyślny w największym repozytorium modeli, nie zawiera instrukcji wykonania, więc wczytanie pliku nie może uruchomić kodu. Dodatkowo wczytuje się szybciej, bo pozwala na odwzorowanie pliku w pamięci zamiast przepisywania go w całości.
Praktyczna reguła jest krótka: jeśli model jest dostępny w tym formacie, bierz go i problem znika. Jeśli dostępny jest wyłącznie w formacie wykonywalnym, skanuj przed wczytaniem, a jeszcze lepiej przekonwertuj raz w izolowanym środowisku i dalej pracuj na wersji bezpiecznej.
Konwersja bywa pomijana, bo wygląda na dodatkową pracę, natomiast wykonuje się ją raz na model i usuwa całą klasę ryzyka z codziennej pracy zespołu. Przy modelach uruchamianych lokalnie, na przykład przez Ollamę, format jest zwykle już zadbany po stronie narzędzia, ale przy własnych wagach albo modelach dostrajanych wewnętrznie decyzja należy do Ciebie.
Filtrowanie promptów i odpowiedzi
Druga otwarta biblioteka z tego zestawu zajmuje się czymś zupełnie innym: treścią wchodzącą do modelu językowego i wychodzącą z niego. Wszystko poniżej opisuje projekt zamrożony w lipcu 2026 roku, więc czytaj to jako opis stanu ostatecznego, a nie rozwijanego.
Zestaw obejmuje kilkanaście kontroli wejścia i około dwudziestu kontroli wyjścia. Po stronie wejścia są między innymi wykrywanie wstrzyknięć, danych osobowych, tokenów dostępu i treści toksycznych. Po stronie wyjścia dochodzi sprawdzanie zgodności z pytaniem, wykrywanie niedziałających i złośliwych odnośników oraz danych wrażliwych w odpowiedzi.
from llm_guard import scan_prompt
from llm_guard.input_scanners import Anonymize, PromptInjection
skanery = [Anonymize(vault), PromptInjection()]
oczyszczony, poprawny, ryzyko = scan_prompt(skanery, prompt_uzytkownika)
if not all(poprawny.values()):
raise ValueError(f"Prompt odrzucony, wyniki ryzyka: {ryzyko}")Wszystko działa lokalnie, w Twoim procesie, więc treść nie opuszcza infrastruktury. To główna różnica wobec usług takich jak Lakera Guard czy Prompt Security, gdzie tekst leci na cudzy serwer.
Cena jest przewidywalna. Część kontroli używa modeli klasyfikujących, więc pierwsze uruchomienie pobiera wagi, a każde sprawdzenie kosztuje czas procesora albo karty graficznej. Przy dziesięciu włączonych kontrolach opóźnienie robi się zauważalne i trzeba wybrać te, które naprawdę są potrzebne, zamiast włączać wszystko.
Skąd pochodzi model i dlaczego to trudne pytanie
Skanowanie odpowiada na pytanie, czy plik zawiera niebezpieczny kod. Nie odpowiada na pytanie, czy ten plik jest tym, za co się podaje, a to jest osobny problem.
W tradycyjnym łańcuchu dostaw oprogramowania masz podpisy, sumy kontrolne i rejestry pakietów z historią wydań. Przy modelach jest gorzej. Repozytoria publiczne pozwalają założyć konto o nazwie łudząco podobnej do znanej organizacji, opublikować model o nazwie sugerującej oficjalne pochodzenie i zebrać pobrania od osób, które kopiują nazwę z tekstu w internecie.
Model dostrojony ma dodatkowo pochodzenie wielostopniowe: ktoś wziął cudze wagi, dotrenował je na własnych danych i opublikował wynik. Sprawdzenie, co dokładnie znalazło się w danych treningowych na którymkolwiek etapie, jest w praktyce niemożliwe.
Praktyczne minimum wygląda tak. Zapisz sumę kontrolną pliku, którego użyłeś, razem z wersją i adresem źródła. Trzymaj kopię w repozytorium wewnętrznym, zamiast pobierać przy każdym wdrożeniu, bo plik pod tym samym adresem może się zmienić. Ogranicz listę organizacji, z których wolno pobierać, do takiej, którą da się przejrzeć.
To brzmi jak biurokracja, dopóki nie pojawi się zgłoszenie o podatnym artefakcie i pytanie, czy Was dotyczy. Zespół z rejestrem odpowiada w kwadrans, zespół bez rejestru przegląda maszyny przez trzy dni.
Testowanie napastnicze i to, co ono daje
Osobną kategorią jest sprawdzanie, jak model zachowuje się pod celowym atakiem, a nie przy zwykłym użyciu.
Polega to na wygenerowaniu zestawu zapytań próbujących obejść ograniczenia, wydobyć prompt systemowy albo wymusić odpowiedź spoza dozwolonego zakresu, a potem policzeniu, ile z nich przeszło. Wynik jest liczbą, i to jest jego główna wartość.
Różnica wobec filtrowania jest zasadnicza. Filtr działa w czasie pracy aplikacji i zatrzymuje pojedyncze zapytania. Testowanie napastnicze uruchamiasz przed wdrożeniem i przed zmianą promptu systemowego, a wynik mówi, czy zmiana pogorszyła sytuację.
W wersji komercyjnej to osobny produkt platformy. W wersji minimalnej wystarczy własny zbiór stu zapytań, zapisany w repozytorium i uruchamiany przy każdej zmianie promptu. Nie jest tak dokładny jak narzędzie dedykowane, natomiast wykrywa najczęstszy przypadek: poprawkę promptu, która przy okazji otworzyła coś, co wcześniej było zamknięte.
Protect AI kontra alternatywy
| Rozwiązanie | Zakres | Model działania | Kiedy wybrać |
|---|---|---|---|
| Skaner modeli | Artefakty modelu | Lokalnie, wiersz poleceń | Pobierasz modele z publicznych repozytoriów |
| Biblioteka filtrująca | Prompty i odpowiedzi | Lokalnie, biblioteka, projekt zarchiwizowany | Dane nie mogą opuścić infrastruktury, a brak rozwoju jest do przyjęcia |
| Guardrails AI | Prompty i odpowiedzi | Lokalnie, walidatory jako kod | Reguły opisane w kodzie projektu |
| Lakera Guard | Prompty i odpowiedzi | Usługa zewnętrzna | Chcesz gotowy filtr bez utrzymania |
| Platforma komercyjna | Wszystko powyżej plus obserwacja | Usługa dostawcy | Wymogi zgodności i raportowanie |
Pierwsze dwa wiersze nie konkurują ze sobą, tylko pokrywają dwa różne etapy. Skaner działa przed wdrożeniem, na plikach. Filtr działa w czasie pracy aplikacji, na treści. Wdrożenie tylko jednego z nich zostawia otwartą drugą stronę. Przy nowym projekcie warto jednak pamiętać, że drugi wiersz opisuje projekt zamknięty, więc rolę filtru pełni dziś raczej trzeci albo czwarty wiersz tej tabeli.
Ostatni wiersz warto rozważyć wtedy, gdy potrzebujesz dowodu, a nie tylko zabezpieczenia. Otwarte narzędzia nie generują raportów dla audytora, nie mają panelu i nie przypilnują, żeby ktoś przejrzał zdarzenia. Przy wymogach formalnych to bywa rozstrzygające niezależnie od jakości samego wykrywania.
Gdzie to wpiąć
Kolejność ma znaczenie, a najczęstszy błąd polega na wpięciu tego w miejscu, przez które i tak nie przechodzi połowa ruchu.
Skanowanie modeli wpina się w potok budowania oraz w moment pobrania. Model wciągnięty ręcznie na stację roboczą programisty omija oba te miejsca, więc warto mieć jedną komendę, którą zespół faktycznie uruchamia, i wpisać ją do instrukcji uruchomienia projektu.
Filtrowanie treści wpina się w trzech punktach: wejście od użytkownika, treść pobrana z zewnątrz i wyjście z modelu. Trzeci jest pomijany najczęściej, a bez niego wstrzyknięcie, które weszło przez pobrany dokument, wychodzi prosto do użytkownika.
Do wykrywania danych osobowych warto rozważyć osobne narzędzie, takie jak Presidio, jeśli to jest Twój główny problem. Biblioteka filtrująca robi to przy okazji, natomiast narzędzie wyspecjalizowane daje więcej kontroli nad typami danych i regułami krajowymi.
Ostatnia rzecz to rejestr modeli. Wiedza o tym, który model, w jakiej wersji i skąd pobrany działa na produkcji, jest warunkiem jakiejkolwiek reakcji na zgłoszenie o podatnym artefakcie. Bez tego rejestru na pytanie „czy dotyczy nas ten problem" nie da się odpowiedzieć inaczej niż zgadywaniem.
Typowe błędy
Pierwszy to wczytywanie modeli z publicznych repozytoriów bez skanu. Nazwa organizacji nie jest weryfikacją, a plik w formacie wykonywalnym uruchamia kod przy wczytaniu.
Drugi to traktowanie czystego wyniku skanu jako gwarancji. Skaner wykrywa znane wzorce, więc odsiewa to, co znane, a nie potwierdza, że plik jest bezpieczny.
Trzeci to pominięcie konwersji do formatu bezpiecznego, mimo że jest dostępna. Jednorazowa praca usuwa całą klasę ryzyka, a mimo to zostaje przy starym formacie z przyzwyczajenia.
Czwarty to włączenie wszystkich kontroli w bibliotece filtrującej naraz. Opóźnienie rośnie, a większość z nich nie dotyczy Twojego przypadku, więc płacisz czasem odpowiedzi za ochronę, której nie potrzebujesz.
Piąty to filtrowanie wyłącznie wejścia. Odpowiedź modelu bywa jedynym miejscem, w którym widać, że coś poszło nie tak wcześniej.
Szósty to mylenie otwartych narzędzi z platformą komercyjną. Materiały opisujące panel, raporty i obserwację w czasie działania dotyczą produktu płatnego, a nie tego, co instalujesz jednym poleceniem.
FAQ
Czy Protect AI nadal istnieje?
Nie jako osobna firma. Palo Alto Networks ogłosiło przejęcie w kwietniu 2025 i zamknęło je dwudziestego drugiego lipca tego samego roku, a produkty komercyjne działają dziś jako część platformy Prisma AIRS.
Czy narzędzia otwarte są nadal darmowe?
Tak, obie zostały darmowe: skaner artefaktów modelu na licencji Apache 2.0, biblioteka filtrująca prompty i odpowiedzi na licencji MIT. Obie instaluje się przez zwykły menedżer pakietów, bez konta i bez klucza. Różnica dotyczy rozwoju: skaner dostał wydanie w lutym 2026 roku, a biblioteka filtrująca została w lipcu 2026 roku zarchiwizowana i nie jest już utrzymywana.
Dlaczego wczytanie pliku z modelem miałoby być groźne?
Bo w popularnym formacie plik zawiera instrukcje odtworzenia obiektu, w tym możliwość wywołania dowolnej funkcji. Wczytanie wykonuje te instrukcje, więc odpowiednio spreparowany plik uruchamia kod na Twojej maszynie, a sam model działa przy tym normalnie.
Czy format bezpiecznych tensorów rozwiązuje problem całkowicie?
Rozwiązuje problem wykonania kodu przy wczytaniu, bo przechowuje wyłącznie liczby. Nie chroni przed modelem wytrenowanym tak, żeby zachowywał się niepoprawnie w wybranych sytuacjach, i to jest osobna kategoria ryzyka wymagająca testów zachowania.
Czym biblioteka filtrująca różni się od usług zewnętrznych?
Miejscem działania. Biblioteka pracuje w Twoim procesie, więc treść nie opuszcza infrastruktury, a koszt to czas procesora. Usługa zewnętrzna aktualizuje wykrywanie sama i nie obciąża Twoich maszyn, natomiast prompty przechodzą przez cudzy serwer.
Kod skanera stoi w repozytorium na GitHubie, a szczegóły przejęcia w komunikacie Palo Alto Networks.