c2pa-scanner
Prüft Website-Sitemaps auf KI-generierte Bilder anhand der C2PA- und EXIF/XMP-Herkunft — eine Hilfe für die KI-Kennzeichnung nach EU AI Act Art. 50, direkt im Terminal.
trainedAlgorithmicMedia).Mehrstufig und bewusst auf wenige Falsch-Positive ausgelegt.
Primärsignal: die offizielle c2pa-Lib liest das signierte Manifest; die digitalSourceType-Assertion entscheidet das Verdict (trainedAlgorithmicMedia = KI-generiert, compositeWithTrainedAlgorithmicMedia = KI-bearbeitet).
Denselben IPTC-Marker liest das Tool auch aus dem XMP, wenn kein gültiges C2PA vorhanden ist — so werden Bilder erkannt, die ihre Signatur beim Verkleinern verloren, das XMP aber behalten haben.
Fehlt jeder digitalSourceType, wird der Software- / CreatorTool-Tag gegen eine kuratierte Liste eindeutiger Generativ-KI-Tools geprüft (Midjourney, DALL-E, Stable Diffusion, Firefly …). Mehrdeutige Editoren wie Photoshop oder GIMP zählen bewusst NICHT.
Aus einer Sitemap werden alle Seiten geladen und die Bild-URLs per Regex über das rohe HTML extrahiert — das findet auch Bilder in Web-Component-Attributen und declarative Shadow-DOM, nicht nur klassische <img src>.
Fehlt eine direkte Sitemap-URL, wird sie automatisch gesucht (robots.txt, dann übliche Standardpfade). Vollständigere Sitemaps liefert das Schwester-Tool Sitemap-Tracker.
Zuschaltbar: jede Seite wird zusätzlich in einem headless Chromium (Playwright) gerendert, um auch erst per JavaScript ins (Shadow-)DOM geladene Bilder zu finden — als Ergänzung zur Regex-Extraktion (Union).
Rechts neben der Trefferliste eine Bildvorschau (Kitty-Grafik/Sixel mit Half-Block-Fallback), plus klickbarer Link zur Fundseite und ein Dialog mit dem rohen C2PA-Manifest.
Optional: unter dem Bild ein Screenshot der gerenderten Fundseite, zum Bild gescrollt - so prüfst Du ohne Absprung, ob das KI-Label auf/am Bild dargestellt wird. Eigener Playwright-Sidecar mit Cache und Cookie-Consent-Handling.
Ein Banner (Usercentrics, OneTrust, Cookiebot) wird automatisch bestätigt, sobald es geladen ist — sonst verdeckt es die Seiten-Vorschau, und beim Rendern bleiben Bilder ungeladen, die eine Seite erst nach der Zustimmung freigibt. Der Manager kommt per Skript nach und ist beim Laden der Seite noch nicht da, deshalb wird auf ihn gewartet statt einmal zu raten. Abschaltbar in den Einstellungen bzw. mit --no-consent.
Die Taste x steht nur während eines Laufs im Fuß und beendet ihn — angestoßene Abrufe laufen aus, neue kommen keine mehr dazu. Die bis dahin gefundenen Bilder bleiben in der Tabelle, statt wie beim Beenden mit q verloren zu gehen.
Rechtsklick-Kontextmenü auf der Tabelle: Export als JSON, JIRA-Tabelle oder Klartext — in die Zwischenablage oder als Datei. Filter auf „Nur KI-Bilder“.
Erzeugt ein echtes, C2PA-signiertes Testbild (KI-generiert oder KI-bearbeitet) als Positiv-Testfall — zum Prüfen der eigenen Pipeline.
Grenzen: Bilder ganz ohne Herkunftssignal (kein C2PA, kein XMP/EXIF) sind nicht als KI erkennbar. Metadaten lassen sich entfernen (Screenshot, erneutes Speichern, viele Plattformen strippen sie beim Upload). Ein Treffer ist ein belastbares Indiz für KI; das Fehlen ist kein Beweis dagegen — das Tool sieht nur, was die signierende Software eingetragen hat.
Vollständigkeitshalber: die Alternativen, die es gibt, aber bewusst NICHT eingebaut sind.
Google SynthID, Meta, Amazon Titan: robust gegen Bearbeitung, aber jedes Verfahren braucht den Detektor seines Anbieters — kein offener, universeller Reader. SynthID ist nur über Googles Portal prüfbar. Grund: nicht integrierbar.
„Ist das KI?“ (Hive, Sensity, Illuminarty): generatorübergreifend und nach Kompression/Verkleinern unzuverlässig, veralten schnell, adversarial fragil. Grund: für eine Kennzeichnungs-Entscheidung nicht verteidigbar.
Frequenzspektrum, Rausch-Residuen, Diffusions-Fingerprints: Forschungsgrad, kein fertiges Werkzeug, gleiche Zuverlässigkeits-Vorbehalte wie ML-Klassifikatoren. Grund: Aufwand/Nutzen passt nicht.
Gegen eine Registry bekannter KI-Bilder: funktioniert nur, wenn das Bild dort registriert ist — keine allgemeine Lösung. Grund: zu geringe Abdeckung.
Die Leitlinie: lieber wenige, belastbare Signale (Provenienz) als viele unsichere — passend zum Zweck, eine rechtssichere KI-Kennzeichnung nach EU AI Act Art. 50 zu unterstützen.
Die Technologien hinter dem Projekt.
Ohne Befehl startet die grafische TUI.
| Befehl | Beschreibung | Default |
|---|---|---|
c2pa-scanner | Grafische TUI starten | — |
tui [sitemap] | TUI mit optionaler Start-Sitemap | — |
scan <sitemap> | Sitemap crawlen und Bilder prüfen (URL, .xml oder Domain) | — |
scan --render | Seiten mit Playwright rendern (JS-/Shadow-DOM-Bilder) | aus |
scan --rate-limit N | Höchstens N Requests pro Minute (Seiten, Renderings, Bilder). 0 = ohne Limit | 60 |
scan --no-consent | Cookie-Banner stehen lassen statt zu bestätigen (wirkt nur mit --render) | aus |
scan --ignore-robots | robots.txt ignorieren (nur für eigene Seiten sinnvoll) | aus |
scan --accept-disclaimer | Haftungshinweis bestätigen (einmalig nötig) | aus |
make-testimage <out> | Signiertes C2PA-Testbild erzeugen | — |
make-testimage --edited | KI-bearbeitet statt KI-generiert | aus |
Was ein Scan auf dem Zielsystem anrichtet - und wer dafür geradesteht.
Eine Sitemap zu crawlen heißt, jede darin aufgeführte Seite und jedes Bild abzurufen. Mit Browser-Rendering läuft jede Seite zusätzlich durch ein echtes Chromium und damit an den Zwischenspeichern des Servers vorbei. Auf einer großen Website kommen so schnell mehrere hundert Requests pro Minute zusammen - genug, um ein Produktivsystem spürbar zu verlangsamen oder im ungünstigsten Fall an seine Speichergrenze zu bringen.
Deshalb ist der Scanner voreingestellt gedrosselt: 60 Requests pro Minute, Seiten, Renderings und Bilder zusammengezählt. Zwei Punkte dazu: Die Einstellung "Parallele Requests" begrenzt nur die Gleichzeitigkeit, nicht die Rate. Und mit Rendering werden ausschließlich die Seitenaufrufe gedrosselt - was der Browser danach an Skripten, Schriften und Bildern nachlädt, zählt nicht mit, die tatsächliche Last liegt also höher als die eingestellte Zahl.
Mit der Nutzung erklären Sie:
Die Software wird unentgeltlich und ohne jede Gewährleistung bereitgestellt ("as is"), wie in Abschnitt 7 der Apache-Lizenz 2.0 beschrieben. Eine Haftung des Autors (Michael Blaess) für Schäden, die aus der Nutzung entstehen, ist ausgeschlossen, soweit dies gesetzlich zulässig ist. Unberührt bleibt die Haftung für Vorsatz und grobe Fahrlässigkeit, für Schäden aus der Verletzung des Lebens, des Körpers oder der Gesundheit sowie nach dem Produkthaftungsgesetz.
Beim ersten Start fragt das Programm diesen Hinweis ab; ohne Zustimmung startet es nicht. Auf der
Kommandozeile wird er einmalig mit --accept-disclaimer bestätigt. Die Sprache richtet
sich dabei nach Deiner Systemumgebung - Deutsch nur bei deutschsprachiger Umgebung, sonst Englisch.
Fertige Binaries pro Plattform oder aus dem Quellcode.
Rechtsgrundlage: EU AI Act (VO 2024/1689), Artikel 50 — gültig ab 2. August 2026. Zum Gesetzestext.