Sicherheitslücken in KI-generiertem Code

Welche Sicherheitslücken hat mit KI generierter Code am häufigsten?

Vier, und sie liegen alle an der Grenze zwischen Code und Konfiguration — also genau dort, wo weder ein Linter noch ein URL-Scanner hinsieht: eine Tabelle im public-Schema ohne Row Level Security, ein Server-Geheimnis im Repository oder im Client-Bundle, eine API-Route, die eine vom Aufrufer genannte ID ohne Berechtigungsprüfung verwendet, und ein Storage-Bucket, der auf public steht. Alle vier stehen im Quelltext Ihres Projekts, und alle vier sind aus einer Migration, einer .env-Datei oder einer config.toml eindeutig ablesbar.

1. Fehlende Row Level Security

Erkennbar an einem create table public.… ohne zugehöriges alter table … enable row level security. Folge: die Tabelle ist über den anon key lesbar, der in jedem Browser-Bundle steht.

Die zweite Variante ist tückischer: RLS ist aktiv, aber eine Policy steht auf using (true). Im Dashboard sieht das aus wie „abgesichert“.

2. Exponierte Secrets

Ein service_role key, ein sk_live_-Stripe-Schlüssel oder ein Anbieter-Schlüssel für ein KI-Modell, committet oder unter NEXT_PUBLIC_ ausgeliefert. Der anon key gehört ausdrücklich nicht dazu.

Wichtig ist die Reihenfolge der Reaktion: rotieren, dann entfernen. Umgekehrt ändert sich nichts an der Kompromittierung.

3. Zugriffskontrolle, die es nicht gibt

Eine Route liest params.id oder ?order_id=, fragt damit die Datenbank und prüft nirgends, wer fragt. Wer die eigene Bestellung sehen kann, kann jede sehen — man muss die Zahl nur hochzählen.

Aus dem Code allein lässt sich das nicht beweisen, nur zeigen, dass die Prüfung fehlt. Der Beweis besteht aus zwei Anfragen: als Nutzer A auf die eigene Ressource und als Nutzer A auf die von B.

4. Öffentliche Storage-Buckets

public = true in der config.toml, ein insert into storage.buckets … true in einer Migration oder ein createBucket(name, { public: true }) im Code. Jede Datei darin ist mit der URL abrufbar — ohne Schlüssel, ohne Login.

Für Avatare und Marketingbilder ist das richtig. Für Rechnungen, Uploads und Dokumente ist es ein Leck, und die Lösung heißt signierte URLs statt getPublicUrl.

Sentris prüft diese vier Punkte automatisch

Ein Scan braucht keinen Account und kostet nichts — Sie sehen die Anzahl der Funde, bevor Sie irgendetwas bezahlen. Wie oft wir dabei danebenliegen, steht gemessen und mit Datum unter /precision; das veröffentlicht in diesem Markt sonst niemand. Gerichtsstand Schweiz, AVV und Unterauftragsverarbeiter sind öffentlich einsehbar.

App scannen

Sentris is evidence of technical measures taken. It is not evidence of GDPR compliance, and nobody selling a tool can issue that.