Bezpieczeństwo w qubie

Data wejścia w życie: 23 września 2026 Wersja: 1.1 — przegląd dokładności wdrożenia


Dla badaczy — szybki przewodnik:

Pełne informacje znajdują się w §12 (Koordynowane ujawnianie).


Kim jesteśmy

qub.social jest obsługiwany przez VSPRY AUSTRALIA PTY LIMITED (ABN 41 631 026 330), Level 38, 71 Eagle Street, Brisbane QLD 4000, Australia. Odniesienia do "qub", "my", "nas" i "nasz" oznaczają ten podmiot.

Kontakt bezpieczeństwa: support@qub.social z prefiksem tematu [SECURITY].


1. Nasze podejście

qub jest infrastrukturą zaufania. Produkt jest nic niewart, jeśli nie jest bezpieczny, więc bezpieczeństwo nie jest funkcją — jest substratem. Ta strona opisuje, w konkretnych terminach, jak chronimy nasz stos, Twoje dane i integralność zapieczętowanej treści.

Wartość weryfikowalnego zobowiązania czasowego rośnie w miarę, jak coraz większa część internetu staje się generowana przez maszyny. Zweryfikowana transakcja przechowywania lub kotwica w dzienniku przejrzystości może ustalić, że szyfrogram istniał nie później niż w czasie jego bloku; zapieczętowany artefakt osobno udowadnia integralność treści, powiązanie z rundą drand i wszelkie podpisy autorów. Utrzymywanie tych twierdzeń oddzielnie jest standardem, do którego odnosi się ta strona.

Nie prosimy Cię o zaufanie nam. Projektujemy tak, by zaufanie wymagane od nas było tak małe, jak to możliwe, a tam, gdzie zaufanie jest wymagane, wyjaśniamy dokładnie, co jest zaufane i dlaczego.

Trzy zasady napędzają każdą decyzję projektową:


2. Model zagrożeń

2.1 Przed czym chronimy

2.2 Przed czym nie możemy chronić

Jesteśmy uczciwi co do naszych granic. qub nie może obronić przed:


3. Kryptografia po stronie klienta

W domyślnym przepływie wiadomości przeglądarki szyfrowanie treści odbywa się przed żądaniem przesyłania. Dwa wyraźne ścieżki różnią się: Builder /api/v1/seal celowo wysyła tekst jawny i klucz generowany przez dzwoniącego do Pracownika w celu zamknięcia w pamięci, a etapowanie/podpisywanie paktu wysyła podpisany ustrukturyzowany pakt do serwisu, aby mógł sfinalizować dwustronny artefakt. Żadnego z tych wyjątków nie należy mylić z end-to-end szyfrowaniem ścieżki przeglądarki.

3.1 Szyfrowanie czasowe

qub używa tlock — szyfrowania opartego na tożsamości kluczowanego do przyszłej rundy beaconu drand. Szyfrowanie postępuje w Twojej przeglądarce z użyciem klucza publicznego sieci drand; klucz deszyfrujący jest uwalniany publicznie przez sieć drand tylko wtedy, gdy zostaje osiągnięta docelowa runda. Nikt, w tym my, nie może zrekonstruować klucza deszyfrującego z wyprzedzeniem.

Celujemy w łańcuch quicknet:

Klucz publiczny łańcucha quicknet i czas genesis są skompilowane do klienta. Nie pobieramy parametrów łańcucha w czasie wykonania, więc złośliwy węzeł nie może podstawić łańcucha, który kontrolujemy.

3.2 Szyfrowanie symetryczne

Schemat tlock opakowuje klucz treści AES-256-GCM. AES-GCM zapewnia uwierzytelnione szyfrowanie: pojedynczy bit przełączony w szyfrogramie powoduje, że deszyfrowanie zawodzi, zamiast produkować po cichu uszkodzony tekst jawny.

3.3 Kanoniczna serializacja

Struktury protokołu są serializowane przy użyciu deterministycznego CBOR (RFC 8949 §4.2 podstawowe deterministyczne kodowanie). Dwie implementacje kodujące tę samą strukturę logiczną produkują identyczny CBOR. Kompletnie zapieczętowane ładunki są nie deterministyczny: tlock i zewnętrzna osłona szyfrowania używają świeżej losowości. Skrót ciała jest obliczany na surowych bajtach ciała, podczas gdy kodowanie kanoniczne sprawia, że otaczające podpisane/strukturę przewodową są jednoznaczne.

Napisaliśmy enkoder CBOR ręcznie zarówno dla naszych implementacji klienta, jak i serwera, zamiast polegać na generycznej bibliotece serializacji — wymóg to dokładność, nie ergonomia, a testy własności działają w obu implementacjach, by zweryfikować, że się zgadzają.

Test regresyjny twierdzi, że kanoniczny format na drucie nie zawiera żadnej sekwencji bajtów marki qub poza kluczem pola qub_id prymitywu protokołu. Format na drucie jest celowo neutralny względem marki — każdy zgodny widz (nasz lub strony trzeciej) może renderować każdy qub z trwałego magazynu, niezależnie od tego, które wdrożenie go zapieczętowało. Test jest tripwirem, który zapobiega przyszłej zmianie przed przypadkowym zaszyciem odniesienia marki w bajty, które, gdy są w trwałym magazynie, nie mogą być przepisane.

3.4 Haszowanie ciała i integralność przed ujawnieniem

Każdy zapieczętowany ładunek zawiera skrót SHA3-256 surowych bajtów swojego ciała. Skrót jest powiązany z qub_id a kiedy włączone jest podpisywanie autorstwa, do pola podpisu V2. Przeglądarka ponownie oblicza go po odszyfrowaniu i odrzuca niezgodność.

32-bajtowy identyfikator zawartości qub_id pochodzi z 108-bajtowego wstępnego obrazu obejmującego wersję protokołu, typ treści, znaczniki czasu utworzenia i odblokowania, opcjonalny znaczek czasowy wyniku (lub jego zerowy sentinel), docelową rundę drand, skrót treści oraz SHA3-256 opcjonalnego tytułu znormalizowanego według NFC. Bramka lub CDN nie mogą zmienić żadnego powiązanego pola w sposób spójny i nadal przejść ponownego wyprowadzenia. Tytuły są ograniczone do 100 punktów kodowych NFC i odrzucane, jeśli należą do wspólnej wrogiej/sterowania klasą punktów kodowych (w tym nadpisania bidi, znaki o zerowej szerokości, blok tagów, BOM, C0, C1 i DEL).

3.5 Podpisywanie (ML-DSA-65)

Podpisywanie autorstwa używa ML-DSA-65 (FIPS 204), znormalizowanego przez NIST schematu podpisu postkwantowego. Celowo wybraliśmy prymityw postkwantowy do podpisywania, ponieważ zapieczętowana treść jest trwała: podpis, który weryfikuje dzisiaj, musi nadal weryfikować dekady później, w tym po tym, jak duże komputery kwantowe staną się praktyczne.

Klucze podpisywania są generowane w przeglądarce. Lokalny sekret jest owinięty w nieekstrakcyjalny klucz WebCrypto przed zapisaniem w IndexedDB. Jeśli używana jest funkcja odzyskiwania po urządzeniu związana z kontem, zaszyfrowany AEAD przenośny pakiet kluczy jest przechowywany po stronie serwera; jego zaszyfrowany klucz tajny jest powiązany z niezmiennym identyfikatorem konta, a serwis weryfikuje publiczną powłokę, ale nie może odszyfrować materiału tajnego. Surowe bajty klucza prywatnego nie są wysyłane na serwer. Klucze publiczne i rekordy poświadczeń są przechowywane w celu weryfikacji i wyświetlania tożsamości.

To samo in-browser deszyfrowanie tlock stosuje się wewnątrz qub embed: gdy zapieczętowany qub jest renderowany przez <qub-embed> na stronie strony trzeciej, deszyfrowanie nadal dzieje się w iframe embed w przeglądarce widza. Embed nie zmienia modelu zaufania — tekst jawny nigdy nie jest odszyfrowywany na serwerze qub.

3.6 Publiczne przypisanie — opt-in

Zapieczętowane quby nie niosą wskaźnika on-chain do swojego twórcy, chyba że twórca wyraźnie wybierze, by go dołączyć. Gdy pieczętujesz quba, aplikacja referencyjna emituje tag magazynu Author (64-znakowy szesnastkowy odcisk palca Twojego klucza publicznego podpisującego) tylko wtedy, gdy "Publiczne przypisanie" jest włączone na etapie wyboru daty. Z wyłączonym przełącznikiem — domyślnie — żaden tag Author nie jest pisany, a qub jest nieprzypisany w trwałym magazynie: nic w magazynie nie łączy uploadu z Twoim pseudonimem, Twoim e-mailem ani Twoimi innymi qubami. Z włączonym przełącznikiem odcisk palca rozwiązuje się do Twojego @handle przez łańcuch atestacji w §6.3 / §10, a odliczanie widza pokazuje "Zapieczętowane przez @{handle}" przed ujawnieniem.

To jest celowa ochrona przed ryzykiem wyliczania, jakie stworzyłby zawsze-włączony tag Author: strona trzecia, która pozna odcisk palca twórcy, mogłaby inaczej przeszukiwać trwały magazyn po tagu i zrekonstruować pełen historyczny dorobek tego twórcy. Opt-in przypisanie zamyka ten kanał — tylko quby, które twórca wyraźnie zdecyduje się przypisać, pojawiają się pod odciskiem palca w trwałym magazynie.

Strona profilu /u/{handle} jest kartą zweryfikowanej tożsamości — pseudonim, opcjonalna nazwa wyświetlana + URL, plakietka "verified email" (bez adresu) i krótka forma kryptograficznego odcisku palca. Nie wymienia qubów twórcy. Odwiedzający, którzy chcą zobaczyć konkretnego quba od twórcy, podążają bezpośrednio za URL dostarczenia tego quba.

3.7 Zewnętrzna warstwa szyfrowania

Nawet po tym, jak deszyfrowanie timelock stanie się matematycznie możliwe — gdy podpis drand dla powiązanej rundy zostanie opublikowany — sama kanoniczna warstwa timelock pozwala indeksatorowi na masowe odszyfrowanie wykrywalnych qubów. Prywatna dostawa zamyka ten kanał poprzez dodatkową warstwę symetryczną wokół danych zaszyfrowanych timelock (Protokół §13). Publiczna dostawa celowo pomija ten wrapper, aby powiadomienia, osadzenia i linki odkrywania mogły działać bez tajnego fragmentu.

Opakowanie używa AES-256-GCM, znormalizowanego przez NIST uwierzytelnionego szyfru, ze świeżym 256-bitowym kluczem K generowanym per qub przez CSPRNG Twojej przeglądarki. K jest związany z qub_id quba jako uwierzytelnione dane dodatkowe, więc klucz z jednego quba nie może być ponownie użyty do deszyfrowania innego quba.

K nigdy nie dociera do naszych serwerów w domyślnym trybie prywatnej przeglądarki. Jest kodowane w fragmencie URL linku do udostępnienia (https://qub.social/c/<tx_id>#<base64url(K)>). Przeglądarki nie przesyłają fragmentów URL do serwerów—RFC 3986 umieszcza fragment poza żądaniem—więc qub.social, bramy magazynowania, CDN i monitorowanie żądań są ślepe na K w tym przepływie. Przechowywane OuterWrapper jest rozpoznawalnym, ustrukturyzowanym CBOR, ale jego uwierzytelnione pole szyfrogramu ukrywa wnętrze SealedQub strukturę i nie można jej otworzyć bez K.

Konsekwencje netto:

Endpoint Worker'a po stronie serwera /api/v1/seal (używany przez agentów AI i innych klientów API) wymaga, aby wywołujący wygenerował K za pomocą CSPRNG, zachował go lokalnie i dostarczył jako wrapper_key_b64url. Worker z konieczności widzi w pamięci zarówno tekst jawny, jak i K na tej wyraźnie zaufanej ścieżce, ale nie utrwala żadnego z nich. Obowiązkowy Idempotency-Key zapobiega utworzeniu drugiego rozliczonego quba przez utraconą odpowiedź, podczas gdy zachowany przez wywołującego K można połączyć z odtworzonym URL bez fragmentu. Różni się to od domyślnej ścieżki przeglądarki, gdzie K nigdy nie dociera do Worker'a, chyba że twórca wyraźnie włączy odzyskiwanie.


4. Transport i krawędź

4.1 TLS

Ruch przeglądarki do qub jest obsługiwany przez HTTPS na krawędzi Cloudflare. Odpowiedzi ustalają HTTP Strict Transport Security (max-age=63072000; includeSubDomains; preload). Dokładna negocjowana wersja TLS i zestaw szyfrów są określane przez aktywną konfigurację edge, a nie przez kod aplikacji. Nie udostępniamy osobno dostępnego serwera źródłowego.

4.2 Bezpieczeństwo treści

Skompilowany klient jest serwowany ze ścisłymi nagłówkami content-type i cache. Powłoka SPA jest pojedynczym originem. Nie osadzamy skryptów stron trzecich dla analityki ani reklamy. Dwa touchpoints stron trzecich w produkcie są obydwa wąsko ograniczone: przepływ zakupu opuszcza SPA całkowicie z pełno-stronicowym przekierowaniem do checkout hostowanego przez Stripe (https://checkout.stripe.com/…) — UI Stripe nigdy nie wykonuje się w naszym originie i nigdy nie widzimy danych karty — a przepływ pieczęci ładuje widget Turnstile Cloudflare, prywatnościowo-zachowującą alternatywę CAPTCHA, którą Cloudflare renderuje wewnątrz własnego sandboxowanego iframe. Żadna ze stron nie może odczytać reszty strony.

Ten qub osadź iframe (serwowany z qub.social/embed/{tx_id} i załadowano na strony osób trzecich przez embed.js) posiada własną Politykę Bezpieczeństwa Treści (Content-Security-Policy). Jej connect-src lista dozwolonych 'self', https://qub.social, https://arweave.net, https://ar-io.dev, https://permagate.io, https://api.drand.sh, i https://drand.cloudflare.com. Ramka iframe działa z sandbox="allow-scripts allow-top-navigation-by-user-activation" (nie allow-same-origin): strona gospodarza nie może odczytać swojego DOM i nie może nawigować po gospodarzu, chyba że po akcji użytkownika.

4.3 CORS i zakres pobierania

Klient przeglądarki wykonuje żądania fetch tylko do:

Cele osadzenia są egzekwowane przez jego CSP. Docelowe miejsca głównej SPA są ustalone w kodzie i konfiguracji oraz testowane przez przeglądarkę i kontrole integracji; Integralność podzasobów nie jest kontrolą celu sieciowego.

Osadzenie pobiera przechowywane bajty przez dozwolone pochodzenia qub/storage, odsłania prywatne dane w przeglądarce używając K z fragmentu URL, oraz pobiera podpisy rund w czasie ujawnienia z dwóch dozwolonych pochodzeń drand. Główna SPA używa zestawu czterech punktów końcowych jako awaryjnego config/drand-endpoints.json (drand.cloudflare.com, api.drand.sh, api2.drand.sh, i api3.drand.sh) tak więc awaria jednego punktu końcowego nie blokuje ujawniania. Osadzony CSP odrzuca połączenia spoza swojej jawnej listy.


5. Infrastruktura po stronie serwera

5.1 Serverless Edge

Nasze API działa w całości na zarządzanym środowisku serverless na krawędzi. Nie ma żadnych maszyn wirtualnych, kontenerów ani trwałych procesów serwera, którymi administrujemy. To dramatycznie redukuje powierzchnię ataku, za którą jesteśmy odpowiedzialni: nie utrzymujemy systemu operacyjnego, serwera WWW ani środowiska uruchomieniowego aplikacji, które musimy łatać.

Stosowany jest osobny middleware public-CORS Access-Control-Allow-Origin: * do następującego ustawionego ścieżki: /embed.js, /embed/v1.js, wszystko pod /embed/; /api/v1/telemetry; /api/v1/openapi.json; wszystko pod /api/v1/qub/ (w tym bajty, metadane, dowód, zaangażowanie, powiadomienie i subtrasy push); wszystko pod /api/v1/log/; publiczne obsługiwanie wyszukiwań pod /api/v1/handle/; a publiczny awatar czyta poniżej /api/v1/identity/avatar/. Jej pozwolenia na lot testowy GET, POST, i OPTIONS z Content-Type nagłówek żądania. Ta powierzchnia oparta na prefiksie jest szersza niż tylko wywołania, które obecnie wykonuje osadzenie, więc każdy obsługujący poniżej tych prefiksów musi nadal wymuszać własną walidację, uwierzytelnianie, limity prędkości i kontrolę nadużyć. Inne ścieżki API zachowują politykę CORS ograniczoną do qub.social.

5.2 Magazyn

Domyślny przepływ komunikatów przeglądarki nie przechowuje tekstu nieszyfrowanego na infrastrukturze qub. Builder /api/v1/seal obsługuje zwykły tekst i K w pamięci, ale nie przechowuje żadnego z nich. Etapowanie Paktu musi przechowywać podpisany, ustrukturyzowany pakt aż do jego współpodpisania, wycofania lub wygaśnięcia. Opcjonalne odzyskiwanie przechowuje zdolność dostarczenia (pełny link zawierający fragment), aby można było ją później odzyskać. W związku z tym nie opisujemy całej warstwy przechowywania jako „tylko metadane”.

5.3 Sekrety

Sekrety (portfele do podpisywania, tokeny dostawcy i klucze HMAC) są dostarczane poprzez powiązania sekretów/platformy/środowiska, a nie przez kontrolę źródła. Komponenty w czasie wykonywania otrzymują tylko te powiązania, których potrzebują. Procedury rotacji i nakładania się są specyficzne dla komponentu; nie twierdzimy, że istnieje jeden uniwersalny mechanizm rotacji automatycznej lub audytowanej.

5.4 Logowanie i telemetria

Strukturyzowane logi JSON są pisane na każde żądanie API z ID korelacji powierzchnionym w nagłówku odpowiedzi X-Request-Id. Telemetria klienta jest anonimowa — bez identyfikatora urządzenia, bez adresu IP, bez podglądu treści. Zdarzenia są buforowane w pamięci i opróżniane w trybie best-effort; nieudane opróżnienie jest odrzucane, nie ponawiane. Telemetria jest zaprojektowana, by być wyłączalna w warstwie sieci bez wpływu na produkt.


6. Uwierzytelnianie

6.1 Logowanie magic-link

Logowanie odbywa się przy użyciu jednorazowego tokena podpisanego HMAC, wysyłanego na Twój adres e-mail. Link jest ważny przez 15 minut, a jego wykorzystanie jest atomowo rejestrowane, więc jednoczesne lub powtórne użycie kończy się niepowodzeniem. W przypadku sukcesu przeglądarka otrzymuje nieprzezroczysty __Host-qub_session ciastko z Secure, HttpOnly, SameSite=Strict, i Path=/ atrybuty.

Sesje mają 30-dniowy limit bezczynności i 90-dniowy absolutny limit, obracają się po 24 godzinach i akceptują tylko bezpośrednio poprzednią generację w ramach 120-sekundowego okresu łaski dla utraconej odpowiedzi. Wrażliwe zmiany konta wymagają uwierzytelnienia w ciągu poprzednich 10 minut. Tajny klucz podpisu HMAC jest powiązaniem z platformą; samo odczytanie tylko metadanych nie generuje ważnego tokena.

6.2 Klucze API (poziom programisty)

Klucze API programisty używają prefiksu qub_sk_ dla łatwego rozpoznania i grepowalności. Każdy klucz:

Endpointy zarządzania kluczami admin są ogrodzone za oddzielnym poświadczeniem admin.

6.3 Atestacja e-mail (podpisywanie autorstwa)

Powiązanie adresu e-mail z kluczem podpisującym wymaga:

  1. Posiadania prywatnego klucza podpisującego (podpisujesz wyzwanie)
  2. Posiadania skrzynki e-mail (wpisujesz 6-cyfrowy kod dostarczony e-mailem)

Każdy sam w sobie jest niewystarczający. Odwołanie jest podpisanym rekordem na Twoim własnym koncie i działa natychmiast; widzowie pobierający atestację widzą stan odwołany i wyświetlają odpowiednio.


7. Płatności

Wprowadzanie i przetwarzanie kart działa w ramach kasy hostowanej przez Stripe. Nigdy nie otrzymujemy numerów kart, dat ważności ani kodów CVC. Przechowujemy identyfikatory klientów i subskrypcji Stripe, stan subskrypcji oraz dane okresowe w rekordach uprawnień/kluczy API, aby można było uzgadniać dostęp, odnowienia, pomiar, anulowania i zwroty. Oświadczenia o prywatności i bezpieczeństwie Stripe regulują sposób przetwarzania danych płatności.

Endpoint pieczęci krzyżowo sprawdza rekord uprawnień przeciwko identyfikatorowi urządzenia i, dla zalogowanych użytkowników, przeciwko powiązanej tożsamości. Uprawnienie nie może być ponownie użyte między urządzeniami bez tego, by użytkownik wyraźnie je przywrócił przez logowanie magic-link.


8. Odporność na nadużycia

8.1 Wykrywanie botów

Przepływ pieczęci jest ogrodzony przez prywatnościowo-zachowującą alternatywę CAPTCHA, która nie używa ciasteczek do śledzenia i nie odciska palca dla reklamy. Nieudane wyzwanie jest odrzucane przez nasz edge Worker przed jakimkolwiek przetwarzaniem po stronie pieczęci.

8.2 Ograniczanie częstotliwości

Ograniczenia częstotliwości są egzekwowane na kilku warstwach:

Liczniki i atomowe żądania są rozproszone między KV, Durable Objects oraz powiązania limitu szybkości platformy zgodnie z wymaganiami spójności punktu końcowego. Żądania objęte limitem szybkości zwracają 429; punkty końcowe, które mogą obliczyć okno ponownej próby, obejmują Retry-After.

8.3 Moderacja treści

Domyślna trasa przesyłania przeglądarki nie może skanować ciała: otrzymuje tylko klienta-zapieczętowany artefakt. Budowniczy /api/v1/seal trasa widzi jawny tekst tymczasowo, a etap przygotowawczy paktu utrzymuje uporządkowane warunki aż do finalizacji, ale te wyjątki zaufania nie przekształcają ogólnej ścieżki przesyłania niewidomej na bajty w skaner treści. Moderacja operacyjna jest lista blokowanych na warstwie przeglądarki: qub znajdujący się na liście odmów jest odrzucany przez naszą przeglądarkę niezależnie od tego, czy przechowywana zawartość jest nadal dostępna. Umieszczenie na liście odmów nie cofa trwałych bajtów, wpisów w dzienniku przejrzystości ani danych w stałej sieci, które zostały już opublikowane.

Zgłoszenia nadużyć są ograniczane częstotliwościowo z użyciem jednokierunkowego hashu IP zgłaszającego; nie przechowujemy IP w jasny sposób w tym celu.


9. Łańcuch dostaw i integralność budowania

9.1 Przypinanie toolchaina

Wersje kompilatora i środowiska uruchomieniowego są przypięte w konfiguracji repozytorium, a zależności są rozwiązywane za pomocą zatwierdzonych plików blokady. CI sprawdza aktualność plików generowanych oraz invariatywność wrażliwą na powtarzalność. Nie twierdzimy jednak, że każdy czysty build jest identyczny bit po bicie na wszystkich obsługiwanych maszynach.

9.2 Linty i analiza statyczna

Workspace włącza nasze najściślejsze grupy lintów na poziomie deny. CI traktuje każde ostrzeżenie — w tym ostrzeżenia o linkach dokumentacji — jako awarię budowania. To jest celowe: używamy ścisłości lintów jako tripwire dla subtelnych regresji.

9.3 Bramki CI

Proces CI obejmuje formatowanie i rygorystyczne lintery; testy Rust, WASM/przeglądarka, Worker, embed i API; sprawdzanie typów; pokrycie kodu; sprawdzanie mutacji/inwariantów; analizę statyczną zależności i procesów; sprawdzanie kluczy i18n, pokrycia, odchyleń i wrogich punktów kodu; świeżość wygenerowanej dokumentacji/API/bazy wiedzy; kontrolę inwentarza dokumentów i linków wewnętrznych; budżety arkuszy stylów i pakietów; oraz walidację OpenAPI. Niektóre kosztowne zadania związane z mutacją są planowane zamiast uruchamiane przy każdym pushu.

Pojedynczy wymagany ci Podsumowanie pozostaje czerwone, jeśli jakiekolwiek wymagane zadanie nie powiedzie się. Workflowy chronionych gałęzi i wdrażania wykorzystują ten wynik zamiast powielania mniejszej bramki bezpieczeństwa.

9.4 Testowanie mutacji

Cotygodniowe zadanie uruchamia testowanie mutacji wobec krytycznych pod względem bezpieczeństwa czystych modułów: haszowanie, kanoniczny CBOR, pieczęć, odblokowanie, newtypes formatu na drucie, walidatory typów protokołu i przestrzeń nazw pseudonimów. Testowanie mutacji odpowiada na pytanie "czy nasz zestaw testów łapie subtelnie zły kod?" — jeśli zmutowana implementacja wciąż przechodzi wszystkie testy, wiemy, że mamy lukę pokrycia testami i adresujemy ją.

9.5 Git hooks

Lokalne hooki (pre-commit, pre-push) odzwierciedlają bramki CI, więc regresje są łapane zanim opuszczą maszynę programisty. Hooki są instalowane przez skrypt repo; nie są obchodzone w naszym workflow, a CI jest autorytatywną bramką, jeśli są pominięte.


10. Testowanie

Krytyczny dla bezpieczeństwa kod niesie trzy rodzaje testów:


11. Higiena gałęzi i wydań

Gałęzie funkcji postępują staging tylko przez pull request Gate 1: wymagane ci zielony, brak nierozwiązanych próśb o zmianę, brak konfliktu scalenia i czyste, sprawdzone drzewo; scalenie jest typu squash-and-delete. main posuwa się naprzód tylko przez Bramę 2 staging → main pull request i zachowuje historię przodków za pomocą commita scalającego. Bezpośrednie wypychanie na gałąź nie jest procesem wydania.

Wdrażanie na środowisko staging i produkcyjne jest wyzwalane z odpowiedniego chronionego staging i main gałęzie stanu po CI. Kod z pull requestów i dane uwierzytelniające fork nie otrzymują sekretów wdrożeniowych.

Sekrety używane w przepływach wdrożenia są ograniczone do środowiska wdrożenia przez naszą platformę CI. Nie są dostępne dla przepływów żądań ściągnięcia z forków.


12. Skoordynowane ujawnienie

Jeśli sądzisz, że w qub istnieje podatność bezpieczeństwa, chcemy o tym usłyszeć szybko i zobowiązujemy się obsłużyć zgłoszenie profesjonalnie.

Potwierdzamy otrzymanie w ciągu trzech dni roboczych i utrzymujemy Cię informowanym, gdy badamy. Za Twoją zgodą przypisujemy zgłaszających w notach wydania.

12.1 Safe Harbor

Jeśli Twoje badanie przestrzega reguł powyżej (badanie w dobrej wierze, brak szkody dla innych użytkowników lub usługi, rozsądne okno ujawnienia), nie podejmiemy działań prawnych przeciwko Tobie i nie poprosimy o to organów ścigania. Traktujemy Twoją pracę jako autoryzowane testowanie i wolelibyśmy, by błąd znalazł ktoś z badaczy bezpieczeństwa niż atakujący.

Ten Safe Harbor stosuje się do:

Nie stosuje się do socjotechniki członków zespołu qub, testów denial-of-service ani uzyskiwania dostępu do danych innych użytkowników poza tym, co potrzebne do zademonstrowania problemu. Jeśli nie jesteś pewny, czy coś mieści się w Safe Harbor, zapytaj najpierw z tym samym prefiksem tematu [SECURITY].


13. Uczciwe ograniczenia

Bezpieczeństwo jest praktyką, nie stanem. Pewne ograniczenia warto wymienić bezpośrednio:


14. Zmiany w tej stronie

Materialne zmiany są oznaczone aktualizacją daty wejścia w życie na górze. Tam, gdzie zmiana odzwierciedla konkretne ulepszenie bezpieczeństwa, opisujemy ją krótko w publicznym changelogu. Tam, gdzie zmiana odzwierciedla wyjaśnienie polityki, opisujemy, co się zmieniło i dlaczego.

Dla pytań o cokolwiek na tej stronie, napisz na support@qub.social z prefiksem tematu [SECURITY].


15. Dziennik zmian

Wersja Data wejścia w życie Podsumowanie
1.1 23 września 2026 Uzgodniono twierdzenia kryptograficzne, tryby dostarczania, przechowywanie, CSP, sesje, klucze API, płatności, CI i proces wydawniczy z wdrożonym systemem.
1,0 2 maja 2026 Publikacja wstępna.