miércoles, diciembre 31, 2008

Fin de año 2008

Terminó el año marcado por la crisis económica cuyo origen ha sido la bestial expansión de crédito, la primera crisis de la cual hemos podido disponer de información casi en tiempo real gracias a Internet. En Internet, me ha llamado la atención la cantidad de intentos cada vez más claras por parte de los gobiernos de países democráticos de poner coto a la información que circula por Internet y sobre todo en España como la SGAE ha hecho valer su apoyo al actual gobierno y ha sido recompensada con ello.

Hemos seguido descubriendo rincones de España que merecen muchísimo la pena (Gredos, Picos de Europa), por encima de las estupideces de las diecisiete taifas autonómicas que tenemos que soportar.

Espero que este año 2009 sea mejor que el que ha pasado y que haya salud para todos. Me gustaría extenderme más, pero casi es hora de ponerme a cenar. Disfrutar de la noche en compañía de toda vuestra gente.

viernes, diciembre 26, 2008

Ficheros de registro de Snort Unified 2, segunda parte

Continúo con las notas sobre el uso de ficheros de registro Unified 2 con Snort. Para poder analizar los ficheros, lo más simple es configurar Snort para que genere los dos tipos de registro: Uno, las alertas, un fichero en texto plano que puede leerse fácilmente y que nos va a servir de referencia para analizar el formato binario Unified 2, que es el segundo tipo de registro que se va a generar.

La configuración de Snort que voy a usar es la siguiente:

  1. El programa se ejecutará con el uid y gid del usuario snort de la máquina. Es necesario saber los valores numéricos de ambos y se obtienen fácilmente con:
    ibookdrizzt:~ terron$ id snort
    uid=504(snort) gid=504(snort) groups=504(snort)
  2. El directorio donde quiero que se almacenen los logs es /Users/snort/log
  3. Quiero generar ficheros de alertas y registros unified2
  4. Quiero que se capture como mínimo la MTU de una ethernet (1500 bytes)
  5. El fichero de reglas de Snort lo voy a descomprimir en /Users/snort
Con las condiciones anteriores, lo primero es bajarse la última versión de las reglas de Snort desde SourceFire1 y descomprimirlas dentro del directorio /Users/snort:
ibookdrizzt:~ snort$ tar zxvf snortrules-snapshot-2.8.tar.gz
El comando anterior generará un árbol de directorio cuya raíz es /Users/snort donde descomprimirá todos los ficheros de reglas y configuración de Snort.

Ahora hay que editar el fichero snort.conf,cuyo path completo si se ha seguido la configuración anterior será /Users/snort/etc/snort.conf. Este fichero hay que modificarlo de acuerdo con las reglas que se deseen usar, los diferentes módulos de detección que tiene Snort, las variables que definen cuales son las redes a analizar y los módulos encargados de escribir las alertas. Como mi idea de momento es usarlo en una instalación de ossim, he decidido dejar todas las reglas activadas. Con la configuración que quiero implementar las líneas que hay que añadir al fichero snort.conf son las siguientes:

config logdir: /Users/snort/log/
output alert_fast: alert.log
output unified2: filename snort.log,limit 64
config set_gid: 504
config set_uid: 504
config snaplen: 1500
La explicación de las líneas anteriores es la siguiente:
  1. Establecer el directorio donde se almacenan los registros de Snort en /Users/snort/log. Es importante que esta línea aparezca antes de la configuración de cualquier módulo de salida de registros, porque sino, Snort tomará la configuración que tenga por defecto o el valor que se le pase en la línea de comandos a través del parámetro -l.
  2. Se activa el módulo de salida que genera alertas en formato de texto y estas se almacenarán en el fichero alert.log. La ruta completa de este fichero será /Users/snort/log/alert.log
  3. Se activa el módulo de salida Unified2. El nombre del fichero que generará está especificado por el parámetro filename y será snort.log.timestamp, donde timestamp es una marca de tiempos que generará Snort cuando crea el fichero. Se limita el tamaño máximo del fichero a 64MB. Snort automáticamente creará un fichero nuevo cuando se alcance el tamaño máximo.
  4. Se establece el uid y el gid con el que se ejecutará Snort, en este caso 504 que son el uid y el gid que corresponde al usuario snort.
  5. Configuro la longitud de la captura a la MTU2 de la interfaz. Como se trata de una ethernet o una wifi, la establezco a 1500 bytes.
Una vez establecida la configuración, basta con ejecutar Snort:
ibookdrizzt:/Users/snort root# snort -i en1 -c /Users/snort/etc/snort.conf

En este caso la interfaz que está conectado a Internet es la en13, que recibirá el tráfico y lo analizará, y generará las diferentes alarmas y capturará los paquetes que las causan. Si vemos el directorio de registro:

alert.log
snort.log.1230070130
snort.log.1230071033

Vemos el fichero alert.log que almacena las alarmas en modo texto y los otros dos ficheros son binarios en formato Unified 2. Estos últimos son los que quiero analizar.


1Hay que registrarse para poder bajarse las reglas de Snort con Sourcefire. De manera gratuita, se puede bajar uno las reglas que están actualizadas con un mes de retraso respecto a la versión de pago, que se actualizan diariamente.
2Maximum transfer unit: la cantidad máxima de datos que puede transportar la capa de enlace
3En este caso se está ejecutando en MacOS X y la interfaz que se está usando es el airport (en1). En este caso está configurado con una IP para que todo el tráfico entrante del router ADSL se dirija al mismo. En otro artículo comentaré como debería hacerse esta configuración con los puertos de SPAN de un switch o con un router ADSL.

Technorati Tags:

jueves, diciembre 25, 2008

miércoles, diciembre 24, 2008

Un par de citas de Ludwig Von Mises

"Every boom must one day come to an end" (1928)

"The crisis from which we are now suffering is also the outcome of a credit expansion" (1931)

Curiosas, en especial la última: "La crisis que estamos sufriendo es una consecuencia de la expansión de crédito". Los analistas económicos y estudiosos de la materia tendrán que pensar si realmente el crédito puede estar creciendo hasta el infinito con los diferentes mecanismos financieros sin estar respaldado por el correspondiente crédito.

Techno rati Tags: ,

domingo, diciembre 21, 2008

Ficheros de registro de Snort Unified 2, primera parte

Hace algún tiempo estuve implicado con ossim añadiendo soporte para poder leer los ficheros de registro unified que genera Snort en los agentes para mandar la información al server de correlación. Ahora me gustaría modificar lo que hice para que sea capaz también de leer ficheros unified2, el nuevo formato que han implementado los autores de Snort para almacenar tanto alarmas como los flujos de datos de los paquetes que lo causan. Lo primero que he tenido que hacer es documentarme el formato, puesto que sólo hay información en el código fuente.

El nuevo formato no tiene cabeceras que identifiquen el fichero (como si ocurre en el formato unified), y que cada fichero no es más que un conjunto de eventos y los paquetes de datos asociados a lo mismos. Todos los DWORD (unit32_t) y WORD (uint16_t) son enteros de 4 y 2 bytes respectivamente big endian ("network byte order"). La estructura de un evento almacenado en el fichero es la siguiente:

  1. Una cabecera de dos palabras de 32 bits. El primer DWORD indica el tipo de registro y el segundo la longitud total del evento almacenado.
  2. Una estructura que dependerá del valor de campo tipo, y en su caso, de los datos del paquete. Tal como se recoge en la siguiente tabla:

#defineValorEstructura
UNIFIED2_PACKET2Unified2Packet
UNIFIED2_IDS_EVENT7Unified2Event
UNIFIED2_IDS_EVENT_IPV672Unified2Event6
UNIFIED2_IDS_EVENT_MPLS99Unified2Event_MPLS
UNIFIED2_IDS_EVENT_IPV6_MPLS100Unified2Event6_MPLS

En caso de estar grabando un paquete de datos (representado por la structura Unified2Packet),tras esta va los datos del paquete.

Estructuras C

Las estructuras C que representan los eventos están a continuación. Todos los campos tienen los bytes en network byte order (big endian). Las estructuras que representan eventos especial tienen varios campos comunes que se repiten en las estructuras que están en la siguiente tabla:

CampoTipoDescripción
sensor_idDWORDIdentifica el sensor que ha generado el evento.
event_idDWORDIdentificador del evento.
event_secondDWORDPara almacenar una marca temporal de la generación del evento.
event_microsecondDWORD
signature_idDWORDIdentifica a la regla de Snort que ha generado ele vento.
generador_idDWORDIdentifica el módulo de Snort que generado el eventos.
signature_revisionDWORDRevisión de la regla
classification_idDWORDIdentifica la clase a la que pertenece la alerta generada. Esto se configura en Snort a través de la sentencia config classification
priority_idDWORDIdentifica la prioridad de la regla que ha generado la alerta.

El resto de los campos de cada estructura son específicos de cada uno de los eventos.

Unified2RecordHeader
Esta estructura de datos está presente al principio de todos los eventos que se almacenan en el fichero. Su longitud es de 8 bytes.
typedef struct _Unified2RecordHeader
{
    uint32_t type;
    uint32_t length;
} Unified2RecordHeader;
Unified2Event
typedef struct _Unified2Event
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    uint32_t ip_source;
    uint32_t ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event
Unified2Packet
Esta estructura de datos tiene una particularida:Los últimos 4 bytes, representados po el campo packet_data se sobreescriben con los primeros del paquete de datos.
typedef struct _Unified2Packet
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t packet_second;
    uint32_t packet_microsecond;
    uint32_t linktype;
    uint32_t packet_length;
    uint8_t packet_data[4];
} Unified2Packet
Unified2Event6
typedef struct _Unified2Event6
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event6
Unified2Event6
typedef struct _Unified2Event6
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
} Unified2Event6
Unified2Event_MPLS
typedef struct _Unified2Event_MPLS {     uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    uint32_t ip_source;
    uint32_t ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
    uint32_t mpls_label;
} Unified2Event_MPLS;
Unified2Event6_MPLS
typedef struct _Unified2Event6_MPLS
{
    uint32_t sensor_id;
    uint32_t event_id;
    uint32_t event_second;
    uint32_t event_microsecond;
    uint32_t signature_id;
    uint32_t generator_id;
    uint32_t signature_revision;
    uint32_t classification_id;
    uint32_t priority_id;
    struct in6_addr ip_source;
    struct in6_addr ip_destination;
    uint16_t sport_itype;
    uint16_t dport_icode;
    uint8_t protocol;
    uint8_t packet_action;
    uint32_t mpls_label;
} Unified2Event6_MPLS

Referencias

  1. Snort
  2. Understanding Snort's Unified2 output

Technorati Tags:

jueves, diciembre 18, 2008

Notas sobre NAT en MacOS X (I)

Esta tarde he tenido que usar el NAT en MacOS X, y me he entretenido redactando algunas notas de como funciona. La pila TCP/IP y las utilidades de red que utiliza MacOS X derivan directamente de FreeBSD. El sistema de firewall es ipfw, y viene incluido y activado por defecto en MacOS X. El comando para controlar el firewall es ipfw. A diferencia de Linux, el proceso de NAT de los paquetes no se realiza en el kernel del sistema, sino en un proceso aparte denominado natd. A este proceso llegan los paquetes que se seleccionen a través de las reglas de ipfw y del mecanismo divert.

Activando la conexión a Internet compartida

La manera más sencilla de activar el NAT en MacOS X es usar la conexión compartida. Se ejecuta las preferencias del sistema, elegimos la opción de Compartir y se despliega el siguiente cuadro de diálogo:

compartir internet

En este cuadro de diálogo seleccionamos la interfaz que consideramos pública (en este caso será el Airport) y las interfaces de red que se van a compartir, cosa que se hace en el cuadro de diálogo de abajo. Una vez que se ha activado, pulsamos iniciar y se comienza a compartir las interfaces de red.

Veamos los cambios de configuración que ha realizado la GUI. En primer lugar, las reglas de firewall. Para ello desde una ventana de Terminal, ejecutamos la orden ipfw show.

00010  26221  16201955 divert 8668 ip from any to any via en1 02000 264607  23464758 allow ip from any to any via lo* 02010      0         0 deny ip from 127.0.0.0/8 to any in 02020      0         0 deny ip from any to 127.0.0.0/8 in 02030      0         0 deny ip from 224.0.0.0/3 to any in 02040      0         0 deny tcp from any to 224.0.0.0/3 in 02050 209103  38244907 allow tcp from any to any out 02060 333894 376385236 allow tcp from any to any established 02065      0         0 allow tcp from any to any frag 12190      3       192 deny tcp from any to any 65535   7662    912661 allow ip from any to any
Aparte, se habrá ejecutado un proceso, natd que será el encargado de traducir las direcciones. Podemos verlo ejecutando el comando:
ibookdrizzt:~ terron$ ps aux|grep natd root       372   0.0  0.0    27332    580  ??  Ss   12:14AM   0:00.43 /usr/sbin/natd -alias_address 192.168.1.33 -interface en1 ibookdrizzt:~ terron$ 

Lo que hace la primera regla del firewall, es dirigir todos los paquetes que lleguen a la interfaz en1 - el Airport - hacia el proceso natd, que será el encargado de traducir las direcciones, cambiando la origen con la que tenga la interfaz en1. Como puede verse el NAT se realiza en el momento de salida de los paquetes, tras decidir por cual interfaz va a salir.

Configurando el NAT de manera manual

La situación en la que quería usar el NAT es la que está representada en el siguiente esquema:

Tenemos un PowerMac G5 conectado a una red wireless cuyo punto de acceso es un router WIFI que me conecta a Internet. La red que se forma es una 192.168.1.0/24 y el Mac tiene asignado la dirección IP 192.168.1.100 (interfaz en1) . A la interfaz ethernet del Mac se crea una red ethernet con dirección IP asignada 192.168.2.1 (interfaz en0). Lo que quiero es que el Mac me haga NAT de las IP de la red 192.168.2.x y me las traduzca a una dirección IP en la red 192.168.1.x, a ser posible la misma que tiene asignada la interfaz wireless. Una implementación de un masquerading clásico.

El NAT se realiza en MacOS X justo antes de que el paquete abandone la interfaz de red. En el esquema anterior, los paquetes salen hacía Internet a través de la interfaz en1. Por tanto, se deberá configurar natd para que intercete los paquetes antes de salir y modifique la dirección origen del paquete y llegado el caso, el puerto origen. Hay que indicarle al kernel que pase los paquetes que coinciden. En nuestro caso, cualquier paquete que tenga dirección origen 192.168.2.0/24 hacia cualquier dirección. Usaremos ipfw para que el kernel nos pase los paquetes a través del mecanismo divert:

ipfw -f flush
ipfw add divert natd all from 192.168.2.0/24 to any via en1
Ojo, en caso de que ya existan reglas en el firewall, comentar que ipfw -f flush borraría todas las existentes. En este caso habría que ver donde insertarlas. Se puede consultar las reglas que ya están instaladas ejecutando la orden ipfw show.

Ahora habrá que ejecutar natd, el programa que se va a encargar de traducir las direcciones. La dirección IP a la cual se va a traducir recibe el nombre de alias. Este programa cuando se ejecuta, automáticamente pasa a background, con lo cual si se quiere depurar el tráfico de paquetes, se debe ejecutar con la opción -v. Puesto que queremos que se le traduzca todo lo que nos mande la regla de divert configurada anteriormente, teóricamente debería valer con:

/usr/sbin/natd -v -interface en1
Sin embargo, veremos que esto no funciona. ¿Por qué?. Porque aunque nos traduzca correctamente la dirección origen de cualquier paquete que salga con la dirección en el rango 192,.168.2.0/24, los que recibe el firewall no sabe que debe enviarlos de nuevo al proceso natd. Esto ocurre por la particular implementación que usa MacOS X y que deriva de FreeBSD, frente a la implementación de Linux toda realizada en el núcleo, y que tiene la correspondiente tabla de estados que permita saber que paquetes están nateados o qué paquetes tienen como origen la propia máquina que hace NAT.

La solución para mi situación es muy sencilla,puesto que tengo dos redes privadas que controlo y puedo usar direcciones en ellas sin problemas: Lo que hago es añadir una IP alias a la interfaz en1 que va a ser la que usen los paquetes nateados. Una regla de nuevo en el ipfw que haga que todo lo que llegue hasta esa IP sea dirigido hacia el natd y ya está. La configuración sería de la siguiente manera:

ifconfig en1 192.168.1.101 alias ipfw -f flush
ipfw add divert natd all from 192.168.2.0/24 to any via en1
ipfw add divert natd all from any to 192.168.1.101 via en1
natd -a 192.168.1.101

Problemas

La implementación de NAT que utiliza MacOS X no es lo que se puede decir muy eficiente. La necesidad de mover los paquetes desde el kernel a programas de modo usuario y posteriormente volverlos a pasar al kernel para su transmisión hace que sea más lento que implementaciones completas en kernel como la de Linux y su NetFilter.

El soporte de inspección de protocolos es muy limitado, sólo tiene soporte para FTP e IRC, estando el resto de protocolos que mandan información de direcciones dentro de los mismos no soportados - los famosos módulos de masquerading de Linux -.

Referencias

I have translate to english the post: Some notes about using de MacOS X NAT (Network address traslation), first part

Technorati Tags: , ,

miércoles, diciembre 17, 2008

La crisis económica, modelos y efecto multiplicador de la informática

John Stokes, habitual de Ars Technica, se despacha en Axioms, downturns, and a global (computer?) crash con la relación entre la actual crisis económica, los modelos que han usado los bancos para medir el riesgo de los agentes a los cuales concedían créditos y el factor de multiplicación que supone un mundo tan interconectado como el de hoy.

Hay dos visiones distintas: La primera es aquella de los que defienden que los modelos son correctos, pero que los datos con los que se han alimentado son erróneos (por ejemplo In Modeling Risk, the Human Factor Was Left Out, en el New York Times. La segunda visión, After the Crash: How Software Models Doomed the Markets, afirma que los modelos están pensados para unas condiciones de contorno concretas, y que cuando estas se alteran, ya no son válidos. En este caso ciertas suposiciones que se hacen para establecer los modelos económicos no serían válidos:

The software models in question estimate the level of financial risk of a portfolio for a set period at a certain confidence level. As Benoit Mandelbrot, the fractal pioneer who is a longtime critic of mainstream financial theory, wrote in Scientific American in 1999, established modeling techniques presume falsely that radically large market shifts are unlikely and that all price changes are statistically independent; today’s fluctuations have nothing to do with tomorrow’s—and one bank’s portfolio is unrelated to the next’s.
Esta nota hace referencia a uno de los mayores estudiosos de sistemas caóticos como es Benoit Mandelbrot. Reconozco que me gusta esta idea y entronca con mi visión más liberal de la economía donde agentes privados interaccionan entre sí y no se puede planificar las decisiones que toman.

Ahora, ¿qué pasa cuando se modela un sistema pensando que se cumplen esas restriciones siempre y se alimenta con datos para obtener un resultado determinado?. Pues que el resultado es indefinido puesto que nos hemos saltado las condiciones de contorno para las cuales el modelo fue creado. Sumémoles a esto la capacidad de proceso y velocidad de las redes de comunicaciones actuales y tendremos un sistema que utiliza un modelo para tomar decisiones económicas que está básicamente en un estado desconocido y que dado su interconexión está multiplicando la "basura" generada por un modelo que está actuando fuera de las condiciones de contorno para el que fue concebido. Lo que en informática se llama GIGO, Garbage In, Garbage out, que viene a resumir que un ordenador hace exactamente lo que tú le propones, y que si le metes basura como entrada, los datos que resulten de su proceso serán basura (primera visión) o si el modelo no funciona (segunda visión) seguiremos obteniendo información falsa.

Una de las cosas más interesantes de esta crisis es que está siendo casi televisada, en el sentido que la información fluye por el mundo casi en el mismo momento que se produce, llegando algunos, como Klaus Zimmermann presidente del instituto de estudios económicos DIW, a pedir que se dejen de hacer prediciones y no se publiquen (la referencia al final de esta noticia). Algún día alguien estudiará el efecto multiplicativo que ha tenido la información (o la falta de la misma) en esta crisis económica.

Technorati Tags: ,,

martes, diciembre 16, 2008

Google publica un libro sobre seguridad de navegadores We

(vía Securityfocus. Michal Zalewski, que ahora trabaja para Google, acaba de publicar un libro sobre la seguridad de los navegadores web más usados. Está dividido en tres partes:

La primera parte describe los navegadores webs, los estándares y protocolos sobre los que se contruyen y cómo están soportados en cada uno de los diferentes productos existentes.

La segunda parte muestra un resumen de los diferentes mecanismos que implementan los navegadores para proporcionar un entorno segurod de navegación, así como los defectos que se han detectado en los diseños.

La Tercera parte hace referencia a mecanismos de seguridad experimentales y mecanismos que se man tienen por compatibilidad.

Technorati Tags: ,,

lunes, diciembre 15, 2008

Google Native Client: Detalles de la implementación

Google se ha embarcado en un proyecto que permita ejecutar código nativo en un navegador web de manera segura. Esta idea no es nueva, Microsoft fue una de las primeras compañías que intentaron este camino a través de la tecnologia ActiveX. Sin embargo el mecanismo de seguridad basado en firmas y zonas de ejecución, no ha sido suficiente para evitar que haya sido uno de los vectores de ataques más usados contra sistemas que ejecutan Windows.

Los objetivos de Google es permitir un entorno de ejecución de módulos binarios x86 - aunque podrían portarlo a otras arquitecturas de microprocesador - que permitan aprovechar la potencia disponible en los microprocesadores actuales, que sea portable entre diferentes sistemas operativos y que sea seguro. Para poder interactuar con el resto del navegador existe un puente que comunica javascript con los módulos binarios.

Google crea un entorno aislado ("sandbox") donde se va a ejecutar los diferentes módulos, cada uno de los cuales está en un espacio de direcciones separados y que se comunican entre ellos a través de un mecanismo de procedimientos de llamada remoto (RPC). Se aísla el código que se ejecuta en el sandbox del sistema operativo, ofreciendo sólo una serie de servicios autorizados a llamar desde los ejecutables generados.

De la documentación que llevo leída, en especial de Native Client: A Sandbox for Portable, Untrusted x86 Native Code, la idea que me hago de la arquitectura que quiere implementar Google es la siguiente:

Arquitectura

Destacar en este caso el mecanismo de comunicación, denominado IMC e implementado en éste módulo de intercomunicación.

Para tener un entorno seguro se realiza un análisis estático del código que se ha generado: se busca detectar aquellas instrucciones peligrosas para el sistema y se fuerza a que el módulo ejecutable tenga una determinada estructura para evitar código automodificable e instrucciones superpuestas. Además utiliza los mecanismos de segmentación presente en la arquitectura x86 para evitar referencias a memoria fuera de los límites del proceso, y aislar el módulo binario de las librerias que el propio sistema mapea en memoria. La implementación de estos mecanismos de protección es lo que Google llama inner sandbox.

Native Client impone las siguientes restricciones a un módulo binario para que pueda ejecutarse en el entorno:

  1. El módulo binario una vez cargado en memoria es sólo de lectura.
  2. El módulo binario se linka empezando en la dirección de memoria cero y a partir de los 64kbytes empieza el código máquina generado por las herramientas.
  3. Las llamadas de control indirectas utilizan una secuencia especial de instrucciones.
  4. El binario ocupa páginas de memoria completa, rellenándose hasta el límite de las páginas, apareciendo al menos una instrucciones hlt.
  5. No puede contener instrucciones que sobrepasen 32 bytes de memoria.
  6. Todas las direcciones de las instrucciones válidas son alcanzables a través de un desemsablado que empieza en la dirección de carga.
  7. Todas los saltos directos tienen como destino instrucciones válidas e identificadas durante el análisis estático de código.
El análisis estático del código generado se implementa en la libreria native client verifier (ncv). Es el encargado de asegurarse que no existen instrucciones de carga o escritura de datos fuera de la memoria asignada, que el binario puede desemsablarse de manera exacta, no debe de existir direcciones inseguras y debe de existir integridad en el flujo del binario. La seguridad de esta parte del código es crítica, (y algún bug han descubierto ya)

El módulo tiene una particular disposición en memoria que permite atrapar aquellas referencias a punteros nulos (protege la primera página de la memoria asignada contra lectura y escritura). Los siguientes 60 Kb se utilizan para el código de los servicios de ejecución y el resto del espacio de direcciones se dedica al módulo.Todos los módulos binarios tienen como base la dirección cero y el código comienza a insertarse a partir de los 64 kbytes:

Mapa de memoria

Es interesante ver en acción uno de los mecanismos que tienen los procesadores x86 desde que existe el modo protegido: El uso de la segmentación para limitar el rango de memoria que puede accederse.Acostumbrados a modelos de memoria planos y de 4 GB, Google implementa con ayuda de la segmentación el modelo de memoria (ver nacl_ldt.c para el caso de Linux). Este mecanismo, no se puede usar en procesadores ejecutando código de 64 bits. La estructura que tendría una vez cargado el módulo en memoria sería la siguiente:

Las llamadas al sistema que se realizan desde el módulo binario se compara contra una lista blanca de llamadas permitidas. Esta validación formaría otra capa de protección que Google llam outer sandbox, donde se implementaría los servicios de ejecución. Están en service runtime.

Aparte el entorno de ejecución define un API que da acceso a los servicios que puede necesitar el módulo binario: gestión de memoria, gestión de hilos o primitivas de sincronización.

Referencias

  1. Google Native Client: Aplicaciones x86 en el navegador
  2. Native Client
  3. Native Client: A Sandbox for Portable, Untrusted x86 Native Code
  4. Safer than ActiveX: a look at Google's Native Client plugin
  5. Native Client:README
  6. Native Client: A Technology for Running Native Code on the Web

Technorati Tags: ,,

domingo, diciembre 14, 2008

El Tiemblo y alrededores

A pesar del mal tiempo, hemos aprovechado este sábado para irnos a comer a El Tiemblo, un pequeño pueblo de la provincia de Ávila, lindando casi con Madrid. Saliendo de Madrid por la M-501, hasta San Martín de Valdeiglesias. Una vez allí, salimos del pueblo para tomar la N-403 con dirección a Ávila. A los pocos kilómetros del pueblo, tomamos un cruce a la izquierda, donde un kilómetro más adelante están los los Toros de Guisando. Son esculturas de origen vetón, datadas entre el siglo II y I antes de Cristo y que representan a ganado bobino. Aquí se firmó el Tratado de los Toros de Guisando donde Enrique IV de Castilla proclamaba a su hermana Isabel I de Castilla como Princesa de Asturias y heredera del trono.

A pesar del tiempo de perros que hacía, pudimos sacar algunas fotos del grupo escultórico:

Toros de Guisando

Volvemos a la N-401 y entramos en el pueblo del Tiemblo. Justo en la rotonda de entrada - donde están unas estatuas que representan a los toros de guisando -, seguimos a la señalización que nos lleva hasta hacía el Castañar del Tiemblo. Al comienzo la carretera está asfaltada, aunque es estrecha, llegamos hasta una zona habilitada como parking. De aquí parte una pista de tierra, por la cual se puede circular con un coche sin problemas, que sube hasta un merendero. De éste merendero parte una senda de montaña que lleva hasta el pozo de nieve, una construcción donde se almacenaba nieve en invierno para posteriormente venderla en verano.

El bosque, con las sendas que parten hacía el pozo de nieve

La ventisca hacía aconsejable darse la vuelta, y bajar de nuevo. Llegado al cruce de la zona de aparcamiento del Castañar nos empezó a caer aguanieve, y decidimos continuar ya hacía el Tiemblo, para comer. Nos fuimos a comer a Casa Mariano, famoso por la abundancia de sus platos. Nos dimos un buen homenaje a base de chuletón y cochinillo.

Después de una agradable sobremesa, decidimos volver a Madrid, pero esta vez lo hicimos a través de El Escorial. Saliendo de El Tiemblo, fuimos hacía San Martín de Valdeiglesias por la N-403. Una vez allí, tomamos la M-501 con dirección a Madrid hasta llegar al cruce con dirección hacía Robledo de Chavela. Ya comienzan a verse las espectaculares antenas de la Madrid Deep Space Communication complexa, parte la red de antenas de espacio profundo de la NASA, desde donde se controlan misiones como las de la Voyager.

Llegamos a Robledo de Chavela, toda la zona estaba nevada. Comenzamos a subir el Puerto de la Cruz Verde. Por la zona de Robledo de Chavela no estaba demasiado nevado, pero al coronar y empezar a bajar hacia El Escorial, la vertiente estaba totalmente nevada. La carretera estaba despejada por las máquinas quitanieves, pero aún así había que ser prudentes. Llegamos al Escorial y ya tomamos la carretera hacía la A-6, y rumbo a Madrid.

Technorati Tags: ,

martes, diciembre 09, 2008

Organizaciones de artistas canadienses piden una tasa sobre Internet y obligatoriedad de contenidos

(víaz Slashdot) Las asociaciones de autores ACTRA y SOCAN, que agrupan a autores del mundo del cine y de la música acaban de pedir una nueva serie de regulaciones para Internet para promover la cultura canadiense y la nueva creación. El mismo tipo de excusas que usa aquí la SGAE para justificar el canon digital. Pero aún hay más: intentan imponer que el 51% del contenido de las webs comerciales canadienses sea de origen canadiense. Recuerda mucho a la imposición que existe en España que las TV privadas de financiar con un tanto por cierto de sus beneficios a cine español - el cual no suele estar caracterizado por su éxito comercial -.

Technorati Tags: ,

sábado, diciembre 06, 2008

Más motivos para cerrar las cadenas públicas de televisión

No es ningún secreto que opino que las cadenas públicas de televisión están mejor cerradas que gastando dinero del presupuesto público. Hoy hay una noticia en el Confidencial, Ofensiva de Rubalcaba contra Luis Fernández, que refuerza aún más esa opinión. Según la noticia, al ministro del interior, Alfredo Pérez Rubalcaba, no le ha hecho mucha gracia ciertas informaciones que ha emitido RTVE, y ha pedido el cese de su presidente. Destaco los siguiente:
En conversaciones con miembros de la Ejecutiva socialista Rubalcaba acostumbra a recordar una anécdota del traspaso de poder con Francisco Álvarez Cascos, cuando éste le anunció que el gobierno del PP se proponía privatizar TVE y Rubalcaba le respondió "ya veréis cuando pasen unos cuantos meses como le cogéis gusto a la caja tonta y se os olvidan esas ideas de la privatización"
Para que todo el mundo tenga claro porqué quieren los políticos las diferentes cadenas sufragadas con el bolsillo del contribuyente: simplemente sirven para hacer propaganda de los políticos de los cuales depende su presupuesto. Y para eso, mejor cerradas, que para eso hay ya bastantes cadenas de TV y radios que no depende de los presupuestos generales del estado, y sobre todo, tenemos Internet.

Technorati Tags:

Autozone: Gestión de memoria autonámica en MacOS X

Una de las novedades de Objective-C 2.0 es la posibilidad de gestionar la memoria través de un recoletor de basura (garbage collector) que se encarga de analizar la memoria buscando objetos que ya no están referenciados para liberar la memoria que están usando. Se llama Autozone y el código fuente está disponible con una licencia de tipo Apache.

En Objective C se (autorelease pools aparte) crean objetos de esta manera:

MyClass *c = [[Myclass alloc] init];
MyClass *ref;
...
ref=[OtroObjecto myclass];
[ref retain];
...
[c release];
[ref release];

El mecanismo de gestión de memoria en las anteriores versiones de Objetive C estaba basado en una cuenta del número de referencias que tiene hacia el objeto. Cuando se crea el objeto tiene una sola referencia. Si se le manda el mensaje retain la cuenta de referencias aumenta en uno, mientras que si se le manda el mensaje release la cuenta de referencias disminuye en uno. Cuando ésta llega a cero el sistema libera la memoria asignada al objeto. Hasta ahora, toda esta gestión hay que realizarla manualmente teniendo cuidado para evitar que se pierda la cuenta, porque sino tendríamos una pérdida de memoria.

Para facilitar la labor a los programadores Apple ha decidido implementar un recoletor de basura que facilite el trabajo a los programadores y no tengan que llevar la cuenta de referencias de los distintos objetos que se van creando y los que nos devuelve el sistema. Esta librería está escrita en C++ y según la documentación está pensado para usarlo en un entorno de ejecución donde parte de la memoria puede estar manejada por mecanismos distintos de los que ofrece Autozone.

La implementación ejecuta un hilo que va analizando la memoria, viendo la cuenta de referencias que tienen los objetos y construyendo un grafo que representa las relaciones entre los objetos que el programa ha creado. Si hay objetos aislados, significa que no existen referencias a los mismos por parte de otros objetos, y por tanto puede liberarse la memoria que utilizan.

Hay un hilo que está continuamente analizando las regiones de memoria. De esta manera se evita bloquear la ejecución de otros hilos mientras se analiza la memoria buscando objetos que no estén referenciados por otros.

Lo malo, es que no hay documentación que explique porqué está implementado la gestión de memoria de esta manera.

Referencias

Technorati Tags: ,

viernes, diciembre 05, 2008

Novedades de Google

Consultando el blog oficial de Gmail he visto un par de noticias que me han interesado:

Sincronizar Google Calendar a través de Caldav

Gracias al soporte de CalDAV ahora se puede sincronizar los calendarios locales con Google Calendar. Han creado también varios programas para poder sincronizar con Outlook - a través de un plugin -, las Blackberry y otros dispositivos móviles. Puede ser útil si se tiene varios ordenadores y se quiere sincronizar entre ellos, aunque como siempre, dejaremos más información nuestra en manos de Google :). Toda la información en Syncing your Google Calendar. El soporte de CalDAV está disponible en la MacOS X 10.5 Leopard y en SunBird

Soporte de Gmail en Google Desktop

Han desarrollado un Gmail on your Google Desktop, un applet para la barra de tareas, para poder leer el correo que tiene en Gmail sin necesidad de tener abierto un navegador. El complemento se llama gmailgadger y está disponible.

Technorati Tags: ,

jueves, diciembre 04, 2008

Representación gráfica de expresiones regulares

(vía reddit.programming). Supongamos que tenemos una expresión regular complicada y queremos visualizar gráficamente como se comportará. Una posible solución es recurrir a strfriend. Por ejemplo, si se quiere representar una expresión regular que matchee con un entero, [-+]?(?:0|[1-9][0-9]*) genera el siguiente gráfico:

Regex

De los comentarios de la entrada en Reddit encontré la referencia a expresión regular necesaria para validar una dirección de correo electrónico RFC 822. Sólo tiene 83 líneas y 6509 caracteres. Y aún así el motor regex de Perl es capaz de comérsela, aunque supera con creces lo que es lógico y mantenible hacer a través de expresiones regulares.

Technorati Tags: