Archivos Octubre 2007

Escribo este artículo con orgullo y preocupación. Orgullo por el impacto que logró mi trabajo y preocupación porque, bueno ya van a ver porque. md5_name.jpg

El año 2005 escribí un artículo en codeproject donde mostré un esquema práctico que explotaba una de las vulnerabilidades encontradas en ese tiempo al algoritmo MD5. El artículo alcanzó notoriedad al ser destacado en Slashdot, y en Kriptópolis.

Mi artículo original está en inglés y hay un (muy breve) resumen en este mismo blog.

La verdad es que no me preocupé much más del tema, y no estaba enterado de los derroteros que siguió esta prueba de concepto, pero haciendo una investigación reciente encontré el trabajo de Peter Selinger, profesor e investigador de la Universidad de Dalhouse en Canada que extendió mi esquema aprovechando el resultado de Patrich Stach, que permite aprovechar los posteriores descubrimientos sobre las fallas de este algoritmo.

Otra sorpresa es que este trabajo ha sido mencionado como una herramienta anti forense en círculos de hackers éticos.

¿De que se trata todo esto, y que implicancias tiene?

md5sum.jpg

Les voy a dar un ejemplo.

Cuando ustedes van a un sitio donde se encuentran las imágenes de disco de Ubuntu encontrarán un archivo llamado MD5SUMS que en el caso de Ubuntu 7.10 contiene lo siguiente:

ebf7ad055bc39634065daa10de980d7e *ubuntu-7.10-alternate-amd64.iso
9a4ae3cfd68911a861d094ec834c9b48 *ubuntu-7.10-alternate-i386.iso
61c87943a92bc7bf519da4e2555d6e86 *ubuntu-7.10-desktop-amd64.iso
d2334dbba7313e9abc8c7c072d2af09c *ubuntu-7.10-desktop-i386.iso
43ff753b260729b12c7d21d3a6db8c73 *ubuntu-7.10-server-amd64.iso
7d88cd87df509a740d9f47b9bbf1375e *ubuntu-7.10-server-i386.iso
5308a79f5e652edba5be84644ee14b09 *ubuntu-7.10-server-sparc.iso

La serie de numeros y letras a la izquierda de cada nombre nos indica el valor resultante al aplicar el algoritmo MD5 al archivo de la derecha.

En este caso, para la imagen del CD ubuntu-7.10-desktop-i386.iso el valor MD5 es d2334dbba7313e9abc8c7c072d2af09c.

Para validar de que nuestra imagen es la correcta, lo más seguro es aplicar un cálculo del hash MD5 en el archivo descargado y comprobar que coincida con lo informado en el sitio oficial de Ubuntu. Si estos valores coinciden sabemos que el disco no ha sido saboteado ni alterado por nadie.

Esto impide que un hacker malicioso pueda infectar Ubuntu con un virus o un trojano, ya que el hacker tendría que crear una imagen iso similar, reemplazarla en el servidor y asegurarse de que que el valor MD5 de su archivo coincida con lo informado por Ubuntu.

Hasta ahora eso parecía imposible, pero como demostré en el 2005 es muy sencillo escribir un programa extractor que burlara este mecanismo de verificación, aprovechando los fallos al algoritmo MD5 (descubiertos en ese tiempo por Xiaoyun Wang and Hongbo Yu de la Universidad de Shandong en China).

El problema con mi esquema es que requiere la distribución del programa extractor, pero la prueba de concepto de Selinger elimina esta traba.

Selinger es capaz de crear un programa "auto extractor", con lo que deja inutilzable la "firma MD5" como medio de validación de la integridad de los archivos.

Si pensamos en los archivos ISO con que se distribuyen las imagenes vivas de Ubuntu, y otros sistema operativos, estos archivos son "auto ejecutables", y por lo tanto aplica el esquema propuesto por Selinger.

La puerta está abierta para distribuir troyanos infectando cualquier distribución de linux que use MD5 como único mecanismo de validación.1

No es dificil imaginar una extensión al programa de Salinger para genera imagenes ISO maliciosas de muchos sistema operativos distribuidos de esta manera.

Por supuesto esta prueba de concepto también inhabilita el uso de MD5 como base para construir MAC (Message Autentication Code) en registros, transacciones o documentos digitales.

En este caso es más sencillo romper este mecanismo de control, porque los MACs siempre son ejecutados por programas externos, y para esto basta usar un esquema como el que describí en mi artículo original.

Han pasado 2 años de que sabemos estas cosas y aún me encuentro con implementaciones en que usan MD5 como un mecanismo de autenticar transacciones.2

Pero lo peor, es que todavía me topo con sistemas que proclaman su alto nivel de seguridad porque las claves de sus usuarios son almacenadas en MD5, algo no recomendado antes del 2005, y que aún sigue usándose.

¿Entienden ahora por qué aparte de orgullo siento preocupación?

[1] Insisto en lo de único mecanismo de verificación, porque en muchos casos se usan otras códigos de autenticación adicionales o complementarios, como firmas PGP o dos valores de hash, uno MD5 y otro SHA-1 por ejemplo.

[2] Lamentablemente muchos usuarios no saben o no se preocupan de verificar la integridad de las imágenes de los archivos descargados, así que muchas veces los hackers no necesitan algo tan complicado para vulnerar la distribución de sofware.

Un interesante estudio la Universidad de Carnegie Mellon investiga el mercado negro de servicios de cibercrimen. El trabajo se basó en en el análisis de unos 2.4 GiB de registros de conversaciones en canales IRC, lo que comprende unos 13 millones de mensajes.

El "abstract" de este paper dice:

"Este paper estudia una economía subterránea activa que se especializa en la "comoditización" de actividades como el fraude con tarjetas de crédito, robo de identidad, spamming, phishing, robo de credenciales en línea, y la venta de servidores comprometidos. Usando la traza de siete meses de bitácoras recolectadas de un mercado subterráneo activo que opera en redes públicas de servidores de Internet Relay Chat, hemos podido medir el cambio desde el "hacking por diversión" al "hacking por ganancias" que ha dado nacimiento a un substrato societal lo suficientemente maduro que roba riquezas por millones de dolares en menos de un año"

Además de los típicos servicios como envío de spam, listas de direcciones de email, servicios de phishing, hay que agregar listas de servidores con vulnerabilidades, servicios de ataques DDOS (Distributed Denial of Services), pero además hay un mercado de datos de identidad, como datos completos de tarjetas de crédito, incluyendo el registro de datos de este tipo:

Nombre: Phil Phished
Dirección: 100 Scammed Lane, Pittsburg, PA
Teléfono: 555-677-1234
Número de Tarjeta: 4123 4567 8901 2345
Exp: 10/09 CVV: 123
SSN: 123-45-6789

SSN es el security social number.

Según los investigadores en los mensajes registrados circularon más de 80.000 datos verídicos de tarjetas de crédito, y el valor de esta información varía si la tarjeta es más reciente.

Una lectura obligatoria y recomendada para todos los preocupados de los problemas asociados al robo de identidad y la seguridad en general.

Esto es el colmo del "geek ismo":

Por 29 dolares aprox., puedes comprarte esta T-Shirt que detecta la presencia e intensidad de las redes Wi-Fi en la cercanía, tal como este feliz cliente nos muestra:

211dd10.jpg

Para lavar, no olviden que deben desconectar la franja animada del cable además de sacar las baterías antes de ponerla en la máquina. Además se recomienda lavar con agua fría.

;)

Para los interesados: Wi-Fi Detector Shirt

Los diputados chilenos no han dejado de sorprenderme en el último tiempo.

Ahora, gracias al impulso del incansable Luis Ramirez, un grupo transversal de diputados ha dado su apoyo al proyecto Un Computador Por Niño (y por "transitividad" al OLPC).

ucpndiputados.jpg

Felicitaciones a Luis Ramirez y a todos los que participan del proyecto UCPN.

A continuación parte del comunicado de prensa:

El Presidente de la Cámara de Diputados, Patricio Walker y los diputados Nicolás Monckeberg (RN) y Marco Enríquez-Ominami(PS) iniciaron hoy una campaña de sensibilización con las distintas autoridades de Gobierno para lograr la masificación de computadoras portátiles en la educación, especialmente para los sectores más pobres del país.

La propuesta fue explicada en una visita a la Escuela Panamá, de la comuna de Santiago, donde se han realizado importantes avances en materia de acceso a las nuevas tecnologías. En la ocasión, los diputados formularon un llamado al Gobierno y a todos los sectores a apoyar esta iniciativa que se enmarca en la necesidad de avanzar en una mayor equidad e igualdad de oportunidades.

Ver texto completo.

Ricardo Galli es un personaje, yo no le conocía hasta que nos topamos hace ya casi dos años cuando el iniciaba meneame y yo blogmemes. Es una persona de fuertes declaraciones, y personalmente estoy en descuerdo con lo que él dice el 60% de las veces. Pero le respeto, le creo, y lo encuentro coherente y por lo tanto leo sus apuntes regularmente.

Ricardo se ha visto forzado a cerrar el blog porque "residía" dentro del dominio de la Universidad donde trabaja.
La causa de todo es es cometer el pecado de decir la verdad, algo que uno espera de un académico en todo caso. Las autoridades universitarias en este caso han temido las amenazas legales en su contra.

Algo sé de presiones para que elimines lo que escribes, pero aún no es tiempo de hablar de eso.

Las palabras de Enrique Dans reflejan lo inusitado e injusto de esta situación que afecta al creador de meneame:

"El hecho sería malo, malísimo en cualquier caso, pero en éste resulta además especialmente sangrante: la entrada censurada de Ricardo argumentaba sólidamente contra un pretendido "observatorio de Internet" completamente carente de todo rigor académico y de investigación, una práctica que, como profesor que es, Ricardo hacía muy bien en denunciar. La pregunta de qué diablos hace toda una rectora de universidad ejerciendo la censura para "proteger" a un sitio semejante de la opinión legítima de uno de sus profesores no tiene respuesta válida ni la tendrá nunca, sean cuáles sean las razones. Es, pura y simplemente, una barbaridad. Y una pena."

Les recomiendo que lean el artículo que ha sido censurado por la UIB y vean lo injusto y ridícula que es la medida que ha tomado la rectoría de esa universidad en contra de uno de sus académicos.

Cuestión de Azar

| | Comentarios (0) | TrackBacks (0)

"The generation of random numbers is too important
to be left to chance."

..Robert R. Coveyou, Oak Ridge National Laboratory

"Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin."

.. John Von Neumann

Hay sorteos que no pasarían el escrutinio de expertos [1]. La verdad es que hay casos en que la forma en que se realiza un sorteo no es algo tan grave, pero en otros casos el asunto se torna delicado. Por ejemplo, muchos jóvenes norteamericanos impugnaron la forma en que fueron elegidos ("sorteados") para ir a Vietnam durante 1969, pues consideraban que este mecanismo estaba viciado (ver).

Así que realizar un sorteo justo es algo que no debe ser dejado al azar.

No sé si han tenido la oportunidad de ver cómo se realizan los sorteos de las loterias, pero el proceso es bastante riguroso y seguro, por ejemplo, la medición y peso de las bolitas debe cumplir una serie de estándares.

Pero, ¿podemos realizar sorteos usando el computador como generador de números aleatorios?

La gran característica de los números aleatorios es que estos no sean predecibles, y por lo tanto, si desarrollamos un algoritmo para calcular números aleatorios estamos "cayendo en pecado", como dijo Von Neumann.

La función rand(), o random() que encontramos en varios lenguajes de programación, y en algunas planillas de cálculo son útiles para aplicaciones simples, o para algunos videos juegos, pero no resisten un análisis estadistico serio. Estos generadores de números aleatorios tienden a repetir secuencias después de unos pocos miles de "ciclos", es por eso que los jugadores de video juegos descubren con el tiempo "patrones" que les permiten "dar vuelta" los juegos después de un tiempo.

dilbertrandom.gif

Por esto que debemos recurrir a mejores métodos para poder generar verdaderos números aleatorios.
Normalmente estos métodos utilizan alguna interfaz analógica a un instrumento que mide un fenómeno físico. Hasta ahora los fenómenos físicos son aleatorios, por ejemplo, el decaimiento de una partícula radiactiva, el ruido termal, o incluso el retraso del reloj.

Dado que conseguir una fuente externa analógica es complicado se han desarrollados mecanismos que permiten usar los dispositivos disponibles en el computador.
Por ejemplo, se puede contar el tiempo medio que toman los usuarios al tipear cada tecla, o por ejemplo capturar una serie de posiciones del mouse.
El "seudo dispositivo" /dev/random de Linux, y la función RtlGenRandom Windows están basadas en estas técnicas para generar números seudo aleatorios.

Sin embargo hay mejores formas de lograr números aleatorios de verdad, y sin necesidad de invertir en hardware especial para medir fenómenos físicos aleatorios.

El servicio random.org, mantenido por Mads Haahr, es muy bueno, no sólo porque ha sido analizado estadísticamente de acuerdo a las recomendaciones del NIST, sino que es un servicio que lleva "varios años en el mercado", utiliza una fuente física natural (basada en el ruido atmosférico), y tiene una interfaz web interactiva y una API HTTP para invocar el servicio.
(¿Mencioné que además el servicio es gratuito?)

Lo reitero, generar números aleatorios no es cuestión de azar...

[1] Afortunadamente el sorteo mencionado cuenta con el mejor notario posible (un gato) ;)

Los invito a retroceder 4 años...

  • Web 2.0 y el tejido social : Internet aparece como un instrumento de gran potencial no sólo para fortalecer el desempeño de los gobiernos, sino para avanzar hacia cotas hasta ahora impensables en el desarrollo de la democracia. (Alvaro Díaz 2003)
  • ¿alfabetización digital?: : _Para mi la sociedad de la información tiene que ser democrática y segura, yo la pienso como un bien público de libre acceso. Es por esta razón que una de nuestras tareas es logra alfabetizar digitalmente a más de 700 mil
    chilenos. Lo más importante es el acceso a la información, que se traduce en
    productividad, bienestar económico y que las personas pueden acceder a más
    posibilidades y mejores trabajos....Nos basaremos en el modelo de Irlanda, la certificación otorgada a través del proyecto "Enlaces" y los telecentros que tendrá en su primer ciclo - el más básico - una duración de 18 horas, donde el estudiante aprenderá a trabajar con un procesador de texto, navegar por internet, mandar email, y algunos conceptos sencillos sobre sistemas operativos, como combinaciones de teclas, además de las partes fundamentales de un computador.
    (Alvaro Díaz, 2003)_
  • Exportar bits _A mi parecer lo que tenemos que hacer es exportar bits, es decir,
    software, ideas, servicios, y productos con valor agregado. Pero para esto
    necesitamos mejorar los controles de calidad, aumentar la productividad,
    crear aplicaciones para los diversos sistemas operativos como Linux y
    Windows. Nuestro país tiene gente capaz, pero también debemos crear un
    sistema de certificación de recursos humanos. (Alvaro Díaz 2003). _
  • A propósito de acuerdos..., pareciera que Microsoft sólo hizo una renovación de contrato. ;)

No hay nada nuevo bajo el sol...

Si han tenido que explicar como funcionan los joins en SQL, o han tenido dudas sobre el resultado de un query especifico, este post de Jeff Atwood les va a interesar, porque explica como funcionan los joins usando Diagramas de Venn.

Las operaciones en bases de datos relacionales son sobre conjuntos, así que esta debería ser la forma más natural de explicar este concepto, al menos a mi nunca me lo explicaron así, y hay veces que entender o escribir un query puede ser una experiencia que consume mucho tiempo y esfuerzo mental.
Esta forma de visualizar creo que es muy útil.

A los que enseñan bases de datos, ¡incorporen esto en sus clases por favor!

A continuación les dejo 2 de los ejemplos explicados por Jeff Atwood:

Tenemos 2 tablas:

Tabla A Tabla B

idnameidname
------------
1Pirate1Rutabaga
2Monkey2Pirate
3Ninja3Darth Vader
4Spaghetti4Ninja

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

idnameidname
------------
1Pirate2Pirate
3Ninja4Ninja
join-inner.png

El otro caso es mas complejo:

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

idnameidname
------------
2Monkeynullnull
4Spaghettinullnull
nullnull1Rutabaga
nullnull3Darth Vader
join-outer.png

De acuerdo a El Mostrador:

Cámara aprueba proyecto sobre neutralidad en acceso a internet

Iniciativa establece que la protección de los derechos de los usuarios en Internet deberá considerar el cumplimiento de ciertas obligaciones, tanto de los suministradores como de los proveedores de acceso.

La Cámara de Diputados aprobó y despachó al Senado, por 66 votos a favor y 2 abstenciones, un proyecto de ley que garantiza el principio de neutralidad en materia de acceso a internet.

La iniciativa modifica la Ley General de Telecomunicaciones, indicando que la protección de los derechos de los usuarios en Internet deberá considerar el cumplimiento de ciertas obligaciones, tanto de los suministradores como de los proveedores de acceso.

De esta forma, los suministradores y proveedores no podrán bloquear, interferir, discriminar o entorpecer en cualquier forma, la capacidad de cualquier usuario de Internet para acceder, utilizar, enviar, recibir u ofrecer cualquier contenido, aplicación o servicio legítimo a través de Internet, ni cualquier otro tipo de actividad o uso realizado a través de la red.

Tampoco podrán realizar ninguna actividad que restrinja la libertad de los usuarios para el uso de los contenidos o servicios dispuestos en Internet.

En todo caso, se establece que los suministradores y proveedores de acceso a Internet deberán tomar las medidas necesarias para garantizar la privacidad de los usuarios, la protección contra virus y la seguridad de la red, siempre que ello no tenga por objeto realizar acciones destinadas a gestionar tráficos con fines anticompetitivos.

Asimismo, sólo podrán bloquear el acceso a determinados contenidos, aplicaciones o servicio, a pedido expreso del usuario. Un reglamento establecerá las prácticas restrictivas a la libertad de utilización de los contenidos o servicios que se presten a través de Internet.

La iniciativa se originó en una moción de los diputados Gonzalo Arenas, Marcelo Díaz, Enrique Estay, Alejandro García-Huidobro, Patricio Hales, Javier Hernández, Tucapel Jiménez, José Antonio Kast, Carlos Recondo y Felipe Ward.

Precisión

| | Comentarios (2) | TrackBacks (0)

Esta nota está "impulsada" por algunos comentarios a mi post anterior con respecto al Bug de Excel 2007, el primero es un enlace a una discusión en Kriptópolis sobre la precisión numérica de javascript. El segundo es para preguntarme si sabía que Visual Basic rendondea hacia abajo.

La verdad es que no sé cómo redondea Visual basic, porque afortunadamente nunca he tenido que programar en ese lenguaje ;).

Pero lo que me sorprende es leer otros comentarios que demuestran una ignorancia sobre la precisión de los computadores que es sorprendente en profesionales de la informática.

Todo programador debería saber que la precisión de las operaciones matemáticas está dada por la manera en que se representan los números.

Hoy en día la forma más aceptada para el almacenamiento de números es la representación estándar IEE de Punto Flotante, o IEE754.

Esta representación, a pesar de ser bastante buena y precisa, no permite representar todos los números reales posibles, los que son infinitos.

Como no podemos tener infinitos dígitos para representar un número, debemos adoptar alguna convención, y para eso usamos una cantidad de bits para almacenar los números.

La representación típica usa 64 bits para almacenar un número real. Excel y muchos programas que requieren alta precisión, usan la denominada "representación doble extendida", en que cada número se representa en 80 bits.

Esta representación tiene algunas propiedades curiosas, como por ejemplo, que hay 1.000 veces más números entre 0 y 0,5 que entre 0,5 y 1,0. Es decir, la precisión es mayor cuando más nos acercamos a 0.

float1.jpg

Hay consecuencias asociadas a la decisión de usar esta representación. Una de las más impactantes es la no asociatividad de los números.

Si recuerdan del colegio la asociatividad es una propiedad que nos permite decir que podemos agrupar 3 o más números de distintas maneras y los resultados van a ser los mismos.

Por ejemplo, si tenemos los números 0,1;0,56 y 0,78 para sumarlos los podemos agrupar de las siguientes maneras: (0,1+0,56)+0,78 o 0,1+(0,56+0,78). En general, da lo mismo como los ordenemos, el resultado va a ser el mismo.

Sin embargo esto no ocurre en los computadores.

Por ejemplo, este código en javascript demuestra lo que digo:

var n = new Array(1001);
var i;
for (i = 1; i <= 1000; i++) {
n[i] = i * 1.19;
}

s0 = 0;
for (i = 1; i <= 1000; i++)
{
s0 = s0 + n[i];
}

s1 = 0;
for (i = 1000; i >= 1; i--) {
s1 = s1 + n[i]
}

delta = s1 - s0;

alert('s0 = ' + s0 + ' s1 = ' + s1 + ' s1-s0 = ' + delta);

Pueden probar este código en esta página

Lo que hace este código es crear un arreglo de 1000 numeros, desde 1 a 1000, donde cada numero es multiplicado a su vez por 1,19 (esto es como aplicarle el IVA a cada numero).

Luego suma los numeros en orden ascendente (s0) y luego en orden descendente (s1).

Al final muestra el resultado de ambas sumas, y la diferencia entre ambas (delta).

Lo interesante es que delta, es decir, s1-s0 debería ser 0, pero como la suma no es asociativa el resultado no es el esperado.

Esta diferencia puede parecer insignificante, pero la verdad es que me he topado con muchas aplicaciones prácticas en que esta diferencia se nota.

Cuando uno empieza como programador se topa con problemas del tipo: "sume el monto de 1.000 facturas aplicándoles el IVA."

Tradicionalmente para sumar un arreglo de N cifras usamos el siguiente algoritmo:

def Suma(A[1..N])
suma := 0
for i := 1 to N do
suma := suma + A[i]
return suma

Sin embargo esta no esa la manera más precisa de hacer este cálculo.

Una mejor manera de sumar es usando la Fórmula de Kahan:

def SumaKahan(A[], 1 a N)
S := A1;
C := 0;
for j := 2 to N do
Y = A[j] - C;
T = S + Y;
C = (T - S) - Y;
S = T;
return S

Esta formula tiene una precisión altisima1.

Para los que estén interesados en experimentar en la continuación de este artículo hay un programa en C que demuestra la precisión de este algoritmo.

Este es sólo un ejemplo de las cosas que todo programador debe saber sobre punto flotante.

[1] Los detalles se pueden encontrar acá, la perturbación en el algoritmo es del 2*epsilon, mientras que en el algoritmo tradicional es proporcional a N*epsilon, donde epsilon es el error de aproximación dado por la representación numérica.

"No todo lo que sube ha de bajar".

Por años, hemos conocido al Teniente Alejandro Bello como alguien que se ha extraviado. El año 2014 se cumplirán 100 años de su extraña desaparición y la historia le devolverá la mano para reconocerlo como uno de los grandes aventureros de Chile, un pionero que en la realización de su pasión encuentra la muerte. A continuación la sinopsis del documental Alejándrose Bello de Tus Ojos, de los realizadores Rossenman & Godoy con la gestión Cultural de la Oficina BRAVO.

Gracias a Wenukura.

Por favor, comparen la orgullosa leyenda que tienen los iPods "Diseñado por Apple en California"

05california-2.png

Frente al tímido "Hola desde Seattle" que exhiben los Zune de Microsoft.

05zune.png

Joel Spolsky escribe un notable comentario al respecto de la patética envidia a Apple que sienten en Redmond.

En todo caso, ambos dispositivos son ensamblados en China :).

¡Como se mueve la economía global, y en Chile recién queremos empezar a ver que hacemos...

¿seremos los chilenos más patéticos ?

La Universidad de California en Berkeley esta publicando video de clases y charlas a través de Youtube, para esto basta visitar el sitio: http://youtube.com/user/ucberkeley.

Les dejo un charla del año 2005 dictada por Sergei Brin, uno de los fundadores de Google, sobre buscadores en internet:

Sobre este archivo

Esta página es un archivo de las entradas de Octubre 2007, ordenadas de nuevas a antiguas.

Septiembre 2007 es el archivo anterior.

Noviembre 2007 es el siguiente archivo.

Encontrará los contenidos recientes en la página principal. Consulte los archivos para ver todos los contenidos.

Technorati

Technorati search

» Blogs que enlazan aquí

Creative Commons License
Este weblog está licenciado bajo una Licencia Creative Commons.

BloGalaxia website stats