WAF i ochrona przed wtryskiem
1) Dlaczego WAF w epoce API
Nawet przy rygorystycznej walidacji i parameteryzacji, wstrzyknięcia występują z powodu:- „długie ogony” integracji (dotychczasowy kod, haki powiązane),
- rozbieżności sparingowe (ramy pośredniczące),
- nowe techniki obwodnicy protokołu/obwodnicy.
- WAF daje wczesne zaprzeczenie i „wirtualne łatanie” granicy przed wydaniem kodu, ale nie zastępuje bezpiecznego rozwoju.
2) Model zagrożenia: Typy wtrysku API
SQLi/ORMi: classic/boolean/time-based/stacked; ślepy przez opóźnienia.
NoSQLi (Mongo/Elastic): operator '$ ne/$ gt', JSON injection, regex-DoS.
Command Injection/RCE: metacharacters shell, substitution argument, unsafe deserialization → code exec.
XXE: podmioty zewnętrzne/systemy gwarancji depozytów w XML.
SSRF: dostęp do '169. 254. 169. 254 "/usługi wewnętrzne; DNS-rebinding.
Wzór wstrzyknięcia: Jinja/Thymeleaf/Handlebars; '{{77}}'.
LDAP/EL Injection, XPath, Header Injection (CRLF), Path traversal.
Specyficzne dla GraphQL: introspekcja „__ schemat”, głębokość/złożoność zapytań.
Specyficzne dla JSON/JS: zanieczyszczenie prototypem („__ proto __”, „konstruktor”).
gRPC/Protobuf: nadmiar wiadomości, przemyt pola przez niedopasowanie schematu.
3) architektury WAF
Obwód CDN-WAF: szybkie filtrowanie geo/ASN, podstawowa kontrola bot, pamięć podręczna/anti-padding.
Obwód L7 (NGINX/Envoy/APISIX/Kong): dokładne parsowanie, głębokie zasady, integracja z PDP/limity.
Sidecar/mash (Envoy WASM/Filter): per-service, close to the data, less false positive for internal API.
Zalecenie: model dwuwarstwowy (CDN-WAF + L7 WAF).
4) Parsing, normalizacja i anty-obwodnica
WAF powinien zobaczyć tę samą reprezentację kanoniczną co wniosek:- Normalizacja ścieżki ('/a/% 2e% 2e/b '→ awaria),' UTF-8 '/Unicode confusables, NUL bytes.
- Pojedyncze dekodowanie: URL-/HTML-/Unicode-/Base64-layers, zakaz podwójnego dekodowania.
- Ograniczenia: 'max _ headers', 'max _ header _ size', 'max _ body _ size', 'max _ args', JSON depth, multipart limit, 2x gzip/zip bombs prohibited.
- Zasady dotyczące typu treści: „aplikacja/json” tylko w punktach końcowych JSON; odrzucić „poliglot”.
5) Modele reguł
Negatywne (podpisy): OWASP CRS (SQLi/XSS/SSRF/Java/Node RCE itp.). Szybki start.
Pozytywne (lista zezwoleń): rygorystyczne schematy (schemat JSON/Protobuf), rodzaje i zakresy; na trasach.
Nieprawidłowe/punktacja: podsumowanie „podejrzanych” objawów → próg blokowania.
Kontekst: różne profile „POST/płatności” i „GET/status”; mniej FP.
6) Jednostki zabezpieczające (w pakiecie)
1. Schematy i typy: JSON Schemat/Protobuf walidacja do logiki biznesowej.
2. Parameteryzacja: gotowe wyrażenia, wiązania ORM, zakaz konkatenacji.
3. Wyjście-ucieczka: HTML/JS/SQL kontekst.
4. Polityka ciała: Content-Type, rozmiar, ograniczenia multiart, zakaz binariów na uchwytach JSON.
5. Zasady WAF: CRS + niestandardowe negatywne/dodatnie.
6. Wskaźnik/Kwota/Równoczesność: tłumienie brute/żółw DDoS, uchwyty ochronne/wyzwania dla form publicznych.
7. Izolacja sieci: polityka wyjścia dla SSRF (odmowa RFC1918/metadata/Unix gniazd).
8. Higiena nagłówków: „X-Content-Type-Options: nosniff”, „Content-Security-Policy” dla front, „Referrer-Policy”.
9. GraphQL guard: granice głębokości/złożoności, zakaz introspekcji w prod (lub role-gate).
7) Przykłady konfiguracji
7. 1 NGINX + ModSecurity (OWASP CRS)
nginx load_module modules/ngx_http_modsecurity_module.so;
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
modsecurity_rules '
SecRuleEngine On
Подключаем CRS
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/.conf
Позитивные правила: только JSON и ограничение размера
SecRule REQUEST_HEADERS:Content-Type "!@rx ^application/json($;)" "id:10001,phase:1,deny,status:415,msg:'Only JSON allowed'"
SecRequestBodyLimit 1048576
SecRequestBodyNoFilesLimit 1048576
Блок локальных адресов (SSRF)
SecRule REQUEST_HEADERS:Host "@ipmatch 127.0.0.0/8 10.0.0.0/8 169.254.0.0/16 192.168.0.0/16" \
"id:10002,phase:1,deny,status:403,msg:'Blocked private range'"
';
server {
listen 443 ssl http2;
server_name api.example.com;
client_max_body_size 1m;
proxy_request_buffering on; # защита от slow-POST proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
location /v1/ {
proxy_pass http://app_backends;
}
}
7. 2 Wysłannik HTTP WAF (WASM + JSON Schema + SSRF egress-odmowa)
yaml http_filters:
- name: envoy.filters.http.wasm typed_config:
config:
vm_config: { vm_id: waf, code: { local: { filename: /plugins/waf.wasm } } }
configuration:
"@type": type.googleapis.com/google.protobuf.Struct value:
crs_profile: "strict"
deny_patterns: ["(?i)union.select", "(?i)(sleep benchmark)\\s\\("]
json_schema:
"/v1/payments:create": "/schemas/payments_create.json"
- name: envoy.filters.http.router
Egress SSRF guard (L4): deny private ranges from gateway filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy typed_config:
stat_prefix: egress cluster: internet access_log: [...]
tunneling_config:
hostname: "%REQ(:authority)%"
transport_socket:
name: envoy.transport_sockets.tls
7. 3 APISIX: ograniczenie typu i anty-obfuscation
yaml routes:
- uri: /v1/
plugins:
cors: { allow_origins: "https://app.example.com" }
request-validation:
body_schema:
{"type":"object","properties":{"amount":{"type":"number","minimum":1}},"required":["amount"]}
uri-blocker:
block_rules: ["..","%2e%2e","%2f..","\\x00"] # traversal/NULL proxy-rewrite:
headers:
set:
X-Content-Type-Options: "nosniff"
8) Dostrajanie i zmniejszanie fałszywych pozytywów (FP)
Profile na trasie: ścisłe zasady tylko w stosownych przypadkach (np. '/search 'pozwala '/'%').
Tylko cień/raport: odpowiedzi dziennika przed blokiem; Porównanie mierników A/B.
Niestandardowe pozwalają na listy „hałaśliwych” legalnych parametrów.
Punktacja: Blok tylko wtedy, gdy suma wskaźnika> próg.
Eksperymenty: niewielki procent ruchu do nowych zasad → auto-rollback.
9) Obserwowalność i częstość występowania
Метрика: 'waf _ block _ total {rule}', 'waf _ anomaly _ score', 'request _ body _ rejected _ total', 'schema _ violate _ total', 'ssrf _ block _ total'.
Dzienniki (pobrane próbki): reguła, część żądania (edytowana), 'trace _ id',' lokator ',' route ', powód. Ukryj PII/sekrety.
Deski rozdzielcze: górne reguły/ścieżki, klastry FP, dynamika po zwolnieniu.
Incydenty: zapisywanie artefaktów (ładunek użytkowy, pcap w razie potrzeby), produktów RCA i „wirtualnych łatek”.
10) Testowanie i scenariusze chaosu
Obwodnice WAF (SQLi/XSS/SSRF), podwójne/potrójne kodowanie mieszane Unicode.
Różnice w parsowaniu: wyślij ładunek użytkowy, w którym serwer proxy i ramy mogą się różnić (duplikaty parametrów, tablice, ';' vs' & ').
Slow-POST/oversize, bomby zamek błyskawiczny, wieloczęściowe formy, błędna granica.
GraphQL: generator głębokości/złożoności, limity kontrolne i czasowe.
11) Antypattery
„Włączył KSR i zapomniał”: bez schematów, bez dostrajania wzdłuż tras.
Dzienniki z surowym organem żądania i PII.
Brak limitów normalizacji/rozmiaru → obwodnice, DoS do parsowania.
Pominięcie 'Content-Type '/charset checks → ataki poliglotyczne.
Brak filtrów wyjmowania → SSRF do metadanych chmurowych.
Jeden wspólny profil dla zewnętrznych i wewnętrznych API.
Niekontrolowane wyjątki „dla partnera” → otwory w obwodzie.
12) Szczegóły dotyczące iGaming/Finance
Wzmocnione profile na uchwytach płatności/wyjściowych: małe limity nadwozia, rygorystyczne schematy, odrzucanie list dla pól konta/IBAN/PAN (maskowanie, sprawdzanie formatów).
Haki internetowe z PSP/KYC: podpis HMAC/wzajemny TLS, poszczególne profile WAF, anty-replay.
Filtry geo/ASN i ograniczenia behawioralne, aby zapobiec rejestracjom bot i nadużyciom bonusowym.
Dzienniki incydentów są niezmienne (audyt), przechowywanie przez jurysdykcję.
13) Lista kontrolna gotowości Prod
- Podwójna warstwa WAF (CDN + L7), pojedyncza normalizacja i limity wielkości.
- KSR OWASP włączone, niestandardowe zasady na trasie; JSON Schema/Protobuf na długopisach.
- Polityka typu treści/charset; disallow double decoding/NULL/traversal.
- SSRF-egress blok dla prywatnych pasm/metadanych; Ochrona przed buntowaniem DNS.
- Stawka/kwota/Równoczesność i walka z botem (wyzwania) na formularzach publicznych.
- Shadow/Report-Only → canary → enforce; auto-rollback przez SLO i FP.
- Mierniki/kłody/szlaki z maskowaniem; deski rozdzielcze „top rules „/FP.
- Playbooks wirtualnych i RCA; regularne testy obejścia.
- Oddzielne profile dla haków internetowych PSP/KYC, długopisów płatniczych i wewnętrznych interfejsów API.
14) TL; DR
Ochrona budowania przez warstwy: normalizacja i ograniczenia → schematy/typy → parametryzacja → WAF (CRS + caste) → filtry szybkości/bot → SSRF egress block. Tune per-route, uruchom nowe zasady w cieniu → canary, monitoruj mierniki/FP i wykonaj „wirtualne plastry” przed naprawą kodu. Dla ścieżek płatności/webhook - oddzielne ścisłe profile, HMAC/mTLS i minimalne okna zaufania.