~~NOTOC~~ {{wvds:title>Sigurnost}} ===== Sigurnosni Mehanizmi ===== WvdS Crypto Service implementira više zaštitnih mehanizama koji su **automatski aktivni**. Ne trebate ništa konfigurirati. ---- ==== Ograničavanje Brzine ==== Štiti od napada uskraćivanja usluge (DoS) preopterećenjem. | Parametar | Vrijednost | | Maks. zahtjeva/sekundi | 1000 | | Burst tolerancija | 100 | | Cooldown | 100 ms | **Ponašanje pri prekoračenju:** Zahtjev --> [Rate Limiter] --> Status: 0x07 (RATE_LIMITED) --> Kriptografska operacija nije izvršena **Preporuka za klijente:** * Pri statusu 0x07: Pričekajte i ponovite s backoff * Eksponencijalno vrijeme čekanja: 100ms, 200ms, 400ms, ... int send_with_retry(const uint8_t* request, size_t len) { int retry = 0; int delay_ms = 100; while (retry < 5) { send_request(request, len); int status = get_response_status(); if (status != 0x07) return status; // Nije rate-limited usleep(delay_ms * 1000); delay_ms *= 2; // Eksponencijalni backoff retry++; } return -1; // Timeout } ---- ==== Praćenje Nonce ==== **Ponovna uporaba Nonce = Katastrofa** Kod AES-GCM, ponovna uporaba nonce vodi do potpune kompromitacije oba čista teksta! Crypto Service aktivno štiti od ponovne uporabe nonce: === Za Encrypt === * Nonce generira servis (CSPRNG) * Klijent ne može predložiti vlastitu nonce * Svaka nonce koristi se samo jednom === Za Decrypt === * Servis sprema korištene nonce (Bloom Filter) * Pri ponovljenoj nonce: Status 0x08 (NONCE_REUSE) * Veličina prozora: 1 milijun nonce **Napomena:** Praćenje nonce je po Key-ID. Pri rotaciji ključa pratilica se resetira. ---- ==== Validacija Unosa ==== Svi unosi se provjeravaju prije obrade: | Provjera | Kod greške | | Magic Byte != 0xC7 | 0x01 (INVALID_HEADER) | | Nepoznat Request-Type | 0x02 (INVALID_TYPE) | | Duljina sadržaja pogrešna | 0x03 (INVALID_PAYLOAD) | | Key-ID ne postoji | 0x04 (KEY_NOT_FOUND) | | Sadržaj > 64 KB | 0x09 (PAYLOAD_TOO_LARGE) | **Bez iznimaka:** Servis ne baca iznimke. Sve greške se vraćaju putem statusnih kodova. ---- ==== Maksimalna Veličina Sadržaja ==== | Ograničenje | 64 KB (65536 bajta) | Razlozi: * Veličina dijeljene memorije ograničena * Zaštita od DoS (iscrpljivanje memorije) * Predvidljivo vrijeme izvršavanja **Šifriranje velikih podataka:** // Chunked Encryption za velike datoteke #define CHUNK_SIZE (60 * 1024) // 60 KB po komadu int encrypt_large_file(FILE* in, FILE* out) { uint8_t buffer[CHUNK_SIZE]; size_t bytes_read; uint32_t chunk_id = 0; while ((bytes_read = fread(buffer, 1, CHUNK_SIZE, in)) > 0) { // AAD sadrži Chunk-ID za zaštitu redoslijeda char aad[32]; snprintf(aad, sizeof(aad), "chunk:%u", chunk_id++); uint8_t ct[CHUNK_SIZE + 28]; size_t ct_len; uint8_t nonce[12], tag[16]; encrypt_message(buffer, bytes_read, aad, strlen(aad), ct, &ct_len, nonce, tag); fwrite(nonce, 1, 12, out); fwrite(tag, 1, 16, out); fwrite(ct, 1, ct_len, out); } return 0; } ---- ==== Brisanje pri Oslobađanju ==== Svi sigurnosno kritični podaci se prepisuju nakon uporabe: * Ključevi (nakon kriptografske operacije) * Čisti tekstovi (nakon šifriranja) * Dijeljene tajne (nakon razmjene ključeva) **Implementacija:** // Spriječi optimizaciju kompajlera static void secure_zero(void* ptr, size_t len) { volatile uint8_t* p = (volatile uint8_t*)ptr; while (len--) *p++ = 0; } ---- ==== L4Re Izolacija ==== Crypto Service radi kao izolirani L4Re task: +---------------------------------------------------------------+ | L4Re Microkernel | +---------------------------------------------------------------+ | | | | | | | +--+--+ +---+---+ +---+---+ +---+---+ | | | Sigma0 | | Moe | | Crypto | | OEM | | | | (Root) | | (Mem) | | Service| | Gateway| | | +--------+ +-------+ +--------+ +--------+ | | | | | | +--------------+ | | SAMO ovaj IPC | +---------------------------------------------------------------+ **Sigurnosna jamstva:** * Vlastiti adresni prostor (bez izravnog pristupa memoriji) * Dozvoljen samo eksplicitni IPC (temeljen na mogućnostima) * Bez pristupa mreži (air-gapped) ---- ==== Rješavanje Problema ==== | Simptom | Mogući uzrok | Rješenje | | Status 0x04 trajno | Key-Storage oštećen | Regenerirajte ključeve | | Status 0x07 često | Brzina zahtjeva previsoka | Batching, caching | | Status 0x08 | Rotacija ključa zaboravljena | Generirajte novi ključ | | Spore performanse | FIPS način + Debug | Koristite release build | | Curenje memorije | Odgovori nisu obrađeni | Očistite dijeljenu memoriju | ---- [[.:api|< API Referenca]] | [[.:compliance|Dalje: Usklađenost >]]