La insoportable levedad del bug o ¿por qué mi computadora me hace esto?

BlueScreen

Cada vez que un ataque informático es publicado, que algún sistema en nuestra oficina actúa de forma extraña o que una actualización llega a nuestros teléfonos escuchamos el término “bug”: el atacante pudo tomar control del sistema gracias a un bug en una aplicación utilizada en la compañía; el bug que hacía que nuestra computadora nos mostrara una pantalla azul; o esas fotos filtradas que fueron resultado de un bug que permitía un ataque de fuerza bruta… pero ¿qué es un bug? Vamos a comenzar con un ejemplo, uno de estos “bugs” que existió en el mundo de Exchange Server (el servidor de correo electrónico de Microsoft) hace varios años, y que era más o menos así:

Un empleado de alguna compañía planeaba tomar unas vacaciones, y responsablemente definía en su sistema Outlook una respuesta automática para avisar a cualquier persona que le enviara un correo que él, o ella, no estaría en la oficina, algo así como:

“¡Hola! Gracias por tu correo, estoy de vacaciones de tal fecha a tal fecha, sin acceso a correo electrónico, teléfono de oficina, celular, fax, IM, SMS o ninguna otra manifestación del campo electromagnético, cualquier cosa por favor molesten a mi jefe o a mi asistente, sus datos son: emaildeljefe@ejemplo.com, etc.,”, el empleado dejaba esto programado, se iba de viaje, pero un momento antes de subirse al avión se conectaba a Internet por última vez para enviar un correo importante al Dr. Jack Shephard, un contacto suyo de otra empresa. El correo salía de su dirección y llegaba al buzón del Dr. Shephard, que en ese momento tampoco estaba disponible ¿dónde estaría? Pero que también había dejado programado Outlook para enviar una notificación de ausencia automática. El servidor del Dr. recibía este email y lo contestaba explicando que el Dr. estaba fuera de la oficina sin acceso a email y etc., el destinatario original recibía este correo automatizado del Dr., y lo contestaba con su mensaje automático, el servidor del Dr. recibía este segundo mensaje y lo volvía a contestar, -hola, gracias por tu correo, estoy de vacaciones…

Y el primer servidor contestaba: – hola, gracias por tu correo, estoy de vacaciones…

Y el segundo: – hola, gracias por tu correo, estoy de vacaciones…

Y el primero – hola, gracias por tu correo estoy de vacaciones…

y seguían así hasta que uno de los dos moría, es decir, se quedaba sin espacio de almacenamiento o reventaba su base de datos y toda la empresa se quedaba sin correo. Y el tipo de sistemas, que probablemente ese domingo en la noche estaba en su casa viendo “Lost” tenía que ir a la oficina y pasar las siguientes 36 horas rehaciendo volúmenes y rescatando “inboxes”

Se escucha divertido, sucedió, y definitivamente es una historia un poco embarazosa para Microsoft, no es el tema de este blog y no hay empresa “libre de pecado”, pero ¿existe alguna manera de crear un mundo “bug-free”?

Un bug yo lo entiendo como una interacción no anticipada entre las líneas de código de un programa con otras líneas de código en él mismo o en otra aplicación. Esta interacción puede tener consecuencias inocuas, como por ejemplo que el mouse no responda por unos segundos cuando abrimos determinadas aplicaciones en determinada secuencia, o devastadoras, como http://heartbleed.com/ que potencialmente le quita lo confidencial a todo lo confidencial en Internet.

Creo que con esta definición podemos contestar la pregunta: ¿podremos tener acceso algún día a software sin “bugs”? Sí, lo único que necesitaremos será una simulación de todas y cada una de las líneas de código interactuando de todas las maneras posibles con todas y cada una de las combinaciones de las otras líneas hasta lograr una especie de “determinismo binario”, o lo que es lo mismo, adivinar el futuro ¿es esto posible? Matemáticamente la respuesta es sí: lo único que necesitamos es una computadora con capacidad de procesamiento y de almacenamiento infinitos. Jeje.

En el mundo real las leyes de la termodinámica y la entropía en los sistemas nos cierran esta puerta definitivamente (temas relacionados: problemas de Hilbert, teorema de Shannon), así que la informática está condenada a un sistema evolutivo, no a uno determinista, y los errores van a ser siempre parte del avance de la tecnología en general y de extinción de algunas empresas en particular. Tony Hoare dijo: “hay dos maneras de diseñar software. Una es hacerlo tan simple que obviamente no haya errores. La otra es hacerlo tan complicado que no haya errores obvios”. La magnitud de la tarea y los miles de millones de líneas de código aún por escribir son parte de nuestra historia futura como especie, hay algunos movimientos interesantes como seL4, un sistema operativo cuyo Kernel ha comprobado matemáticamente estar libre de “bugs” pero claro, ningún equipo falla si no lo sacas de la caja, también hay tendencias en programación altamente preocupantes, como las utilizadas en casas de bolsa, lo cual me lleva a la segunda pregunta ¿está en peligro la humanidad de que un bug comience una guerra nuclear o destruya la economía? Sobre la guerra nuclear no tengo ni idea, espero que no, de la economía me encontré el otro día el siguiente artículo de Donald MacKenzie:

http://www.lrb.co.uk/v36/n17/donald-mackenzie/be-grateful-for-drizzle
La historia larga, corta, llega el tipo de comunicaciones en una de estas empresas de “stock-market” y le informa al VP correspondiente que la conexión con la sucursal de Londres ya está lista y que a partir de ese momento todos los cambios de un mercado se reflejarán de manera inmediata en el otro, y el VP le dice:

— Define inmediato

— Bueno, a la velocidad de la luz, la velocidad máxima en el universo. Si alguna acción o bono cambia de precio en NJ, ese cambio se transmitirá a la velocidad de la luz a Londres –uno se puede imaginar al tipo esperando su palmadita en la cabeza

— ¿Y cómo lo lograron?

— Unimos con fibra óptica las dos sucursales, fue un trabajo enorme, tuvimos que aislar la fibra con materiales que todavía no existían, cruzar los abismos más profundos del planeta y luchar con tiburones (todo esto es real)

— Ok, entonces cuando dices velocidad de la luz te refieres a la velocidad de la luz en un cristal, no en el vacío

— Correcto, 2/3 partes de la velocidad de la luz en el vacío, 125,000 millas o 5 vueltas a la tierra por segundo

— Pues no nos sirve, tiren esa fibra a la basura y conéctense por antenas, esto es una empresa seria.

Y efectivamente, a elegir geodesias y poner antenas, ya que la velocidad es crítica al grado de que incluso la longitud del cable que te conecta al router principal desde tu data center debe de ser igual al de todas las empresas que rentan espacio en el mismo. Para los desarrolladores que trabajan en este entorno las reglas cambian: utilizando la elegante técnica del “bit fucking” que ellos definen como: “no toques el Kernel, no toques la memoria, no invoques subrutinas” crean algoritmos en los circuitos integrados de estas máquinas que permiten un procesamiento suficientemente veloz como para sacar ventaja a la velocidad de la luz en el vacío vs. fibra óptica… ok… muy interesante, ¿Qué significa? Significa que esta evolución hacia la velocidad, este “bit fucking”, ha eliminado cualquier función adicional en el código, incluidos los mecanismos de detección de errores.

Vale, esto suena como un Meh! pero… un pequeño bug en estos sistemas, digamos alguien que confunda en el código el signo + por el signo –, que esté en producción unos segundos puede hacer perder millones al bróker, en 50 segundos más hacer quebrar al banco y en varios minutos colapsar la economía mundial, así que la siguiente vez que alguien confunda el 5 con la S podría ser el fin del mundo. Y eso es Mr. Bug.

Mi consejo a los programadores: coman frutas y verduras

Jorge A. Pinedo
Octubre, 2014

El robo de identidad y The Twilight Zone. Las víctimas del delito cibernético

SSN

Imagina que un día tomas tu celular para hablarle a un amigo, pero por error marcas el número de tu oficina, suena dos veces y después te escuchas contestando a ti mismo(a), no una grabación, sino alguien con tu misma voz tomando la llamada desde tu lugar de trabajo. Este es el inicio de un episodio de “La dimensión desconocida” (The Twilight Zone) donde el personaje se da cuenta que un doble suyo ha tomado control de su vida: su familia, casa, trabajo y todo lo demás, el personaje corre a su casa, intenta abrir la puerta pero sus llaves no funcionan, el carro no está, su tarjeta de crédito es rechazada, su perro lo muerde, etc., el capítulo termina con el tipo buscando comida en la basura, solo, en un callejón, viendo a lo lejos la ventana de su casa, donde esta persona que ahora es él cena con su familia.

Ahora bien, con excepción de algunos qué pensarían “Bueno, al fin salí de eso…” la historia tiene ese sentimiento de pesadilla en donde sabemos que estamos en peligro pero no entendemos la naturaleza de la amenaza. La vida es una historia y para vivirla entre otras personas necesitamos crear un personaje que tenga nombre, apellido, nacionalidad, trabajo, dinero, licencia de manejo, certificado de nacimiento, seguro social y muchos otros requisitos que día con día los demás nos piden (y les pedimos a los demás) para demostrar que somos quienes decimos ser.

¿Qué sucede cuando alguien más tiene acceso a esa información? Las dos consecuencias más comunes son el robo de identidad y el acceso a información confidencial (en el siguiente blog). En el primer caso, aunque es poco probable que llegue a los extremos del capítulo de “Dimensión desconocida”, alguien que conozca nuestro nombre, apellido, seguro social (en USA), dirección y teléfono puede, de manera exitosa, solicitar préstamos, comprar cosas y llenar reclamaciones de impuestos, lo cual nos hará ganadores de un caso con el IRS que puede durar dos o tres años, una destrucción total de nuestro historial crediticio y adiós casa, adiós vacaciones, adiós “home theater” y ahora sí, bienvenido a la dimensión desconocida en donde pasarás los siguientes diez años explicando “ese soy yo pero no fui yo” y “yo soy yo” cada vez que compres algo. Esto debido a que los documentos de autenticación son los mismos que hace 200 años: unos papeles firmados, unos números, una tarjetita de cartón; pero la tecnología para almacenar e intercambiar esa información definitivamente no lo es. Hemos pasado de un mundo en que había que presentar personalmente un papel y hablar con alguien a uno en donde conocer una secuencia de caracteres e ingresarla en un portal web es suficiente para identificarnos. Definitivamente la humanidad no podría regresar al papel (así como la economía no podría regresar al patrón oro), hacer algo así sería renunciar a gran parte de los logros que hemos logrado como especie, pero todavía estamos muy lejos de tener el andamiaje legal necesario para desarrollar tecnologías de autenticación seguras y eficientes.

Es muy corriente que el avance tecnológico esté muchos años adelantado al avance legal que es necesario para regularlo: el descubrimiento del campo electromagnético y los códigos para asignación de frecuencias tienen casi 100 años de diferencia y al día de hoy son un torpe obstáculo para la creación de nuevas formas de comunicación, no voy a desviarme mucho en el tema, pero les dejo estos dos links:

“The Path to Spectrum Deregulation”
http://www.bitsbook.com/excerpts/chapter8/

Click to access chapter8.pdf

La forma en que nos autenticamos en la red es obsoleta e insegura, de manera irresponsable los gobiernos no han creado las regulaciones que impidan y disuadan el robo de identidad, y mientras eso sucede es importante que cada uno se proteja lo mejor que pueda.

Dar consejos para “vivir” seguro en el Internet está más allá de los alcances de este blog (y quizá de cualquier blog), pero aquí algunos básicos para protegernos del robo de identidad:
http://www.transunion.com/personal-credit/identity-theft-and-fraud/how-to-prevent-identity-theft.page

Y algo muy importante, tanto en la creación de nuevas leyes, como en el día a día de los usuarios, tratar de combinar dos de los tres pilares fundamentales de la verificación de identidad en cada una de nuestras transacciones:

– Algo que sabes: Contraseña, preguntas “secretas”, etc.
– Algo que tienes: Una tarjetita con la que abres la puerta, “tokens”
– Algo que eres: huella digital, cornea, etc.,

Más información de estos conceptos aquí (si alguien sabe quién inventó estas tres leyes originalmente por favor compártalo en los comentarios)
http://www.cs.cornell.edu/courses/cs513/2005fa/nnlauthpeople.html

Por último aquí una historia real sobre cómo perder tu identidad cibernética:
http://www.wired.com/2012/08/apple-amazon-mat-honan-hacking/all/

En próximos blogs seguiré hablando de seguridad, bugs, protección de información confidencial y nubes con chicas desnudas… hasta entonces…

Jorge A. Pinedo
Pinjorge@hotmail.com

¿De qué tamaño es internet? IPv4, IPv6 y una historia de ajedrez

Cuenta la leyenda que el emperador de la India, fascinado por el recientemente inventado juego de ajedrez, quiso recompensar a su inventor concediéndole un deseo, el inventor fue llevado a audiencia y ahí, frente al emperador y sus consejeros pidió “un grano de maíz en la primera casilla del tablero, dos granos de maíz en la segunda, cuatro en la tercera y así hasta llegar a la última”, el emperador, entendiendo que eso era poca cosa para su generosidad terminó la audiencia y ordenó que le fuera entregada al hombre su recompensa…

Tablero

Algunos días después recordó este episodio y preguntó si ya le habían dado al hombre su saco de maíz, se hicieron la investigaciones y encontraron que los matemáticos del reino todavía no habían terminado de hacer el cálculo, pero que la cantidad necesaria hasta el momento era más que toda la producción de maíz de todos los reinos conocidos… el emperador quedó sorprendido y en recompensa ordenó que le cortaran la cabeza al inventor (eso último lo inventé yo, pero es un riesgo real de hacerle bromas a los emperadores).

Aquí las matemáticas:

Primera casilla = 1

Segunda casilla = 2

Tercera casilla = 2×2 = 4

Cuarta casilla = 2x2x2 = 8

.

.

.

Casilla 10 = 2x2x2x2x2x2x2x2x2x2 = 1024

Si recordamos que 2x2x2x2 (dos multiplicado por sí mismo 4 veces) puede ser escrito como 2^4, la lista queda como sigue:

2^0 = 1     (Búsqueda recomendada en Google: ¿Cuánto es un número elevado a la potencia cero?)

2^1 = 2

2^2 = 4

2^3 = 8

2^4 = 16

.

.

.

2^10 = 1024

Cómo los tableros de ajedrez tienen 64 casillas tenemos que el número de granos necesarios para darle al hombre la recompensa solicitada es:

2^64 – 1 = 9,223,372,036,854,779,999 granos de maíz. Más o menos el volumen del planeta tierra (si algún día me ves en la calle recuérdame explicarte de donde salió el “- 1” al final de la fórmula)

El concepto del 2 multiplicado por sí mismo es uno de los más importantes en el mundo de la tecnología.

Pensemos en Internet como la suma de la información generada por equipos y las rutas para que esa información llegue de un equipo a otro. Cualquier cosa que conectemos a Internet es como una persona que envía una carta: genera información que posteriormente pone en un sobre con una dirección y lo deposita en el buzón, en dónde el servicio postal hace su magia y la mayoría de las veces entrega esa carta a la persona a la que iba dirigida.

Para que esta analogía funcione cada cosa en Internet debe de tener una dirección única. El problema es que Internet es el hijo monstruoso de tecnologías y proyectos que datan desde finales de los años sesentas, como Arpanet, y que naturalmente no fueron diseñados para tener miles de millones de usuarios, fue hasta los años ochenta que nació el sistema actual de direcciones que utiliza la mayor parte del Internet hoy en día (llamado IPv4). Un ejemplo de una dirección de ese tipo se puede encontrar preguntándole al dispositvo a través del cual estás leyendo esto cuál es la dirección IP que está utilizando y que probablemente te dirá algo como esto:

192.168.1.2 (cuatro grupos de números entre el 1 y el 255)

Lo cual, en números binarios (0 y 1) se escribe así:

11000000.10100110.00000001.00000010 (cuatro grupos de ocho números ‘octetos’ compuestos por 0 y 1)

Para explicar que significa esto vamos a transformar todos los números en 1 para encontrar el número mayor que puede ser expresado con 32 dígitos binarios:

11111111.11111111.11111111.11111111

Ahora regresemos al inicio de la historia con el tipo y su tablero de ajedrez, tenemos 4 series de 8 unos, de igual manera que medio tablero tiene 4 filas de 8 casillas

MedioTablero

Los 1 significan que esa casilla tiene el número de granos de maíz que le corresponden por su posición, los 0 significan que tiene 0 granos, combinándolos podemos representar cualquier número, por ejemplo:

11100000 = 128 + 64 + 32 + 0 + 0 + 0 + 0 + 0 = 224

Si llenamos la primera mitad del tablero de ajedrez en la primera casilla tenemos 1 grano de maíz, en la segunda 2, en la tercera 4, y así hasta llegar a la número 32, en dónde tenemos 2,147,483,648. Ahora bien, si todas las casillas están llenas, es decir, este número:

11111111.11111111.11111111.11111111

Tenemos la suma 1 + 2 + 4 + 8 + 16 + … + 2,147,483,648 =

4,294,967,295 granos de maíz

Que es igual al número máximo de direcciones IPv4 que teoricamente pueden existir, es decir, es el tamaño máximo del Internet. Es importante aquí hacer la aclaración de que muchas de esas direcciones están reservadas para otros usos como “broadcasts”, experimentación y otros, pero para fines de este blog haré el análisis solamente desde el punto de vista aritmético, dicho esto, en los noventas aquí sería el punto final y cualquier estudiante podría seleccionar este texto (Ctrl + a) copiarlo (Ctrl + c), pegarlo (Ctrl + v), ponerle su nombre y terminar su tarea, sin embargo, aunque 4,294,967,295 se ve un número grande, es apenas aproximadamente la mitad de la población mundial (aunque desgraciadamente el porcentaje de acceso a Internet es todavía muy bajo y ese es otro tema), y muchas de esas direcciones se utilizan en el “backstage” de Internet (los equipos de las empresas proveedoras de Internet ‘ISP’), además hay personas que tienen 10 o más dispositivos conectándose a Internet (cel, pc, laptop, hotspot, reader, etc.,) y hay una enorme cantidad de dispositivos esperando su turno a conectarse (carros, neveras, hornos, licuadoras, muñecas inflables y el chip del perro), por lo que parece que tenemos un problema. Pero eso es noticia vieja, ya que desde mediados de los noventas las aproximadamente cuatro mil millones de direcciones de IPv4 se hubieran agotado si no hubiéramos aprendido a hacer trampa (NAT, PAT, mismo número para IP privadas, etc.,), sin embargo esas soluciones tienen un límite y nos hacen utilizar algunas tecnologías para cosas para las que no fueron planeadas -como los números de puertos, que fueron diseñados para identificar aplicaciones, no para aumentar el número de conexiones desde una misma dirección-. La solución definitiva existe desde 1998, cuando el “Internet Engineering Task Force (IETF)” definió el protocolo IPv6 (hubo antes un IPv5 pero nunca superó la fase de prueba) y para el año 2014 aproximadamente el 5% del tráfico de Internet se lleva a cabo en este nuevo esquema, el cual todavía presenta retos de migración, aprendizaje y costumbre que han evitado su adoptación total.

La diferencia principal entre IPv4 y IPv6 es su tamaño, es decir, la cantidad de direcciones que se pueden generar en cada uno:

IPv4 =    32 bits (un bit es el equivalente a una casilla del tablero o a la cantidad de dígitos en la dirección), por ejemplo, la dirección

11000000.10100110.00000001.00000010

Tiene 32 cifras = 32 bits

Entonces

IPv4 = 32 bits = 4,294,967,295 Granos de maíz (o direcciones IP de Internet)

Tablero de ajedrez = 64 bits = 9,223,372,036,854,779,999 granos de maíz

IPv6 = 128 bits = 170,141,183,460,469,000,000,000,000,000,000,000,000 (aproximado)

No es la biblioteca de Borges pero es número absurdamente grande, veámoslo de esta manera: IPv4 tiene suficientes direcciones para darle una dirección IP a cada uno de los habitantes en un planeta de 4,000 millones de habitantes; IPv6 tiene suficientes para que en 4,000 millones de galaxias, cada una con 4,000 millones de planetas habitados por 4,000 millones de personas, ewoks y aliens cada uno tenga 4,000 millones de direcciones disponibles. Galaxias más, galaxias menos, parece un plan bastante completo. Obviamente, no todas las direcciones están disponibles para uso público, y se espera que cada dispositivo utilice varias de ellas -Global, Unicast, Anycast, Unique, Local, sus combinaciones y lo que se les ocurra – y quizá comencemos a ver direcciones “desechables”, es decir, que se utilizarán para una transacción y después serán eliminadas, lo cual haría el Internet un sitio mucho más seguro. IPv6 nos permitirá también generar direcciones aleatoriamente sin preocuparnos de que se repitan (estadísticamente la probabilidad será despreciable) y otras ventajitas, como emplear y aprender tecnologías que no quedarán obsoletas y asignarle a tu empresa la dirección hexadecimal 2014:CACA:DE:BEBE::/64 … todo ese potencial lentamente se está desarrollando y los pronósticos son una migración completa a IPv6 en los siguientes 20 a 30 años aunque nadie tiene mucha certeza al respecto, quizá nos toque ver antes a algún tataranieto de Anakin Skywalker.

Jorge A. Pinedo

pinjorge@hotmail.com