~~NOTOC~~
{{wvds:title>Sicurezza}}
===== Meccanismi di Sicurezza =====
Il WvdS Crypto Service implementa diversi meccanismi di protezione che sono **automaticamente attivi**. Non dovete configurare nulla.
----
==== Rate Limiting ====
Protegge da attacchi Denial-of-Service (DoS) tramite sovraccarico.
| Parametro | Valore |
| Max richieste/secondo | 1000 |
| Tolleranza burst | 100 |
| Cooldown | 100 ms |
**Comportamento al superamento:**
Richiesta --> [Rate Limiter] --> Stato: 0x07 (RATE_LIMITED)
--> Nessuna operazione crypto eseguita
**Raccomandazione per i client:**
* Su stato 0x07: Attendere e riprovare con backoff
* Tempo di attesa esponenziale: 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; // Non rate-limited
usleep(delay_ms * 1000);
delay_ms *= 2; // Backoff esponenziale
retry++;
}
return -1; // Timeout
}
----
==== Nonce Tracking ====
**Riutilizzo Nonce = Catastrofe**
Con AES-GCM, il riutilizzo di una nonce porta alla compromissione completa di entrambi i testi in chiaro!
Il Crypto Service protegge attivamente dal riutilizzo nonce:
=== Per Encrypt ===
* La nonce è generata dal servizio (CSPRNG)
* Il client non può fornire una propria nonce
* Ogni nonce è usata una sola volta
=== Per Decrypt ===
* Il servizio memorizza le nonce usate (Bloom Filter)
* Su nonce ripetuta: Stato 0x08 (NONCE_REUSE)
* Dimensione finestra: 1 milione di nonce
**Nota:** Il tracking nonce è per Key-ID. Il tracker viene resettato alla rotazione chiavi.
----
==== Validazione Input ====
Tutti gli input vengono validati prima dell'elaborazione:
| Controllo | Codice errore |
| Magic Byte != 0xC7 | 0x01 (INVALID_HEADER) |
| Request-Type sconosciuto | 0x02 (INVALID_TYPE) |
| Lunghezza payload errata | 0x03 (INVALID_PAYLOAD) |
| Key-ID non esiste | 0x04 (KEY_NOT_FOUND) |
| Payload > 64 KB | 0x09 (PAYLOAD_TOO_LARGE) |
**Nessuna eccezione:**
Il servizio non lancia eccezioni. Tutti gli errori vengono restituiti tramite codici di stato.
----
==== Dimensione Massima Payload ====
| Limite | 64 KB (65536 byte) |
Motivi:
* Dimensione memoria condivisa limitata
* Protezione DoS (esaurimento memoria)
* Tempo di esecuzione prevedibile
**Cifrare dati grandi:**
// Chunked Encryption per file grandi
#define CHUNK_SIZE (60 * 1024) // 60 KB per chunk
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 contiene Chunk-ID per protezione ordine
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;
}
----
==== Azzeramento al Rilascio ====
Tutti i dati critici per la sicurezza vengono sovrascritti dopo l'uso:
* Chiavi (dopo operazione crittografica)
* Testi in chiaro (dopo cifratura)
* Segreti condivisi (dopo scambio chiavi)
**Implementazione:**
// Impedisce ottimizzazione del compilatore
static void secure_zero(void* ptr, size_t len) {
volatile uint8_t* p = (volatile uint8_t*)ptr;
while (len--) *p++ = 0;
}
----
==== Isolamento L4Re ====
Il Crypto Service gira come task L4Re isolato:
+---------------------------------------------------------------+
| L4Re Microkernel |
+---------------------------------------------------------------+
| | | | | |
| +--+--+ +---+---+ +---+---+ +---+---+ |
| | Sigma0 | | Moe | | Crypto | | OEM | |
| | (Root) | | (Mem) | | Service| | Gateway| |
| +--------+ +-------+ +--------+ +--------+ |
| | | |
| +--------------+ |
| SOLO questo IPC |
+---------------------------------------------------------------+
**Garanzie di sicurezza:**
* Spazio di indirizzamento proprio (nessun accesso diretto alla memoria)
* Solo IPC esplicito permesso (basato su capability)
* Nessun accesso alla rete (air-gapped)
----
==== Risoluzione Problemi ====
| Sintomo | Possibile causa | Soluzione |
| Stato 0x04 persistente | Key-Storage corrotto | Rigenerare le chiavi |
| Stato 0x07 frequente | Rate richieste troppo alto | Batching, caching |
| Stato 0x08 | Rotazione chiavi dimenticata | Generare nuova chiave |
| Performance lente | Modo FIPS + Debug | Usare build release |
| Memory leak | Risposte non elaborate | Pulire memoria condivisa |
----
[[.:api|< Riferimento API]] | [[.:compliance|Continua: Conformità >]]