WAF והגנה על הזרקה
1) מדוע WAF בעידן ה ־ API
אפילו עם אימות קפדני ופרמטריזציה, זריקות מתרחשות בשל:- ”זנבות ארוכים” של אינטגרציה (קוד מורשת, קובצי רשת משתייכים),
- ניתוחים על אי התאמות (פרוקסי ↔ מסגרת),
- טכניקות מעקף פרוטוקול/ערפול חדשות.
- WAF נותן מכחיש מוקדם ו ”תיקון וירטואלי” גבול לפני שחרור קוד, אבל לא להחליף פיתוח מאובטח.
2) מודל איום: סוגי הזרקת API
SQLi/ORMI: classic/boolean/time-based/staded; עיוור דרך עיכובים.
NOSQLI (מונגו/אלסטי): מפעילים 'ne $/$ gt', הזרקת JSON, Regex-DOS.
הזרקת פקודה/RCE: מטכרקטי מעטפת, החלפת ארגומנטים, עריקה לא בטוחה.
XXE: ישויות חיצוניות/DTD ב ־ XML.
SSRF: גישה לשנת 169. 254. 169. 254 '/שירותים פנימיים; רישום מחדש של DNS.
הזרקת תבנית: Jinja/Thymeleaf/Handlebars; ”[77]”.
הזרקת LDAP/EL, XPath, הזרקת כותרת (CRIF), traversal Path.
הספציפי של GraphQL: ”__ schema” introspection, עומק/מורכבות של שאילתות.
JSON/JS-ספציפי: אב טיפוס זיהום (”__ אב טיפוס __”, ”קונסטרוקטור”).
GRPC/Protobuf: הודעות גדולות מדי, הברחות שדה באמצעות סכימת חוסר התאמה.
3) ארכיטקטורות WAF
היקף CDN-WAF: סינון Geo/ASN מהיר, בקרת בוט בסיסית, מטמון/אנטי ריפוד.
היקפי L7 (NGINX/Enveroy/APISIX/Kong): פירוק מדויק, כללים עמוקים, אינטגרציה עם PDP/limits.
Sidecar/mash (שליח WASM/Filter): לכל שירות, קרוב לנתונים, פחות חיובי שגוי עבור API פנימי.
המלצה: מודל שכבות כפול (CDN-WAF + L7 WAF).
4) ניתוחים, נורמליזציה ואנטי-מעקפים
WAF צריך לראות את אותו ייצוג קנוני כמו היישום:- נורמליזציה של הנתיב ('/a/% 2e% 2e/b 'acclusion),' UTF-8 '/Unicode confusions, NUL bytes.
- פענוח יחיד: URL-/HTML-/Unicode-/Base64-layers, איסור על פענוח כפול.
- הגבלות: ”max _ headers”, ”max _ header _ size”, ”max _ body _ size”, ”max _ args”, ”JSON”, ”multipart limit”, ”2x gzip/zip bombs” אסורות.
- מדיניות תוכן-סוג: 'application/json' רק בנקודות קצה JSON; לדחות ”פוליגלוט”.
5) מודלים כלליים
שלילי (חתימות): OWASP CRS (SQLi/XSS/SSRF/Java/Node RCE, וכו '). התחלה מהירה.
חיובי (Law-list): תרשימים נוקשים (JSON Schema/Protobuf), סוגים וטווחים; על מסלולים.
אבנורמלי/ניקוד: סיכום סימני ”חשוד” = חסימת סף.
קונטקסטואלי: פרופילים שונים עבור 'POST/תשלומים' ו- 'GET/status'; פחות FP.
6) יחידות הגנה (בצרור)
1. סכימות וסוגים: JSON Schema/Protobuf תוקף ללוגיקה עסקית.
2. פרמטריזציה: ביטויים מוכנים, קישורי ORM, איסור עיכוב.
3. בריחת פלט: HTML/JS/SQL קונטקסטואלי.
4. מדיניות גוף: Content-Type, גודל, Multipart Drivates, איסור על כליאה על ידיות JSON.
5. כללי WAF: CRS + מותאם אישית שלילי/חיובי.
6. Rate/Quota/Concurrency: braute/turtle DDOS Dupersion, Captchas/Defensive Agress עבור צורות ציבוריות.
7. בידוד רשת: מדיניות יציאת SSRF (מכחישה שקעים RFC1918/metadata/Unix).
8. כותרות-היגיינה: 'X-Content-Type-Options: Nosniff', 'Content-Security-Policy' לחזית, 'Relrer-Policy'.
9. שומר GraphQL: גבולות של עומק/מורכבות, איסור על אינטרוספקציה בפרוד (או שער תפקידים).
7) דוגמאות הגדרות
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 שליח HTTP WAF (WASM + JSON Schema + SSRF Egress-design)
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: הגבלת סוג ואנטי-ערפול
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) כוונון והפחתת חיוביות כוזבות (FP)
פרופילים לכל מסלול: כללים נוקשים רק במקום המתאים (למשל: '/חיפוש 'מאפשר '/'%'.
צל/דיווח-בלבד: רישום תגובות לפני הבלוק; השוואה של מדדים.
הרשימות מותאמות אישית עבור פרמטרים לגיטימיים ”רועשים”.
ניקוד: חסם רק כאשר מחוון סכום> סף.
ניסויים: אחוז קטן של תנועה לחוקים חדשים.
9) יכולת תצפית ושכיחות
”waf _ block _ total _ rule”, ”waf _ anomaly _ score”, ”request _ body _ נדחה _ total”, ”ssrf _ block _ total”.
לוגים (דגימה): כלל, חלק מהבקשה (עריכה), 'עקבות _ id',' דייר ',' מסלול ', סיבה. הסוואה של סודות מח "ש.
לוחות מחוונים: כללים/נתיבים עליונים, אשכולות FP, דינמיקה לאחר השחרור.
תקריות: שמירת חפצים (מטען, pcap במידת הצורך), מוצרי RCA ו ”טלאים וירטואליים”.
10) בדיקות ותרחישי כאוס
הצפנות מעקפים של WAF (SQLi/XSS/SSRF), הצפנות מעורבות כפול/משולש של יוניקוד.
חילוקי דעות: שלח מטען, שבו הפרוקסי והמסגרת יכולים לסטות (פרמטרים כפולים, מערך, 'vs' & ").
Slow-POST/Oversize, zip bombs, צורות רב-חלקים, גבול שגוי.
מחולל עומק/מורכבות, בדיקת גבולות ופסקי זמן.
11) תרופות אנטי ־ פטריות
”מופעל CRS ושכח”: ללא מזימות, ללא כוונון לאורך נתיבים.
יומנים עם גוף בקשה גלם ומח "ש.
אין נורמליזציה/גודל מגביל עוקף, DOS לניתוח.
דילוג 'תוכן סוג '/charset בודק = התקפות פוליגלוט.
אין מסנני יציאה = SSRF לענן metadata.
פרופיל אחד נפוץ עבור אפליקציה חיצונית ופנימית.
חריגים בלתי מבוקרים ”עבור השותף” = חורים בהיקף.
12) פרטים של iGaming/Finance
פרופילים מחוזקים על ידיות תשלום/פלט: מגבלות גוף קטנות, תרשימים מחמירים, רשימות לשדות חשבון/IBAN/PAN (מסכות, בדיקות פורמט).
Webhooks מ-PSP/KYC: חתימת HMAC/TLS הדדית, פרופילי WAF בודדים, אנטי-שידור חוזר.
מסנני GEO/ASN ומגבלות התנהגות כדי למנוע רישום בוט והתעללות בונוס.
יומני תקרית הם בלתי ניתנים לביקורת, אחסון על ידי תחום שיפוט.
13) רשימת מוכנות תומכת
[ ] השכבה הכפולה WAF (CDN + L7), נורמליזציה יחידה וגבולות גודל.
[ ] OWASP CRS מאופשר, כללים מותאמים אישית לכל מסלול; JSON Schema/Protobuf על עטים בכתב.
[ ] מדיניות תוכן-סוג/charset; ביטול פענוח כפול/NULL/traversal.
[ ] SSRF-Egress עבור להקות פרטיות/metadata; DNS הגנה מחדש.
[ ] קצב/מכסה/קונקורנסי ואנטי-בוט (אתגרים) על צורות ציבוריות.
[ ] Shadow/Report-Only Canary # Access; גלגול אוטומטי על ידי SLO ו FP.
[ ] Metrics/Logs/Trails עם מיסוך; לוחות מחוונים ”כללים עליונים ”/FP.
[ ] טלאי וירטואלי וספרי משחק של RCA; בדיקות מעקפים רגילות.
[ ] פרופילים נפרדים לחוברות אינטרנט של PSP/KYC, עטים בתשלום, ו-API פנימי.
14) TL; DR
לבנות הגנה על ידי שכבות: נורמליזציה והגבלה של schemes/types # pharmaterization ac WAF (CRS + caste) # rate/bot filters _ SSRF egress block. כוונון לכל מסלול, הפעלת כללים חדשים בצל = כנרית, צג מדדים/FP ועשה ”טלאים וירטואליים” לפני תיקון הקוד. עבור נתיבי תשלום/webhook - פרופילים נוקשים נפרדים, HMAC/mTLS וחלונות אמון מינימליים.