Instagram y el juego de la insinuación: Como un pequeño "leak" de Machine Learning permite saber el tipo de fotos publicas en cuentas privadas (Parte 2 de 3)
Como hemos visto al final de la primera parte de este artículo, una vez que ya hemos obtenido mediante técnicas de Web Scrapping todas las URLs del contenido multimedia de interés, sólo nos queda calcular el nivel de desnudez de un conjunto de imágenes. Para ello, vamos a necesitar algún recurso que sea capaz de reconocer imágenes explícitas. Esto, por supuesto, ya existe. Es posible entrenar una red neuronal para discriminar el contenido adecuado del que no lo es.
Como indicábamos un poco antes en este mismo artículo, en nuestra prueba de concepto hacemos uso de Nudity image detection HTTP API. Este proyecto proporciona una API REST lista para implementar que permite predecir si una imagen es ofensiva o tiene contenido para adultos. Se basa en open_nsfw, que proporciona un modelo de red neuronal de código abierto previamente entrenado para Caffe.
Opción 1: Ejecutar localmente el contenedor NSFW
La API y todo lo necesario para que funcione es parte de una imagen de Docker. Así que primero necesitarás instalar Docker para tu sistema operativo. Comando Docker Pull Command:
Opción 2: Levantando el servicio NSFW en Heroku
Si no deseamos desplegar una pesada imagen Docker en nuestro equipo local, contamos con la posibilidad de hacer uso de una opción simple y rápida que es desplegar la imagen en Heroku para poder hacer llamadas a la API. Esta es la opción por la que optamos.
Como podéis deducir del pipeline de la herramienta (Figura 7 de la primera parte de este artículo), este es el caso que nos ocupa, pues nos interesaba hacer requests en Batch para todas las URLs "scrapeadas". En nuestro caso, nos tuvimos que crear una cuenta en Heroku y dar los siguientes pasos:
Para cualquier duda sobre el uso de Docker, no dudéis en consultar el libro de 0xWord "Docker: SecDevOps" escrito por de Fran Ramírez, Elías Grande y Rafael Troncoso.
Preparando los perfiles objetivo y vigilante en Instagram
El principal requisito para poder usar todas las herramientas generadas para la PoC es tener un perfil de Instagram. Empecemos intentando averiguar el nivel de exposición de un perfil privado. Para ello nos creamos un perfil privado @charmingcdo (objetivo).
Una vez creado este perfil lo abrimos como público, empezamos a completar con alguna foto sugerente y comenzamos a seguir a gente con perfiles relativamente explícitos. También lo aderezábamos con algunos "likes" y comentarios habituales a otras cuentas. En apenas una semana y media conseguimos seguir a unos 150 perfiles y unos 60 followers. Todo esto con 4 fotografías de 4 personas que nada tenían que ver entre sí.
Cómo no, no tardamos en tener un grupo de seguidores que querían contactar con nosotros a toda costa. Aquí tenéis una de las múltiples vídeo-llamadas que recibimos de algunos de nuestros seguidores. Este fue en especial insistente. Esto sirve como ejemplo del nivel de exposición con el que nos podemos encontrar en estas redes sociales.
Para poder hacer la prueba, ahora nos creamos otra cuenta de Instagram desde la que hacer el scrapping a la que llamamos @ideaslocas_test (Este será nuestro vigilante). Esta cuenta tenía como misión únicamente monitorizar la cuenta objetivo.
Ejecutando el análisis del perfil privado
El primer paso es poner el perfil @charmingcdo como privado. Como se indicaba en la Figura 5 de la primera parter del artículo, nos interesamos en aquella región de la página web remarcada en naranja. El perfil @ideaslocas_test no es amigo de @charmingcdo. Por ello, sólo podemos hacer análisis de las imágenes de las cuentas sugeridas y, a lo sumo, de la de perfil.
Levantando la página web en local
Ejecutamos el siguiente comando para levantar el servidor Flask en local.
Y en la última parte veremos los resultados que se obtienen con este tipo de análisis. Os dejaremos además uno o dos vídeos para que veáis cómo es el proceso completo.
Saludos.
Figura 8: Instagram y el juego de la insinuación: Como un pequeño "leak" de Machine Learning permite saber el tipo de fotos publicas en cuentas privadas (Parte 2 de 3) |
Como indicábamos un poco antes en este mismo artículo, en nuestra prueba de concepto hacemos uso de Nudity image detection HTTP API. Este proyecto proporciona una API REST lista para implementar que permite predecir si una imagen es ofensiva o tiene contenido para adultos. Se basa en open_nsfw, que proporciona un modelo de red neuronal de código abierto previamente entrenado para Caffe.
Figura 9: Nudity Image Detection HTTP API en GitHub |
El objetivo principal de este modelo es proporcionar una solución lista para implementar de manera que las personas que puedan necesitar este tipo de servicio de forma gratuita hagan uso del mismo. La API REST de Python, con Caffe y open_nsfw, están empaquetadas todas juntas en una imagen de Docker. Tenemos dos opciones para poder hacer uso del servicio.
Opción 1: Ejecutar localmente el contenedor NSFW
La API y todo lo necesario para que funcione es parte de una imagen de Docker. Así que primero necesitarás instalar Docker para tu sistema operativo. Comando Docker Pull Command:
$ docker pull eugencepoi/nsfw_apiUna vez haya terminado el pull para levantar el servicio basta con ejecutar, por ejemplo:
$ docker run -it -p 127.0.0.1:5000:5000/tcp --env PORT=5000 eugencepoi/nsfw_api:latestSe podría hacer uso de la API para una imagen:
http://localhost:5000/?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.pngLo cual nos devolvería una puntuación (score) de idoneidad entre 0 y 1 para la dirección de la imagen facilitada a través del parámetro URL.
Opción 2: Levantando el servicio NSFW en Heroku
Si no deseamos desplegar una pesada imagen Docker en nuestro equipo local, contamos con la posibilidad de hacer uso de una opción simple y rápida que es desplegar la imagen en Heroku para poder hacer llamadas a la API. Esta es la opción por la que optamos.
Figura 10: The Heroku CLI |
Como podéis deducir del pipeline de la herramienta (Figura 7 de la primera parte de este artículo), este es el caso que nos ocupa, pues nos interesaba hacer requests en Batch para todas las URLs "scrapeadas". En nuestro caso, nos tuvimos que crear una cuenta en Heroku y dar los siguientes pasos:
• Descarga e instala Heroku CLI.
• Accede al registro de contenedores de Heroku. heroku container:login
• Creamos una aplicación heroku create YOUR_APP_NAME
• Subimos la imagen heroku container:push web --app YOUR_APP_NAME
• Lanzamos la imagen: heroku container:release web --app YOUR_APP_NAMEElegimos YOUR_APP_NAME = nsfw-api. El servicio a partir de ese momento estaría en funcionamiento a través de los endpoint URL (para una única URL) y batch-classify (para obtener las scores conjuntas de varias URLs).
Figura 11: Libro de Docker: SecDevOps escrito por Fran Ramírez y Rafael Troncoso |
Para cualquier duda sobre el uso de Docker, no dudéis en consultar el libro de 0xWord "Docker: SecDevOps" escrito por de Fran Ramírez, Elías Grande y Rafael Troncoso.
Preparando los perfiles objetivo y vigilante en Instagram
El principal requisito para poder usar todas las herramientas generadas para la PoC es tener un perfil de Instagram. Empecemos intentando averiguar el nivel de exposición de un perfil privado. Para ello nos creamos un perfil privado @charmingcdo (objetivo).
Una vez creado este perfil lo abrimos como público, empezamos a completar con alguna foto sugerente y comenzamos a seguir a gente con perfiles relativamente explícitos. También lo aderezábamos con algunos "likes" y comentarios habituales a otras cuentas. En apenas una semana y media conseguimos seguir a unos 150 perfiles y unos 60 followers. Todo esto con 4 fotografías de 4 personas que nada tenían que ver entre sí.
Figura 12: Nuestro perfil sugerente sufrió "acoso" por vídeo-llamadas al poco de crearlo. |
Figura 13: Cuenta @ideaslocas_test como cuenta vigilante |
Para poder hacer la prueba, ahora nos creamos otra cuenta de Instagram desde la que hacer el scrapping a la que llamamos @ideaslocas_test (Este será nuestro vigilante). Esta cuenta tenía como misión únicamente monitorizar la cuenta objetivo.
Ejecutando el análisis del perfil privado
El primer paso es poner el perfil @charmingcdo como privado. Como se indicaba en la Figura 5 de la primera parter del artículo, nos interesamos en aquella región de la página web remarcada en naranja. El perfil @ideaslocas_test no es amigo de @charmingcdo. Por ello, sólo podemos hacer análisis de las imágenes de las cuentas sugeridas y, a lo sumo, de la de perfil.
Levantando la página web en local
Ejecutamos el siguiente comando para levantar el servidor Flask en local.
$ python instagram_nsfw-webapp/app.pyTras ejecutar este comando se levantará un servidor al que se puede acceder a través de la ruta: http://localhost:5000/ Esto nos dirige a la página que nos permitirá lanzar el proceso de scrapping del perfil privado.
Figura 14: Página de login y comienzo de la búsqueda |
Y en la última parte veremos los resultados que se obtienen con este tipo de análisis. Os dejaremos además uno o dos vídeos para que veáis cómo es el proceso completo.
Saludos.
Autores: Chema Alonso (Contactar con Chema Alonso) y Enrique Blanco (@eblanco_h) miembro del equipo de Ideas Locas en CDO. Puedes contactar con Enrique Blanco en MyPublicInbox.
*****************************************************************************************
- Instagram y el juego de la insinuación (1 de 3)
- Instagram y el juego de la insinuación (2 de 3)
- Instagram y el juego de la insinuación (3 de 3)
*****************************************************************************************
1 comentario:
El Doge detective. Error 404 (teta not found) grrrr.
Publicar un comentario