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

398 lines
10 KiB
Markdown

# 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 = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"`": "&#x60;",
"\u0000": "\ue000"
};
// ...
}
```
**Status:** ✅ DOBRA IMPLEMENTACJA
- Escapuje wszystkie kluczowe znaki HTML
- Prawidłowa kolejność (&amp; 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:
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-eval';">
```
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*