Czym jest CWE?
CWE (Common Weakness Enumeration) to utrzymywany przez społeczność katalog typowych słabości bezpieczeństwa oprogramowania i sprzętu. W przeciwieństwie do CVE, które opisuje konkretne podatności, CWE definiuje kategorie błędów, które mogą prowadzić do podatności.
| Aspekt | CWE | CVE |
|---|---|---|
| Co opisuje | Typ słabości/błędu | Konkretna podatność |
| Przykład | CWE-79: Cross-site Scripting | CVE-2021-44228: Log4Shell |
| Liczba wpisów | ~1000 typów | ~250,000+ podatności |
| Zmienność | Stabilna (kategorie) | Rośnie codziennie |
| Zastosowanie | Edukacja, analiza kodu | Patching, alerting |
Prosta analogia:
- CWE = rodzaj choroby (grypa)
- CVE = konkretny przypadek zachorowania (pacjent #12345 z grypą)
Kto utrzymuje CWE?
CWE jest rozwijane przez MITRE Corporation we współpracy z społecznością bezpieczeństwa. Lista jest finansowana przez CISA (Cybersecurity and Infrastructure Security Agency).
- Strona główna: https://cwe.mitre.org
- Wersja: CWE 4.14 (luty 2024)
- Wpisy: ~950 typów słabości
Struktura CWE
Hierarchia CWE
CWE jest zorganizowane hierarchicznie:
CWE-1000: Research Concepts (korzeń)
└── CWE-699: Software Development (kategoria)
└── CWE-20: Improper Input Validation (klasa)
└── CWE-79: Cross-site Scripting (bazowa)
└── CWE-80: Basic XSS (wariant)
Typy wpisów CWE
| Typ | Opis | Przykład |
|---|---|---|
| Pillar | Najwyższy poziom abstrakcji | CWE-682: Incorrect Calculation |
| Class | Abstrakcyjna klasa słabości | CWE-20: Improper Input Validation |
| Base | Konkretna słabość | CWE-79: XSS |
| Variant | Specyficzny wariant | CWE-80: Basic XSS |
| Compound | Kombinacja słabości | CWE-352: CSRF |
Anatomia wpisu CWE
Każdy wpis CWE zawiera:
CWE-89: Improper Neutralization of Special Elements
used in an SQL Command ('SQL Injection')
├── Description (opis słabości)
├── Extended Description (szczegóły techniczne)
├── Relationships (relacje z innymi CWE)
├── Applicable Platforms (języki, technologie)
├── Common Consequences (skutki exploitacji)
├── Likelihood of Exploit (prawdopodobieństwo)
├── Detection Methods (jak wykryć)
├── Potential Mitigations (jak zapobiec)
├── Demonstrative Examples (przykłady kodu)
├── Observed Examples (powiązane CVE)
└── References (źródła)
CWE Top 25 Most Dangerous Software Weaknesses
MITRE co roku publikuje listę 25 najniebezpieczniejszych słabości na podstawie danych o realnych podatnościach (CVE) i ich wpływie.
CWE Top 25 (2024)
| Rank | CWE ID | Nazwa | Przykład |
|---|---|---|---|
| 1 | CWE-79 | Cross-site Scripting (XSS) | Wstrzyknięcie JS do strony |
| 2 | CWE-89 | SQL Injection | ' OR '1'='1 |
| 3 | CWE-416 | Use After Free | Dostęp do zwolnionej pamięci |
| 4 | CWE-78 | OS Command Injection | ; rm -rf / |
| 5 | CWE-20 | Improper Input Validation | Brak walidacji danych wejściowych |
| 6 | CWE-125 | Out-of-bounds Read | Odczyt poza buforem |
| 7 | CWE-22 | Path Traversal | ../../../etc/passwd |
| 8 | CWE-352 | Cross-Site Request Forgery | Nieautoryzowana akcja |
| 9 | CWE-787 | Out-of-bounds Write | Buffer overflow |
| 10 | CWE-287 | Improper Authentication | Słabe uwierzytelnianie |
Pełna lista Top 25 (2024)
| Rank | CWE ID | Nazwa |
|---|---|---|
| 11 | CWE-476 | NULL Pointer Dereference |
| 12 | CWE-798 | Use of Hard-coded Credentials |
| 13 | CWE-190 | Integer Overflow |
| 14 | CWE-502 | Deserialization of Untrusted Data |
| 15 | CWE-77 | Command Injection |
| 16 | CWE-119 | Buffer Overflow |
| 17 | CWE-862 | Missing Authorization |
| 18 | CWE-276 | Incorrect Default Permissions |
| 19 | CWE-918 | Server-Side Request Forgery (SSRF) |
| 20 | CWE-306 | Missing Authentication |
| 21 | CWE-362 | Race Condition |
| 22 | CWE-269 | Improper Privilege Management |
| 23 | CWE-94 | Code Injection |
| 24 | CWE-863 | Incorrect Authorization |
| 25 | CWE-400 | Uncontrolled Resource Consumption |
Najważniejsze CWE - szczegóły
CWE-79: Cross-site Scripting (XSS)
Opis: Aplikacja nie neutralizuje lub niepoprawnie neutralizuje dane wejściowe przed włączeniem ich do strony HTML.
Typy XSS:
- Reflected (CWE-79) - payload w URL, wykonany natychmiast
- Stored (CWE-79) - payload zapisany w bazie, wykonany przy każdym wyświetleniu
- DOM-based (CWE-79) - payload manipuluje DOM bez wysyłania do serwera
Przykład podatnego kodu (PHP):
// ŹLE - brak enkodowania
echo "Witaj, " . $_GET['name'];
// Atak: ?name=<script>alert('XSS')</script>
Poprawne rozwiązanie:
// DOBRZE - enkodowanie HTML
echo "Witaj, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
Mitigacje:
- Enkodowanie wyjścia (output encoding)
- Content Security Policy (CSP)
- Walidacja i sanityzacja danych wejściowych
- Używanie frameworków z auto-escape (React, Angular)
CWE-89: SQL Injection
Opis: Aplikacja konstruuje zapytania SQL używając danych wejściowych bez odpowiedniej neutralizacji.
Przykład podatnego kodu (PHP):
// ŹLE - konkatenacja
$query = "SELECT * FROM users WHERE id = " . $_GET['id'];
// Atak: ?id=1 OR 1=1
Poprawne rozwiązanie:
// DOBRZE - prepared statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
Mitigacje:
- Prepared statements / parameterized queries (najważniejsze!)
- ORM z parametryzacją
- Walidacja typu danych wejściowych
- Zasada najmniejszych uprawnień dla konta DB
CWE-22: Path Traversal
Opis: Aplikacja używa danych wejściowych do konstruowania ścieżek plików bez odpowiedniej walidacji.
Przykład podatnego kodu (Python):
# ŹLE - brak walidacji ścieżki
filename = request.args.get('file')
return send_file(f"/uploads/{filename}")
# Atak: ?file=../../../etc/passwd
Poprawne rozwiązanie:
# DOBRZE - walidacja i normalizacja
import os
filename = request.args.get('file')
safe_path = os.path.normpath(os.path.join('/uploads', filename))
if not safe_path.startswith('/uploads/'):
abort(403)
return send_file(safe_path)
CWE-798: Use of Hard-coded Credentials
Opis: Aplikacja zawiera zakodowane na stałe hasła, klucze API lub inne sekrety.
Przykład podatnego kodu:
# ŹLE - hasło w kodzie
DB_PASSWORD = "SuperSecretPassword123!"
API_KEY = "sk-1234567890abcdef"
Poprawne rozwiązanie:
# DOBRZE - zmienne środowiskowe lub secrets manager
import os
DB_PASSWORD = os.environ.get('DB_PASSWORD')
API_KEY = os.environ.get('API_KEY')
# Lub: AWS Secrets Manager, HashiCorp Vault, Azure Key Vault
CWE vs OWASP Top 10
CWE i OWASP Top 10 są powiązane, ale służą różnym celom:
| Aspekt | CWE | OWASP Top 10 |
|---|---|---|
| Zakres | Wszystkie słabości | Top 10 kategorii dla web |
| Granularność | Szczegółowa (950+ wpisów) | Wysoka abstrakcja (10 kategorii) |
| Aktualizacja | Ciągła | Co ~4 lata |
| Zastosowanie | Klasyfikacja techniczna | Awareness, priorytetyzacja |
Mapowanie OWASP Top 10 (2021) na CWE
| OWASP | Główne CWE |
|---|---|
| A01: Broken Access Control | CWE-200, CWE-284, CWE-285, CWE-639 |
| A02: Cryptographic Failures | CWE-259, CWE-327, CWE-331 |
| A03: Injection | CWE-77, CWE-78, CWE-79, CWE-89 |
| A04: Insecure Design | CWE-209, CWE-256, CWE-501 |
| A05: Security Misconfiguration | CWE-16, CWE-611 |
| A06: Vulnerable Components | CWE-1104 |
| A07: Auth Failures | CWE-287, CWE-384, CWE-613 |
| A08: Software/Data Integrity | CWE-494, CWE-502, CWE-829 |
| A09: Logging Failures | CWE-117, CWE-223, CWE-532 |
| A10: SSRF | CWE-918 |
Jak używać CWE w praktyce?
1. Secure Code Review
Podczas przeglądu kodu, szukaj wzorców odpowiadających konkretnym CWE:
Checklist Code Review:
□ CWE-79: Czy dane użytkownika są enkodowane przed wyświetleniem?
□ CWE-89: Czy używamy prepared statements?
□ CWE-22: Czy walidujemy ścieżki plików?
□ CWE-798: Czy nie ma hardcoded credentials?
□ CWE-502: Czy deserializujemy tylko zaufane dane?
2. SAST/DAST Configuration
Narzędzia SAST (np. SonarQube, Checkmarx) raportują znalezione problemy z odniesieniem do CWE:
Finding: SQL Injection vulnerability
File: UserController.java:45
CWE: CWE-89
Severity: Critical
Recommendation: Use PreparedStatement instead of string concatenation
3. Vulnerability Classification
Przypisuj CWE do znalezionych podatności:
Raport z pentestów:
┌────────────────────────────────────────────────┐
│ Finding #1: Stored XSS in comments │
│ CWE: CWE-79 │
│ CVSS: 6.1 (Medium) │
│ OWASP: A03:2021 Injection │
│ Remediation: Implement output encoding │
└────────────────────────────────────────────────┘
4. Developer Training
Szkolenia deweloperów oparte na CWE Top 25:
- Tydzień 1: CWE-79 (XSS) - teoria + ćwiczenia
- Tydzień 2: CWE-89 (SQLi) - teoria + ćwiczenia
- Tydzień 3: CWE-22 (Path Traversal) - teoria + ćwiczenia
- …
5. Procurement Requirements
W wymaganiach dla dostawców:
“Dostarczone oprogramowanie nie może zawierać słabości z listy CWE Top 25 Most Dangerous Software Weaknesses, co zostanie zweryfikowane poprzez skanowanie SAST/DAST przed odbiorem.”
Narzędzia wspierające CWE
| Narzędzie | Typ | Obsługa CWE |
|---|---|---|
| SonarQube | SAST | Mapowanie reguł na CWE |
| Checkmarx | SAST | Native CWE reporting |
| Snyk | SCA/SAST | CWE w raportach |
| OWASP ZAP | DAST | CWE ID w alertach |
| Burp Suite | DAST | CWE references |
| Semgrep | SAST | Custom rules z CWE |
CWE w regulacjach i standardach
| Regulacja/Standard | Wymagania dot. CWE |
|---|---|
| PCI DSS 4.0 | Wymaga adresowania OWASP Top 10 (mapowane na CWE) |
| NIST SSDF | Rekomenduje używanie CWE do klasyfikacji |
| ISO 27001 | Pośrednio przez secure development |
| NIS2 | Wymagania dot. bezpiecznego rozwoju oprogramowania |
| Cyber Resilience Act | Będzie wymagać raportowania CWE |
FAQ
Czy każda podatność (CVE) ma przypisane CWE?
Nie zawsze, ale NVD stara się przypisywać CWE do wszystkich CVE. Około 85% CVE ma przypisane CWE.
Ile CWE powinienem znać jako developer?
Zacznij od CWE Top 25. To pokrywa większość realnych problemów. Następnie poznaj CWE specyficzne dla Twojej technologii (np. CWE-918 SSRF dla aplikacji cloud).
Czy CWE dotyczy tylko aplikacji webowych?
Nie. CWE obejmuje słabości w:
- Aplikacjach webowych
- Aplikacjach desktopowych
- Systemach embedded
- Sprzęcie (hardware)
- Kryptografii
- Konfiguracji
Jak raportować nowe CWE?
Można zgłaszać propozycje nowych CWE przez stronę MITRE CWE. Wymagane jest uzasadnienie, że słabość jest powszechna i nie jest pokryta przez istniejące CWE.
Podsumowanie
- CWE to katalog typów słabości oprogramowania (nie konkretnych podatności)
- CVE opisuje konkretne podatności, CWE klasyfikuje typ błędu
- CWE Top 25 to lista najniebezpieczniejszych słabości - znajomość obowiązkowa dla developerów
- Najważniejsze CWE: CWE-79 (XSS), CWE-89 (SQLi), CWE-22 (Path Traversal)
- Używaj CWE do klasyfikacji w raportach, szkoleniach, wymaganiach dla dostawców
- Narzędzia SAST/DAST automatycznie raportują znalezione problemy z odniesieniem do CWE
Chcesz sprawdzić bezpieczeństwo swojego kodu? Zamów audyt kodu źródłowego lub testy penetracyjne aplikacji. Skontaktuj się z nami.
Powiązane pojęcia
Poznaj kluczowe terminy związane z tym artykułem w naszym słowniku cyberbezpieczeństwa:
- Bezpieczeństwo aplikacji — Bezpieczeństwo aplikacji to praktyki i narzędzia chroniące aplikacje przed…
- OWASP Top 10 — OWASP Top 10 to lista 10 najkrytyczniejszych zagrożeń bezpieczeństwa aplikacji…
- Bezpieczne programowanie — Bezpieczne programowanie to zestaw praktyk i narzędzi minimalizujących ryzyko…
- Cross-Site Scripting (XSS) — XSS to atak na aplikacje webowe polegający na wstrzykiwaniu złośliwego kodu…
- Powierzchnia ataku — Powierzchnia ataku (Attack Surface) to suma wszystkich punktów, przez które…
Sprawdź nasze usługi
Potrzebujesz wsparcia w zakresie cyberbezpieczeństwa? Sprawdź:
- Audyty bezpieczeństwa - kompleksowa ocena stanu zabezpieczeń
- Testy penetracyjne - identyfikacja podatności w infrastrukturze
- SOC as a Service - całodobowy monitoring bezpieczeństwa
