# Analiza Bezpieczeństwa CyberChef **Data:** 2025-12-18 **Audytor:** Claude Code ## Podsumowanie Wykonawcze Przeprowadzono kompleksową analizę bezpieczeństwa projektu CyberChef, obejmującą: - Audyt zależności npm (35 podatności wykrytych) - Analizę kodu źródłowego pod kątem luk bezpieczeństwa - Przegląd implementacji kryptograficznych - Identyfikację potencjalnych wektorów ataku XSS i injection --- ## 1. Podatności w Zależnościach (KRYTYCZNE) ### 1.1 Podsumowanie ``` Łącznie: 35 podatności - Krytyczne: 8 - Wysokie: 8 - Średnie: 11 - Niskie: 8 ``` ### 1.2 Najważniejsze Podatności #### A. @babel/runtime, @babel/helpers, @babel/runtime-corejs3 (ŚREDNIE) - **CVE:** GHSA-968p-4wvh-cqc8 - **Opis:** Nieefektywna złożoność RegExp w wygenerowanym kodzie - **CWE:** CWE-1333 (ReDoS) - **CVSS:** 6.2 - **Wersja podatna:** < 7.26.10 - **Rozwiązanie:** Aktualizacja do >= 7.26.10 ```bash npm install @babel/runtime@^7.26.10 @babel/helpers@^7.26.10 ``` #### B. ws (WYSOKIE) - **CVE:** GHSA-3h5v-q93c-6h6q - **Opis:** DoS podczas obsługi requestów z wieloma nagłówkami HTTP - **Wersja podatna:** 2.1.0 - 5.2.3 - **Rozwiązanie:** Aktualizacja websocket-stream ```bash npm audit fix ``` #### C. webpack-dev-server (ŚREDNIE) - **CVE:** GHSA-9jgg-88mc-972h, GHSA-4v9v-hfq4-rm2v - **Opis:** Możliwość kradzieży kodu źródłowego poprzez złośliwe strony - **Wersja podatna:** <= 5.2.0 - **Rozwiązanie:** Aktualizacja do 5.2.2+ ```bash npm install webpack-dev-server@^5.2.2 ``` #### D. shelljs (ŚREDNIE) - **CVE:** GHSA-4rq4-32rv-6wp6 - **Opis:** Niewłaściwe zarządzanie uprawnieniami - **Rozwiązanie:** Rozważyć zastąpienie grunt-chmod nowszą wersją #### E. tmp (NISKIE) - **CVE:** GHSA-52f5-9888-hmc6 - **Opis:** Możliwość zapisu plików tymczasowych przez symlinki - **Wersja podatna:** <= 0.2.3 - **Rozwiązanie:** Aktualizacja do >= 0.2.4 #### F. @eslint/plugin-kit (NISKIE) - **CVE:** 1106734 - **Opis:** ReDoS w ConfigCommentParser - **Rozwiązanie:** Aktualizacja ESLint #### G. bcryptjs (ZALECANE) - **Obecna wersja:** 2.4.3 - **Dostępna wersja:** 3.0.3 - **Zalecenie:** Aktualizacja do najnowszej wersji dla poprawek bezpieczeństwa --- ## 2. Podatności w Kodzie Źródłowym ### 2.1 Użycie eval() (KRYTYCZNE) **Lokalizacja:** `src/web/waiters/OutputWaiter.mjs:373` ```javascript eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval ``` **Problem:** - Wykonanie arbitrary JavaScript z zawartości HTML - Potencjalny XSS jeśli HTML pochodzi z niezaufanego źródła - eval() jest jedną z najbardziej niebezpiecznych funkcji JS **Zalecenie:** ```javascript // Zamiast eval(), użyć bezpieczniejszych alternatyw: // 1. Użyć Function constructor (nieco bezpieczniejszy) // 2. Używać CSP (Content Security Policy) do blokowania eval // 3. Przerobić na deklaratywne podejście bez wykonywania kodu // Przykład z Function: try { const scriptFunction = new Function(scriptElements[i].innerHTML); scriptFunction(); } catch (err) { log.error(err); } ``` **Ryzyko:** WYSOKIE - możliwy XSS i arbitrary code execution --- ### 2.2 Użycie innerHTML (ŚREDNIE) **Wykryto 20+ wystąpień innerHTML w kodzie** **Przykłady potencjalnie niebezpieczne:** #### A. `src/web/utils/htmlWidget.mjs:34` ```javascript wrap.innerHTML = this.html; ``` **Analiza:** - Bezpośrednie ustawienie HTML bez sanityzacji - JEDNAK: Kod później wywołuje `walkTextNodes()` i `Utils.escapeHtml()` - **Status:** Akceptowalne z zastrzeżeniami #### B. `src/web/App.mjs:660` ```javascript notice.innerHTML = compileInfo; ``` **Analiza:** - compileInfo pochodzi z window.compileMessage - Należy upewnić się, że źródło jest zaufane - **Zalecenie:** Dodać sanityzację #### C. `src/web/App.mjs:734-735` ```javascript document.getElementById("confirm-title").innerHTML = title; document.getElementById("confirm-body").innerHTML = body; ``` **Analiza:** - Należy sprawdzić źródła zmiennych title i body - **Zalecenie:** Użyć textContent lub sanityzacji **Ogólne Zalecenie:** ```javascript // Zamiast: element.innerHTML = userInput; // Użyć: element.textContent = userInput; // Dla czystego tekstu // LUB element.innerHTML = Utils.escapeHtml(userInput); // Dla HTML ``` --- ### 2.3 Funkcja Utils.escapeHtml() (POZYTYWNE) **Lokalizacja:** `src/core/Utils.mjs:850` **Analiza:** ```javascript static escapeHtml(str) { const HTML_CHARS = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "`": "`", "\u0000": "\ue000" }; // ... } ``` **Status:** ✅ DOBRA IMPLEMENTACJA - Escapuje wszystkie kluczowe znaki HTML - Prawidłowa kolejność (& jako pierwszy) - Obsługuje null bytes **Zalecenie:** Używać konsekwentnie w całym projekcie --- ### 2.4 Math.random() (INFORMACYJNE) **Wykryto 8 wystąpień Math.random()** **Lokalizacje:** - `src/core/vendor/gost/gostRandom.mjs:119` - Crypto (⚠️) - `src/core/lib/LoremIpsum.mjs:90,148,149,184` - Generowanie tekstu (✅) - `src/core/lib/LS47.mjs:227` - Padding (⚠️) - `src/core/operations/RandomizeColourPalette.mjs:50` - Kolory (✅) - `src/core/operations/Numberwang.mjs:49` - Zabawa (✅) **Problem:** Math.random() NIE jest kryptograficznie bezpieczny **Zalecenia:** ```javascript // Zamiast Math.random() w kontekstach kryptograficznych: const array = new Uint32Array(1); crypto.getRandomValues(array); const randomValue = array[0] / (0xFFFFFFFF + 1); // Lub użyć crypto.randomBytes() w Node.js ``` **Priorytet:** - KRYTYCZNY dla gostRandom.mjs (crypto) - NISKI dla LoremIpsum, Numberwang (nie-security) --- ### 2.5 Command Injection (ZABEZPIECZONE) **Analiza:** ```javascript // webpack.config.js:124 "child_process": false, ``` **Status:** ✅ ZABEZPIECZONE - child_process jest wyłączony w konfiguracji webpack - Brak użycia exec(), spawn(), execFile() w kodzie aplikacji - Minimalne ryzyko command injection --- ### 2.6 Słabe Algorytmy Kryptograficzne (INFORMACYJNE) **Analiza:** - Nie znaleziono użycia przestarzałych algorytmów (DES, RC4) w createCipheriv - CyberChef implementuje wiele algorytmów w celach EDUKACYJNYCH/DEKODOWANIA - Użycie MD5, DES, RC4 jest ZAMIERZONE jako narzędzia, nie zabezpieczenia **Status:** ✅ AKCEPTOWALNE (kontekst narzędzia) --- ## 3. Rekomendacje Naprawcze ### 3.1 Natychmiastowe (Priorytet 1) 1. **Aktualizacja zależności:** ```bash npm install @babel/runtime@^7.26.10 npm install @babel/helpers@^7.26.10 npm install webpack-dev-server@^5.2.2 npm install tmp@^0.2.5 npm install bcryptjs@^3.0.3 npm audit fix ``` 2. **Zabezpieczenie eval():** - Przeanalizować czy eval() jest absolutnie konieczny - Rozważyć Function constructor - Dodać CSP headers 3. **Przeglądnąć innerHTML:** - Sprawdzić źródła danych w App.mjs:734-735 - Dodać Utils.escapeHtml() gdzie potrzeba ### 3.2 Krótkoterminowe (Priorytet 2) 1. **Zastąpić Math.random() w crypto:** ```javascript // W src/core/vendor/gost/gostRandom.mjs if (crypto && crypto.getRandomValues) { crypto.getRandomValues(u8); } else { // Fallback - wyświetl ostrzeżenie console.warn("Crypto not available, using weak randomness"); for (let i = 0; i < u8.length; i++) { u8[i] = Math.floor(256 * Math.random()) & 255; } } ``` 2. **Dodać Content Security Policy:** ```javascript // W HTML head: ``` 3. **Code review wszystkich innerHTML:** - Dokumentować każde użycie - Uzasadnić dlaczego innerHTML zamiast textContent - Dodać sanityzację gdzie potrzeba ### 3.3 Długoterminowe (Priorytet 3) 1. **Wdrożyć politykę aktualizacji:** - Regularny npm audit (co tydzień) - Automatyczne aktualizacje bezpieczeństwa (Dependabot/Renovate) 2. **Dodać testy bezpieczeństwa:** - Unit testy dla Utils.escapeHtml() - Testy XSS dla wszystkich inputów - SAST (Static Application Security Testing) 3. **Dokumentacja bezpieczeństwa:** - SECURITY.md z procedurą zgłaszania - Polityka odpowiedzialnego ujawniania - Security advisories --- ## 4. Pozytywne Aspekty Bezpieczeństwa ✅ **Dobre praktyki znalezione w kodzie:** 1. **Utils.escapeHtml()** - prawidłowa implementacja 2. **child_process disabled** - brak command injection 3. **Empty catch blocks** - oznaczone i z uzasadnieniem 4. **ESLint rules** - no-eval oznaczony jawnie 5. **Brak hardcoded credentials** - nie znaleziono 6. **Właściwa separacja** - Core vs Web vs Node --- ## 5. Skrypt Automatycznej Naprawy ```bash #!/bin/bash # auto-fix-security.sh echo "🔒 CyberChef Security Auto-Fix" echo "================================" # Backup package-lock.json cp package-lock.json package-lock.json.backup # Update critical dependencies echo "📦 Aktualizacja krytycznych zależności..." npm install @babel/runtime@^7.26.10 --save npm install @babel/helpers@^7.26.10 --save-dev npm install webpack-dev-server@^5.2.2 --save-dev npm install tmp@^0.2.5 --save-dev npm install bcryptjs@^3.0.3 --save # Run audit fix echo "🔍 Uruchamianie npm audit fix..." npm audit fix # Final audit echo "📊 Końcowy raport bezpieczeństwa:" npm audit echo "✅ Gotowe! Sprawdź czy aplikacja działa poprawnie." echo "⚠️ Jeśli wystąpią problemy, przywróć: mv package-lock.json.backup package-lock.json" ``` --- ## 6. Monitoring i Dalsze Kroki ### Narzędzia do wdrożenia: 1. **Snyk** lub **npm audit** - ciągły monitoring zależności 2. **ESLint security plugin** - statyczna analiza 3. **OWASP Dependency-Check** - dodatkowa weryfikacja 4. **GitHub Dependabot** - automatyczne PR z aktualizacjami ### Metryki do śledzenia: - Liczba podatności (cel: 0 critical/high) - Czas do naprawy (cel: < 7 dni dla critical) - Pokrycie testami bezpieczeństwa (cel: > 80%) --- ## 7. Podsumowanie **Stan obecny:** - 35 podatności w zależnościach (naprawialne) - 1 krytyczne użycie eval() (wymaga przeglądu) - 20+ innerHTML (wymagają weryfikacji źródeł) - Ogólnie dobra kultura bezpieczeństwa w kodzie **Zalecana kolejność działań:** 1. ✅ Zaktualizować zależności npm (1-2 godziny) 2. ⚠️ Przeanalizować eval() i innerHTML (4-6 godzin) 3. 🔄 Zastąpić Math.random() w crypto (2-3 godziny) 4. 📝 Wdrożyć CSP i monitoring (ongoing) **Ryzyko ogólne:** ŚREDNIE **Po naprawach:** NISKIE --- *Raport wygenerowany automatycznie przez Claude Code* *Wymaga weryfikacji przez security team przed wdrożeniem*