~~NOTOC~~ {{wvds:title>Varnost}} ===== Varnostni Mehanizmi ===== WvdS Crypto Service implementira več zaščitnih mehanizmov, ki so **samodejno aktivni**. Ničesar vam ni treba konfigurirati. ---- ==== Omejevanje Hitrosti ==== Ščiti pred napadi zavrnitve storitve (DoS) z obremenitvijo. | Parameter | Vrednost | | Maks. zahtev/sekundo | 1000 | | Burst toleranca | 100 | | Cooldown | 100 ms | **Obnašanje ob prekoračitvi:** Zahteva --> [Rate Limiter] --> Status: 0x07 (RATE_LIMITED) --> Kriptografska operacija ni izvedena **Priporočilo za odjemalce:** * Pri statusu 0x07: Počakajte in ponovite z backoff * Eksponentna čakalna doba: 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; // Ni rate-limited usleep(delay_ms * 1000); delay_ms *= 2; // Eksponentni backoff retry++; } return -1; // Timeout } ---- ==== Sledenje Nonce ==== **Ponovna uporaba Nonce = Katastrofa** Pri AES-GCM ponovna uporaba nonce vodi do popolnega kompromitiranja obeh čistopisov! Crypto Service aktivno ščiti pred ponovno uporabo nonce: === Za Encrypt === * Nonce generira storitev (CSPRNG) * Odjemalec ne more predložiti lastne nonce * Vsaka nonce se uporabi samo enkrat === Za Decrypt === * Storitev shranjuje uporabljene nonce (Bloom Filter) * Pri ponovljeni nonce: Status 0x08 (NONCE_REUSE) * Velikost okna: 1 milijon nonce **Opomba:** Sledenje nonce je na ključ-ID. Pri rotaciji ključa se sledilnik ponastavi. ---- ==== Validacija Vhodov ==== Vsi vnosi se preverijo pred obdelavo: | Preverjanje | Koda napake | | Magic Byte != 0xC7 | 0x01 (INVALID_HEADER) | | Neznan Request-Type | 0x02 (INVALID_TYPE) | | Dolžina vsebine napačna | 0x03 (INVALID_PAYLOAD) | | Key-ID ne obstaja | 0x04 (KEY_NOT_FOUND) | | Vsebina > 64 KB | 0x09 (PAYLOAD_TOO_LARGE) | **Brez izjem:** Storitev ne vrže izjem. Vse napake se sporočijo preko statusnih kod. ---- ==== Maksimalna Velikost Vsebine ==== | Omejitev | 64 KB (65536 bajtov) | Razlogi: * Velikost skupnega pomnilnika omejena * Zaščita pred DoS (izčrpanje pomnilnika) * Predvidljiv čas izvajanja **Šifriranje velikih podatkov:** // Chunked Encryption za velike datoteke #define CHUNK_SIZE (60 * 1024) // 60 KB na kos 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 vsebuje Chunk-ID za zaščito vrstnega reda 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 ob Opustitvi ==== Vsi varnostno kritični podatki se po uporabi prepišejo: * Ključi (po kriptografski operaciji) * Čistopisi (po šifriranju) * Skupne skrivnosti (po izmenjavi ključev) **Implementacija:** // Prepreči optimizacijo prevajalnika 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 teče kot izoliran L4Re task: +---------------------------------------------------------------+ | L4Re Microkernel | +---------------------------------------------------------------+ | | | | | | | +--+--+ +---+---+ +---+---+ +---+---+ | | | Sigma0 | | Moe | | Crypto | | OEM | | | | (Root) | | (Mem) | | Service| | Gateway| | | +--------+ +-------+ +--------+ +--------+ | | | | | | +--------------+ | | SAMO ta IPC | +---------------------------------------------------------------+ **Varnostne garancije:** * Lasten naslovni prostor (brez neposrednega dostopa do pomnilnika) * Dovoljen samo ekspliciten IPC (na osnovi zmožnosti) * Brez dostopa do omrežja (air-gapped) ---- ==== Odpravljanje Težav ==== | Simptom | Možen vzrok | Rešitev | | Status 0x04 trajno | Key-Storage poškodovan | Ponovno generirajte ključe | | Status 0x07 pogosto | Hitrost zahtev previsoka | Batching, caching | | Status 0x08 | Rotacija ključa pozabljena | Generirajte nov ključ | | Počasna zmogljivost | FIPS način + Debug | Uporabite release build | | Puščanje pomnilnika | Odgovori niso obdelani | Počistite skupni pomnilnik | ---- [[.:api|< API Referenca]] | [[.:compliance|Naprej: Skladnost >]]