Przejdź do treści
megapromotingPorozmawiajmy

Ekspertyza · Cyberbezpieczeństwo

Bezpieczeństwo aplikacji, które budujemy i obsługujemy — kontrole zapisane w kodzie, weryfikowalne z zewnątrz, bez certyfikacji, której nie posiadamy.

Prace obejmują bezpieczeństwo aplikacji i inżynierię prywatności: nagłówki i politykę treści, ograniczanie liczby żądań, domyślny stan „zamknięty” weryfikacji, szyfrowanie sekretów, dzienniki, których nie da się przepisać, anonimizację danych oraz terminy retencji zapisane w kodzie, a nie tylko w polityce. Nie jesteśmy certyfikowanymi audytorami i nie wystawiamy certyfikatów.

Już zbudowaneWybrałem „dostarczone” dla celowo wąskiej dziedziny, a ograniczenie zapisujemy przed listą możliwości. Kontrole opisane niżej działają w systemach własnych i część da się już teraz zweryfikować z zewnątrz: limit rate pokazuje się przy dwunastu kolejnych żądaniach (dziesiąte dostaje 429, sprawdzone na produkcji 06.09.2026), sonda zdrowia zwraca wyłącznie wartości logiczne, a nagłówki bezpieczeństwa odczytuje się z odpowiedzi. Druga i trzecia przytoczona implementacja to platforma sesizari — polityka treści z wartością jednorazową na odpowiedź, biała lista docelowych sieci zweryfikowana w ciągłej integracji, obowiązkowe uwierzytelnianie dwuetapowe dla personelu — oraz klient podpisu elektronicznego napisany bez żadnej nowej zależności, z ochroną przed opakowaniem podpisu XML. Czego NIE potwierdza dowód: nie mamy żadnej certyfikacji, nie świadczymy usług testów ofensywnych, nie prowadzimy centrum monitoringu i nie wydajemy atestów zgodności.

Większość luk, które znaleźliśmy we własnych systemach, nie była wyrafinowanymi exploitami. Były to wartości domyślne. Trasa inicjująca połączenie telefoniczne do dowolnego numeru, bez uwierzytelniania, z której żadna komponenta interfejsu już od dawna nie korzystała. Sprawdzenie pochodzenia, które przechodziło, gdy lista była pusta. Pełny adres IP wysyłany w wiadomości powiadomienia, podczas gdy strona publiczna obiecywała anonimizację. Wszystkie trzy były zapisane w naszym kodzie i żadnej z nich nie wykryłby automatyczny skaner.

Stąd bierze się forma usługi. Nie sprzedajemy raportu ze skanowania. Czytamy kod z precyzyjnym pytaniem: gdy to sprawdzenie nie może zdecydować, co robi — zezwala czy odmawia? Domyślna pozycja to różnica między bramą a dekoracją. W naszych systemach brama konsumpcji zwraca „niedozwolone” przy wyjątku, a trasa połączenia telefonicznego odpowiada 404, jeśli sekret nie jest skonfigurowany — czyli funkcja jest wyłączona, jeśli ktoś nie uruchomił jej celowo.

Druga połowa pracy to inżynieria poufności, bo w praktyce tych dwóch rzeczy nie da się rozdzielić. Publicznie deklarowany okres przechowywania nic nie znaczy, jeśli nie jest egzekwowany przez kod. U nas dziennik żądań usuwa pliki starsze niż zadeklarowany okres, przy czym liczba dni pochodzi z tej samej wartości, która widnieje w opublikowanej polityce. W innym systemie tabela retencji przechowuje obok każdego terminu opublikowany tekst, słowo w słowo, oraz podstawę prawną — tak, aby polityka i baza danych nie mogły po cichu od siebie odbiegać.

To, co publikujemy o sobie, jest częścią metody. Polityka treści tej strony pozwala na `unsafe-inline` i `unsafe-eval` w skryptach. To rzeczywista słabość i zapisujemy ją tutaj, nie w raporcie wewnętrznym — to właśnie ten mechanizm pozwolił naszemu własnemu audytowi dostępności wstrzyknąć narzędzie weryfikacyjne bezpośrednio na stronę produkcyjną. Dostawca, który nie publikuje własnych znanych słabości, nie ma jak znaleźć Twoich.

Co obejmuje

Praca, komponent po komponencie

Czytamy domyślną pozycję każdej weryfikacji

Centralne pytanie analizy: gdy weryfikacja nie może zdecydować, zezwala czy odmawia? Prawdziwy przykład z własnego kodu, oznaczony jako taki: lista dozwolonych źródeł widżetu przepuszcza sprawdzenie, jeśli lista jest pusta — świadomy wybór zgodności ze starszymi instalacjami, zapisany w komentarzu, ale oznaczający, że ograniczenie do domeny trzeba skonfigurować jawnie przy każdej implementacji. Kontrprzykład: brama konsumpcji, która przy każdym wyjątku zwraca „niedozwolone”.

Prawidłowe ograniczenie liczby żądań za proxy

Dziesięć żądań na minutę na adres, z subtelnością, która decyduje, czy ograniczenie działa, czy nie: klucz bierze się z ostatniego skoku nagłówka przekierowania, a nie z pierwszego. Nasz proxy dodaje prawdziwy adres na końcu tego, co wysłał klient, więc pierwszy wpis jest kontrolowany przez atakującego — kto oprze klucz na nim, może przekroczyć limit, wysyłając losowe wartości. Można to zweryfikować z zewnątrz: dwanaście kolejnych żądań daje dziewięć udanych odpowiedzi, a potem 429.

Nagłówki i polityka treści, z jedną wartością na odpowiedź tam, gdzie się da

Na tej stronie: ścisły transport na dwa lata z subdomenami i wpisem do listy preloading, typ treści niededukowalny, restrykcyjna polityka referrera, polityka uprawnień, która zamyka kamerę i pozostawia mikrofon oraz lokalizację tylko dla własnej strony. Na platformie zgłoszeń, jeszcze bardziej rygorystycznie: polityka treści otrzymuje jedną wartość przy każdej odpowiedzi, generowaną w proxy, bez źródeł zewnętrznych dla skryptów, połączeń ani czcionek, a osadzanie w ramce jest całkowicie odrzucane.

Biała lista docelowych adresów sieciowych, weryfikowana automatycznie

W projekcie publicznym to, z jakimi adresami aplikacja może się kontaktować, jest listą weryfikowaną przez komendę uruchamianą w ciągłej integracji, zarówno statycznie, jak i w czasie wykonania. Nowy pakiet, który zaczyna dzwonić do domu, odpada podczas weryfikacji, nie w produkcji. To kontrola, która wychwytuje dokładnie tę klasę incydentów w łańcuchu dostaw, przed którą nikt nie chroni się skanerem podatności.

Sekrety nie trafiają do odpowiedzi, logów ani powiadomień

Sonda stanu formularza kontaktowego zwraca wyłącznie wartości logiczne — czy jest skonfigurowany, czy uwierzytelnienie jest poprawne, czy dziennik da się zapisać — nigdy token, identyfikator rozmowy ani nazwę bota. Tokeny kanału platformy komunikacyjnej są przechowywane zaszyfrowane. Logi alertów przechodzą przez moduł redakcji danych osobowych przed zapisaniem.

Anonimizacja stosowana przed zapisaniem, nie po

Adres IP jest skracany do prefiksu sieci — /24 dla IPv4, /48 dla IPv6 — przed trafieniem do dziennika lub do powiadomienia. Z dwoma ważnymi szczegółami: bierze się ostatni skok, nie pierwszy, z tego samego powodu co przy ograniczaniu liczby żądań; a adresy IPv4 zgłaszane w formie mapowanej IPv6 są rozpoznawane i traktowane jak IPv4, w przeciwnym razie byłyby zachowywane w całości, czyli dokładnie odwrotnie niż zamierzenie.

Dziennik, który dodaje, nie przepisuje

Zgłoszenia przez formularz są zapisywane do dziennika dopisywanego, jeden obiekt na linię, z uprawnieniami 0600 dla pliku i 0700 dla katalogu, przed próbą dostarczenia. Powód to rzeczywista awaria: gdy kanał powiadomień padł, endpoint zwracał 500 i każde zgłoszenie ginęło bez śladu. Teraz zepsuty kanał oznacza „trzeba zajrzeć do pliku”, a nie „żądanie nigdy nie istniało”. Wynik dostarczenia jest zapisywany jako druga linia, z tym samym identyfikatorem.

Okres przechowywania stosowany przez kod, nie tylko deklarowany

Dziennik zgłoszeń usuwa pliki starsze niż publicznie zadeklarowany termin, z liczbą dni pobraną z tej samej wartości. W innym systemie tabela retencji przechowuje obok każdego terminu tekst opublikowany słowo w słowo oraz podstawę prawną, a funkcja czyszczenia domyślnie raportuje, co usunęłaby; rzeczywiste usunięcie wymaga jawnego argumentu. Ciche usuwanie jest trybem błędu, nie funkcją.

Tożsamość i podpis, gdy projekt tego wymaga

Mamy od podstaw i bez nowych zależności napisany dostawcę usług do uwierzytelniania federacyjnego oraz klienta do podpisu elektronicznego. Analizator XML nie przetwarza definicji typu dokumentu, więc klasa ataków przez zewnętrzne encje nie ma zastosowania; weryfikacja podpisu zwraca węzeł objęty podpisem, a nie wartość logiczną, a wywołująca strona ma obowiązek porównać tożsamość obiektu — obrona przed podmianą podpisu. Kanonikalizacja została sprawdzona na oficjalnych wektorach specyfikacji.

Jak to wygląda

Trasa, krok po kroku.

01

Ustalamy zakres i czego nie wolno nam dotykać

Na piśmie, przed każdym poleceniem: jakie systemy, jaki okres, jakie rodzaje weryfikacji są dozwolone i kto jest osobą kontaktową, jeśli coś się zatrzyma. Dostarczamy: podpisany dokument zakresu i listę systemów wyłączonych.

02

Czytamy kod i konfigurację, ze szczególnym uwzględnieniem pozycji domyślnej

Kontrole, które nie mogą rozstrzygnąć, sekrety trafiające do odpowiedzi lub dzienników, trasy, których już nikt nie wywołuje, ale pozostają otwarte, brakujące nagłówki. Dostarczamy: ustalenia z plikiem i linią, uporządkowane według tego, co można z nimi zrobić, a nie według teoretycznej wagi.

03

Naprawiamy albo dokładnie opisujemy naprawę

Tam, gdzie mamy dostęp, wprowadzamy kontrolę i piszemy test, który ją utrzymuje — kontrola bez testu ginie przy pierwszej refaktoryzacji. Tam, gdzie nie mamy dostępu, dostarczamy zmianę opisaną na tyle precyzyjnie, by zespół klienta mógł ją zastosować bez ponownego kontaktu z nami.

04

Łączymy poufność z kodem

Termin przechowywania, anonimizacja i lista odbiorców stają się wartościami w kodzie, z opublikowanym tekstem obok. Dostarczamy: uzupełniony rejestr czynności przetwarzania, z wypełnioną kolumną „gdzie jest zaimplementowane”, oraz listę pozostających do ustalenia punktów, z tym, kto decyduje o każdym z nich.

05

Sprawdzamy z zewnątrz to, co da się sprawdzić z zewnątrz

Nagłówki, zachowanie graniczne, co zwracają sondy stanu. Dostarczamy: dokładne komendy weryfikacyjne, tak aby każda osoba — w tym audytor klienta — mogła powtórzyć sprawdzenie bez nas.

Warstwy, których dotykamy, od góry do dołu1nagłówki i polityka treści2ograniczenie szybkości z kluczem pobranym z ostatniego skoku3uwierzytelnianie, role i separacja według organizacji stosowana wpodstawie4zaszyfrowane sekrety, nigdy w odpowiedziach ani dziennikach5dziennik z dodawaniem i anonimizacją stosowaną przed zapisem6okres przechowywania zastosowany przez kod, wraz z opublikowanym obok tekstem
Warstwy, których dotykamy, od góry do dołu

Dane

Czego dotykamy, gdzie to leży i jak długo zostaje

Pytania, które zadaje każdy, kto ma inspektora ochrony danych — postawione tutaj, zanim on je zada.

Co obejmujemy w analizie
Kod, konfiguracja serwera, nagłówki odpowiedzi i, gdzie ma to zastosowanie, schemat bazy danych oraz polityki dostępu wiersz po wierszu. Nie potrzebujemy rzeczywistych danych klientów, aby przeprowadzić analizę, i wolimy w ogóle ich nie dotykać.
Czego nie robimy bez domeny autoryzowanej na piśmie
Żadnych działań, które generują ruch przeciwko działającemu systemowi. Sprawdzenia na produkcji, które pojawiają się na tej stronie, są zwykłymi żądaniami odczytu, na naszych własnych systemach. Każde przekroczenie tego limitu wymaga pisemnej autoryzacji, z okresem i adresami, podpisanej przez osobę uprawnioną do jej wydania.
Gdzie trafiają ustalenia
W dokumencie z jednym ustaleniem w każdym wierszu: gdzie się znajduje, co można z tym zrobić, co dokładnie to naprawia i jak weryfikuje się naprawę. Ustalenia opisujące ścieżkę wykorzystania nie krążą przez niezabezpieczone kanały i nie trafiają do materiałów publicznych przed naprawą.
Rejestr przetwarzania
W części dotyczącej poufności wynik to rejestr z jednym wierszem na działalność: cel, podstawa, kategorie danych, odbiorcy, transfery, lokalizacja przechowywania, termin, środki oraz plik w kodzie, w którym to jest zaimplementowane. To, czego nie udało się zweryfikować, zapisuje się jako „niezweryfikowane”, nie uzupełnia się tego z szablonu.
Reguła, która trzyma politykę przyklejoną do kodu
Jeśli zmiana kodu zmienia to, co jest zbierane, do kogo trafia albo jak długo jest przechowywane, opublikowana polityka zmienia się w tym samym kroku wydania. Rozbieżność między opublikowaną polityką a kodem była dokładnie problemem, który skłonił nas do napisania własnego rejestru.

Przykład

Zapomniana trasa, która mogła dzwonić do kogokolwiek

Sytuacja

Podczas przeglądu własnej strony natrafiliśmy na trasę interfejsu programowania, która inicjowała połączenie telefoniczne do dowolnego numeru przesłanego w treści żądania. Bez uwierzytelniania, na koszt i z numeru firmy. Żaden komponent interfejsu już jej nie wywoływał — jedynym wywołującym był element, który już się nie wyświetlał. Czyli działała otwarcie w internecie, bez powodu, by ktokolwiek miał się jej przyglądać.

Co zbudowaliśmy

Potraktowaliśmy to jako dwa problemy, nie jeden. Technicznie: trasa teraz wymaga współdzielonego sekretu w nagłówku, a jeśli sekret w ogóle nie jest skonfigurowany, zwraca 404 — funkcja jest wyłączona, jeśli ktoś jej celowo nie włączy, a nie włączona, dopóki ktoś jej nie wyłączy. Prawnie i etycznie: automatyczne niezamówione połączenie to przetwarzanie danych, którego osoba wywoływana nie zażądała, więc zapisaliśmy w rejestrze, co byłoby potrzebne do ewentualnej reaktywacji — udokumentowaną podstawę względem osoby wywoływanej, ewidencję zgody i kanał sprzeciwu.

Co z tego wyszło

Funkcja jest domyślnie wyłączona i pozostaje wyłączona, dopóki ktoś nie podejmie wyraźnej decyzji. Wiersz w rejestrze przetwarzania opisuje stan, poprzedni stan, ryzyko i warunki reaktywacji — więc kolejna osoba, która znajdzie trasę, nie musi odtwarzać rozumowania.

Czego nie mówi ten przypadek

Nie odkryliśmy tego za pomocą narzędzia. Znaleźliśmy to, czytając trasy jedna po drugiej i pytając, przy każdej, kto ją wywołuje. Automatyczny skaner zobaczyłby trasę, która zwraca 400 na puste żądanie, i przeszedłby dalej. To też ograniczenie metody: obejmuje to, co czytamy, a to, czego nie czytamy, pozostaje nieobjęte — dlatego zakres ustala się na piśmie.

Pytania

O co pytają ludzie, zanim zadzwonią

Czy macie certyfikaty bezpieczeństwa?

Nie. Ani ISO 27001, ani SOC 2, ani certyfikacji testów ofensywnych, ani akredytacji audytora. Nie wydajemy certyfikatów i nie podpisujemy atestów zgodności. To, co możemy pokazać, to własna praktyka, z plikiem i linią, oraz kontrole, które wprowadziliśmy w działających systemach. Jeśli potrzebujesz certyfikatu do akt, potrzebujesz akredytowanej jednostki, nie nas — i lepiej wiedzieć to teraz.

Czy wykonujecie testy penetracyjne?

Nie jako usługi. Nie mamy zespołu do testów ofensywnych, licencji ani certyfikowanej metodologii i nie udajemy, że je mamy. Robimy analizę kodu i konfiguracji, plus nieinwazyjne sprawdzenia z zewnątrz — nagłówki, zachowanie na limicie szybkości, to, co ujawniają odpowiedzi błędów. Jeśli projekt wymaga prawdziwych testów ofensywnych, potrzebujesz wyspecjalizowanej firmy; możemy pracować obok niej nad naprawą.

Co znaleźliście we własnych systemach?

Trzy rzeczy, w jeden dzień analizy, wszystkie opisane publicznie w naszym rejestrze. Trasa, która inicjowała połączenie telefoniczne do dowolnego numeru z treści żądania, anonimowo, bez uwierzytelniania, której żadna komponenta interfejsu już nie wywoływała — teraz zwraca 404, jeśli sekret nie jest skonfigurowany, czyli jest wyłączona, jeśli ktoś nie uruchomi jej celowo. Widget rozmowy, który ładował się przy każdym widoku i zapisywał sesję w pamięci przeglądarki, zanim odwiedzająca osoba o cokolwiek poprosiła — teraz ładuje się po naciśnięciu przycisku. I pełny adres IP wysyłany w powiadomieniu, podczas gdy publiczna strona obiecywała anonimizację — teraz jest skracany przed zapisaniem.

Wasza polityka treści dopuszcza `unsafe-eval`. Dlaczego miał(a)bym wam wierzyć?

Bo to my wam powiedzieliśmy, a nie wy się o tym dowiedzieliście. Tak, polityka tej strony dopuszcza `unsafe-inline` i `unsafe-eval` w skryptach — to realna słabość, odziedziczona po sposobie ładowania niektórych skryptów zewnętrznych, i to właśnie ten mechanizm sprawił, że nasz własny audyt dostępności wstrzyknął narzędzie kontrolne do produkcyjnej strony. W projekcie, gdzie ograniczenie ustalamy od początku, poprawna forma jest taka jak na platformie sesizari.md: unikalna wartość dla każdej odpowiedzi generowana w proxy i brak zewnętrznych źródeł skryptów. Różnica między tymi dwiema rzeczami to dokładnie rozmowa, którą trzeba odbyć na początku projektu, nie na końcu.

Jak mam sprawdzić, bez wiary na słowo, że ograniczenie liczby żądań działa?

Wysyłając dwanaście kolejnych żądań do trasy interfejsu programowania tej strony i licząc odpowiedzi: pierwsze dziewięć przechodzi, dziesiąte dostaje 429 z nagłówkiem mówiącym, po jakim czasie można spróbować ponownie. Okno wynosi jedną minutę. Polecenie jest na liście źródeł tej strony i można je uruchomić teraz. Tę samą zasadę stosujemy do tego, co dostarczamy: jeśli jakiegoś kontrolnego mechanizmu nie da się zweryfikować z zewnątrz przez klienta, nie jest dostarczany, jest deklarowany.

Co dzieje się z danymi osobowymi z formularza?

Są zapisywane do dziennika dopisywanego, jeden obiekt na linię, z ograniczonymi uprawnieniami do pliku i katalogu, zanim zostanie podjęta próba dostarczenia — żeby uszkodzony kanał powiadomień nie sprawił, że żądanie zniknie. Adres IP jest skracany do prefiksu sieci przed zapisaniem. Starsze pliki niż zadeklarowany termin są usuwane, przy czym liczba dni jest pobierana z tej samej wartości, która widnieje w opublikowanej polityce. A wiersz w rejestrze przetwarzania mówi, dla każdego elementu, w którym pliku kodu jest zaimplementowany.

Czy możecie zrobić uwierzytelnianie z państwową tożsamością elektroniczną albo podpisem elektronicznym?

Kod istnieje i jest przetestowany, ale nigdzie nie jest aktywowany w produkcji, a ta różnica ma znaczenie. Mamy napisany dostawcę usług do uwierzytelniania federacyjnego i klienta podpisu, oba bez nowych zależności, z wdrożonymi właściwymi zabezpieczeniami i testami. To, czego brakuje, nie dotyczy kodu: umowy z organem, certyfikatu systemu i rejestracji adresu produkcyjnego. Do tego czasu działająca dziś wersja jest taka, w której obywatelka albo obywatel podpisuje na oficjalnym portalu i wgrywa z powrotem podpisany dokument.

Jakie kontrole zwykle umieszczacie w nowej aplikacji?

Nagłówki i polityka treści z unikalną wartością dla każdej odpowiedzi; ograniczenie liczby żądań z kluczem pobieranym poprawnie zza proxy; separacja według organizacji stosowana w bazie, nie tylko w aplikacji; szyfrowane sekrety i nigdy w odpowiedziach ani dziennikach; klucze idempotencji dla zdarzeń od podmiotów trzecich; obowiązkowe uwierzytelnianie dwuskładnikowe dla kont personelu; dziennik audytu z osobną widocznością dla wewnętrznej i publicznej strony; oraz, dla projektów publicznych, automatycznie sprawdzana przy każdym wydaniu biała lista docelowych adresów sieciowych.

Czego nie obejmuje ta usługa?

Bezpieczeństwa sieci korporacyjnej, sprzętu użytkowniczek i użytkowników, ciągłego monitorowania w stylu centrum operacyjnego, reakcji na incydenty 24/7, analizy kryminalistycznej ani szkolenia przeciw phishingowi. To nie są rzeczy, które robimy źle — to rzeczy, których nie robimy. Naszym zakresem jest aplikacja, którą budujemy lub przejmujemy, plus dane, które przez nią przechodzą.

Na czym opierają się powyższe stwierdzenia (24 źródeł)
  1. Zweryfikowano na produkcji: 12 kolejnych żądań daje 9 odpowiedzi 200, potem 429https://www.megapromoting.com/api/health/contact · 2026-09-06
  2. Nagłówki na produkcji: ścisły transport (HSTS) 63072000 s z subdomenami i preload, niededukowalny typ treści, ograniczona polityka referrera, polityka uprawnień zamykająca kamerę; osadzanie w ramce jest całkowicie odrzucane na endpointach API i ograniczone do tego samego pochodzenia na stronachhttps://www.megapromoting.com/api/health/contact · 2026-09-06

22 z nich to kod i pliki z naszych repozytoriów. Nie publikujemy ich nazw ani numerów linii: razem, na jednej stronie, opisałoby to zbyt dokładnie, jak zbudowane są systemy, które nie należą tylko do nas. Przechodzimy je razem z Tobą, w repozytorium, na życzenie — weryfikacja pozostaje możliwa, tylko odbywa się w rozmowie.

Co chcesz, żeby działało lepiej?

Opowiedz nam o swoim procesie. Wspólnie ustalimy, co warto zbudować, co da się połączyć i jak sprawdzimy wynik.

Porozmawiajmy