Dlaczego to ma znaczenie dla branż regulowanych
Ramy regulacyjne mają znaczenie, bo odwracają pytanie o bezpieczeństwo. Domyślne założenie większości nowoczesnego tooling AI brzmi: "dane wychodzą z hosta, chmura trzyma je bezpiecznie, log audytowy wystarczy". Dla organizacji objętych GDPR art. 32, HIPAA §164.312, tajemnicą adwokacką, ISO 27001 z klauzulami data-residency albo krajowymi ramami cyberbezpieczeństwa, to założenie jest odwrócone: dane nie mogą wyjść z hosta, a ciężar dowodu spoczywa na operatorze.
BuildOnAI startuje z odwróconego założenia:
- Self-hosted z założenia. Każda usługa działa na sprzęcie kontrolowanym przez operatora. Zero połączeń do chmury, zero telemetrii, zero vendor lock-in. Opcjonalny fallback do hostowanego LLM jest opt-in przez klucz API — bez niego ekosystem zostaje całkowicie offline.
- Document Processor zostaje lokalnie. Aplikacja desktopowa Tauri w Rust + Svelte. Parsowanie PDF / DOCX / TXT dzieje się na systemie plików hosta. Embeddingi generuje Ollama na hoście. ChromaDB trzyma je na lokalnym dysku. Oryginał dokumentu nigdy nie przekracza granicy sieci.
- Auth ed25519 między agentami. Gdy organizacja potrzebuje więcej niż jednego agenta lub jednego hosta, każde żądanie jest podpisywane. Klucze publiczne to zwykłe pliki w key-server; rewokacja to
rm. Bez zewnętrznego dostawcy tożsamości. - Trail audytowy z konstrukcji. Każdy uprzywilejowany endpoint zapisuje strukturalną linię JSONL. Tail-and-alert wystarczy na start; osobne SIEM nie jest wymagane.
Cztery warstwy strukturalne
"Bezpieczeństwo strukturalne" oznacza, że ochrona jest częścią architektury, a nie procesu, który operator musi przestrzegać. Cztery warstwy, każda w innym repozytorium, każda z własnym SECURITY.md:
1. Cortex Policy Engine
Policy Engine w Cortex
odmawia niebezpiecznych wywołań niezależnie od tego, kto i
jak zlecił. Skompromitowany prompt może poprosić model o
usunięcie plików; policy odmawia. Trzy reguły domyślnie
(deny dla destruktywnego shella,
ask dla zapisów do FS poza projektem,
allow dla komend read-only). Reguły własne
idą do policy.json w roocie projektu. Engine
to strukturalna obrona przed prompt injection — żadna
sprytna inputka nie obejdzie kroku human-confirmation, gdy
policy mówi ask.
2. Podpisane żądania ed25519
Key Server
+ trzymodowe pokrętło AUTH_MODE
(off → observe → enforce)
zamienia każde wywołanie HTTP między agentami w
podpisaną transakcję. Replayy blokuje krótko żyjący cache
nonce'ów; dryf zegara powyżej ~60 s jest odrzucany.
Klucze publiczne to zwykłe pliki; rewokacja to
rm. Ścieżka migracji jest stopniowa — patrz
Bezpieczne wdrożenie.
3. Izolacja Document Processora
Document Processor działa jako aplikacja Tauri — rdzeń Rust, UI Svelte, brak osadzonego sandboxa przeglądarki, z którego można uciec. Dostęp do plików jest ograniczony do katalogów wybranych przez usera przez allow-list Tauri; nie istnieje zdalny endpoint, do którego atakujący mógłby się dostać. Sparsowany dokument opuszcza Document Processor tylko, gdy operator skonfiguruje jawny pipeline, jak ten w Pipeline dokumentów.
4. Niezmienniki wymuszane w CI
Każde repozytorium ma pipeline w
.github/workflows/ z niezmiennikami
bezpieczeństwa — Python AST checks na wzorce shell-injection,
capability-based fallback sentinele, whitelistę
known-public endpointów, podpisane fixture'y do testów
migracji. Wyłączenie niezmienników CI unieważnia gwarancje
licencji komercyjnej; jest to zapisane w licencji jako
klauzula kontraktowa, nie umowa dżentelmeńska.
Co chronimy, czego nie chronimy
Każde repozytorium ma SECURITY.md z dokładnym modelem zagrożeń tego komponentu. Wspólna struktura:
W zakresie
- Niezaufany prompt próbujący skłonić model do destruktywnego działania (Policy Engine odmawia niezależnie od źródła).
- Nieautoryzowany peer w sieci wywołujący chronione endpointy pod
AUTH_MODE=enforce(żądanie odrzucone; weryfikacja ed25519 nie przechodzi). - Atak replay na podpisane endpointy (cache nonce'ów + okno timestampu).
- Skompromitowany host agenta wycofywany w trakcie incydentu (
rmklucza publicznego na key-server; rewokacja natychmiastowa).
Poza zakresem
- Zdeterminowany atakujący z dowolnym dostępem sieciowym do portów hosta pod
AUTH_MODE=off(domyślne dla wdrożeń solo / zaufany LAN). Jeśli Twoje środowisko nie pasuje do tych założeń, przełącz naenforce. - Złośliwy kod w pluginie Cortexa wrzuconym do
plugins/. Pluginy są dziś trusted-by-design; izolacja przez subinterpretery PEP 684 jest na roadmapie (Cortex v1.2). Do tego momentu traktujplugins/jak dowolny katalog z wykonywalnym kodem na hoście. - Ataki na sam system operacyjny hosta. BuildOnAI to usługa userland; w warstwach, których nie kontroluje, polega na izolacji procesów, kontenerów i uprawnień FS hosta.
Zgłaszanie podatności
Jeśli znalazłaś / znalazłeś problem bezpieczeństwa, napisz
na [email protected]
z tematem [SECURITY]. Wstępne potwierdzenie w
ciągu trzech dni roboczych. Wolimy naprawić coś po cichu i
podziękować w release notes niż dowiedzieć się o problemie
najpierw z social mediów.
Proszę nie zakładaj publicznych issues GitHub na zgłoszenia
bezpieczeństwa. Plik SECURITY.md w każdym
repozytorium opisuje per-component ścieżkę zgłaszania i
nasze zobowiązania reakcji.
Modele zagrożeń per repozytorium
Każde repozytorium ma własny SECURITY.md z autorytatywnym modelem zagrożeń tego komponentu (po angielsku):
- consciousness-server / SECURITY.md — macierz AUTH_MODE, kanał agent-restart, kontrola systemctl, dispenser sekretów key-server, subprocess test-runnera.
- cortex / SECURITY.md — semantyka Policy Engine, strukturalna obrona przed prompt injection, roadmapa izolacji pluginów.
- document-processor / SECURITY.md — allow-list Tauri, brak sieci domyślnie, dokładność klasyfikatora i notatki o false-positives.
- buildonai-key-server / SECURITY.md — IP allow-list, opcjonalny X-API-Key, kształt logu audytowego.