~~NOTOC~~
{{wvds:title>Sicherheit}}
===== Sicherheitsmechanismen =====
Der WvdS Crypto Service implementiert mehrere Schutzmechanismen, die **automatisch aktiv** sind. Sie muessen nichts konfigurieren.
----
==== Rate Limiting ====
Schuetzt vor Denial-of-Service (DoS) Angriffen durch Ueberlastung.
| Parameter | Wert |
| Max Requests/Sekunde | 1000 |
| Burst-Toleranz | 100 |
| Cooldown | 100 ms |
**Verhalten bei Ueberschreitung:**
Request --> [Rate Limiter] --> Status: 0x07 (RATE_LIMITED)
--> Keine Crypto-Operation ausgefuehrt
**Client-Empfehlung:**
* Bei Status 0x07: Warten und Retry mit Backoff
* Exponentielle Wartezeit: 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; // Nicht rate-limited
usleep(delay_ms * 1000);
delay_ms *= 2; // Exponential backoff
retry++;
}
return -1; // Timeout
}
----
==== Nonce-Tracking ====
**Nonce-Reuse = Katastrophe**
Bei AES-GCM fuehrt die Wiederverwendung einer Nonce zur vollstaendigen Kompromittierung beider Klartexte!
Der Crypto Service schuetzt aktiv vor Nonce-Reuse:
=== Fuer Encrypt ===
* Nonce wird vom Service generiert (CSPRNG)
* Client kann keine eigene Nonce vorgeben
* Jede Nonce wird nur einmal verwendet
=== Fuer Decrypt ===
* Service speichert verwendete Nonces (Bloom Filter)
* Bei wiederholter Nonce: Status 0x08 (NONCE_REUSE)
* Fenstergroesse: 1 Million Nonces
**Hinweis:** Das Nonce-Tracking ist pro Key-ID. Bei Key-Rotation wird der Tracker zurueckgesetzt.
----
==== Input Validation ====
Alle Eingaben werden vor der Verarbeitung geprueft:
| Pruefung | Fehler-Code |
| Magic Byte != 0xC7 | 0x01 (INVALID_HEADER) |
| Unbekannter Request-Type | 0x02 (INVALID_TYPE) |
| Payload-Laenge falsch | 0x03 (INVALID_PAYLOAD) |
| Key-ID nicht vorhanden | 0x04 (KEY_NOT_FOUND) |
| Payload > 64 KB | 0x09 (PAYLOAD_TOO_LARGE) |
**Keine Exceptions:**
Der Service wirft keine Exceptions. Alle Fehler werden ueber Status-Codes zurueckgemeldet.
----
==== Max Payload Size ====
| Limit | 64 KB (65536 Bytes) |
Gruende:
* Shared Memory Groesse begrenzt
* DoS-Schutz (Memory Exhaustion)
* Vorhersagbare Laufzeit
**Grosse Daten verschluesseln:**
// Chunked Encryption fuer grosse Dateien
#define CHUNK_SIZE (60 * 1024) // 60 KB pro 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 enthaelt Chunk-ID fuer Reihenfolge-Schutz
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;
}
----
==== Zeroize on Drop ====
Alle sicherheitskritischen Daten werden nach Verwendung ueberschrieben:
* Schluessel (nach Crypto-Operation)
* Klartexte (nach Verschluesselung)
* Shared Secrets (nach Key-Exchange)
**Implementierung:**
// Compiler-optimierung verhindern
static void secure_zero(void* ptr, size_t len) {
volatile uint8_t* p = (volatile uint8_t*)ptr;
while (len--) *p++ = 0;
}
----
==== L4Re Isolation ====
Der Crypto Service laeuft als isolierter L4Re Task:
+---------------------------------------------------------------+
| L4Re Microkernel |
+---------------------------------------------------------------+
| | | | | |
| +--+--+ +---+---+ +---+---+ +---+---+ |
| | Sigma0 | | Moe | | Crypto | | OEM | |
| | (Root) | | (Mem) | | Service| | Gateway| |
| +--------+ +-------+ +--------+ +--------+ |
| | | |
| +--------------+ |
| NUR diese IPC |
+---------------------------------------------------------------+
**Sicherheitsgarantien:**
* Eigener Adressraum (kein direkter Memory-Zugriff)
* Nur explizite IPC erlaubt (Capability-basiert)
* Kein Netzwerk-Zugang (air-gapped)
----
==== Troubleshooting ====
| Symptom | Moegliche Ursache | Loesung |
| Status 0x04 dauerhaft | Key-Storage korrupt | Keys neu generieren |
| Status 0x07 haeufig | Request-Rate zu hoch | Batching, Caching |
| Status 0x08 | Key-Rotation vergessen | Neuen Key generieren |
| Langsame Performance | FIPS-Modus + Debug | Release-Build nutzen |
| Speicherleck | Responses nicht verarbeitet | Shared Memory clearen |
----
[[.:api|< API-Referenz]] | [[.:compliance|Weiter: Compliance >]]