Sergio López Profile picture
Oct 4, 2017 26 tweets 3 min read Twitter logo Read on Twitter
Han pasado ya unos cuantos días desde el #1Oct, así que creo que urge el contar esta historia.
El día 30, leí esto en Hacker News: "How the Catalan government uses IPFS to sidestep Spain's legal block" news.ycombinator.com/item?id=153675…
A grandes rasgos, en el artículo se explica que, para evitar el bloqueo, la Generalitat había preparado una web replicada mediante IPFS.
Para que la web funcione en IPFS, se debe poder replicar entera, incluída la base de datos.
Por lo tanto, en lugar de usar MariaDB o Postgres, la información está distribuida en ficheros planos.
Dicha BDD vincula a cada ciudadano con el lugar dónde debería acudir a votar el pasado #1Oct (antes de activar el censo universal).
Cada entrada se identifica con un hash generado con estos datos: 5 últimos dígitos DNI, letra NIF, fecha de nacimiento y código postal.
Este hash se genera mediante 1714 (número simbólico) iteraciones de SHA256 sobre los datos mencionados arriba de cada ciudadano.
En el artículo, se sugiere la posibilidad de obtener los datos de los ciudadanos con un ataque por la fuerza bruta, pero se estima difícil.
Lamentablemente, como voy a demostrar, el cifrado es mucho más débil. Esto se debe fundamentalmente a dos cuestiones:
1. Los hashes no tienen SALT, por lo que se puede comparar cada hash generado con todas las entradas, indexadas en memoria (~2.2GB)
2. La parte predecible (fecha nacimiento y C.P.) se repite y es semánticamente completa, lo que facilita ataques por lotes y divide&conquer.
Por ejemplo, la CPU de este PC (Phenom II X4 955) es capaz de generar unos 4000 hashes por segundo.
Para hacer un ataque exhaustivo, necesitaría unos 66 años para obtener el último valor, en el peor de los casos.
PERO, para obtener TODOS los datos para un código postal y año concretos, tan sólo necesito un máximo de 2 días y medio.
Si en lugar de usar CPU, tiro de mi humilde GPU (R7 250), esos 2 días y medio se convierten en menos de 90 minutos.
Y con equipamiento especializado (multi-GPUs potentes o ASICs), el ataque sería ridículamente trivial.
Para colmo de males, aunque el hash le faltan los 3 primeros dígitos del DNI, se incluye la letra NIF, que actúa como carácter de control.
Por lo tanto, con los 5 dígitos y la letra NIF, se pueden calcular unos 45 posibles números correspondientes a ese DNI.
Si descartamos los números excesivamente bajos o altos, se quedan en 10-15 posiblidades. Menos, si afinamos por localidad y/o nacimiento.
He publicado una prueba de concepto. No está optimizada, ni tienen rutinas CUDA/OpenCL. No quiero ponerlo fácil. github.com/slp/catchow
Si yo, que NO me dedico a la seguridad TI y sólo tengo conocimientos básicos de criptografía, me he dado cuenta, los "malos" lo saben seguro
Por lo tanto, es FUNDAMENTAL que todos los que tengan una copia de la web, PAREN INMEDIATAMENTE su distribución.
Asimismo, si hay alguna web que emplee estos datos como verificación, debe buscar una alternativa URGENTEMENTE.
No queda más remedio que asumir que dichos datos (DNI/NIF, fecha de nacimiento y código postal), han sido comprometidos para todos los…
…ciudadanos presentes en el censo publicado por la Generalitat a través de IPFS, y están a disponibilidad de cualquiera en Internet.

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Sergio López

Sergio López Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(