cyberchef/SECURITY_ANALYSIS.md
Claude c647191a79
Security improvements: Fix crypto RNG and add security audit
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.
2025-12-18 23:04:08 +00:00

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() i Utils.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 = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        '"': "&quot;",
        "'": "&#x27;",
        "`": "&#x60;",
        "\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)

  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
  1. Zabezpieczenie eval():

    • Przeanalizować czy eval() jest absolutnie konieczny
    • Rozważyć Function constructor
    • Dodać CSP headers
  2. 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:
// 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;
    }
}
  1. Dodać Content Security Policy:
// W HTML head:
<meta http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self' 'unsafe-eval';">
  1. 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

#!/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