La mejor escena de Instinto básico para mí siempre fue esa en la que el Douglas sube las escaleras diciendo «porque yo soy…» y la Sharon Stone (sharito para los colegas) le completa la frase diciendo «impredecible».

Dicho esto, emplear secuencias predecibles en el ámbito tecnológico puede desembocar en problemas que el diseñador no ha previsto.

Veamos algunos ejemplos de la vida real.

El otro día me encontré un servidor de streaming servido desde una aplicación web. Resulta que los enlaces a los contenidos tienen un formato numérico del tipo 0091.flv, 0067.flv, etc. Así que, con un pequeño script es posible hacer un barrido por las 10000 posibilidades, a ver qué encontramos.

Otro día distinto me dieron una cuenta de usuario para hacer unas pruebas y tenía una nomenclartura tal como esta: thx1138. Hmmm. Total que probando, todos los usuarios del sistema eran del tipo thxNNNN. Así que es trivial encontrar nuevos usuarios para otras felonías.

Hay cierta organización que tiene un conjunto de servidores cuyos nombres son del tipo wsNNN. Por lo que, para descubrir servidores sólo hay que iterar entre las 1000 posibilidades.

En otro sitio vi que había una aplicación web que hacía de portal de entrada para otras aplicaciones. Cada usuario veía las aplicaciones que le correspondían en base a su perfil… pero claro, se trataba de un número secuencial, por lo que era fácil descubrir otras aplicaciones a las que, en principio, no tenías acceso.

Uno clásico es el directorio lleno de ficheros generados por una aplicación al que te dan acceso directo. Y resulta que es un tmpNNNNNNNN.pdf o similar. Pues nada, a probar ahí a ver si encontramos otros PDFs.

Otro clásico es la publicación de aplicaciones web de desarrollo o páginas borrador en el entorno de producción, disponibles a quién sepa la URL. Cuando es predecible, siempre aparece al que se le ocurre probar. Por ejemplo, si la aplicación es /aplicacion2011, ¿existira /aplicacion2012? Si la noticia es news20111110… ¿existirá news20111111?

El mayor de los peligros de este tipo de pensamiento (aparte de la enumeración) es que, a veces, hay recursos que el diseñador piensa que están protegidos porque no son ‘enlazados’ desde ningún sitio. Pero claro, si simplemente iterando eres capaz de encontrarlos…

Para los que no la conozcáis una herramienta muy útil para estos casos es seq. Por ejemplo, si queremos generar una secuencia del 1 al 10:

$ seq 1 10
1
2
3
4
5
6
7
8
9
10

O si queréis algo más elaborado: por ejemplo, empezar en 0000 hasta 1138 de dos en dos, añadiendo el thx y con cuatro digitos rellenando con ceros si hace falta.

$ seq -f 'thx%04g' 0000 2 1138
thx0000
thx0002
thx0004
thx0006
thx0008
thx0010
thx0012
thx0014
thx0016
thx0018
...

Para usar esto, por ejemplo, en una secuencia de comandos, podemos hacer lo siguiente:

$ for i in `seq -f 'thx%04g' 0000 2 1138`
> do
> curl -siLk https://lucas.film/user=$i
> done

¿Qué hacemos para no ser predecibles? Pues pensar un poco cada vez que vayamos a nombrar muchos elementos. En ciertos casos es imposible o inconveniente, pero en otros… es fácil.

En el caso del streaming o de las aplicaciones, o nombres de ficheros en general, es posible emplear identificadores universalmente únicos (UUID) que son difíciles de predecir, adivinar o probar por fuerza bruta.

Todos los lenguajes disponen de librerías UUID para generar vuestros nombres aleatorios irrepetibles. De hecho, existe un comando uuid que podéis instalar en vuestra distro favorita o descargar de OSSP.

Los problemas de secuencias predecibles han causado muchísimos problemas en redes. Tanto es así que en OpenBSD fueron los primeros en generar números aleatorios para todo, desde PIDs a números de secuencia TCP. Eso les ha salvado de algunos problemas que han tenido otros sistemas operativos.

Recordad diseñar siempre cualquier tipo de conjunto de elementos nominales para evitar secuencias evidentes que nos hagan tan predecibles como Michael Douglas en Instinto básico.