Nullify

Usługi

Testy penetracyjne Audyty bezpieczeństwa Bezpieczeństwo aplikacji Szkolenia dla firm Bezpłatny skan ekspozycji

Menu

Blog O nas Kontakt
AI

Bezpieczeństwo RAG i baz wektorowych (OWASP LLM08) - jak asystent AI pokazuje cudze dokumenty

22 września 2026 · 9 min czytania

W skrócie: LLM08 Vector and Embedding Weaknesses to kategoria OWASP dla błędów w tym, jak aplikacje RAG tworzą, przechowują i wyszukują embeddingi. Najczęstszy skutek jest bardzo przyziemny: asystent odpowiada na podstawie dokumentu, którego pytający nie powinien zobaczyć.

Źródło problemu prawie zawsze jest to samo. Dokument w systemie źródłowym ma uprawnienia, a jego kawałek w bazie wektorowej już nie. Naprawa polega na tym, żeby uprawnienia przeszły razem z treścią i były sprawdzane przed wysłaniem fragmentów do modelu.

To czwarty wpis z serii o liście OWASP dla aplikacji LLM, po zatruwaniu danych, nadmiernej sprawczości agentów i niezaufanych odpowiedziach modelu. W ogólnym wpisie o testach LLM RAG dostał jeden akapit. Tutaj rozwijamy go do pełnego tematu.

Jak działa RAG i gdzie gubią się uprawnienia

Retrieval-Augmented Generation to sposób, żeby model odpowiadał na podstawie firmowych dokumentów, a nie tylko tego, czego nauczył się w treningu. Schemat jest prawie zawsze taki sam:

  • Indeksowanie. Konektor pobiera dokumenty z SharePointa, dysku, wiki czy systemu zgłoszeń, tnie je na fragmenty i zamienia każdy fragment na wektor liczb (embedding). Wektory razem z tekstem trafiają do bazy wektorowej.
  • Wyszukiwanie. Pytanie użytkownika też jest zamieniane na wektor, a baza zwraca kilka najbardziej podobnych fragmentów.
  • Generowanie. Fragmenty są doklejane do promptu, a model pisze odpowiedź.

W systemie źródłowym każdy dokument ma właściciela i listę osób z dostępem. W bazie wektorowej zostaje tylko to, co zespół świadomie przeniósł do metadanych fragmentu. Jeśli nie przeniósł nic, baza wie jedynie, że fragment jest podobny do pytania, a to nie jest kontrola dostępu.

Dochodzi do tego konto konektora. Żeby zaindeksować „całą wiedzę firmy", zwykle dostaje uprawnienia do odczytu wszystkiego. Asystent działa więc jak zastępca z kluczami do każdego pokoju, który otwiera drzwi każdemu, kto grzecznie zapyta.

Pięć ryzyk z listy OWASP

RyzykoNa czym polegaJak wygląda w praktyce
Nieuprawniony dostęp i wyciekSłaba kontrola dostępu do embeddingów i powiązanych z nimi treści.Pracownik działu sprzedaży pyta o premie i dostaje fragment arkusza kadrowego.
Wycieki między kontekstamiWspólna baza dla wielu grup użytkowników lub klientów, informacje przenikają między zapytaniami.Aplikacja SaaS z jednym indeksem dla wszystkich klientów, w jednej ścieżce API brakuje filtra po identyfikatorze klienta.
Odwracanie embeddingówOdtworzenie tekstu źródłowego z samego wektora.Wyciekła kopia bazy wektorowej, „w której są przecież tylko liczby".
Zatruwanie danychCelowe lub przypadkowe wprowadzenie złej treści do bazy wiedzy.Opisane szerzej w osobnym wpisie.
Zmiana zachowania modeluDołożenie RAG zmienia charakter odpowiedzi, nie tylko ich treść.Przykład OWASP: doradca finansowy po wdrożeniu RAG przestaje odpowiadać empatycznie i podaje same liczby.

Z punktu widzenia testu bezpieczeństwa najważniejsze są pierwsze trzy. Dwa ostatnie dotyczą raczej jakości i integralności odpowiedzi.

Typowe błędy kontroli dostępu

Na testach RAG te same wzorce wracają niezależnie od użytej bazy wektorowej i frameworka:

  • Brak metadanych o uprawnieniach. Fragmenty nie mają informacji, z jakiego dokumentu pochodzą ani kto może go czytać. Filtrować nie ma po czym.
  • Filtrowanie w złym miejscu. Aplikacja pobiera najbliższe fragmenty bez filtra, wysyła je do modelu, a uprawnienia sprawdza dopiero przy wyświetlaniu listy źródeł. Źródło znika z ekranu, ale jego treść jest już w odpowiedzi.
  • Identyfikator najemcy od klienta. Przestrzeń nazw albo kolekcja w bazie jest wybierana na podstawie parametru z żądania, który można podmienić.
  • Uprawnienia zamrożone w chwili indeksowania. Komuś odebrano dostęp do folderu, ale indeks aktualizuje się raz w tygodniu, więc asystent nadal cytuje dokumenty.
  • Usunięte dokumenty w indeksie. Plik skasowany w systemie źródłowym zostaje jako fragmenty w bazie wektorowej albo w pamięci podręcznej odpowiedzi.
  • Baza wektorowa dostępna bezpośrednio. Wystawiona do sieci bez uwierzytelnienia albo z kluczem API zaszytym we frontendzie. Wtedy żadna logika w aplikacji nie ma znaczenia.

Przykład z badań

Zespół SPARK Lab z Uniwersytetu Teksasu w Austin opisał w październiku 2024 atak ConfusedPilot na systemy RAG, w tym Microsoft 365 Copilot. Osoba z prawem zapisu do dowolnego indeksowanego dokumentu mogła wpłynąć na odpowiedzi udzielane innym pracownikom. Według autorów zmieniona treść mogła wpływać na odpowiedzi nawet po usunięciu złośliwego dokumentu. To dobry argument, żeby w teście sprawdzać nie tylko to, co jest w indeksie, ale też to, co z niego powinno zniknąć.

Embedding to nie anonimizacja

Częste założenie brzmi tak: baza wektorowa przechowuje liczby, więc nie jest tak wrażliwa jak dokumenty. Badania mówią co innego. Praca Text Embeddings Reveal (Almost) As Much As Text (Morris i in., EMNLP 2023) pokazała metodę, która z samych embeddingów odtwarzała dokładnie 92% tekstów o długości 32 tokenów. Z embeddingów notatek klinicznych udało się odzyskać pełne imiona i nazwiska pacjentów. Wcześniej podobny wniosek przedstawili autorzy ataku GEIA (Li i in., ACL 2023).

Wyniki dotyczą konkretnych modeli embeddingowych i krótkich tekstów, więc nie należy ich traktować jako gwarancji, że każdy wektor da się odwrócić. Wniosek praktyczny jest jednak prosty: baza wektorowa ma tę samą klasyfikację co dokumenty, z których powstała. Dotyczy to też kopii zapasowych, eksportów i środowisk testowych. Zresztą większość baz i tak przechowuje obok wektora oryginalny tekst fragmentu, więc atakujący często nie musi niczego odwracać.

Ukryta treść w indeksowanych dokumentach

Pierwszy scenariusz ataku w opisie OWASP dotyczy rekrutacji. Kandydat umieszcza w CV białym tekstem na białym tle polecenie, żeby model zignorował wcześniejsze instrukcje i polecił jego kandydaturę. Człowiek tego nie widzi, a narzędzie do wyciągania tekstu przekazuje to modelowi razem z resztą.

Ten sam mechanizm działa dla każdego źródła, do którego zapisują osoby spoza firmy: zgłoszeń od klientów, maili, faktur, formularzy. To styk LLM08 ze wstrzykiwaniem pośrednim: baza wiedzy staje się kanałem, którym polecenia trafiają do modelu.

Jak to sprawdzamy w teście

  • Mapa źródeł i konektorów. Skąd indeks pobiera dokumenty, na jakim koncie, jak często się odświeża i kto z zewnątrz może do tych źródeł pisać.
  • Dokumenty-kanarki. Umieszczamy w źródłach dokumenty z unikalnymi znacznikami, dostępne tylko dla wybranej roli, działu albo klienta. Potem pytamy o nie z kont bez dostępu, wprost i okrężnie.
  • Cykl życia uprawnień. Odbieramy dostęp do dokumentu, usuwamy go, zmieniamy jego treść i sprawdzamy, po jakim czasie asystent przestaje z niego korzystać.
  • Izolacja najemców. Podmiana identyfikatorów klienta, kolekcji i przestrzeni nazw w żądaniach do API, także w ścieżkach mniej oczywistych niż główny czat: eksportach, wyszukiwarce, podsumowaniach.
  • Bezpośredni dostęp do bazy. Czy baza wektorowa i jej panel są osiągalne z sieci, czy klucze nie są widoczne w kodzie frontendu, co zawierają kopie zapasowe.
  • Ukryta treść. Dokumenty z tekstem niewidocznym dla człowieka, w metadanych, komentarzach i polach formularzy, wprowadzane tymi kanałami, do których dostęp mają osoby z zewnątrz.

Co robić

  • Uprawnienia przy każdym fragmencie. Identyfikator dokumentu, najemcy i lista grup z dostępem zapisane w metadanych w chwili indeksowania.
  • Filtr przed modelem, po stronie serwera. Zapytanie do bazy wektorowej zawiera filtr wynikający z sesji użytkownika, a nie z parametrów żądania. Model nigdy nie widzi fragmentu, którego użytkownik nie mógłby otworzyć w systemie źródłowym.
  • Twarda izolacja klientów. W aplikacjach dla wielu firm osobne kolekcje lub bazy dla każdego klienta są bezpieczniejsze niż jeden indeks z filtrem, bo pominięty filtr nie zamienia się w wyciek.
  • Synchronizacja z systemem źródłowym. Odebranie dostępu i usunięcie dokumentu muszą docierać do indeksu i pamięci podręcznej, najlepiej zdarzeniowo, a nie w nocnym przebiegu.
  • Konektor z minimalnymi prawami. Indeksujcie to, czego asystent naprawdę potrzebuje, a nie „wszystko, co widzi konto serwisowe".
  • Walidacja przy wejściu do indeksu. Wyciąganie tekstu, które wykrywa ukrytą treść, oraz oznaczanie źródeł zewnętrznych jako mniej zaufanych.
  • Logi wyszukiwania. Kto zapytał, jakie fragmenty zostały zwrócone i z jakich dokumentów. Bez tego po incydencie nie da się ustalić, co wyciekło.

Czego to nie załatwi

Poprawna kontrola dostępu w RAG sprawia, że asystent nie pokaże więcej, niż użytkownik i tak może zobaczyć. Jeśli jednak uprawnienia w samym SharePoincie czy na dysku są za szerokie, asystent tylko to uwidoczni, bo odnajdzie w kilka sekund plik, którego nikt wcześniej nie szukał. Wdrożenie RAG to dobry moment na przegląd uprawnień w systemach źródłowych, a nie tylko w nowej bazie.

Nie rozwiązuje to też problemu fragmentów, które są dostępne i mają poprawne uprawnienia, ale zawierają polecenia. Na to działa ograniczenie tego, co model może zrobić z przeczytaną treścią, o czym więcej w wpisie o agentach. Zakres testów, w których to sprawdzamy, opisujemy na stronie testów penetracyjnych aplikacji LLM.

Macie asystenta AI na firmowych dokumentach?

Sprawdzamy, czy baza wiedzy respektuje te same uprawnienia co system, z którego pochodzą dokumenty: między rolami, działami i klientami. Napiszcie - odpiszemy w 24 h.

Zapytaj o wycenę