Die besten Möglichkeiten um Bilder auf Websites zu tarnen

Vor einer Weile erhielt ich eine Mail von einem deutschen Unternehmen, welches mich zur Zahlung bzw. Nachlizensierung von einem Bild auf meiner Website aufforderte. Gefunden wurde das Bild mit Hilfe einer Bildsuchmaschine. Zwar konnte ich nachweisen, dass ich das Bild rechtmäßig verwendet habe und die Forderung so abwenden aber diese Geschichte spare ich mir für einen anderen Post. Ich wollte herausfinden wie ich mich in Zukunft vor automatischen Zahlungsaufforderungen durch Bildsuchmaschinen schützen kann. Für mich ist das ein rechtlicher Angriffsvektor auf meine Website. Zwar gebe ich mir Mühe die Bilder auf meiner Website nach bestem Gewissen zu prüfen aber ganz sicher kann ich mir nie sein. Ich nutze häufig Bilder von Pixabay. Ich habe schon gelesen, dass einige Bilder von Pixabay nach einer Weile wieder verschwinden und dann trotzdem Forderungen auf Leute zukommen weil die Quelle nicht mehr nachgewiesen werden kann. Wie kann es also gelingen Bildsuchmaschinen auszutricksen?

Mir geht es hier nicht darum Lizenzvereinbarungen zu umgehen. Ich bin dankbar für alle freien Bilder, die es da draußen gibt und ich gestehe den Urheber:innen auch jede Leistung zu. Hier geht es wirklich nur um die Gefahren selbst trotz größter Sorgfalt das Ziel von Abmahnungen zu werden, die nicht gerechtfertigt sind.

Image Cloaking

Das Zauberwort heißt image cloaking. Ich will also versuchen Bilder so weit zu manipulieren, bis Bildsuchmaschinen diese nicht mehr finden können. Gleichzeitig darf das nicht dazu führen, dass die Bilder unbrauchbar werden. Dafür muss ich nicht darauf warten bis eine dieser Suchmaschinen meine manipulierten Bilder findet. Stattdessen kann ich den umgekehrten Weg gehen und die Bilder ganz direkt als Input bei den Suchmaschinen nutzen. Ich gehe hier also davon aus, dass die Suchmaschine die manipulierten Bilder nicht mehr finden kann, wenn ich ein manipuliertes Bild auch nicht mehr nutzen kann, um das Original zu finden. Für meine Tests will ich eine der größten und bekanntesten Suchmaschinen für Bilder nutzen: https://tineye.com/

Los gehts!

Ich starte auf pixabay.com und lade mir ein beliebiges frei verfügbares Bild herunter. Ich suche zum Beispiel nach "Katze" und speichere eines der Bilder ab.

Zunächst entferne ich nun die Exifdaten aus der Bilddatei und ändere den Dateinamen, um sicherzustellen, dass die gefundenen Matches in der Suchmaschine nur aufgrund der reinen Bilddaten zustande kommen. Es könnte ja sein, dass der Suchalgorithmus im Hintergrund Dateinamen und Metadaten in die Suche einbezieht. Das möchte ich so ausschließen.

Zunächst lade ich das Originalbild in der Suchmaschine hoch, um zu schauen, ob es überhaupt Treffer gibt. Das war bei dem von mir gewählten Bild der Fall. Es gab ca. 1000 Treffer auf diversen Websites.

Manipulationsversuche mit convert

Für die Manipulation des Bildes nutze ich den convert command von imagemagick. Wie du imagemagick unter Ubuntu installieren kannst erfährst du hier: https://wiki.ubuntuusers.de/ImageMagick/ Es ist aber auch für alle anderen gängigen Betriebssysteme verfügbar.

In der folgenden Tabelle kannst du sehen welche Kommandos ich genutzt habe, um das Bild zu manipulieren. Ich habe dazu jeweils notiert wie viele Treffer es nach der Manipulation in tineye.com gab. Außerdem habe ich in der Spalte "Usability" versucht zu bewerten wie brauchbar das Bild nach der Manipulation noch für die Website ist. Einige Techniken führen zwar dazu, dass das Bild nicht mehr gefunden wird, zerstören die Qualität aber so stark, dass es für die Website nicht mehr brauchbar ist. Bei einigen Methoden ist die Qualität des Bildes zwar total schlecht aber trotzdem wird es noch zuverlässig erkannt. Außerdem gibt es Methoden, die nur für manche Bilder funktionieren. Zum Beispiel horizontales und vertikales Spiegeln mit flip und flop. Diese Methoden führen zu guter Bildqualität und reduzieren gleichzeitig die Erkennungsrate erheblich. Jedoch sind diese Methoden für Bilder mit Textinhalten nicht zu gebrauchen.

Method Command Found Results Usability
original 976 good
quality 60 convert file.jpg -quality 60 file_quality_60.jpg 976 good
quality 20 convert file.jpg -quality 20 file_quality_20.jpg 963 low, many artifacts
jpeg:extent=25kb convert file.jpg -define jpeg:extent=25kb file_25kb.jpg 974 low, many artifacts
noise gaussian convert file.jpg +noise gaussian file_gaussian.jpg 976 low, big image size
monochrome convert file.jpg -monochrome file_monochrome.jpg 804 bad
flop convert file.jpg -flop file_flop.jpg 53 good for some images
flip convert file.jpg -flip file_flip.jpg 0 good for some images
blur 0x8 convert file.jpg -blur 0x8 file_blur.jpg 839 bad
rotate 10 convert file.jpg -distort ScaleRotateTranslate 10 file_rotate_10.jpg 741 good
rotate 11 convert file.jpg -distort ScaleRotateTranslate 11 file_rotate_11.jpg 684 good
rotate 12 convert file.jpg -distort ScaleRotateTranslate 12 file_rotate_12.jpg 432 good
rotate 13 convert file.jpg -distort ScaleRotateTranslate 13 file_rotate_13.jpg 72 good
rotate 14 convert file.jpg -distort ScaleRotateTranslate 14 file_rotate_14.jpg 1 good
rotate 15 convert file.jpg -distort ScaleRotateTranslate 15 file_rotate_15.jpg 0 good

Die Methode meiner Wahl: Rotate

Wie du sehen kannst scheint die KI von tineye.com ein Problem mit Rotation zu haben. Du kannst sehen, dass die Erkennungsrate mit steigender Rotation eines Bildes abnimmt. Das ist die bisher einzige funktionierende mir bekannte Methode, die auf nahezu alle Bilder anwendbar ist ohne die Bilder unbrauchbar zu machen und die gleichzeitig gute Ergebnisse bei der Tarnung erreicht.

Ein Bash-Script zur Automatisierung

Von nun an sind alle Bilder auf meiner Website mit Rotation gecloaked. Ich nutze hier die Länge der Bildnamen um einen festen Wert für die Rotation zu berechnen sowie die Richtung der Rotation festzulegen. So sind die Rotationen immer etwas anders aber für jedes Bild immer gleich. Das ist für statische Websites von Vorteil. Da ich die Website mit Rsync aktualisiere werden auch nur veränderte Bilder übertragen. Durch dieses Verfahren bleiben bereits rotierte Bilder immer gleich. Zusätzlich lasse ich noch einige andere Filter über die Bilder laufen. Auch wenn diese nicht so effektiv für das Verstecken sind. Ich füge zum Beispiel Rauschen hinzu, reduziere die Qualität sowie die Bildgröße. Das hat einfach noch Performancegründe und das Rauschen finde ich für diese Website ganz passend. Das Rauschen führt jedoch dazu, dass die Bilder nicht mehr komprimiert werden können, da das Rauschen zufällig ist. Daher nutze ich für die PNGs png8 mit 256 Farben, um die Bildgröße wieder dramatisch zu reduzieren. Bei den JPGs begrenze ich die Filesize auf 100kb, um die durch das Rauschen erzeugte Größe wieder zu reduzieren. Letztlich werden mit -strip noch die Exifdaten bereinigt. Das Script ersetzt alle Bilder in einem Verzeichnis. Also lege vorher unbedingt ein Backup an! Das Script ist ausbaufähig und nicht perfekt. Passe es also deinen Bedürfnissen an!

folder=./static/content/images

for i in $(find "$folder" -type f -print)
do
	filename=$(basename -- "$i")
	extension="${filename##*.}"
	length=${#filename}
	if [ $((length%2)) -eq 0 ];
	then
	    angle=$((length / 2))
	else
	    angle=$((length / 2 * -1))
	fi
	echo Processing file "$i"
	if [ "$extension" = "png" ]; then
	    echo rotating PNG image by "$angle" deg
	    convert "$i" -rotate "$angle" -transparent white +noise gaussian -strip -quality 60 png8:"$i"
	else
	    echo rotating JPG image by "$angle" deg
	    convert "$i" -distort ScaleRotateTranslate "$angle" +noise gaussian -strip -quality 60 -define jpeg:extent=100kb "$i"
	fi
done

Und nun viel Spaß beim Bilder verschleiern! Und nicht vergessen: Spendiert den Leuten auf Pixabay ab und an einen Kaffee!

Titelbild: https://pixabay.com/de/illustrations/camouflage-tarn-militär-textur-1541188/