03 abril 2009

Eliminando EXIF 'al vuelo'

Ahora que el universo es HTTP, es muy común servir imágenes con información sensible en sus cabeceras. Pensando cómo se podría eliminar esta información 'al vuelo' se me ocurrió una forma graciosa, sencilla y muy rápida para hacerlo. Sirva únicamente como ejemplo, puesto que el objetivo no es desarrollar la herramienta en sí, si no la prueba de la implantación.

El servidor web es un apache con mod_actions compilado:
[root@sbd bin]# ./httpd -l | grep act
mod_actions.c
[root@sbd bin]#
En la configuración del servicio, en el fichero httpd.conf modifico el "handle" para que ejecute un CGI cada vez que se hace una petición sobre determinado tipo de archivos, simplemente añadiendo la siguiente línea a este fichero:
Action image/jpeg /cgi-bin/images.cgi
Una vez realizado estos cambios, por cada petición a un archivo "jpg", el CGI de nombre "images.cgi", será ejecutado. Este archivo, no demasiado elaborado, contiene el siguiente código:
#!/bin/sh
# disable filename globbing
set -f
echo "Content-type: image/jpg"
echo
if [ -f "$PATH_TRANSLATED" ]; then
exiv2 delete "$PATH_TRANSLATED"
cat "$PATH_TRANSLATED"
fi
Podríamos añadir algún tipo de caché mediante la copia a otro directorio, para que no limpiase siempre la misma imagen con el consiguiente consumo de recursos o utilizar un proxy-cache que cachease directamente la imagen limpia.... vamos, es optimizable al 500%.

Para algo más sencillo el siguiente comando haría la limpia de todo el documentroot, aunque perdería la gracia:
find /var/www/htdocs -iname "*.jpg" -exec exiv2 delete {} \;
Por otra parte, se podrían añadir otro tipo de archivos con metadatos de otros ficheros ofimáticos, como pdf o docx, el primero utilizando la herramienta exiftool para eliminar XMP y el segundo limpiando los XML por ejemplo con XMLStarlet

Lo cierto es que esto de los metadatos cada vez es más complejo y no estoy demasiado actualizado. Con suerte en BlackHat Europa asistiré a la charla de Chema, la foca y el resto del circo y estaré algo más al día.