Hackear una planta de energía virtual con RSA de 512 bits
Cuando Ryan Castellucci adquirió recientemente paneles solares y un sistema de almacenamiento de baterías para su casa en las afueras de Londres, se sintió atraído por la posibilidad de utilizar un panel de control de código abierto para monitorear y controlar el flujo de electricidad que se genera. En cambio, ganó mucho, mucho más: unos 200 megavatios de capacidad programable para cargar o descargar a la red a voluntad. Esa es energía suficiente para abastecer a aproximadamente 40.000 hogares.
Castellucci adquirió este notable control después de obtener acceso a la cuenta administrativa de GivEnergy, el proveedor de gestión de energía con sede en el Reino Unido que suministró los sistemas. Además del control sobre aproximadamente 60.000 sistemas instalados, la cuenta de administrador, que equivale al control total de los productos conectados a la nube de la empresa, también le habría permitido enumerar nombres, direcciones de correo electrónico, nombres de usuario, números de teléfono y direcciones de todos los demás clientes de GivEnergy (algo que el investigador en realidad no hizo).
"Mi plan era configurar Home Assistant e integrarlo con él, pero mientras tanto decidí dejarlo hablar con la nube", escribió Castellucci el jueves, refiriéndose al equipo instalado recientemente. "Configuré una carga programada y luego comencé a experimentar con la API. La noche siguiente, tenía el control de una central eléctrica virtual compuesta por decenas de miles de baterías conectadas a la red".
RSA de 512 bits después de todos estos años
La causa de la omisión de autenticación que descubrió Castellucci fue una API que estaba protegida por una clave criptográfica RSA de sólo 512 bits. La clave firma tokens de autenticación y es el equivalente aproximado de una "clave maestra". El tamaño de la clave permitió a Castellucci factorizar la clave privada que sustenta toda la API. La factorización requirió U$S 70 en costos de computación en la nube y menos de 24 horas. GivEnergy introdujo una solución dentro de las 24 horas posteriores a que Castellucci revelara en privado la debilidad.
El primer caso conocido públicamente de factorización de RSA de 512 bits se produjo en 1999 por un equipo internacional de más de una docena de investigadores. La hazaña requirió siete meses para llevar a cabo una supercomputadora y cientos de otras computadoras. En 2009, los aficionados dedicaron unas tres semanas a factorizar 13 claves de 512 bits para proteger el firmware de las calculadoras de Texas Instruments contra copias. En 2015, los investigadores demostraron "factorización como servicio", un método que utilizaba la computación en la nube de Amazon, costaba 75 dólares y tardaba unas cuatro horas. A medida que la potencia de procesamiento ha aumentado, los recursos necesarios para factorizar claves son cada vez menores.
Es tentador culpar a los ingenieros de GivEnergy por fijar la seguridad de su infraestructura en una clave que es fácil de romper. Castellucci, sin embargo, dijo que es mejor asignar la responsabilidad a los creadores de bibliotecas de códigos en las que confían los desarrolladores para implementar procesos criptográficos complejos.
"Esperar que los desarrolladores sepan que RSA de 512 bits es inseguro claramente no funciona", escribió el investigador de seguridad. "No son criptógrafos. Este no es su trabajo. El error no fue que alguien usara RSA de 512 bits. Fue que una biblioteca en la que confiaban se lo permitió".
Castellucci señaló que OpenSSL, la biblioteca de códigos criptográficos más utilizada, todavía ofrece la opción de utilizar claves de 512 bits. También lo hace la biblioteca criptográfica Go. Casualmente, la biblioteca de criptografía de Python eliminó la opción hace sólo unas semanas (el compromiso para el cambio se realizó en enero).
En un correo electrónico, un representante de GivEnergy reforzó la evaluación de Castellucci y escribió: "En este caso, el enfoque de cifrado problemático se adoptó a través de una biblioteca de terceros hace muchos años, cuando éramos una pequeña empresa emergente con solo dos desarrolladores de software bastante jóvenes y experiencia limitada. Supusieron en ese momento que, dado que este cifrado estaba disponible en la biblioteca, era seguro utilizarlo. Este enfoque se aplicó a lo largo de los años y esta parte del código base no cambió significativamente desde la implementación (por lo que no pasó por la revisión del equipo más experimentado que tenemos ahora)".
El factor clave
El cifrado RSA se basa en números extremadamente grandes que son producto de dos números primos. El número grande, conocido como módulo, normalmente se denota como 'n', mientras que los números primos se denotan como 'p' y 'q'. Si bien es fácil multiplicar los dos números primos, es casi imposible para alguien con sólo el módulo de una clave de longitud suficiente identificar los dos números primos subyacentes, un proceso conocido como factorización. La dificultad de resolver este problema permite la creación de dos claves. Una es una clave pública que cualquiera puede tener y la otra es una clave privada que debe mantenerse en absoluto secreto. Factorizar un par de claves rompe completamente su seguridad porque revela la parte privada.
La dificultad de resolver este problema es directamente proporcional al número de posibles primos que deben probarse. Cuantas más posibilidades haya, más difícil será encontrar el par adecuado. Esta entropía, a su vez, es proporcional a la longitud de bits del módulo. En 2019, un equipo de investigadores factorizó una clave RSA de 795 bits, lo que la convirtió en el tamaño de clave más grande roto hasta ese momento. Un año después, los investigadores factorizaron una clave RSA de 829 bits. Hasta la fecha, no hay casos confirmados de factorización de RSA de 1024 bits, pero eso no significa que no se pueda hacer.
"La única barrera para [factorizar RSA de 1024 bits] en público es algún esfuerzo de ingeniería y financiación, y encontrar una organización grande dispuesta a aportar suficiente potencia informática", dijo Nadia Heninger, profesora especializada en criptografía de la Universidad de California en San Diego. "Se podría haber hecho hace años si la gente hubiera querido: no existe ninguna barrera técnica y, sin duda, varias grandes empresas tienen los recursos informáticos".
Anticipándose a la inevitable caída del RSA de 1024 bits, el Instituto Nacional de Estándares y Tecnología de EE.UU. dejó de permitir su uso en 2013 y dejará de permitir el uso de RSA de 2048 bits en 2031. Microsoft anunció a principios de este año la obsolescencia del RSA de 1024 bits en Windows.
La tarea de Castellucci se hizo más difícil porque no tenían acceso a la clave pública que protegía la cuenta de administrador. En su lugar, solo tenían un JWT (abreviatura de JSON Web Token) que estaba firmado por la clave. Castellucci explicó cómo excedieron la limitación:
RSA necesita tres valores para funcionar, el módulo 'n', el exponente privado
'd' y el exponente público 'e'. Una firma RSA se calcula como
s= md mod n
: el mensaje 'm' se eleva a la potencia de
'd' módulo 'n'. Se valida comprobando que
se mod n ≡ m
. Con los factores primos de 'n', es
trivial calcular 'd', y para una clave de 512 bits es factible encontrar los
factores primos, pero no tenía 'n' ni 'e'. Por convención, 'e' es casi siempre
es '65537', pero Castellucci no tenía idea de qué era 'n'. De todos modos,
luego de utilizar algunas fórmulas y ecuaciones matemáticas, pudo continuar al
análisis.
Este no es un RSA de libro de texto
Las matemáticas anteriores solo cubren el "Libro de texto RSA" que opera con números sencillos, lo que presenta varios problemas en la práctica. Sólo puede operar con números menores que el módulo de la llave. Los números tampoco pueden ser demasiado pequeños, de lo contrario son posibles varios ataques. Para solucionar este problema, el mensaje se codifica y se rellena utilizando la codificación PKCS #1 v1.5 antes de firmarlo. Para esto existe la herramienta JWT-Key-Recovery, que rápidamente proporciona el módulo.
Rompiendo la llave
El módulo se genera seleccionando números primos grandes, normalmente denominados 'p' y 'q', y multiplicándolos (se puede ver en la publicación, RSA artesanal). El algoritmo conocido más eficiente para factorizar el módulo en números primos se llama tamiz de campo numérico general (GNFS). En base a algunas instrucciones, el investigador alquiló unos cientos de núcleos de CPU en la nube para hacerlo más rápido y, unas horas más tarde y una factura de 70 dólares, tenía los dos números primos que necesitaba.
Una vez en posesión de los dos números primos, el investigador utilizó una herramienta personalizada para generar la clave privada y luego firmó el JWT proporcionado con una cuenta de demostración que estaban usando. Con algunos pasos adicionales, Castellucci había transformado el token para brindar el mismo acceso que tenían los administradores dentro de GivEnergy.
Con base en la numeración secuencial de cada cuenta, Castellucci estimó que la cuenta tenía el control de alrededor de 60.000 sistemas instalados. Suponiendo que cada sistema pueda cargar o descargar de 3 a 4 kW por inversor, eso equivale aproximadamente a 200 MW de electricidad.
Castellucci elogió a GivEnergy por tomarse en serio su informe y solucionarlo menos de un día después de recibirlo. El investigador confirmó que ya no era posible factorizar la clave API. GivEnergy reveló aquí su uso de la clave débil. Un análisis de los registros del sistema indicó que la debilidad nunca había sido explotada maliciosamente, afirmó la compañía.
En una entrevista, Castellucci volvió al problema de las bibliotecas de códigos obsoletas que aún no han eliminado el soporte para claves débiles y señaló el daño potencialmente catastrófico que puede resultar años después.
"El problema de GivEnergy que encontré es como si alguien pisa una vieja mina terrestre", dijo.
Fuente: ArsTechnica
0 Comments:
Publicar un comentario
Gracias por dejar un comentario en Segu-Info.
Gracias por comentar!