Comprehensive security analysis and fixes addressing multiple vulnerabilities identified in code and dependencies. Security Fixes: - LS47: Replace Math.random() with crypto.getRandomValues() for padding - GOST: Add warning when falling back to insecure Math.random() - Both maintain backward compatibility with graceful fallbacks Documentation: - SECURITY_ANALYSIS.md: Comprehensive audit of 35 npm vulnerabilities - SECURITY_FIXES_APPLIED.md: Detailed changelog of all security improvements - scripts/security-fix.sh: Automated dependency update script Key Findings: - 35 npm vulnerabilities (8 critical, 8 high, 11 moderate, 8 low) - Critical: eval() usage in OutputWaiter.mjs (requires review) - Medium: 20+ innerHTML usages (most properly escaped) - Low: Math.random() in crypto contexts (now fixed) Recommendations: 1. Run ./scripts/security-fix.sh to update dependencies 2. Review eval() usage for CSP implementation 3. Audit innerHTML sources in App.mjs 4. Enable automated security scanning (Dependabot/Snyk) Impact: - Improved cryptographic security in LS47 and GOST operations - Better visibility of fallback RNG usage - Clear security documentation for maintainers - Automated tools for dependency management All changes are backward compatible with graceful degradation.
10 KiB
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
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
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+
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
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:
// 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
wrap.innerHTML = this.html;
Analiza:
- Bezpośrednie ustawienie HTML bez sanityzacji
- JEDNAK: Kod później wywołuje
walkTextNodes()iUtils.escapeHtml() - Status: Akceptowalne z zastrzeżeniami
B. src/web/App.mjs:660
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
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:
// 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:
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:
// 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:
// 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)
- Aktualizacja zależności:
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
-
Zabezpieczenie eval():
- Przeanalizować czy eval() jest absolutnie konieczny
- Rozważyć Function constructor
- Dodać CSP headers
-
Przeglądnąć innerHTML:
- Sprawdzić źródła danych w App.mjs:734-735
- Dodać Utils.escapeHtml() gdzie potrzeba
3.2 Krótkoterminowe (Priorytet 2)
- Zastąpić Math.random() w crypto:
// 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;
}
}
- Dodać Content Security Policy:
// W HTML head:
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-eval';">
- Code review wszystkich innerHTML:
- Dokumentować każde użycie
- Uzasadnić dlaczego innerHTML zamiast textContent
- Dodać sanityzację gdzie potrzeba
3.3 Długoterminowe (Priorytet 3)
-
Wdrożyć politykę aktualizacji:
- Regularny npm audit (co tydzień)
- Automatyczne aktualizacje bezpieczeństwa (Dependabot/Renovate)
-
Dodać testy bezpieczeństwa:
- Unit testy dla Utils.escapeHtml()
- Testy XSS dla wszystkich inputów
- SAST (Static Application Security Testing)
-
Dokumentacja bezpieczeństwa:
- SECURITY.md z procedurą zgłaszania
- Polityka odpowiedzialnego ujawniania
- Security advisories
4. Pozytywne Aspekty Bezpieczeństwa
✅ Dobre praktyki znalezione w kodzie:
- Utils.escapeHtml() - prawidłowa implementacja
- child_process disabled - brak command injection
- Empty catch blocks - oznaczone i z uzasadnieniem
- ESLint rules - no-eval oznaczony jawnie
- Brak hardcoded credentials - nie znaleziono
- Właściwa separacja - Core vs Web vs Node
5. Skrypt Automatycznej Naprawy
#!/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:
- Snyk lub npm audit - ciągły monitoring zależności
- ESLint security plugin - statyczna analiza
- OWASP Dependency-Check - dodatkowa weryfikacja
- 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ń:
- ✅ Zaktualizować zależności npm (1-2 godziny)
- ⚠️ Przeanalizować eval() i innerHTML (4-6 godzin)
- 🔄 Zastąpić Math.random() w crypto (2-3 godziny)
- 📝 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