Introducción
Sherloq es un proyecto de investigación personal sobre la implementación de un entorno totalmente integrado para forense de imágenes digitales. No está pensado como una herramienta automática que decide si una imagen es falsificada o no (esa herramienta probablemente nunca existirá…), sino como un compañero en la experimentación de varios algoritmos encontrados en los últimos trabajos de investigación y talleres.
Si bien muchas soluciones comerciales tienen precios de venta al público elevados y a menudo están reservadas a los organismos encargados de hacer cumplir la ley y a los organismos gubernamentales, este conjunto de herramientas pretende ser a la vez un framework extensible y un punto de partida para todo aquel que esté interesado en realizar experimentos en esta aplicación particular del procesamiento de señales digitales.
Creo firmemente que la security-by-obscurity es la forma incorrecta de ofrecer cualquier tipo de servicio forense (es decir, “Usando este software propietario le garantizo que esta foto es prístina… ¡y tiene que confiar en mí!”). Siguiendo la filosofía del código abierto, todo el mundo debería ser capaz de probar varias técnicas por su cuenta, adquirir conocimientos y compartirlos con la comunidad… ¡incluso mejor si contribuyen con mejoras en el código! 🙂
Historia
La primera versión fue escrita en 2015 usando C++11 para construir una utilidad de línea de comando con muchas opciones, pero pronto se volvió demasiado engorrosa y poco interactiva. Esa versión pudo ser compilada con CMake después de instalar las librerías OpenCV, Boost y AlgLib. Esta primera prueba de concepto ofrecía alrededor del 80% de las características planeadas (ver abajo la lista completa).
Aunque también incluye algoritmos novedosos, la versión 2017 añadió principalmente una interfaz gráfica de usuario multi-ventana basada en Qt para proporcionar una mejor experiencia al usuario. Se pudieron mostrar múltiples análisis en la pantalla y se implementó un rápido visor de zoom y desplazamiento para facilitar la navegación de las imágenes. Ese proyecto pudo ser compilado con Qt Creator con Qt 5 y OpenCV 3 y cubrió cerca del 70% de las características planeadas.
Avance rápido hasta el 2020 cuando decidí portar todo en Python (PySide2 + Matplotlib + OpenCV) para un desarrollo y despliegue más fácil. Aunque esta iteración acaba de empezar y todavía tengo que portar todo el código anterior en la nueva plataforma, creo que esta será la “forma” final del proyecto (¡siempre y cuando alguien no se ofrezca voluntario para desarrollar una bonita aplicación web!).
Estoy feliz de compartir mi código y ponerme en contacto con cualquiera que esté interesado en mejorarlo o probarlo, pero por favor, tened en cuenta que este repositorio no está destinado a la distribución de un producto final, mi objetivo es sólo seguir públicamente el desarrollo de una herramienta educativa sin pretensiones, así que esperad errores, código sin pulir y características que faltan! 😉
Características
Esta lista contiene las funciones que Sherloq proveerá (¡esperemos!) una vez que se alcance la etapa beta.
Interfaz
- Moderna interfaz gráfica de usuario basada en Qt con gestión de ventanas de múltiples herramientas
- Soporte para muchos formatos (JPEG, PNG, TIFF, BMP, WebP, PGM, PFM, GIF)
- Un visor de imágenes de alta respuesta con desplazamiento y zoom en tiempo real
- Muchos algoritmos de última generación para probar interactivamente
- Amplia ayuda en línea con explicaciones de la herramienta y tutoriales
- Exportar resultados de análisis tanto visuales como textuales
Herramientas
General
- Original Image: mostrar la imagen de referencia inalterada para la inspección visual
- File Digest: recuperar la información de los archivos físicos, los hashes criptográficos y perceptivos
- Hex Editor: abrir un editor hexadecimal externo para mostrar y editar los bytes en bruto
- Similar Search: navegar por los servicios de búsqueda en línea para encontrar imágenes visualmente similares
Metadata
- Header Structure: volcar la estructura de cabecera del archivo y mostrar una vista interactiva
- EXIF Full Dump: escudriñar a través de los metadatos de los archivos y reunir toda la información disponible
- Thumbnail Analysis: extraer la miniatura incrustada opcional y compararla con la original
- Geolocation Data: recuperar los datos de geolocalización opcionales y mostrarlos en un mapa global
Inspección
- Enhancing Magnifier: lupa con mejoras para identificar mejor las falsificaciones
- Channel Histogram: muestran canales de un solo color o un histograma interactivo compuesto RGB
- Global Adjustments: aplicar ajustes de imagen estándar (brillo, tonalidad, saturación, …)
- Reference Comparison: abrir una vista doble sincronizada para la comparación con otra imagen
Detalle
- Luminance Gradient: analizar las variaciones de brillo horizontal/vertical a través de la imagen
- Echo Edge Filter: utilizar filtros de derivados para revelar regiones artificiales desenfocadas
- Wavelet Threshold: reconstruir la imagen con diferentes umbrales de coeficiente de ondas
- Correlation Plot: explotar los patrones de correlación espacial entre los píxeles vecinos
Colores
- RGB/HSV Plots: muestran gráficos interactivos en 2D y 3D de valores de píxeles RGB y HSV
- Space Conversion: convertir los canales RGB en espacios HSV/YCbCr/Lab/Luv/CMYK/Gray
- PCA Projection: usar PCA de color para proyectar el píxel en la mayoría de los componentes salientes
- Pixel Statistics: calcular los valores RGB mínimos/máximos/promedios de cada píxel
Ruido
- Noise Separation: estimar y extraer diferentes tipos de componentes del ruido de la imagen
- Min/Max Deviation: destacar los píxeles que se desvían de las estadísticas min/max basadas en bloques
- Frequency Split: dividir la luminancia de la imagen en componentes de alta y baja frecuencia
- Bit Planes Values: mostrar aviones de bits individuales para encontrar patrones de ruido inconsistentes
JPEG
- Error Level Analysis: muestran la diferencia de nivel de píxeles con respecto a los niveles de compresión fijos
- Quality Estimation: extraer las tablas de cuantificación y estimar la última calidad de JPEG guardada
- Multiple Compression: utilizar los residuos para detectar la compresión múltiple a diferentes niveles
- DCT Dimples Map: analizar los artefactos de cuantificación periódica introducidos por los dispositivos
Manipulación
- Contrast Enhancement: analizar la distribución del color para detectar mejoras en el contraste
- Copy-Move Forgery: utilizar descriptores de características invariables para la detección de áreas clonadas
- Composite Splicing: explotar las estadísticas de DCT para la detección automática de la zona de empalme
- Image Resampling: estimar la interpolación de píxeles 2D para detectar rastros de remuestreo
Varios
- Median Filtering: detectar los rastros de procesamiento dejados por el filtrado de la mediana no lineal
- Illuminant Map: estimar la dirección de la luz local de la escena en las superficies 3D estimadas
- PRNU Identification: explotan el ruido del patrón del sensor introducido por diferentes cámaras
- Stereogram Decoder: decodificar imágenes 3D ocultas dentro de los autoestereogramas de ojos cruzados
Capturas de Pantalla
Aquí hay algunas capturas de pantalla de la anterior interfaz gráfica de C++ Qt (que se actualizará con la nueva versión):
File Analysis
Color Analysis
Visual Inspection
Instalación
Crear un entorno virtual
Linux
Instalar el administrador de paquetes
$ sudo apt install python3-distutils python3-dev python3-testresources subversion
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
Configurar los entornos virtuales
$ sudo pip install virtualenv virtualenvwrapper
$ echo -e "\n# Python Virtual Environments" >> ~/.bashrc
$ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
$ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
$ source ~/.bashrc
$ mkvirtualenv sq -p python3
MacOS
1) Abrir Terminal e ingresar `python3 --version` para instalar el intérprete y otras herramientas de línea de comandos
2) Una vez instalado, procede de manera similar a la instalación de Linux:
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
$ sudo pip install virtualenv virtualenvwrapper
$ echo -e "\n# Python Virtual Environments" >> ~/.bash_profile
$ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bash_profile
$ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bash_profile
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bash_profile
$ source ~/.bash_profile
3) $ mkvirtualenv sq -p python3
Windows
Puedes seguir esta guía (la instalación de Flask es opcional).
Conda
- Descarga e instala Anaconda (también se puede instalar miniconda, no tiene interfaz gráfica pero es más pequeña)
- Instalar la librería Xinerama:
sudo apt-get install libxcb-xinerama0
- Abrir una consola para crear un entorno Python (en Windows hay que iniciar una consola Conda o sth desde el menú Inicio):
conda create --copy -n sherloq python
- Después de que la instalación termine, teclea en la misma consola
conda activate sherloq
para activar el env y dejar la consola abierta.
Lanzamiento de Programa
- Clonar el contenido del repositorio en una carpeta local
- Cambiar el directorio actual a la carpetae
gui
dentro desherloq
- Ejecuta
pip install -r requirements.txt
- Lanza el programa con
python sherloq.py
sherloq (este enlace se abre en una nueva ventana) por GuidoBartoli (este enlace se abre en una nueva ventana)
An open-source digital image forensic toolset
Bibliografía
- Black Hat Briefings DC. (2008) “A Picture’s Worth: Digital Image Analysis and Forensics” . Washington, DC. Retrieved from http://blackhat.com/presentations/bh-dc-08/Krawetz/Whitepaper/bh-dc-08-krawetz-WP.pdf
- “Noiseprint: a CNN-based camera model fingerprint” (Davide Cozzolino, Luisa Verdoliva)
- “Exposing Digital Forgeries by Detecting Traces of Re-sampling” (Alin C. Popescu and Hany Farid)
- “Two Improved Forensic Methods of Detecting Contrast Enhancement in Digital Images” (Xufeng Lin, Xingjie Wei and Chang-Tsun Li)