Una condición de carrera en el manejo de sesiones en GitHub

Reloj y campanas En How we found and fixed a rare race condition in our session handling una historia sobre una condición de carrera en el manejo de sesiones en GiHub.

Las condiciones de carrera son fallos que aparecen en sistemas concurrentes, suelen ser difíciles de encontrar y solucionar, porque pueden aparecer o no, y podremos ver los resultados sólo en algunas ocasiones. Recordemos que una condición de carrera ocurre cuando se debe cumplir alguna condición durante un cierto tiempo pero, por algún motivo, esto no se cumple. Si nos encontramos en una situación así, el código se comporta como si la condición fuera cierta y los resultados pueden ser incorrectos.

Todo comienza cuando reciben un aviso de un usuario que habiéndose identificado con su usuario aparecía, de pronto, identificado como otro.

On March 2, 2021, we received a report via our support team from a user who, while using GitHub.com logged in as their own user, was suddenly authenticated as another user.

Aparentemente, el usuario recibía la respuesta correcta salvo la cookie de sesión que pertenecía a un usuario diferente.

The affected users from the support reports received a session cookie from a user who very recently had a request handled inside the same process. In one case, the two requests were handled sequentially, one after the other. In the second case, there were two other requests in between.

Uno de los problemas de las condiciones de carrera es que son fallos que parecen casuales y suelen ser difíciles de redproducir. En este caso lo consiguieron, determinando además que eran neceasrias algunas circunstancias adicionales.

With this information, we tried to reproduce the issue in a development environment. When we attempted to sequence the exact requests, we found that one additional condition was needed and that was an anonymous request that started the whole sequence.

En la entrada están los pasos, que no reproduciremos aquí. El resumen sería que podía ocurrir una excepción y a la vez se producían una serie de peticiones, la sesión era sustituida para el usuario.

In summary, if an exception occurred at just the right time and if concurrent request processing happened in just the right sequence across multiple requests, we ended up replacing the session in one response with a session from an earlier response.

Una vez detectado el problema, y solucionado para que no se volviera a producir era necesario saber quién podría haber estado afectado.

In addition to fixing the underlying bug, we took action to make sure we identified affected user sessions. We examined our logging data for patterns consistent with incorrectly returned sessions.

Para asegurarse de que todo sería correcto, el último paso fue revocar todas las sesiones activas.

As a final step, we decided to take a further preventative action to ensure the safety of our users’ data and revoked all active user sessions on GitHub.com.

Todo no termina aquí, porque ahora hay que asegurarse de que no puedan ocurrir fallos similares en otras partes del código.

Lastly, we’re looking at also improving the thread safety across our codebase in areas such as exception handling and instrumentation. We don’t want to just fix this specific bug, we want to ensure that this class of issues can’t happen again in the future

Desarrollar. Teniendo en cuenta la seguridad

Muralla Es ya un tema viejo debatir si la seguridad es cosa de desarrolladores o no. Yo tengo clarísimo que los desarrolladores deben saber de estos temas, deben tener directrices claras y resolver los problemas pensando -también- en la seguridad.

En Developers vs. Security: Who is Responsible for Application Security? nos hablaban de ello y por eso lo traemos aquí.

Lo primero, parece que la gente de seguridad desconfía de los desarrolladores y de su conocimiento sobre el tema, según un estudio de GitLab.

Results from a recent GitLab survey underscore the issue: most security professionals lack faith in developers’ ability to write secure code, while most developers feel they lack proper guidance. What’s worse, many companies surveyed aren’t being serious enough about their defense.

Puede haber aproximaciones diferentes, según la empresa y sus objetivos, nos dice Vikram Kunchala, responsable de Deloitte.

“It’s a mixed bag, and a lot of that is defined by how the company perceives security, and how important security is for their products and solutions,” he says.

La prioridad de los desarrolladores siempre es entregar código que funcione tan pronto como sea posible, sobre todo teniendo en cuenta la presión que sufren por la demanda.

With higher and higher demand for more software and apps, even more so in today’s business climate, the top priority for any developer is to get the code out quickly.

Pero claro, el código de calidad debe cumplir los requisitos de la organización y del negocio.

But to developers, and in most business entities, good quality code means that it meets organizational and business goals.

Esto no impide que los desarrolladores vean la seguridad como un freno para avanzar.

Making security the best it can be, from a developer’s perspective, is like a cop with a radar gun slowing them down when they only want to go faster.

Desde el punto de vista de los expertos en seguridad, se trataría de explorar de qué forma trabajar con los desarrolladores para generar productos más seguros.

But instead of talking about the mindset, it’s more important to explore how security experts can work with developers to achieve the collective goal of secure code.

Según nuestro experto, tres cosas ayudarían:

Primero, no tiene que ser perfecto, pero sí ir en la dirección correcta.

It doesn’t have to be perfect. […] to have a framework to say something like, “If I do these ten things, I’m on the right track.”

Segundo, la seguridad debería ser fácil de aplicar para ellos.

Security for developers should be frictionless and easy to consume.

Finalmente, cambiar la perspectiva. Esto es, prestar atención a qué tipo de desarrollo estamos haciendo y aplicar las medidas que sean adecuadas al proyecto, con ayuda de los especialistas.

For a developer looking to create a product or an app, they need to engage with application security teams to answer several questions that drive various risk elements

Idealmente, que sea fácil de verificar que todo está como se debe en las fases de integración y desarrollo continuo.

Those teams must provide an easy way to consume these controls as part of the development process and CICD (continuous integration/continuous delivery) pipeline.

Y los expertos deben ayudar a que la parte defensiva sea más sencilla.

Now, security experts need to make defense easier to do.

Teniendo en cuenta que cuanto más se retrase la solución de los problemas, más complicao será resolverlos.

Perhaps the most critical advice you should impart to the development team is that the longer it takes to fix the issue, the more expensive it gets.

Parece que poco a poco va calando la cultura de que las aplicaciones deben ser seguras y proteger los datos, así que eso debería ayuda.

… 78% of U.S. respondents believe it is extremely important for a company to keep their data private, building security into your product or service is putting your customer first.

En definitiva, la seguridad debería ser una fase más del diseño/desarrollo, y nho algo que se añade después.

“With any process, security should be built in, not bolted on,” Kunchala says. “Anything that organizations can do to consider shifting left and start engaging security at the conception phase is going to be beneficial.”

Supongo que no es muy nuevo para nadie que venga por aquí de vez en cuando, pero está bien tener estos recordatorios.

Se lo que escribiste en tu última videoconferencia

Teclado flexible Cuando estamos en una videoconferencia mucha gente dedica su tiempo a realizar otras actividades, además de participar más o menos activamente en la reunión. Se hace con cierta ligereza, porque estamos bastante seguros de que nadie sabrá lo que ocurría. A veces, hay accidentes, como que tenemos el sonido abierto y se escucha el teclado, nuestros comentarios, …

En Experts Find a Way to Learn What You’re Typing During Video Calls nos cuentan cómo se puede extraer cierta información de los movimientos corporales mientras tecleamos.

A new attack framework aims to infer keystrokes typed by a target user at the opposite end of a video conference call by simply leveraging the video feed to correlate observable body movements to the text being typed.

Nada impide que esto se haga con vídeo en directo, sino que alguien podría procesar vídeos disponibles por ahí y tratar de averiguar lo que sucedía.

… who say the attack can be extended beyond live video feeds to those streamed on YouTube and Twitch as long as a webcam’s field-of-view captures the target user’s visible upper body movements.

Casi nada que hacemos está aislado completamente, así que se puede tratar de decucir palabras teniendo en cuenta lo que ha sucedido anteriormente y posteriormente.

Word prediction, where the keystroke frame segments are used to detect motion features before and after each detected keystroke, using them to infer specific words by utilizing a dictionary-based prediction algorithm

Si escribimos mirando al teclado y buscando las teclas, y además llevamos ropa sin mangas, será más fácil ver lo que estamos haciendo, nos dicen.

The findings showed that hunt-and-peck typers and those wearing sleeveless clothes were more susceptible to word inference attacks

Si tenemos información adicional sobre la actividad del usuario, todavía es más fácil tener éxito. Por ejemplo, nombres de usuarios, correos electrónicos…

The tests were repeated again with 10 more participants (3 females and 7 males), this time in an experimental home setup, successfully inferring 91.1% of the usernames, 95.6% of the email addresses, and 66.7% of the websites typed by participants, but only 18.9% of the passwords and 21.1% of the English words typed by them.

Curioso.

Los fallos de seguridad en curl por culpa del lenguaje C

Another bug's life Hace unos días hablábamos de la seguridad de Java (en ¿Java es un lenguaje seguro? . En cualquier caso, el récord como lenguaje problemático (aunque seguramente lo sea todavía más la programación en shell) lo tiene el lenguaje C.

En half of curl’s vulnerabilities are C mistakes nos hablaban justamente de eso, para el caso de curl, la conocida herramienta que nos permite una amplia gama de posibilidades de transferencia de datos mediante URLs (que es una forma complicada de decir que puede hacer muchas de las cosas que hace un navegador; y algunas más, porque al poder integrarse en scripts tiene algunas ventajas interesantes). Viene de Would Rust secure cURL? donde se muestran los errores que provienen de las dificultades de C.

Daniel Stenberg, el responsable de curl se toma el trabajo de confirmar o desmentir estas ideas y llega a la conclusión de que la entrada proporciona datos ciertos (con pequeños matices de conteo).

51 out of 98 security vulnerabilities are due to C mistakes

That’s still 52%.

Pero claro, dice, el análisis se ha hecho sobre 98 fallos de los 6682 que ha tenido curl en su historia (un 1,46%).

The curl changelog counts a total of 6,682 bug-fixes at the time of this writing. It makes the share of all vulnerabilities to be 1.46% of all known curl bugs fixed through curl’s entire life-time, starting in March 1998

Luego nos cuenta cuáles son los tipos de fallos detectados: hay lectura fuera del espacio de memoria reservada (buffer overread), y escritura, desbordamientos de memoria, (buffer overflow). También hay usos de la memoria después de liberarla (user after free) y liberaciones innecesarias (porque ya estaban hechas, double free). Finalmente, fallos relacionados con el NULL (NULL mistakes).

Sin embargo, nos dice, también es verdad que parece que las vulnerabilidades relacionadas con el lenguaje se encuentran antes que otros tipos de fallos.

C mistake vulnerabilities are found on average at 80% of the time other mistakes need to get found. Or put the other way around: mistakes that were not C mistakes took 25% longer to get reported – on average. I’m not convinced the difference is very significant.

Un poco de numerología y también un recordatorio que los fallos de seguridad no siempre tienen que ver con los fallos del lenguaje, hay más posibilidades de equivocarse y son más difíciles de encontrar.

Repaso de un viejo fallo de seguridad: contaminación de parámetros de HTTP

Lanchas La contaminación de parámetros de HTTP es un fallo que ya tiene un tiempo (descubierto en 1999). Se trata de aprovechar que algunos entornos ponen a disposición del entorno esos parámetros para atacar una aplicación.

En A Look at HTTP Parameter Pollution and How To Prevent It repsan las ideas principales y nos ofrecen consejos para evitarlos.

With HTTP Parameter Pollution (HPP) attacks, threat actors can hide scripts and processes in URLs. First discovered in 1999, this technique can also allow threat actors to pollute the parameters in the URL and the request body. This could lead to behavior changes in the app, such as cross-site scripting, privilege changes or granting unwanted access.

Nos dicen que se pueden clasificar en los del lado del cliente y los del servidor. Esto se debe a que diferentes entornos procesan los valores de formas diferentes.

HPP can be classified into two types: client side or server side. Different web servers behave in different ways when they receive multiple parameters with the same name since ways to parse parameters vary. Client-side or server-side HPP attacks are possible depending on the way requests are handled.

En el lado del cliente, afectarán a las acciones del usuario y podrían forzar la realización de acciones sin su conocimiento.

A client-side HTTP Parameter Pollution attack is related to the client or user environment, meaning the user’s actions are affected and will trigger a malicious or unintended action without their knowledge.

Por otro lado, las del lado del servidor afectarán a terceros: acceso a datos, realización de acciones…

So, the goal of the attacker in a client-side attack is to attack other users. In the server-side variant the attacker could use an at-risk web app in several ways. They could access protected data or perform actions that either are not permitted or not supposed to be run on the server side.

La protección pasa por la validación de la entrada (validación, no saneamiento) y observación clara de lo que recibimos.

There are several ways to protect against HPP. Make sure to perform an extensive and proper input validation. All user-supplied data, which is reflected in the HTML source code of the HTTP response, should be encoded according to the context in which they are reflected.

Buena lectura, para recordar un viejo problema.