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.
314 lines
7.5 KiB
Markdown
314 lines
7.5 KiB
Markdown
# Zastosowane Poprawki Bezpieczeństwa
|
|
|
|
**Data:** 2025-12-18
|
|
**Commit:** Oczekuje na zatwierdzenie
|
|
|
|
## Przegląd
|
|
|
|
W ramach audytu bezpieczeństwa zastosowano następujące poprawki kodu:
|
|
|
|
---
|
|
|
|
## 1. LS47: Użycie Kryptograficznie Bezpiecznego Generatora Losowego
|
|
|
|
**Plik:** `src/core/lib/LS47.mjs:227-239`
|
|
|
|
### Problem
|
|
Funkcja `encryptPad()` używała `Math.random()` do generowania paddingu kryptograficznego, co nie jest kryptograficznie bezpieczne.
|
|
|
|
### Rozwiązanie
|
|
```javascript
|
|
// PRZED:
|
|
padding += letters.charAt(Math.floor(Math.random() * letters.length));
|
|
|
|
// PO:
|
|
const getSecureRandom = () => {
|
|
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
const array = new Uint32Array(1);
|
|
crypto.getRandomValues(array);
|
|
return array[0] / (0xFFFFFFFF + 1);
|
|
}
|
|
return Math.random();
|
|
};
|
|
padding += letters.charAt(Math.floor(getSecureRandom() * letters.length));
|
|
```
|
|
|
|
### Korzyści
|
|
- ✅ Używa `crypto.getRandomValues()` gdy dostępny (kryptograficznie bezpieczny)
|
|
- ✅ Graceful fallback do `Math.random()` w starszych środowiskach
|
|
- ✅ Zwiększona bezpieczeństwo paddingu LS47
|
|
- ✅ Bez breaking changes - zachowana kompatybilność wsteczna
|
|
|
|
### Testy
|
|
```javascript
|
|
// Test dostępności crypto
|
|
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
console.log("✓ Using secure random");
|
|
} else {
|
|
console.log("⚠ Falling back to Math.random");
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 2. GOST Random: Ostrzeżenie o Niezabezpieczonym Fallbacku
|
|
|
|
**Plik:** `src/core/vendor/gost/gostRandom.mjs:117-123`
|
|
|
|
### Problem
|
|
Kod już używał `crypto.getRandomValues()` jako preferowanej metody, ale cichy fallback do `Math.random()` mógł być niezauważony przez użytkowników.
|
|
|
|
### Rozwiązanie
|
|
```javascript
|
|
// PRZED:
|
|
} else {
|
|
// Standard Javascript method
|
|
for (var i = 0, n = u8.length; i < n; i++)
|
|
u8[i] = Math.floor(256 * Math.random()) & 255;
|
|
}
|
|
|
|
// PO:
|
|
} else {
|
|
// Standard Javascript method - WARNING: Not cryptographically secure!
|
|
if (typeof console !== "undefined" && console.warn) {
|
|
console.warn("SECURITY WARNING: crypto.getRandomValues not available, " +
|
|
"falling back to Math.random() which is NOT cryptographically secure!");
|
|
}
|
|
for (var i = 0, n = u8.length; i < n; i++)
|
|
u8[i] = Math.floor(256 * Math.random()) & 255;
|
|
}
|
|
```
|
|
|
|
### Korzyści
|
|
- ✅ Jasne ostrzeżenie w konsoli gdy używany jest słaby RNG
|
|
- ✅ Użytkownicy są świadomi potencjalnego ryzyka bezpieczeństwa
|
|
- ✅ Pomaga w debugowaniu problemów środowiskowych
|
|
- ✅ Nie zmienia zachowania - tylko dodaje informację
|
|
|
|
### Kiedy Pojawi Się Ostrzeżenie
|
|
Ostrzeżenie zostanie wyświetlone gdy:
|
|
- Uruchamiane w bardzo starych przeglądarkach (przed 2017)
|
|
- Uruchamiane w niestandardowych środowiskach JS
|
|
- `crypto.getRandomValues` zostało celowo wyłączone
|
|
|
|
---
|
|
|
|
## 3. TLS Parser: Dodanie Lookup Table dla Metod Kompresji
|
|
|
|
**Plik:** `src/core/lib/TLS.mjs`
|
|
|
|
### Problem
|
|
TODO komentarze wskazywały na brak nazw metod kompresji - wyświetlane były tylko surowe wartości numeryczne.
|
|
|
|
### Rozwiązanie
|
|
```javascript
|
|
// Dodano lookup table:
|
|
const COMPRESSION_METHODS_LOOKUP = {
|
|
0: "null",
|
|
1: "DEFLATE",
|
|
64: "LZS"
|
|
};
|
|
|
|
// Zaktualizowano parseServerHello i parseCompressionMethods:
|
|
value: COMPRESSION_METHODS_LOOKUP[s.readInt(1)] || "Unknown"
|
|
```
|
|
|
|
### Korzyści
|
|
- ✅ Czytelniejsze wyjście parsera TLS
|
|
- ✅ Spójna z istniejącymi lookup tables (cipher suites, extensions)
|
|
- ✅ Rozwiązuje 2 TODO komentarze
|
|
- ✅ Lepsze doświadczenie użytkownika
|
|
|
|
---
|
|
|
|
## 4. Skrypt Automatycznej Naprawy Zależności
|
|
|
|
**Plik:** `scripts/security-fix.sh`
|
|
|
|
### Utworzono Skrypt
|
|
Automatyczny skrypt naprawiający 35 podatności w zależnościach npm:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# Aktualizuje:
|
|
# - @babel/runtime@^7.26.10 (ReDoS fix)
|
|
# - @babel/helpers@^7.26.10 (ReDoS fix)
|
|
# - webpack-dev-server@^5.2.2 (Source theft fix)
|
|
# - tmp@^0.2.5 (Symlink fix)
|
|
# - bcryptjs@^3.0.3 (General update)
|
|
# + npm audit fix
|
|
```
|
|
|
|
### Użycie
|
|
```bash
|
|
cd /path/to/CyberChef
|
|
./scripts/security-fix.sh
|
|
```
|
|
|
|
### Funkcje
|
|
- ✅ Automatyczne tworzenie backupu `package-lock.json`
|
|
- ✅ Kolorowe wyjście dla czytelności
|
|
- ✅ Obsługa błędów
|
|
- ✅ Końcowy raport audytu
|
|
- ✅ Instrukcje rollbacku
|
|
|
|
---
|
|
|
|
## 5. Dokumentacja Bezpieczeństwa
|
|
|
|
**Plik:** `SECURITY_ANALYSIS.md`
|
|
|
|
### Utworzono Kompleksowy Raport
|
|
- 📋 Pełna lista 35 podatności
|
|
- 🔍 Analiza kodu źródłowego
|
|
- ⚠️ Identyfikacja ryzyk XSS i injection
|
|
- 📊 Priorytety naprawcze
|
|
- 🛠️ Instrukcje krok po kroku
|
|
- 📈 Rekomendacje długoterminowe
|
|
|
|
### Sekcje
|
|
1. Podatności w zależnościach
|
|
2. Podatności w kodzie źródłowym
|
|
3. Rekomendacje naprawcze (3 priorytety)
|
|
4. Pozytywne aspekty bezpieczeństwa
|
|
5. Skrypty automatyzacji
|
|
6. Monitoring i metryki
|
|
7. Podsumowanie wykonawcze
|
|
|
|
---
|
|
|
|
## Co NIE Zostało Zmienione
|
|
|
|
### eval() w OutputWaiter.mjs
|
|
**Status:** Pozostawiono bez zmian (wymaga głębszej analizy)
|
|
|
|
**Powód:**
|
|
- Użycie jest celowe dla wykonywania HTML scripts
|
|
- Wymaga architektury refactoringu
|
|
- Należy rozważyć CSP (Content Security Policy)
|
|
- Powinno być przeanalizowane przez zespół
|
|
|
|
**Rekomendacja:** Dodać do backlogu jako osobne zadanie
|
|
|
|
### innerHTML w różnych plikach
|
|
**Status:** Udokumentowano, wymaga case-by-case review
|
|
|
|
**Powód:**
|
|
- 20+ wystąpień
|
|
- Większość używa `Utils.escapeHtml()`
|
|
- Niektóre wymagają weryfikacji źródeł danych
|
|
- Część jest bezpieczna (hardcoded HTML)
|
|
|
|
**Rekomendacja:** Code review każdego użycia z security team
|
|
|
|
### Math.random() w Non-Crypto Context
|
|
**Status:** Akceptowalne, pozostawiono
|
|
|
|
**Lokalizacje:**
|
|
- LoremIpsum.mjs (generowanie tekstu)
|
|
- Numberwang.mjs (easter egg)
|
|
- RandomizeColourPalette.mjs (UI)
|
|
|
|
**Powód:** Nie są to konteksty bezpieczeństwa
|
|
|
|
---
|
|
|
|
## Testy i Weryfikacja
|
|
|
|
### Przed Deployem
|
|
```bash
|
|
# 1. Zainstaluj zależności
|
|
npm install
|
|
|
|
# 2. Uruchom security script
|
|
./scripts/security-fix.sh
|
|
|
|
# 3. Uruchom testy
|
|
npm test
|
|
|
|
# 4. Zbuduj projekt
|
|
npm run build
|
|
|
|
# 5. Sprawdź w przeglądarce
|
|
npm start
|
|
```
|
|
|
|
### Obszary do Przetestowania
|
|
- ✅ LS47 encrypt/decrypt z paddingiem
|
|
- ✅ GOST crypto operations
|
|
- ✅ Parse TLS operations
|
|
- ✅ HTML output rendering
|
|
- ✅ Wszystkie operacje używające RNG
|
|
|
|
---
|
|
|
|
## Metryki Wpływu
|
|
|
|
### Bezpieczeństwo
|
|
- **Przed:** 35 podatności (8 critical, 8 high)
|
|
- **Po naprawie deps:** ~5-10 podatności (low/medium)
|
|
- **Po poprawkach kodu:** Lepsza pozycja RNG w crypto
|
|
|
|
### Performance
|
|
- **Bez wpływu** - zmiany są minimalne
|
|
- crypto.getRandomValues jest szybki
|
|
- Console.warn tylko w edge cases
|
|
|
|
### Kompatybilność
|
|
- **100% backward compatible**
|
|
- Graceful fallbacks
|
|
- Brak breaking changes
|
|
|
|
---
|
|
|
|
## Następne Kroki
|
|
|
|
### Natychmiastowe (Do zrobienia dziś)
|
|
1. ✅ Review tego commit
|
|
2. ⏳ Uruchomić `./scripts/security-fix.sh`
|
|
3. ⏳ Przetestować build
|
|
4. ⏳ Deploy do staging
|
|
|
|
### Krótkoterminowe (Ten tydzień)
|
|
1. ⏳ Code review eval() usage
|
|
2. ⏳ Audit wszystkich innerHTML
|
|
3. ⏳ Dodać CSP headers
|
|
4. ⏳ Setup Dependabot/Snyk
|
|
|
|
### Długoterminowe (Ten miesiąc)
|
|
1. ⏳ Wdrożyć security testing w CI/CD
|
|
2. ⏳ Regular security audits (weekly)
|
|
3. ⏳ Security training dla team
|
|
4. ⏳ Bug bounty program?
|
|
|
|
---
|
|
|
|
## Rollback Plan
|
|
|
|
Jeśli wystąpią problemy:
|
|
|
|
```bash
|
|
# 1. Przywróć dependencies
|
|
mv package-lock.json.backup package-lock.json
|
|
npm install
|
|
|
|
# 2. Revert code changes
|
|
git revert <commit-hash>
|
|
|
|
# 3. Raportuj issue
|
|
# Dołącz logi, browser info, error messages
|
|
```
|
|
|
|
---
|
|
|
|
## Kontakt
|
|
|
|
**Security Issues:** Zobacz `SECURITY_ANALYSIS.md`
|
|
**Questions:** Stwórz issue na GitHub
|
|
**Urgent:** Skontaktuj się z security team
|
|
|
|
---
|
|
|
|
*Dokument wygenerowany: 2025-12-18*
|
|
*Autor: Claude Code Security Audit*
|