ChainLock, nuestra herramienta para bloquear archivos importantes en Linux

Área de Innovación y Laboratorio de Telefónica Tech    29 septiembre, 2020

Supongamos que tienes un archivo valioso en tu sistema, algo como una billetera de bitcoins (‘wallet.dat’) o un documento con información sensible que quieres mantener seguro y para ello piensas en añadirle una contraseña.  Si utilizas Windows, tal vez, has tomado alguna medida extra para protegerte de clipboard hijacking malware, pero es probable que te preguntes cuál es el siguiente paso en esta carrera por no permitir que los atacantes tomen el control.

Sabemos que algunos malwares tienen como objetivo robar tu archivo ‘wallet.dat’ para que, una vez en su poder, intentar crackear la contraseña offline y transferir los fondos de esa billetera a sus cuentas. Por ello, desde el equipo de Innovación y Laboratorio, hemos creado una nueva herramienta pero, esta vez, para usuarios de Linux.

Queríamos que la herramienta fuese accesible para todos, y que pudiera utilizarse para proteger archivos sensibles sin tener que realizar tediosas tareas como recompilar el kernel o configurar un SELinux, así que creamos ChainLockChainlock puede bloquear cualquier archivo de tu ordenador con sistema Linux de tal forma que pueda ser accedido únicamente por una aplicación especifica. Por ejemplo, puedes bloquear tu archivo ‘wallet.dat’ y garantizar que solo pueda ser accedido por tu aplicación de bitcoin de preferencia y no pueda ser copiado o abierto por otra aplicación o por un malware.

¿Cómo funciona?

Primero, incorporamos el archivo a proteger con el ChainLock CLI. Este va a cifrar el archivo de destino con una contraseña segura, y luego aparece un código QR en la pantalla que podemos escanear con la aplicación complementaria para smartphone. Ahora, la llave para desbloquear el archivo protegido está guardada únicamente en tu smartphone. De esta manera ya tenemos una protección extra, ya que, para tener éxito, un atacante debería comprometer los dos dispositivos para desbloquear el archivo sin tu permiso.

Cuando intentemos acceder al archivo cifrado, podemos usar la línea de comando de la aplicación para desbloquearlo. Este nos mostrará un código QR que con la aplicación complementaria desde el smartphone podemos escanear, seleccionar el archivo que deseamos desbloquear, y la app enviará la información utilizando servicios de Tor hacia nuestra computadora para desbloquearlo.

ChainLock además inicia un daemon para vigilar el archivo y permitir el acceso sólo desde el binario o la aplicación autorizada, de manera tal que, una vez descifrado el archivo, no dejará que ninguna otra aplicación intente acceder al mismo si no es la aplicación que previamente se había definido para tal fin. 

¿Dónde puedo encontrarlo?

En la web de ChainLock se encuentra la aplicación para Linux y la aplicación complementaria para Android, y además puedes seguir el tutorial de uso. Además te dejamos un vídeo para que puedas verlo en acción:

Con esta herramienta hemos intentado desarrollar una prueba de concepto y poner a disposición de la comunidad una forma de asegurar sus archivos. Esperamos que sea de utilidad.

Talento digital: los 20 conocimientos y habilidades más demandados

Raúl Alonso    29 septiembre, 2020

¿Faltan personas o faltan competencias? Pese a las dificultades, el mercado laboral sigue contratando. No obstante, de cada seis empresas que requieren un profesional digital, solo una encuentra el perfil que busca.

Y para hacernos una idea de la dimensión de este desencuentro entre oferta y demanda, otro dato de Eurostat: en 2019, el 47% de las grandes empresas europeas fichó o intentó fichar a profesionales del sector digital.

Una vez más, hablamos de un problema que se agrava en España. Según la OCDE, el nuestro es el segundo país con mayor disfunción estructural entre la oferta y la demanda laboral, tan solo superado por Italia.

En su informe Employment Outlook 2019, la OCDE apunta una de las razones de la situación: el 28,1% de los universitarios elige en Europa carreras STEM (Ciencia, Tecnología, Ingeniería o Matemática, según el acrónimo inglés), en España lo hace el 23,7%.

Por su parte, el informe Empleabilidad y talento digital, de la Universidad Autónoma de Madrid y la Fundación Vass, dedica muchas de sus 106 páginas a analizar un problema coyuntural, que requiere la confluencia de muchos esfuerzos para ser solucionado.

Pero el estudio también incluye la solución, al menos a nivel individual. Y no es otra que identificar los conocimientos y habilidades que el profesional debe reunir para resultar atractivo al mercado laboral en la actualidad. Y es que, en mi opinión, no faltan tantas personas como competencias.

58% de conocimiento y 42% de habilidades

¿Qué profesional digital busca la empresa? Aquellos que quieren mostrar el talento más solicitado por el mercado deben diferenciar entre hard skills y soft skills. Pero, ¿qué porcentaje de uno y otro hay que  mostrar?

La respuesta puede sorprender. No se reclama el perfil del cerebrito brillante, como los protagonistas de la serie The Big Bang Theory (y que Sheldon Lee Cooper me perdone), sino perfiles más poliédricos y ricos en matices.

En concreto, según la Universidad Autónoma de Madrid, el talento digital más deseado estaría compuesto por:

  • 58,3% de hard skill. Se refiere al conocimiento o competencias duras, aquellas que le cualifican para desempeñar una labor profesional específica.
  • 41,7% de soft skill. Son esos atributos conductuales, también llamados competencias blandas y que todos identificamos con las habilidades. Sirven para poner en valor el conocimiento, ya que favorece que se adapte a entornos empresariales y humanos diferentes.

Resulta interesante señalar que en el estudio de la Universidad Autónoma presentado este 2020, las soft skills pesan 1,8 puntos más que en el del año pasad0 (39,9%).

Y es que las habilidades son, al menos, tan valiosas como el conocimiento para afrontar un entorno cambiante como el actual.

Para visualizar el reto, es muy recurrida la demoledora advertencia de la OCDE: el 14% de los trabajos podrán desaparecer entre 15 y 20 años, y otro 32% cambiará completamente su modelo de actuación, en este caso hablamos del conjunto de profesionales.

Qué talento digital busca la empresa

Llegamos al aporte más interesante del estudio de la universidad madrileña. Según su panel de expertos, estos son los conocimientos y habilidades más buscados por el mercado en la actualidad:

Las 10 primeras hard skills

  1. Desarrollos en Plataformas NET y/o Java EE.
  2. Despliegue y operación de software en la nube.
  3. Desarrollo web front-end: HTML, CSS, Javascript…
  4. Arquitecturas de microservicios y server-less.
  5. Desarrollo web Back End (PHP, JSP, ASP, HTML…).
  6. Diseño e implementación de bases de datos.
  7. Gestión y planificación de proyectos informáticos.
  8. Ciencia de datos: análisis de grandes volúmenes de información.
  9. Ingeniería de datos: plataformas software con volúmenes de información.
  10.  Técnicas de testing y desarrollo guiado por pruebas.

Las 10 primeras soft skills

  1. Adaptación al cambio y nuevas situaciones: flexibilidad.
  2. Capacidad analítica.
  3. Capacidad para la cooperación y el trabajo en equipo.
  4. Búsqueda de la excelencia y la mejora continua.
  5. Orientación a resultados.
  6. Responsable y sentido del deber; pensamiento crítico.
  7. Orientación al cliente.
  8. Habilidades en la comunicación oral y escrita.
  9. Capacidad de autoorganización.
  10. Dominio de idiomas.

La revolución de las redes empresariales ya ha empezado

Luis María Lepe    29 septiembre, 2020

Las redes empresariales conectan a los empleados de diferentes sedes proporcionándoles acceso a la información de la organización de una forma instantánea y segura.

Hace pocos años estas redes privadas virtuales (VPN) configuraban entornos mediante accesos dedicados (punto a punto, ATM, MPLS) dentro de los cuales circulaba la información de manera reservada y segura. Pero desde dichas redes no era sencillo conectarse a Internet. Se hacía a través de líneas sobre las que se colocaban complejos firewalls que filtraban el tráfico que entraba y salía de la empresa. La realidad es que en esa época tampoco era muy necesario acceder a Internet desde la oficina (tal vez para leer la prensa si la política de la empresa lo permitía). Todas las aplicaciones e información necesarias para trabajar estaban dentro del CPD corporativo y solo eran accesibles desde la oficina.

El perímetro estaba perfectamente definido mediante un cable que terminaba en un PC WINTEL de sobremesa dentro de los edificios, con un vigilante en la puerta. Esto simplificaba enormemente la gestión de la red y la protección de la información.

Todo está cambiando

  • Se han generalizado los accesos a Internet de alta velocidad y disponibilidad en el hogar (ADSL, FTTH), lo que, junto con la extensión de la movilidad (Wifi, LTE, 5G) hace posible el acceso a la información desde múltiples ubicaciones. A esto se suma la proliferación de nuevos elementos que se conectan a la red empresarial (IoT) y que el COVID-19 ha acelerado la implantación del teletrabajo de una manera que no podíamos imaginar.
  • El perímetro de la red empresarial ha saltado por los aires y es más amplio que nunca. El nuevo «borde» del servicio en ocasiones ni tan siquiera está bien definido. Esto añade complejidad a la gestión y nuevos retos en el ámbito de la ciberseguridad.

Redes empresariales adaptadas a la nueva realidad

Todo ello hace que en la actualidad nos enfrentemos a una nueva (y muy compleja) realidad cuando diseñamos las redes empresariales:

Cinco claves de las nuevas redes

Como consecuencia de todo esto, las redes empresariales tienen que evolucionar. Es necesario simplificar la gestión y facilitar que la información esté accesible de forma segura desde cualquier lugar y dispositivo. Para ello es necesaria una nueva arquitectura que comprenda las siguientes cinco piezas:

SDWAN: redes alineadas con el negocio

  1. Redes “softwarizadas” (SDWAN) sobre las que se incorporan funciones de red virtualizadas (NFV) para una adaptación dinámica de la red a las aplicaciones, integrada de manera nativa con la nube. Esto permite una mayor automatización y simplifica la gestión.
  2. Conectividad universal adaptada a las necesidades de las aplicaciones y empleados. La combinación de diferentes tipos de acceso (MPLS, FTTH, xDSL, LTE, 5G) permite atender necesidades específicas de las aplicaciones (por ejemplo, latencia y ancho de banda exigentes en aplicaciones de videoconferencia, escritorio remoto, VoIP … ) y aporta una mayor rapidez en los despliegues.
  3. Cloud híbrida que combina infraestructuras dedicadas con otras nubes en modo servicio (IaaS, PaaS o SaaS) prestadas por terceras partes.
  4. Seguridad desde el «borde del servicio». Modelo de entrega de servicio integrado de red más seguridad (SASE) Este modelo pone énfasis en los puntos desde los cuales se accede al servicio y abarca tanto las oficinas de la empresa como la red del operador o la infraestructura cloud para una visión integral.
  5. Eficiencia y captura de ahorros, sin renunciar a calidad de servicio. Se trata de optimizar el ancho de banda y equipamiento (hardware de propósito general desacoplado del software) a las necesidades del servicio en cada ubicación (por ejemplo, accesos MPLS para información crítica o legacy y accesos Internet para teletrabajo o cloud)

Convergencia de la red con las TI

Estamos en una nueva era: la de la convergencia de la red con las TI. La combinación de tecnologías de ambos mundos sin renunciar a privacidad y seguridad es una revolución. Es preciso abordarla junto al socio tecnológico idóneo. Telefónica Empresas tiene todas las capacidades necesarias.

Imagen

La Torre Outlet Zaragoza, un centro comercial con la digitalización en el ADN

Javier Lorente    29 septiembre, 2020

Si tuviéramos que dar una definición de digitalización, quizá una de las más acertadas sería la de utilizar la tecnología para registrar perfiles y comportamientos del mundo real de forma que interacciones analógicas se convierten en interacciones digitales con todo lo que eso conlleva en cuanto a tratamiento de datos, interacción en remoto, etc. Esta definición aplica a cualquier proceso de negocio y por tanto, no está suscrito a ningún tipo de sector concreto. Sectores tan dispares como la banca, industria, transporte, retail, etc. ya se transforman introduciendo la tecnología para eficientar procesos y disponer de herramientas que en un entorno previo a lo digital no estarían disponibles.

El complejo más digitalizado de España

Grupo Iberebro, con la idea de ofrecer a sus visitantes un nuevo concepto de ocio y compras absolutamente digitalizado, decide acometer un proyecto en el que transforma su antigua fábrica de Pikolin en Zaragoza en La Torre Outlet Zaragoza, el complejo comercial más digitalizado de España. El proyecto, consigue que este centro comercial no sea un centro comercial al uso. A través de la implementación de nuevas soluciones digitales tanto los nuevos consumidores del centro como los operadores que albergará podrán beneficiarse de un modelo relación-marca cliente basando en la omnicanalidad y la alta personalización de la oferta comercial. Un espacio a cielo abierto con estética industrial, que ha sido diseñado con un balance de comercios y ocio que hacen del mismo un espacio singular no solo en Aragón sino en todo el noreste español. Su propuesta comercial, en modo outlet, abarca casi un centenar de marcas mundialmente conocidas, sin embargo, en este post nos centraremos en hablar más allá de la propia oferta del centro y trasladaremos la importancia de la tecnología para que este espacio se convierta en un espacio comercial innovador. Sus espacios de ocio incluyen experiencias digitales en primera línea y el centro en su conjunto es diseñado en cada una de sus facetas con la digitalización en mente.

Telefónica, socio tecnológico del proyecto, ha integrado las soluciones para ofrecer a los clientes una experiencia única donde confluyen los mundos real y digital.

Telefónica, ha sido el partner tecnológico elegido para llevar a cabo este proyecto, integrando las capacidades de red, comunicaciones e infraestructuras WiFi con las soluciones digitales más avanzadas de IoT, Big Data e Inteligencia Artificial a través de la filial Telefónica Tech, para crear una experiencia de usuario única en la que confluyen el mundo físico y digital. La Torre Outlet Zaragoza abrirá sus puertas a finales de Octubre y tuvo el evento inaugural de encendido digital el 22 de septiembre, comenzando la cuenta atrás para la apertura definitiva.

El proyecto digital del centro ha ido de la mano del proyecto arquitectónico y de negocio, y esa simbiosis se refleja en el resultado. Desde su concepción, Telefónica ha estado trabajando con Grupo Iberebro para diseñar y llevar a cabo la mejor propuesta de tecnología, tanto en los aspectos de comunicaciones como de experiencia de usuario o seguridad. Desde las comunicaciones más básicas, a las cámaras de seguridad, pasando por las soluciones audiovisuales, han sido planteadas como un proyecto más, dentro del proyecto arquitectónico. Quizá la parte más visible de esta colaboración sea el Video Wall LED instalado en la plaza central del centro comercial con una superficie de 141m² de gran resolución (2880 x 768 pixeles), una de las más grandes de España y que, sincronizada con la iluminación y el sonido gracias a la plataforma de Smart Retail de Telefónica spotdyna, permitirá realizar eventos de todo tipo; incluso con interactividad con los visitantes.

Aunque no de los aspectos que mejor definen la digitalización de La Torre Outlet Zaragoza, aunque no sea visible para los visitantes, es el uso extensivo del Big Data, Wifi y Control de Aforos, además de los datos recopilados a través de la App, centralizado en un único dashboard interactivo de gestión, donde se integran todas las fuentes de datos disponibles para ayudar al centro a optimizar la toma de decisiones, basadas en datos, convirtiéndose en uno de los primeros centros comerciales data-driven de España. Además de las fuentes de datos procedentes de los sensores IoT del centro, se refuerza el conocimiento del cliente con los insights que provee Telefónica. Ello permitirá al centro y a las tiendas que lo conforman, una gestión más eficiente al poder tomar decisiones en tiempo real y desarrollar planes de acción basados en datos. La solución permite también identificar clientes potenciales y anticipar comportamientos de compra tanto en el centro comercial como en su página web.

Más allá de la interactividad de la pantalla principal, no faltan otras soluciones que transmiten esta digitalización y que permiten al público sentirse protagonistas del espacio en sus visitas. Con el objetivo de ofrecer una nueva experiencia digital, desde Telefónica Tech se ha desplegado en el centro Kimchi!, una solución de realidad aumentada que simula un photocall interactivo con la que los clientes pueden hacerse sus propias instantáneas y proyectarlas en el Vídeo Wall y que en función de los eventos y promociones del centro conseguirán una mayor interacción con los visitantes.

Este nuevo complejo será pionero en el mundo al desarrollar su gemelo digital 3D.

La Torre Outlet Zaragoza se convertirá también en el primer centro comercial a nivel mundial con un gemelo digital 3D, es decir, una recreación virtual del mismo desarrollado por Imascono, un estudio aragonés especializado en realidad extendida. Este espacio virtual permitirá, entre otras cosas, pasear por el centro, descubrir sus tiendas y, en un futuro, realizar compras (e-commerce 3D) así como reunirse con amigos y conocer a nuevas personas (red social 3D). Siendo la seguridad integral del complejo otra parte fundamental de la digitalización del mismo, operada desde el Centro de Control de Seguridad de Telefónica se configurará como un sofisticado sistema de última generación.

En el evento del pasado 22 de septiembre se pudo observar la capacidad de crear experiencias gracias a la tecnología, con momentos como el miniconcierto en directo de Lionwareo o la reproducción de ciertos contenidos sincronizados anunciando la próxima apertura.

Como en otras ocasiones, Telefónica ha sido apoyado por algunos colaboradores que han ayudado a que el proyecto sea un éxito en su conjunto, como BGL Audiovisual, Imascono, Hapigami o Tecco, empresas que han aportado elementos de la experiencia que han sido integrados y coordinados por Telefónica.

Tendremos que esperar aún unos días para poder recorrer las calles del centro comercial, visitar sus cines o sus centros experienciales de realidad virtual. De momento nos recuerda ese momento una cuenta atrás situada en la emblemática Torre Pikolin, a pocos metros del centro, que también ha sigo digitalizada con nuevas pantallas.

DCGAN para reconstrucción de imágenes

Enrique Blanco    29 septiembre, 2020

Hacer algo más de un año en este blog hicimos una muy breve introducción a los modelos generativos profundos. Hoy vamos a mostrar como construir y entrenar una DCGAN (Deep convolutional generative adversarial networks) dedicada a la reconstrucción de imágenes haciendo uso de Python y Keras.

Las arquitecturas generativas más usadas, recordemos, son los Variational Autoencoders (VAEs) y las GANs o Generative Adversarial Networks. 

En este artículo, vamos a poner un ejemplo práctico con Keras de implementación de una GAN para la reconstrucción de imágenes. Este tipo de redes son el perfecto ejemplo de una red neuronal que constituye un modelo generativo haciendo uso del paradigma de aprendizaje no supervisado para entrenar dos modelos en paralelo en un juego de suma cero.

Figura 1. Ejemplo de una red neuronal GAN. Fuente
Figura 1. Ejemplo de una red neuronal GAN. Fuente

La misión del generador es crear nuevas imágenes similares al conjunto de datos que deberían ser indistinguibles por las redes discriminadoras. La red discriminadora tiene en cuenta dos salidas, que son las imágenes del conjunto de datos real y las imágenes que salen de la red del generador.

El discriminador funciona como un clasificador binario y determina si una imagen dada por el generador es sintética o real.

Comencemos definiendo la ubicación del checkpoint del generador que vamos a entrenar además de importar las librerías y el dataset con el que vamos a trabajar.

codegenerator_save_name = 'generator.h5'
generator_checkpoint_path = './checkpoints/'

import numpy as np
import random
import matplotlib.pyplot as plt
import datetime
import os
from tqdm import tqdm

from keras.layers import Input, Conv2D
from keras.layers import AveragePooling2D, BatchNormalization
from keras.layers import UpSampling2D, Flatten, Activation
from keras.models import Model, Sequential
from keras.layers.core import Dense, Dropout
from keras.layers.advanced_activations import LeakyReLU
from keras.callbacks import EarlyStopping, TensorBoard
from keras.optimizers import Adam
from keras import backend as K
from keras.datasets import mnist

Como vemos, contamos con 60000 imágenes de entrenamiento y 10000 imágenes de testeo con una dimensión de 28 x 28 píxeles para un total de 10 clases distintas.

(X_train, y_train), (X_test, y_test) =  mnist.load_data()

print('Size of the training_set: ', X_train.shape)
print('Size of the test_set: ', X_test.shape)
print('Shape of each image: ', X_train[0].shape)
print('Total number of classes: ', len(np.unique(y_train)))
print('Unique class labels: ', np.unique(y_train))
----------------------------------------------------------------
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
Size of the training_set:  (60000, 28, 28)
Size of the test_set:  (10000, 28, 28)
Shape of each image:  (28, 28)
Total number of classes:  10
Unique class labels:  [0 1 2 3 4 5 6 7 8 9]


Aquí podemos ver 9 ejemplos de los dígitos que hemos importado. Cada una de estas imágenes viene acompañada de su correspondiente etiqueta.

# Plot of 9 random images
for i in range(0, 9):
    plt.subplot(331+i) # plot of 3 rows and 3 columns
    plt.axis('off') # turn off axis
    plt.imshow(X_train[i], cmap='gray') # gray scale
Figura 2. Muestra de 9 imágenes contenidas en MNIST dataset.
Figura 2. Muestra de 9 imágenes contenidas en MNIST dataset.

Data preprocessing

Las imágenes vienen con un solo canal entre 0 y 255. Nuestra intención aquí para procesar la imagen es hacer una normalización entre -1 y 1.

# Converting integer values to float types 
X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)

# Scaling and centering
X_train = (X_train - 127.5) / 127.5
X_test = (X_test - 127.5)/ 127.5
print('Maximum pixel value in the training_set after Centering and Scaling: ', np.max(X_train))
print('Minimum pixel value in the training_set after Centering and Scaling: ', np.min(X_train))
----------------------------------------------------------------
Maximum pixel value in the training_set after Centering and Scaling:  1.0
Minimum pixel value in the training_set after Centering and Scaling:  -1.0

Enriqueciendo el dataset

Ahora vamos a crear una función que modifique un poco nuestras imágenes. Nuestra misión es incluir algunas máscaras de ceros dentro de la imagen para un pequeño número de píxeles. Un ejemplo del resultado de aplicar esa función lo podemos ver a continuación. 

def noising(image):
    """Masking."""
    import random
    array = np.array(image)
    i = random.choice(range(8, 12))  # x coord for top left corner of the mask
    j = random.choice(range(8, 12))  # y coord for top left corner of the mask
    array[i:i+8, j:j+8] = -1  # setting the pixels in the masked region to 0
    return array

noised_train_data = np.array([*map(noising, X_train)])
noised_test_data = np.array([*map(noising, X_test)])
print('Noised train data Shape/Dimension : ', noised_train_data.shape)
print('Noised test data Shape/Dimension : ', noised_train_data.shape)
----------------------------------------------------------------
Noised train data Shape/Dimension :  (60000, 28, 28)
Noised test data Shape/Dimension :  (60000, 28, 28)
Figura 3. Muestra de las mismas 9 imágenes de la Figura 2, pero enmascaradas.
Figura 3. Muestra de las mismas 9 imágenes de la Figura 2, pero enmascaradas.

Haciendo un reshaping de los datos de entrenamiento y testeo

Para poder alimentar correctamente tanto el discriminador como el generador necesitamos hacer un reshape de nuestro DataSet simplemente añadimos una dimensión más a las ya conocidas.

c# Reshaping the training data
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], X_train.shape[2], 1)
print('Size/Shape of the original training set: ', X_train.shape)

# Reshaping the nosied training data
noised_train_data = noised_train_data.reshape(noised_train_data.shape[0],
                                              noised_train_data.shape[1],
                                              noised_train_data.shape[2], 1)
print('Size/Shape of the noised training set: ', noised_train_data.shape)

# Reshaping the testing data
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], X_test.shape[2], 1)
print('Size/Shape of the original test set: ', X_test.shape)

# Reshaping the noised testing data
noised_test_data = noised_test_data.reshape(noised_test_data.shape[0],
                                            noised_test_data.shape[1],
                                            noised_test_data.shape[2], 1)
print('Size/Shape of the noised test set: ', noised_test_data.shape)
----------------------------------------------------------------
Size/Shape of the original training set:  (60000, 28, 28, 1)
Size/Shape of the noised training set:  (60000, 28, 28, 1)
Size/Shape of the original test set:  (10000, 28, 28, 1)
Size/Shape of the noised test set:  (10000, 28, 28, 1)

A continuación, incluimos algunas funciones auxiliares para revertir el escalado de las imágenes y para representar el resultado del aprendizaje de nuestro generador durante el entrenamiento.

ef upscale(image):
    """Scale the image to 0-255 scale."""
    return (image*127.5 + 127.5).astype(np.uint8)


def generated_images_plot(original, noised_data, generator):
    """Plot subplot of images during training."""
    print('NOISED')
    for i in range(9):
        plt.subplot(331 + i)
        plt.axis('off')
        plt.imshow(upscale(np.squeeze(noised_data[i])), cmap='gray')
    plt.show()
    print('GENERATED')
    for i in range(9):
        pred = generator.predict(noised_data[i:i+1], verbose=0)
        plt.subplot(331 + i)
        plt.axis('off')
        plt.imshow(upscale(np.squeeze(pred[0])), cmap='gray')
    plt.show()
    print('ORIGINAL')
    for i in range(9):
        plt.subplot(331 + i)
        plt.axis('off')
        plt.imshow(upscale(np.squeeze(original[i])), cmap='gray')
    plt.show()


def plot_generated_images_combined(original, noised_data, generator):
    """Another function to plot images during training."""
    rows, cols = 4, 12
    num = rows * cols
    image_size = 28
    generated_images = generator.predict(noised_data[0:num])
    imgs = np.concatenate([original[0:num], noised_data[0:num],
                          generated_images])
    imgs = imgs.reshape((rows * 3, cols, image_size, image_size))
    imgs = np.vstack(np.split(imgs, rows, axis=1))
    imgs = imgs.reshape((rows * 3, -1, image_size, image_size))
    imgs = np.vstack([np.hstack(i) for i in imgs])
    imgs = upscale(imgs)
    plt.figure(figsize=(8, 16))
    plt.axis('off')
    plt.title('Original Images: top rows, '
              'Corrupted Input: middle rows, '
              'Generated Images: bottom rows')
    plt.imshow(imgs, cmap='gray')
    plt.show()


def plot_training_loss(discriminator_losses, generator_losses):
    """Plot the losses."""
    plt.figure()
    plt.plot(range(len(discriminator_losses)), discriminator_losses,
             color='red', label='Discriminator loss')
    plt.plot(range(len(generator_losses)), generator_losses,
             color='blue', label='Adversarial loss')
    plt.title('Discriminator and Adversarial loss')
    plt.xlabel('Iterations')
    plt.ylabel('Loss (Adversarial/Discriminator)')
    plt.legend()
    plt.show()

Definición de hiperparametros de nuestra red neuronal

K.clear_session()

# Smoothing value
smooth_real = 0.9

# Number of epochs
epochs = 10

# Batchsize
batch_size = 64

# Optimizer for the generator
optimizer_g = Adam(lr=0.0002, beta_1=0.5)

# Optimizer for the discriminator
optimizer_d = Adam(lr=0.0004, beta_1=0.5)

# Shape of the input image
input_shape = (28,28,1)

Creando el generador

Vamos a crear la arquitectura del generador usando Keras. Probemos en primer lugar con seis bloques convolucionales.

def img_generator(input_shape):
    generator = Sequential()
    generator.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape)) # 32 filters
    generator.add(BatchNormalization())
    generator.add(Activation('relu'))
    generator.add(AveragePooling2D(pool_size=(2, 2)))
    
    generator.add(Conv2D(64, (3, 3), padding='same')) # 64 filters
    generator.add(BatchNormalization())
    generator.add(Activation('relu'))
    generator.add(AveragePooling2D(pool_size=(2, 2)))
    
    generator.add(Conv2D(128, (3, 3), padding='same')) # 128 filters
    generator.add(BatchNormalization())
    generator.add(Activation('relu')) 
    
    generator.add(Conv2D(128, (3, 3), padding='same')) # 128 filters
    generator.add(Activation('relu'))
    generator.add(UpSampling2D((2,2)))
    
    generator.add(Conv2D(64, (3, 3), padding='same')) # 64 filters
    generator.add(Activation('relu'))
    generator.add(UpSampling2D((2,2)))
    
    generator.add(Conv2D(1, (3, 3), activation='tanh', padding='same')) # 1 filter
    return generator
# print generator summary
img_generator(input_shape).summary()
----------------------------------------------------------------
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 32)        320       
_________________________________________________________________
batch_normalization_1 (Batch (None, 28, 28, 32)        128       
_________________________________________________________________
activation_1 (Activation)    (None, 28, 28, 32)        0         
_________________________________________________________________
average_pooling2d_1 (Average (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 64)        18496     
_________________________________________________________________
batch_normalization_2 (Batch (None, 14, 14, 64)        256       
_________________________________________________________________
activation_2 (Activation)    (None, 14, 14, 64)        0         
_________________________________________________________________
average_pooling2d_2 (Average (None, 7, 7, 64)          0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 7, 7, 128)         73856     
_________________________________________________________________
batch_normalization_3 (Batch (None, 7, 7, 128)         512       
_________________________________________________________________
activation_3 (Activation)    (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 7, 7, 128)         147584    
_________________________________________________________________
activation_4 (Activation)    (None, 7, 7, 128)         0         
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 14, 14, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 14, 14, 64)        73792     
_________________________________________________________________
activation_5 (Activation)    (None, 14, 14, 64)        0         
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 28, 28, 1)         577       
=================================================================
Total params: 315,521
Trainable params: 315,073
Non-trainable params: 448
_________________________________________________________________

Cómo vemos hemos creado un modelo con unos 315 parámetros a optimizar.

Creando el discriminador

Ahora es el turno de crear el discriminador. Vamos a poner tres bloques convolucionales seguidos de una capa densa que termine en una única unidad, con un 0 o un 1.

def img_discriminator(input_shape):
    discriminator = Sequential()
    discriminator.add(Conv2D(64, (3, 3), strides=2, padding='same', input_shape=input_shape, activation = 'linear'))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.2))
    
    discriminator.add(Conv2D(128, (3, 3), strides=2, padding='same', activation = 'linear'))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.2))
    
    discriminator.add(Conv2D(256, (3, 3), padding='same', activation = 'linear'))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.2))
    
    discriminator.add(Flatten())
    discriminator.add(Dense(1, activation='sigmoid'))

    return discriminator
# print summary of the discriminator
img_discriminator(input_shape).summary()
----------------------------------------------------------------
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_7 (Conv2D)            (None, 14, 14, 64)        640       
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU)    (None, 14, 14, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 14, 14, 64)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 7, 7, 128)         73856     
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU)    (None, 7, 7, 128)         0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 7, 7, 128)         0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 7, 7, 256)         295168    
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU)    (None, 7, 7, 256)         0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 7, 7, 256)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 12544)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 12545     
=================================================================
Total params: 382,209
Trainable params: 382,209
Non-trainable params: 0
_________________________________________________________________

El número de parámetros a entrenar esta rama de la GAN está en el mismo orden de magnitud que para el generador.

Creando la GAN

Tras definir el discriminador y el generador, con la siguiente función vamos a ser capaces de construir la red neuronal generativa.

def dcgan(discriminator, generator, input_shape):
    # Don't train the discriminator when compiling GAN
    discriminator.trainable = False

    # Accepts the noised input
    gan_input = Input(shape=input_shape)
    
    # Generates image by passing the above received input to the generator
    gen_img = generator(gan_input)
    
    # Feeds the generated image to the discriminator
    gan_output = discriminator(gen_img)
    
    # Compile everything as a model with binary crossentropy loss
    gan = Model(inputs=gan_input, outputs=gan_output)
    return gan

Entendiendo el entrenamiento

Sigamos los siguientes pasos para entrenar nuestro modelo generativo

  1. Cargamos el generador y el discriminador haciendo uso de las funciones que acabamos de crear;
  2. Compilamos el discriminador con una función de pérdida binary cross entropy;
  3. Creamos la GAN y compilamos con la misma función de pérdida;
  4. Generamos baches tanto de imágenes originales como de imágenes modificadas y alimentamos el generador con imágenes modificadas;
  5. A continuación, alimentamos el discriminador con imágenes originales e imágenes obtenidas desde el generador;
  6. Ponemos discriminator.trainable a True para permitir que el discriminador se entren con este nuevo set de imágenes;
  7. Alimentamos el generador con aquellas imágenes que el discriminador ha etiquetado como 1. No se nos debe olvidar cambiar discriminator.trainable a False. No queremos que el discriminador modifique sus pesos mientras se está entrenando el generador;
  8. Desde el punto cuatro hasta el punto 7 repetimos los pasos durante tantas épocas como hayamos definido.
def train(X_train,      noised_train_data,
          input_shape,  smooth_real,
          epochs,       batch_size,
          optimizer_g, optimizer_d):
    """Training GAN."""
    discriminator_losses = []
    generator_losses = []

    # Number of iteration possible with batches of size 128
    iterations = X_train.shape[0] // batch_size
    # Load the generator and the discriminator
    generator = img_generator(input_shape)
    discriminator = img_discriminator(input_shape)
    # Compile the discriminator with binary_crossentropy loss
    discriminator.compile(loss='binary_crossentropy', optimizer=optimizer_d)
    # Feed the generator and the discriminator to the function dcgan
    # to form the DCGAN architecture
    gan = dcgan(discriminator, generator, input_shape)
    # Compile the DCGAN with binary_crossentropy loss
    gan.compile(loss='binary_crossentropy', optimizer=optimizer_g)

    for i in range(epochs):
        print('Epoch %d' % (i+1))
        # Use tqdm to get an estimate of time remaining
        for j in tqdm(range(1, iterations+1)):
            # batch of original images (batch = batchsize)
            original = X_train[np.random.randint(0, X_train.shape[0],
                                                 size=batch_size)]
            # batch of noised images (batch = batchsize)
            noise = noised_train_data[np.random.randint(0,
                                                        noised_train_data.shape[0],
                                                        size=batch_size)]
            # Generate fake images
            generated_images = generator.predict(noise)
            # Labels for generated data
            dis_lab = np.zeros(2*batch_size)
            dis_train = np.concatenate([original, generated_images])
            # label smoothing for original images
            dis_lab[:batch_size] = smooth_real
            # Train discriminator on original images
            discriminator.trainable = True
            discriminator_loss = discriminator.train_on_batch(dis_train,
                                                              dis_lab)
            # save the losses
            discriminator_losses.append(discriminator_loss)
            # Train generator
            gen_lab = np.ones(batch_size)
            discriminator.trainable = False
            sample_indices = np.random.randint(0, X_train.shape[0],
                                               size=batch_size)
            original = X_train[sample_indices]
            noise = noised_train_data[sample_indices]

            generator_loss = gan.train_on_batch(noise, gen_lab)
            # save the losses
            generator_losses.append(generator_loss)
            if i == 0 and j == 1:
                print('Iteration - %d', j)
                generated_images_plot(original, noise, generator)
                plot_generated_images_combined(original, noise, generator)
        
        print("Discriminator Loss: ", discriminator_loss,
              ", Adversarial Loss: ", generator_loss)
        generated_images_plot(original, noise, generator)
        plot_generated_images_combined(original, noise, generator)

        # Save generator model
        generator.save(generator_checkpoint_path) 
        
    # plot the losses
    plot_training_loss(discriminator_losses, generator_losses)

    return generator

Procedamos a lanzar el entrenamiento:

generator = train(X_train, noised_train_data,
                  input_shape, smooth_real,
                  epochs, batch_size,
                  optimizer_g, optimizer_d)
Figura 3. Primera evaluación antes de empezar la primera época de entrenamiento (I)
Figura 4. Primera evaluación antes de empezar la primera época de entrenamiento (II)
Figura 4. Primera evaluación antes de empezar la primera época de entrenamiento (II)
Figura 5. Inferencia del generador tras 10 épocas de entrenamiento (I)
Figura 5. Inferencia del generador tras 10 épocas de entrenamiento (I)
Figura 6. Inferencia del generador tras 10 épocas de entrenamiento (II)
Figura 6. Inferencia del generador tras 10 épocas de entrenamiento (II)

Es fácil observar cómo el generador aprende a reproducir las imágenes que se le facilitan, aunque estas estén enmascaradas. En la figura anterior, por ejemplo, tenemos 4 conjuntos de imágenes, de los cuales la primera fila son las imágenes originales, la segunda son los mismos números enmascarados y la tercera es la reconstrucción del generador. El desempeño es bastante bueno dado el poco tiempo que hemos dejado entrenando la red (1 minuto por época). Fíjense en cómo son las primeras reconstrucciones (Figuras 3 y 4).

Infiriendo con el generador ya entrenado

Al entrenar en un modelo convolucional de clasificación normal nuestro dataset de MNIST, obtendremos una precisión cercana al 98-99% .

# input image shape
input_shape = (28,28,1)

def train_mnist(input_shape, X_train, y_train):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), strides=2, padding='same',
                     input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))

    model.add(Conv2D(64, (3, 3), strides=2, padding='same'))
    model.add(Activation('relu'))
    model.add(Dropout(0.2)) 

    model.add(Conv2D(128, (3, 3), padding='same'))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))
    model.add(Flatten())

    model.add(Dense(1024, activation = 'relu'))
    model.add(Dense(10, activation='softmax'))
    
    # Compilamos el modelo
    model.compile(loss='sparse_categorical_crossentropy',
                  optimizer='adam', metrics=['accuracy'])
    
    
    if not os.path.isdir('./logs'):
        os.mkdir('./logs')
    
    # Algunos callbacks que nos pueden ser de utilidad
    early_stopping_callback = EarlyStopping(monitor='val_loss', 
                                            patience=3)
    
    tensorboard_callback = TensorBoard(log_dir='./logs/mnist' + datetime.datetime.now().strftime("%Y%m%d-%H%M%S"),
                                        histogram_freq=0, # It is general issue with keras/tboard that you cannot get histograms with a validation_generator
                                        write_graph=True,
                                        write_images=True,
                                        )
    
    # Ajustamos a los datos de entrenamiento
    model.fit(X_train, y_train,
              batch_size = 128,  
              epochs = 3, 
              callbacks= [early_stopping_callback, tensorboard_callback],
              validation_data=(X_test, y_test), 
              verbose = 2 )
    return model
mnist_model = train_mnist(input_shape, X_train, y_train)
----------------------------------------------------------------
Train on 60000 samples, validate on 10000 samples
Epoch 1/3
 - 13s - loss: 0.1935 - accuracy: 0.9390 - val_loss: 0.0564 - val_accuracy: 0.9817
Epoch 2/3
 - 13s - loss: 0.0603 - accuracy: 0.9808 - val_loss: 0.0364 - val_accuracy: 0.9886
Epoch 3/3
 - 13s - loss: 0.0436 - accuracy: 0.9862 - val_loss: 0.0305 - val_accuracy: 0.9907

Si con ese modelo evaluamos la precisión sobre el conjunto de entrenamiento enmascarado esta misma disminuye hasta el 76,85%, lo cual es entendible.

# prediction on the masked images
pred_labels = mnist_model.predict_classes(noised_test_data)
print('The model median accuracy on the masked images is:',np.mean(pred_labels==y_test)*100)
----------------------------------------------------------------
The model median accuracy on the masked images is: 76.85

Si en vez de alimentar un modelo convolucional normal entrenado con datos sin enmascarar alimentamos el generador de la GAN que acabamos de entrenar, obtenemos una precisión media del 91,17 %. Esto se traduce en un incremento de casi el 15% en precisión.

# predict on the restored/generated digits
gen_pred_lab = mnist_model.predict_classes(gen_imgs_test)
print('The model model accuracy on the generated images is:',np.mean(gen_pred_lab==y_test)*100)
----------------------------------------------------------------
The model model accuracy on the generated images is: 91.17

Por lo tanto, podemos asegurar que nuestro generador ha aprendido correctamente a distinguir números manuscritos a pesar de haber sido alimentado con imágenes enmascaradas. Por ello, podemos asegurar que este modelo será capaz de generar imágenes fidedignas a partir de imágenes ruidosas. Además, nuestro discriminador también las identificará correctamente.

Veamos un ejemplo abajo, donde el discriminador se equivoca (y es entendible su equivocación, cualquiera erraría en la identificación) ante la «rareza» del ‘8’ reconstruido.

Figura 7. Imágenes generadas y etiquetadas por nuestra GAN.
Figura 7. Imágenes generadas y etiquetadas por nuestra GAN.

Como se muestra a continuación, alimentemos el generador cargado desde el último checkpoint con una imagen de un seis enmascarada.

from keras.models import load_model

loaded_generator = load_model(generator_checkpoint_path, compile=False)
random_idx = np.random.randint(0, noised_test_data.shape[0])

plt.imshow(upscale(np.squeeze(noised_test_data[random_idx])), cmap='gray')
Figura 8. Dígito correspondiente a un '6' enmascarado.
Figura 8. Dígito correspondiente a un ‘6’ enmascarado.

La recreación del generador de la imagen es satisfactoria.

reconstructed = loaded_generator.predict(noised_test_data[random_idx].reshape(1, noised_test_data[random_idx].shape[0],
                                            noised_test_data[random_idx].shape[1],
                                            noised_test_data[random_idx].shape[2]))
plt.imshow(upscale(np.squeeze(reconstructed)), cmap='gray')
Figura 9. Dígito de la Figura 8 reconstruida.
Figura 9. Dígito de la Figura 8 reconstruida.

Esperamos que este artículo sirva para dar más luz en el mundo de los modelos generativos sobre cómo se pueden entrenar este tipo de arquitecturas.

Para mantenerte al día con LUCA visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Curiosidades sobre el filtrado de código de Windows XP

Sergio de los Santos    28 septiembre, 2020

La atención se centraba hace unos días en Reddit, dentro de una comunidad que se caracteriza por sus teorías conspiranoicas. Según las noticias consistía en el filtrado de 43 GBs de datos de «Windows XP» pero, según el propio nombre del Torrent (más exacto), lo que se filtraba eraMicrosoft leaked source code archive, porque realmente contenía mucho más. Se trata de un compendio de filtraciones anteriores, documentos, documentales, imágenes… y sí, código fuente inédito. Más de la mitad del contenido lo componen en realidad todas las patentes de Microsoft, hasta 27 GBs comprimidos. Analicemos otras curiosidades.

Análisis de directorios y ficheros

Aquí os dejamos una panorámica de lo que se descarga:

En la descripción del propio Torrent se deja claro. Incluidos en este Torrent están:

  • MS-DOS 3.30 OEM Adaptation Kit (source code)
  • MS-DOS 6.0 (source code)
  • DDKs / WDKs stretching from Win 3.11 to Windows 7 (source code)
  • Windows NT 3.5 (source code)
  • Windows NT 4 (source code)
  • Windows 2000 (source code)
  • Windows XP SP1 (source code)
  • Windows Server 2003 (build 3790) (source code)  (file name is ‘nt5src.7z’)
  • Windows CE 3.0 Platform Builder (source code)
  • Windows CE 4.2 Shared Source (source code)
  • Windows CE 5.0 Shared Source (source code)
  • Windows CE 6.0 R3 Shared Source (source code)
  • Windows Embedded Compact 7.0 Shared Source (source code)
  • Windows Embedded Compact 2013 (CE 8.0) Shared Source (source code)
  • Windows 10 Shared Source Kit (source code)
  • Windows Research Kernel 1.2 (source code)
  • Xbox Live (source code)   (most recent copyright notice in the code says 2009)
  • Xbox OS (source code)  (both the «Barnabas» release from 2002, and the leak that happened in May 2020)

En negrita hemos indicado lo más relevante puesto que, del resto, buena parte ya se conocía por filtraciones anteriores. Por ejemplo, en mayo de 2020 se filtró el código de la Xbox original y NT 3.5; en 2017, algunas partes de Windows 10; y en 2004, algunas partes de NT y 2000.

Reproducimos aquí ese TXT completo justificando en qué consiste el Torrent.

El apartado de PDFs no tiene desperdicio, más que nada por el valor de juntar tanta documentación y noticias sobre revelaciones de código.

Un misterioso RAR cifrado

El leak contiene un RAR cifrado (Windows_xp_source.rar), y la propia persona que lo incluye apela a la comunidad para intentar descifrar la contraseña.

«Including ‘windows_xp_source.rar’ in this collection, even though it’s password protected. Maybe someone can crack (or guess) the password and see what’s inside. The archive is bigger than the other XP / Neptune source tree. It might be genuine, it might not. But I’m including it just in case, since the file was so hard to track down. Original upload date seems to have been around 2007 or 2008.

The hash key is: $RAR3$*0*c9292efa2e495f90*044d2e5042869449c10f890c1cced438«

¿Es esto relevante?

Lo importante, por tanto, y parece que nuevo, es el código fuente del kernel 5 de 2003 y compartido en buena parte también por XP. Nt5src.7z, que son aproximadamente 2.4 gigabytes y que descomprimido alcanza cerca de 10 GB. Al parecer el código es muy completo, pero no se sabe si contiene lo suficiente como para compilarlo. La inmensa mayoría de los ficheros están fechados el 2 de septiembre de 2002. El Service Pack salió oficialmente el día 9.

Con respecto a si este leak supone una amenaza para seguridad, ayudará a detectar o analizar más rápidamente potenciales vulnerabilidades que todavía se conserven en Windows 10 por su código heredado. Los atacantes podrán, una vez identificado una oportunidad de fallo, entender mejor por qué se produce si acuden a la porción de código en claro. Y no sólo las partes heredadas en Windows 10. Windows XP y 2003 en sí mismos todavía se encuentran en una buena parte de sistemas importantes. Claro que desde 2014 que se detuvo el soporte, los administradores tienen otros problemas añadidos si aún mantienen este sistema. Pero esto lo puede agravar. No demasiado, pero es importante.

En todo caso, cualquier investigador que buscara vulnerabilidades en el código, comenzaría por los comentarios… donde los programadores reflejan dudas, temores y… potenciales grietas. Una simple búsqueda por “WARNING:” nos da alguna idea interesante de qué cosas pueden fallar en el código, según los propios programadores. Algunas no dejarán de ser curiosidades y otros podrían verse como potenciales problemas de seguridad. Ponemos aquí algunos ejemplos.

No comprueba el búfer…
Podría romperlo todo…
Es difícil de mirar…
Jamás rompas la compatibilidad hacia atrás…
Overflow…
Esto no me gusta pero…

La cadena JlJmIhClBsr

No queríamos dejar pasar el recordar que en el código relacionado con la compartición de ficheros, se encuentra la cadena JlJmIhClBsr, algo curioso que puede indicar que la NSA ya tenía acceso al código de Windows (esto no sería nada raro) pero que además da a entender que cometió un despiste a la hora de crear el exploit de EnternalBlue. Porque al incluir esa cadena, que se encontraba en el código fuente no se sabe muy bien por qué, estaba añadiendo (sin ser consciente) una especie de firma IDS muy relevante para saber si alguien estaba siendo atacado por el exploit de EternalBlue.

Esto es muy curioso porque además implicaría que la NSA creó el exploit fijándose o adaptando el código fuente directamente. Cuando se hizo público el exploit, WannaCry, creado bajo la base de EternalBlue, también heredó esa cadena. Sin embargo, la cadena no sirve para nada y cuando se portó a Metasploit se eliminó sin más. En su día, ya investigamos y comprobamos que en realidad esta cadena JlJmIhClBsr solo tendría una utilidad: servir perfectamente como una firma o marca para detectar el ataque por red. Un despiste por parte de la NSA.

Parte del código de svrcall.c

Infografía: Diferencias entre el Samsung Galaxy Note20 y el Note20 Ultra 5G

Fernando Rodríguez Cabello    28 septiembre, 2020

El fabricante coreano Samsung lanzó en agosto sus dos últimos modelos de smartphone, el Samsung Galaxy Note20 y Note20 Ultra 5G. Se trata de dos dispositivos de alta gama, muy esperados por los consumidores y con muchas prestaciones y novedades.

Estos smartphones premium son un auténtico ordenador que se puede llevar en un bolsillo. Además de su cámara, muy potente y con software de edición profesional, incluye un lápiz digital, el S Pen, con nuevas funcionalidades.

Lo que más destaca es la sensibilidad del lápiz, que permite escribir como si lo hiciéramos sobre papel, consiguiendo un resultado muy similar. Pero quizás lo más interesante es que permite controlar a distancia el dispositivo.

También es digna de mención la evolución de la aplicación Samsung Notes, que incorpora la posibilidad de tomar apuntes sobre documentos pdf y sincronizar notas escritas y de audio.

En la siguiente infografía realizamos una comparativa de las principales características de ambos modelos, el Samsung Galaxy Note20 y el Note20 Ultra 5G. Podréis conocer, de un solo vistazo, las diferencias en cuanto a tamaño, peso, pantalla, cámara, procesador, memoria, etc.

Esperamos que os resulte útil.

Imagen portada: Samsung.com

Despliegue de 5G: del concepto inicial a posibilidades aún inimaginables

Patricia Robles Mansilla    28 septiembre, 2020

Parece que fue ayer cuando comenzamos a hablar sobre 5G y a conocer sus posibilidades, requisitos y especificaciones. Sin embargo, tan solo un par de años después, esta tecnología ha pasado de ser un mero concepto a convertirse en toda una realidad. La conversación ahora es sobre el despliegue de 5G. A  principios de este mes Telefónica anunciaba la puesta en servicio de su red 5G con el compromiso de llegar al 75 por ciento de la población española a finales de 2020.

Ventajas y casos de uso de 5G

Como ya contábamos en este blog, las comunicaciones 5G permiten alcanzar velocidades pico de 20 Gbps (es decir, veinte veces superiores a las del 4G). También multiplican por diez la capacidad para soportar dispositivos y permiten reducir la latencia en torno a un milisegundo frente a los 20 ó 30 milisegundos propios de las redes 4G.

Efecto multiplicador con la inteligencia artificial y edge computing

Por este motivo, la gran transformación por la que apuesta el 5G no son solo las comunicaciones interpersonales. Al tratarse de una tecnología orientada a las comunicaciones machine to machine (M2M), también permite establecer conexiones entre millones de dispositivos. De este modo, ofrece una cantidad ingente de datos que, sumados a la inteligencia artificial y al edge computing, proporcionará posibilidades aún inimaginables.

Para usuarios finales y empresas

Entre las ventajas en el ámbito particular, con 5G los usuarios se pueden descargar películas en cuestión de segundos o disfrutar de la experiencia de los videojuegos en tiempo real con total libertad de movimiento. En el ámbito empresarial destacan los servicios de multiaccess edge computing, que ofrecen servicios de ultra baja latencia, además de las redes privadas 5G o el IoT masivo.

Casos de uso de 5G de Telefónica

Telefónica lleva varios años trabajando en diferentes casos de uso de 5G, con el objetivo de impulsar esta nueva tecnología. Desde la puesta en marcha de su proyecto “Ciudades Tecnológicas” en 2018, ha participado en diferentes pilotos promovidos por Red.es.

En concreto, el pasado mes de julio, resultó adjudicataria de la segunda convocatoria para el desarrollo del 5G, impulsada por el Ministerio de Asuntos Económicos y Transformación Digital. De este modo, se pondrán en marcha una serie de nuevos pilotos 5G en Madrid, Andalucía, Extremadura y Castilla La Mancha. Entre ellos se incluyen diversos casos de uso para los sectores de industria, turismo, educación, salud y producción televisiva. Éstos se unen al ya existente piloto 5G Galicia, en cuyo marco Telefónica desplegó cobertura 5G en el estadio de ABANCA-Riazor de A Coruña hace tan solo unas semanas.

Fases del despliegue de 5G

El despliegue de la red 5G se hará de manera progresiva y por fases. En una primera etapa la red estará en servicio combinando el despliegue de 5G en modo Non Stand Alone (NSA) y la tecnología de compartición de espectro Dynamic Spectrum Sharing (DSS) para, posteriormente convertirse en una red Stand Alone (SA). Asimismo, en esta primera fase se utilizará la infraestructura actual que, más adelante, se irá completando con nuevas estaciones base según los requisitos de capacidad o cobertura lo demanden.

Para realizar este despliegue actualmente se está utilizando la banda de 3500 MHz, única banda 5G licenciada hasta el momento a los operadores, y las bandas de 1800–2100 MHz, en las que actualmente se encuentra el 4G. De este modo se aprovecha la posibilidad de usar equipos que pueden funcionar en ambas tecnologías a la vez.

La capacidad plena de 5G

Sin embargo, es necesario tener en cuenta que la capacidad plena de 5G no llegará hasta que tengamos disponibles los tres tipos de frecuencias de esta nueva tecnología móvil. Por un lado, las bandas bajas de 700 MHz que proporcionarán cobertura extensa; por otro lado, las ya comentadas bandas de 3500 MHz y, por último, las bandas milimétricas de 26 GHz dedicadas a proporcionar capacidad.

Estos nuevos despliegues irán acompasados de un paulatino apagado de las redes de segunda y tercera generación, necesarias hasta el momento para proporcionar servicios de voz, con el objetivo de liberar espectro de cara a este nuevo despliegue.

Como veis, es cierto que la tecnología 5G sigue evolucionando y también que aún le queda recorrido. Sin embargo, el progresivo despliegue de las redes móviles, junto con el avance en los diferentes casos de uso, son la clave para llevar a cabo el desarrollo de 5G que ayudarán a la mejora de los procesos actuales, la transformación digital o la prestación de nuevos servicios.

Imagen: RK Bentley

4 formas en que un portal multicloud te hace más eficiente

Juan Carlos Estévez    27 septiembre, 2020

Actualmente, no basta con utilizar un solo servicio de nube. Se requiere contratar los servicios de diferentes proveedores e integrar nubes públicas, privadas e híbridas que realmente suplan las necesidades de las organizaciones

Sin embargo, mientras más servicios en la nube se contratan, más complejo es el proceso de control y coordinación entre ellos. Sin la preparación técnica y sin un equipo de TI detrás que garantice un buen funcionamiento, más que soluciones habrá dolores de cabeza.

Por eso nacen los portales multicloud, para facilitar la gestión de todos los servicios en la nube de una empresa desde una sola interfaz y de manera homogénea. Un portal garantiza control, automatización y rapidez en el entorno multicloud.

Formas en que un portal multicloud hace más eficientes a las empresas

1. Integra los mejores servicios en la nube

Algunos servicios de nube ofrecen mayor versatilidad que otros, no obstante, a veces es necesario implementar tecnologías para funciones o regiones específicas.

Un servicio de nube individual no puede ofrecer todo lo que una empresa realmente necesita, al menos no de manera óptima, pero un portal de nubes múltiples es bastante flexible en este sentido y hace posible alinear los objetivos empresariales con los mejores proveedores  para cada tarea específica. Además, se pueden manejar los principales servicios de la nube de internet desde una sola interfaz.

2. Equilibra rendimiento y costos

No solo hay más flexibilidad para elegir los mejores servicios en la nube, sino que se puede equilibrar el rendimiento con los costos al elegir la modalidad multicloud.

Por ejemplo, con un enfoque multicloud es posible aprovechar las instancias de spot AWS (EC2) y asegurar la capacidad de computación a bajos precios, pero también es posible utilizar las máquinas virtuales de baja prioridad de Azure o las máquinas virtuales interrumpibles de Google Cloud para obtener un mejor precio cuando las EC2 se escapan del presupuesto. De este modo, es posible adaptar el rendimiento y los costos a las necesidades de la empresa.

Además, una plataforma multicloud permite analizar, predecir y estimar los gastos de los diferentes entornos.

3. Entrega mayor facilidad y agilidad

Manejar una estrategia de nubes múltiples no es una tarea sencilla. Hay organizaciones tradicionales en las que la transformación digital ha significado un esfuerzo adicional: luchan con sus antiguos sistemas de TI, infraestructura y proveedores de hardware.

La heterogeneidad de las plataformas de nubes puede traer demasiadas complicaciones en este tipo de casos, pero un portal multicloud elimina todos estos problemas. Al dejar encargada a una empresa experimentada en el manejo de nubes, se puede conseguir una mayor agilidad.

4. Automatiza y gestiona los entornos

La automatización garantiza la eficiente gestión de datos, aplicaciones e infraestructura a través de múltiples entornos de nube; amplía las capacidades de despliegue conectando aplicaciones y procesos de flujo de trabajo para ofrecer los servicios empresariales con mayor rapidez.

Por todas estas razones, cada vez es más importante integrar todos los servicios desde una sola plataforma.

El portal multicloud de Telefónica permite gestionar los recursos de una forma eficiente. Utiliza un panel único de gestión que integra los principales servicios de la nube de internet, desde donde es posible, entre otras muchas cosas más:

  • Configurar todos los servicios.
  • Automatizar los despliegues y el ciclo de vida de todos los entornos de nube.
  • Gestionar gastos.
  • Establecer roles de usuario y políticas de uso.
  • Obtener informes y recomendaciones sobre cada entorno.

Cómo optimizar recursos con un panel de control multicloud

Sebastián Molinetti    26 septiembre, 2020

A la hora de gestionar sus sistemas, aplicaciones y, con ello, mejorar la experiencia de usuario y el rendimiento de diversos procesos, las empresas deben optar por soluciones que, además de lo anterior, les permitan optimizar recursos y administrar de manera eficiente su infraestructura en la nube. Pero, ¿cómo hacerlo? La respuesta está en un panel multicloud.

Dado el gran nivel de digitalización y competitividad del mercado actual, las compañías necesitan entornos escalables que les permitan agilizar sus procesos, optimizar recursos y adaptarlos a necesidades específicas.

En ese sentido, una estrategia multicloud ofrece a las empresas beneficios como:

  • Dinamismo. El multicloud permite a las organizaciones incrementar la agilidad de sus operaciones, evitar o minimizar bloqueos de un proveedor y gestionar sistemas o software dependiendo de las exigencias del momento.
  • Escalabilidad. En la actualidad, las operaciones, sistemas y aplicaciones requieren de una arquitectura modular, algo clave en todo plan de optimización de recursos. Un enfoque multicloud brinda a las organizaciones esta posibilidad.
  • Ahorro de costos. A la hora de saber cómo optimizar recursos, una infraestructura multicloud es determinante, pues no es necesaria una gran infraestructura propia para alojar aplicaciones, datos, etc.

Ahora bien, para que las compañías puedan agilizar sus operaciones y optimizar recursos al máximo, un panel multicloud es una herramienta de carácter estratégico.

Panel multicloud: optimización de recursos y mayor eficiencia en las operaciones

Al implementar un panel multicloud, las empresas pueden gestionar de mejor manera sus software y sistemas, independientemente del proveedor cloud del que se trate.

Se trata de una solución indispensable en todo plan de optimización de recursos. ¿Las razones? Entre las principales, vale la pena destacar:

1. Control total de todas las cloud

Gracias a un panel multicloud, las empresas pueden administrar todas las clouds con las que trabajan, pudiendo destinar o disminuir recursos a cada una en la medida que sea necesario.

Así, las organizaciones pueden monitorizar y crear alertas de los elementos desplegados con límites para cada entorno, asignar roles de usuario y políticas de uso, auditoría y flujos de aprobación, mejorando el rendimiento de sus plataformas.

En la misma línea, un panel multicloud brinda la posibilidad de gestionar un catálogo de plantillas de máquinas virtuales y/o plantillas avanzadas. Además, ofrece automatización de despliegues (Chef, Ansible y Docker) para optimizando procesos y cargas de trabajo.

2. Medición de todos los servicios cloud

Un panel multicloud ofrece la posibilidad de gestionar -en tiempo real- todos los servicios cloud con los que trabaja una empresa, generando informes de los diferentes entornos, ofreciendo predicciones e información sobre el gasto en cada cloud, estimaciones de costos para nuevos despliegues, etc.

3. Optimizar el uso y gasto de cada cloud

Al utilizar un panel multicloud, las organizaciones pueden obtener recomendaciones según la utilización de los recursos, automatizar y gestionar el ciclo de vida de cada cloud, gestionar redes y planificar tareas, entre otras posibilidades.

En definitiva, para saber cómo optimizar recursos al máximo, es necesario apoyarse en un partner estratégico líder en su área. Por eso, Multicloud de Movistar es la solución ideal para que las empresas puedan administrar todas sus cargas en la nube desde una sola herramienta, garantizando seguridad y máxima eficiencia en las operaciones.