12
May
2012

Forking de procesos en Linux

La creación de procesos en Linux implica dos etapas: forking y exec -me tomo la licencia de denominarlas así por las familias de funciones implicadas en cada caso-.

En la etapa de forking se duplica el proceso que realiza la llamada de creación. Para esta duplicación se crea un nuevo process descriptor -estructura donde se guarda la información del proceso- y se agrega a la lista de process descriptors que maneja el kernel. Este nuevo process descriptor es muy similar al del proceso padre pero difiere en el process id y en los procesos hijos -el proceso recién creado no tiene hijos y el proceso padre pasó a tener un hijo más-.

En cuanto al espacio de memoria del nuevo proceso, se utiliza la técnica de copy on write para lograr una mayor optimización. Empleando esta técnica ambos procesos tienen su espacio de memoria pero esta división comienza siendo “virtual”. A medida que se realizan operaciones de escritura en la memoria, se duplican las páginas que corresponden.

La etapa de exec permite la carga en memoria y ejecución de un binario. Veremos en este artículo solo forking.

A continuación la parte más divertida:

#include <stdio .h>
#include <stdlib .h>
#include <unistd .h>
 
int main(int argc, char* argv[]){
    pid_t id_del_proceso_hijo = fork();
    pid_t proceso_actual = getpid();
    printf("Mensaje de %d: Mi hijo es %d\n", proceso_actual, id_del_proceso_hijo);
    int* status_ptr = malloc(sizeof(int));
    *status_ptr = -1;
    pid_t estado_del_hijo = waitpid(id_del_proceso_hijo, status_ptr, 0x0);
    printf("Mensaje de %d: Espere hasta que se reportó el proceso %d. Info del reporte: %d\n", proceso_actual, estado_del_hijo, *status_ptr);
    return 0;
}
</unistd></stdlib></stdio>


Leer el resto del artículo »

24
Mar
2012

Crypto++: cifrar bloque binario con AES + ECB

Crypto++ es una de las bibliotecas más importantes y recomendables para implementar funciones criptográficas en C++. Es de uso libre (open source) y funciona en múltiples plataformas (Windows, Linux, OS X). Si en algún momento deciden usarla, tomenlo con paciencia porque es un poco árida al principio.

En el día de hoy comencé a implementar una demo de CTR (streamcipher) en Qt/C++. Para esta implementación -que no es tan compleja-, necesité aplicar un blockcipher a bloques binarios de largo fijo. Elegí como blockcipher al algoritmo Rijndael. Como no era el objetivo implementar un Rijndael desde cero, decidí utilizar la funcionalidad que brinda Crypto++ (cryptopp).

Para facilitar el asunto, voy a estar trabajando con bloques y claves de 128 bits (16 bytes).

Al cifrar un único bloque de largo fijo e igual a 128 bits, no necesito padding ni técnicas de block-chaining (ej. CBC). Por lo tanto, el modo en el que necesitaba usar AES es ECB sin padding. Recordemos que ECB no encadena bloques realmente y en caso de que el texto plano se repita, se repetirá también el cifrado leakeando información. Por favor nunca utilizar ECB para cifrar mensajes de más de un bloque.

Hechas estas consideraciones, este es el código:


Leer el resto del artículo »

19
Mar
2012

Autenticación de mensajes: HMAC

Otro mecanismo para autenticar mensajes es utilizar una función de hash y una PSK (pre-shared key). Llamemos h a la función de hash.

¿Cómo se calcula el MAC?

h ( K XOR a || h ( K XOR b || m))

K es la clave compartida.
a y b son constantes pre-definidas. Según el NIST en su documento FIPS198a, a (outerpad) es el byte x’5c’ repetido la cantidad de veces que entra un byte como input de la función de hash. b (innerpad) se forma igual que a pero con el byte x’36′.
m es el mensaje a autenticar.

Según el NIST, en su documento FIPS198a:

The size of the key, K, shall be equal to or greater than L/2, where L is the size of the hash function output.

Calcular el HMAC de las siguientes formas está mal:

h ( K || m), h ( m || K), h (K || m || K), etc.

B. Schneier, en su libro Cryptography Engineering, considera que utilizar SHA-1 como función de hash es riesgoso. En su lugar -y para lograr una seguridad de 128 bits- recomienda SHA-256.

Leer el resto del artículo »

17
Mar
2012

Autenticación de mensajes: CBC-MAC II

Retomando el artículo anterior (Autenticación de mensajes: CBC-MAC), voy a comentarles aquí otros dos posible ataques a CBC-MAC.

Este ataque puede aplicarse también algunas funciones de hash. Supongamos que “c” tiene un bloque de largo. El atacante encuentra que MAC(a || c) = T y que MAC(b || c) = T. Como MAC(a || c) = E(MAC(a) XOR c) y MAC(b || c) = E(MAC(b) XOR c), entonces MAC(a) = MAC(b). Por lo tanto, si el atacante captura MAC(a || d), puede saber que MAC(b || d) tendrá el mismo tag.

Para la siguiente demostración, a la función MAC la voy a abreviar como M. Supongamos ahora que “a” y “b” tienen un bloque de largo. El atacante captura las MACs de “a”, “b” y “a || b”. Si captura “a || b”, entonces tiene E(M(a) XOR b). El atacante puede crear ahora la MAC del mensaje “b || M(a) XOR M(b) XOR b”. ¿Por qué? Ese mensaje tendría la siguiente MAC: E(M(b) XOR (M(a) XOR M(b) XOR b)). Si conmutamos y reasociamos, sería igual a E(M(b) XOR M(b) XOR M(a) XOR b). Pero M(b) XOR M(b) es igual a 0. Y 0 XOR ALGO es igual a ALGO. Entonces nos quedaría E(M(a) XOR b). PERO ESO ES M(a || b) QUE YA LO TENEMOS! Entonces usamos ese mismo tag y acabamos de autenticar un mensaje un tanto particular pero construido por nosotros :)

Artículo en base a información obtenida de Cryptography Engineering (B. Schneier). Demostración de martin.com.uy/sec.

16
Mar
2012

Autenticación de mensajes: CBC-MAC

Como mencionabamos en el artículo anterior (MAC: autenticación de mensajes), CBC-MAC es una implementación de MAC para autenticación de mensajes.

CBC-MAC

La idea detrás de esta implementación es transformar un algoritmo de cifrado con CBC (encadenamiento de bloques) en una función MAC. El tag MAC se obtiene al aplicar el algoritmo de cifrado con CBC al mensaje y tomar el último bloque -en ocasiones se utiliza la mitad del bloque-. Es importante que la clave utilizada en la obtención del MAC sea distinta a la clave utilizada para cifrar el mensaje. En caso contrario el MAC sería igual al último bloque del mensaje y podrían debilitarse tanto el cifrado como la autenticación.

Un ataque al CBC-MAC

Supongamos que un atacante, con suficiente tiempo, captura todos los mensajes de una comunicación y almacena su MAC en una base de datos con dos columnas: Mensaje – MAC. En determinado momento va a suceder que al almacenar una de esas tuplas mensaje-MAC, el valor de MAC ya se encuentra en la base de datos para un mensaje distinto. Esto es, en criptografía, una colisión. ¿Cuándo sucederá? Por la paradoja del cumpleaños, para un MAC de 128 bits ocurrirá en promedio al capturar 2^64 mensajes.


Leer el resto del artículo »

15
Mar
2012

MAC: autenticación de mensajes

La criptografía permite asegurar la confidencialidad de un mensaje pero no su integridad. Un atacante podría modificar (“tamperear”) un mensaje cifrado en medio de la comunicación y el receptor no tendría elementos para determinar si esto ocurrió.

Las técnicas de encadenamiento de bloques (block-chaining), utilizadas habitualmente en la criptografía, hacen que la tarea de modificar un mensaje no sea tan fácil. Si todos los bloques se encuentran encadenados y dependen de los anteriores, probablemente al realizar una modificación estemos introduciendo basura que no puede ser descifrada por el receptor. Sin embargo, en determinadas condiciones puede construirse un mensaje “válido” para el receptor a partir, por ejemplo, de mensajes cifrados -previamente interceptados- que guarden una estructura común.

MAC (Message Authentication Code) es una técnica destinada a autenticar mensajes y verificar, por lo tanto, su integridad. Dado un mensaje (m) y una clave (K), llamamos tag (T) al resultado de aplicarle al par mensaje-clave la función MAC. Para ser más claros: T = MAC(K, m).

Al enviar el mensaje al receptor adjuntamos T. El receptor, quien conoce previamente a K, realiza el mismo cálculo y comprueba de esa forma si el mensaje es auténtico. Un atacante que intercepte la comunicación no sabría, al modificar el mensaje, cómo generar un T válido.

Todo mensaje distinto tendrá un T distinto. Al igual que ocurre con las funciones de hash, el conjunto imagen (T) es finito y esto hace que la función no sea inyectiva. Si no fuera posible generar colisiones intencionadas, no se sabría qué bits agregar para hacer pasar un mensaje modificado por uno auténtico (dado un T conocido).

Según Bruce Schenier, en su libro Cryptography Engineering:

An ideal MAC function is a random mapping from all possible inputs to n-bits outputs.

En los próximos artículos veremos las implementaciones más comunes de MAC, como por ejemplo CBC-MAC, HMAC y GMAC.

11
Mar
2012

DIA – Editor de Diagramas OpenSource

dia - editor de diagramas opensource

Quizás muchos ya lo conozcan pero el otro día tuve que realizar un diagrama de Entidad-Relación y acudí a este editor visual de diagramas: DIA. Cumple el mismo rol que Microsoft Visio pero se trata de una aplicación open source, desarrollada en el marco del proyecto GNOME. Podemos dibujar diagramas de red, diagramas UML, diagramas de Entidad-Relación (MER), diagramas de circuitos eléctricos, etc.

Es muy fácil de usar, ofrece un abanico amplio de diagramas (hay unas 35 plantillas aproximadamente con todo tipo de elementos) y brinda las comodidades básicas para edición de texto, incorporación de imágenes y conexión de elementos mediante distintos tipos de líneas y flechas.

Los diagramas pueden exportarse a múltiples formatos: PNG, PDF, SVG, etc.

Se encuentra disponible para múltiples plataformas: Linux, OS X y Windows. Probé instalarlo desde los repositorios de Ubuntu 10.10 y compilarlo bajando el source del sitio oficial -hay que instalar algunas dependencias pero se encuentran todas en el repositorio oficial de Ubuntu-.


Leer el resto del artículo »

10
Mar
2012

Diseño de un mecanismo de autenticación – Parte I

En esta serie de artículos quiero presentar un mecanismo de autenticación web sencillo, de la familia challenge-response, que diseñe para el sitio Live! -la idea no es original obviamente-.

Lo más típico en la autenticación web es que el sitio pregunte al usuario por la contraseña. El usuario la ingresa y en el servidor se calcula su digest. Este digest se compara contra el digest guardado en la base de datos y si son iguales, la autenticación es válida.

Este mecanismo es sencillo y no almacena la contraseña en el servidor. Pero puede ser peligroso: la contraseña viaja desde el cliente al servidor en texto plano. Cualquiera que pueda interceptar uno de estos paquetes (a nivel de Internet o de la red interna), podría visualizarla. ¿Puede ser útil este tipo de autenticación? Sí, si se utiliza el protocolo HTTPs (SSL) en la comunicación cliente-servidor.

Supongamos que, habiendo evaluado el impacto y riesgo, llegamos a la conclusión de que HTTPs no es una opción. Lo que debemos hacer es implementar un mecanismo de autenticación que reduzca a un atacante sus posibilidades de éxito. Por ejemplo, que aún sniffeando y registrando todos los paquetes de una conexión, no pueda autenticarse.

autenticacion web segura


Leer el resto del artículo »

24
Feb
2012

Live! Blogs, antes de lo esperado

Live Blogs

Como comentaba en el artículo anterior (Live! 2.0), planificaba para el año que viene implementar el módulo Live! Blogs. Con bastantes horas de programación en estos días, logré terminarlo antes de lo esperado :)

Funciona de la siguiente manera:

- Cada vez que se escribe/edita/elimina un artículo o comentario en uno de los blogs WordPress asociados, se envía una notificación mediante cURL HTTP GET a Live!. Al recibir esta notificación, Live! actualiza la información del artículo o comentario en base a un canal XML con el blog (era un RSS al que le modifiqué completamente el esquema para expresar la información de interés).

- Al escribirse un comentario en Live! Blogs, se envía una notificación mediante cURL HTTP POST con los datos del comentario al blog WordPress asociado para que se publique. Si no se encuentran errores, Live! Blogs recarga nuevamente los comentarios del artículo.

- Live! Blogs, de esta manera, guarda una réplica sincronizada (en tiempo real) de los artículos y comentarios de los blogs WordPress asociados. Esto permite que en la mayoría de las situaciones -lecturas- se obtenga un buen tiempo de respuesta.

Live! utiliza la clase SimpleXML de php para parsear el archivo XML.

Del lado de WordPress, armé un plugin sencillito y modifiqué algunos archivos del core para aplicar el filtro en los lugares necesarios.

Live! Blogs puede mostrar todos los artículos juntos o filtrar por blog.

18
Feb
2012

Live! 2.0

Live martin.com.uy

Hago un paréntesis en las publicaciones habituales porque quiero presentarles Live! 2.0 (http://martin.com.uy/live). Es una versión renovada de este mini-sitio personal, que utilizo principalmente para subir imágenes y publicar notas.

Fue programado desde cero con Symfony 2 (php) y jQuery (javascript + ajax). Utilizo también el ORM Doctrine, el motor de plantillas Twig y Swiftmailer -para el envío de mails de notificación-.

Tenía desde hace tiempo en el debe aprender esas tecnologías y la verdad que me dejaron muy satisfecho.

El sitio fue probado en Firefox, Chrome y Safari. En Internet Expĺorer ni siquiera me molesté en probarlo…

Son bienvenidos los comentarios y sugerencias! :)