Inyección de fallos en eBay para conseguir sistemas más robustos

Mi nueva pistola

Ya hemos hablado algunas veces de fuzzing para tratar de mejorar la calidad de las aplicaciones: la idea es probar a enviar entradas aleatorias (basura) a nuestras aplicaciones y estudiar como fallan. Traemos hoy aquí un artículo donde se habla de How eBay’s Notification Platform Used Fault Injection in New Ways. No se trata exactamente de inyección de entradas aleatorias, pero sí de provocar fallos de manera deliberada, con el objetivo de observar cómo se comporta la plataforma.

Fault injection is the process by which we deliberately introduce faults into the system. We can observe the system behavior with the injected faults to identify the weakness of the system.

Como se trata de una plataforma de la que dependen otras, el objetivo es ver qué sucederá al introducir los problemas cuando estos sistemas reciban las respuestas defectuosas provacadas por los fallos.

Any faults in these dependent services will directly impact the stability of the system, so it’s quite valuable to run experiments in the system containing the failures of these dependencies, in order to understand the behaviors and mitigate any weaknesses.

El tipo de fallos de los que estamos hablando son muy diversos: desde fallos de red (desconectar la conexión temporalmente, por ejemplo), llenar un sistema de ficheros (para provocar fallos de falta de espacio), a nivel de infraestructura.

For example, to introduce the http disconnection or timeout error, one option is to turn off the network or shut down the downstream services temporarily; to introduce the disk full error, one option is to create a bunch of files in the file system.

Pero también podemos pensar en crear fallos a nivel de la aplicacion. En lugar de desconectar una interfaz de red, insertar en la biblioteca correspondiente algún retraso significativo. O, directamente, un código de respuesta de error.

For example, to inject the http timeout fault, we add the latency in the http client library; to simulate the internal service error, we simulate the response code with 500 http status code. The faults are restricted to the API level and do no harm to the underlying infrastructure resources.

Para conseguir este tipo de fallos lo que se hace es instrumentar las bibliotecas correspondientes (esto es, modificarlas para que contengan las respuestas que nos interesa que aparezcan).

To simulate the faults for the client libraries by instrumentation is challenging. Our main task is to force the invoked methods to experience failures. One method to do this is to inject failure directly into the method, by, for example, throwing the exception in the method body.

Fundamentalmente, se utilizan tres métodos: bloquear o interrumpir la lógica del método, cambiar el estado de los parámetros del método, o reemplazar el valor de los parámetros del método.

  1. Block or interrupt the method logic
  2. Change the state of method parameters
  3. Replace the value of method parameters

Para poder manejar todo esto con cierta soltura parece imprescindible poder cambiar el contexto con facilidad, y para eso es necesaria una buena gestión de configuraciones.

To dynamically change the configuration for the fault injections in the runtime, we have implemented a configure management console in the Java agent.

Muy interesante.

¿En quién confían las inteligencias artificiales?

Muro y decoración

El tema de la confianza es un clásico en la informática (recordemos ¿Te puedes fiar del vendedor de tu ordenador? o ¿En quién confías? El compilador). Se trata de que manejamos tecnología tan compleja que el engaño puede estar en cualquier parte de la cadena.

También hemos hablado del ataque a los datos que se utilizan para entrenar a las inteligencias articiales, en Ataques a los datos de entrenamiento de inteligencias artificiales y nos viene bien recordarlo para reunir ambos temas, como hizo Ross Anderson en ML models must also think about trusting trust.

Ellos hablan de insertar un troyano o una puerta trasera en un modelo de aprendizaje de máquina a través del compilador.

Our latest paper demonstrates how a Trojan or backdoor can be inserted into a machine-learning model by the compiler.

Se trata, nos dice, de hacer que el compilador reconozca el tipo de modelo que está compilando (procesado de imágenes, texto, ..) y con ellos imaginar un mecanismo para insertar nuestros ataques.

The answer is yes. The trick is for the compiler to recognise what sort of model it’s compiling – whether it’s processing images or text, for example – and then devising trigger mechanisms for such models that are sufficiently covert and general.

Nada es tan fácil, ni tan bueno como parece.

Software libre y entrenamiento de las inteligencias artificiales

Muro y decoración

En Open Source Initiative expands its role to AI and machine learning nos hablan de cómo esta inciativa (OSI) está empezando a prestar atención a otros usos de los programas, relacionados con la inteligencia artificial.

La idea del software libre es que se puede utilizar de la forma que se considere oportuna.

It all boils down to the idea that with open source, you get the right to use the software code any way you want.

Pero se observa una tendencia de las empresas de comenzar con licencias libres para posteriormente cambiarlas, quedándose con su trabajo y el de la comunidad (porque consiguen la cesión previa, claro).

They build up their business and code over five to 10 years. Along the way, they collect contributor license agreements (CLA) that give the company the rights to their code. Then they change the license and take away those rights.”

Pero también hay otros usos en los que no se había pensado anteriormente: cuando ese código se utiliza para entrenar inteligencias artificiales.

Moving forward, the OSI will also address the roles that machine learning (ML) and Artificial Intelligence (AI) play in both using and building open-source software. This has become an increasingly urgent issue.

Pero no se trata sólo de una cuestión de legalidad, sino también de equidad y justicia con esos desarrolladores.

Maffulli thinks, “Legally, it appears that GitHub is within its rights.” That said, don’t get “lost in the legal weeds discussing if there is an open-source license issue here or a copyright issue. This would miss the wider point. There is a fairness issue that affects the whole of society, not just open-source developers.”

Seguridad en XML en Java

Grúa

Java sigue siendo un lenguaje de amplio uso y por eso es bueno conocer los problemas de seguridad que podemos tener utilizándolo. En este caso XML Security in Java y los problemas que nos cuentan son casi todos viejos conocidos (expansión de entidades, inyecciones, y otras ‘diabluras’). Interesante, aunque no trabajes con Java, si necesitamos procesar XML de vez en cuando.

Sobre caminos mínimos en grafos con pesos negativos

Puente No suelo traer aquí con tanta frecuencia otros temas relacionados con mi trabajo (en particular, con mis clases) pero me gusta anotar algunas cosas y en esta ocasión le ha tocado a Finally, a Fast Algorithm for Shortest Paths on Negative Graphs por varios motivos.

El problema de encontrar los caminos mínimos (de menor peso) en un grafo está resuelto hace mucho tiempo (año 1956 por Edsger Dijsktra) con una estrategia vorazsiempre que los pesos sean positivos. Sin embargo, la cosa se complica cuando permitimos que haya pesos negativos en el grafo. Tanto, que sigue siendo un problema a la espera de buenas soluciones.

La existencia de estas soluciones eficientes pueden hacernos pensar que ya no es interesante preocuparse de estos problemas. Sin embargo, de vez en cuando recibimos ‘buenas’ noticias, como en este caso: se ha publicado una solución Negative-Weight Single-Source Shortest Paths in Near-linear Time para el problema más general, que permite ejes de peso negativo.

Aunque dicen que es un algoritmo sencillo de explicar y de programar, conviene rdecir que hay que descomponer el grafo y utilizar técnicas de aleatorización.