miércoles, julio 24, 2013

Intel MPX: Extensiones de protección de memoria

(via reddit.programming) Intel acaba de presentar una serie de extensiones de protección de memoria que permita un uso más seguro de punteros en C y C++. Este conjunto de nuevas instrucciones permiten verificar si un acceso a memoria está dentro de un rango permitido protegiendo al programa de un posible buffer overflow.

Intel® MPX is designed to allow a system to run both Intel MPX enabled software and legacy software together. When executing software containing a mix of Intel MPX code and legacy code, the legacy code does not benefit from Intel MPX, but it also does not experience any change in functionality or performance. Performance of Intel MPX enabled code running on processors that do not support Intel MPX is similar to embedding NOPs in the instruction stream. Intel MPX is designed such that enabled applications can link with, call into, or be called from legacy software (libraries, etc.) while maintaining existing application binary interfaces (ABIs)

Las extensiones se pueden consultar en Intel® Architecture Instruction Set Extensions Programming Reference, concretamente en el capítulo 9 del mismo.

La idea de MPX es asociar rangos de direcciones válidas a los que pueden acceder un puntero determinado, siendo el hardware el encargado de verificar que cualquier acceso a dicho puntero está dentro del rango permito, intentando proteger al sistema de un buffer overflow. Por supuesto, hace falta compiladores y sistemas operativos que permitan usar estas nuevas extensiones. Lo que no me queda demasiado claro es que ocurre con un binario que tenga estas instrucciones y se intente ejecutar en un procesador que no tenga soporte para las mismas. De este párrafo creo entender que no debe de haber problemas en ejecutar un binario con estas instrucciones en un procesador que no soporte las mismas:

All Intel MPX instructions are NOP on processors that report CPUID.(EAX=07H, ECX=0H).EBX.MPX [bit 14] = 0, or if Intel MPX is not enabled by the operating system (see Section 9.3.3). Applications can selectively opt-in to use Intel MPX instructions.


Technorati Tags: ,

domingo, julio 21, 2013

VLC: De vuelta a la plataforma iOS

Ha vuelto a la plataforma iOS el magnífico reproductor multimedia VLC, el cual fue retirado de la misma por problemas de licencia hace dos años. Reescrito desde cero, de fuentes abiertas y licenciado de manera dual - Mozilla y GPL 2 o posterior - para ser compatible con los términos de la AppStore de Apple, permite reproducir una gran variedad de archivos multimedia. Se puede ejecutar en cualquier dispositivo que tenga la versión de iOS 5.1 en adelante. Funciona sin problemas en hardware tan antiguo como el iPhone 3GS o el iPad 1.

He tenido algún pequeño problema a la hora de reproducir algunos vídeos en el iPad 1, que se ha solucionado reiniciando la aplicación. Lo más interesante para mi - puesto que puedo reproducir vídeos en formato mp4 sin problemas con Quicktime en el iPad - es que soporta los ficheros de subtítulos en formato SubRip (srt).


Technorati Tags: ,

martes, julio 09, 2013

Desactivar IPv6 en Mac OS X desde la línea de comandos

Una de las características de Mac OS X que siempre más me ha gustado es la posibilidad de usar tanto la interfaz gráfica del sistema como diferentes utilidades la línea de comandos para la configuración y administración del mismo. Una de esas joyas desconocidas que permiten el control total de la configuración de red desde la línea de comandos es networksetup.

En Mac OS X , un servicio de red (network service) no es más que un conjunto de configuraciones de un puerto de red determinado (ethernet, wifi). Por ejemplo, se pueden tener varios servicios para el puerto ethernet en función de la localización donde se esté: casa, oficina, etc. networksetup permite la configuración y gestión de los servicios de red.

Se puede obtener la lista de servicios de red que hay en el sistema con ayuda del parámetro -listallnetworkservices

baldurgate:~ terron$networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Bluetooth DUN
Ethernet
FireWire
Wi-Fi
Bluetooth PAN
baldurgate:~ terron$

Con ayuda de la opción -getinfo se puede obtener información sobre una servicio de red determinado. Por ejemplo, para el servicio de Wi-Fi:

baldurgate:~ terron$ networksetup -getinfo Wi-Fi
DHCP Configuration
IP address: 192.168.x.x
Subnet mask: 255.255.x.x
Router: 192.168.x.x
Client ID: 
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Wi-Fi ID:  XX:XX:XX:XX:XX:XX 

Puede verse como está activado el soporte de IPv6 en modo automático.

Para desactivar IPv6 en cualquier servicio, se usa el parámetro -setv6off seguido del nombre del mismo:

networksetup -setv6off Ethernet
networksetup -setv6off Wi-Fi

Para que el sistema pueda realizar cambios en las bases de datos que almacenan la configuración de red, se debe estar autentificado con un usuario que tenga privilegios de admin o root. En caso de que no sea así, el sistema nos presentará un cuadro de diálogo para que se introduzcan las credenciales de un usuario con dichos privilegios.


Technorati Tags:

viernes, junio 28, 2013

Notas rápidas de la instalación de Apache Cassandra en MacOS X

Cassandra es una base de datos NoSQL diseñada para trabajar de manera distribuida y manejar grandes cantidades de datos. Su diseño tolerante a fallos y la escalabilidad son dos de sus puntos fuertes.

Los requisitos necesarios para poder instalar este programa en MacOS X son los siguientes:

  • Una cuenta de usuario sobre la cual se va a ejecutar. En este caso,se va a suponer que existe una cuenta de usuario estándar, sin privilegios especiales llamada cassadmin
  • Tener instalada el Java Runtime Enviroment en MacOS X. Normalmente,se ha usado el que suministra Apple1 (al menos en Mac OS X Lion que es donde se han hecho las pruebas). Se puede comprobar que versión se tiene del JRE con la siguiente orden:
    swordcoast:~ terron$ java -version
    java version "1.6.0_51"
    Java(TM) SE Runtime Environment (build 1.6.0_51-b11-456-11M4508)
    Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-456, mixed mode)
    
  • Tener la posibilidad de bloquear en RAM la suficiente cantidad de memoria sin que su contenido sea paginado por el sistema. Los sistemas operativos actuales utilizan un espacio de direcciones virtuales, paginando a disco páginas cuando necesitan liberar RAM para otros procesos. Se le puede indicar al sistema que ciertas regiones de memoria no puedan paginarse y estén siempre en RAM. Sin embargo, para evitar abusos, esta cantidad suele estar limitada. Puede comprobarse su valor en la shell bash con la orden ulimit:
    swordcoast:~ terron$ ulimit -l
    unlimited
    
    En MacOS X esta cantidad no está limitada, sin embargo, en otros sistemas si. Por ejemplo, en Debian está limitado a 64 Kbytes. En este caso sería necesario añadir un fichero que modificara el comportamiento del usuario que utiliza Cassandra para ejecutarse para que pueda bloquear toda la memoria que quiera.
  • Tener instalado Java Native Access, una serie de clases Java, que permiten el acceso sencillo a librerías dinámicas del sistema sin necesidad de usar JNI. Estas clases Java pueden bajarse empaquetadas en un fichero jar desde jna, el repositorio
  • . En este caso se ha usado la versión 3.5.2, compuesta por los ficheros jna-3.5.2jar (sha1 f1bf9fe267e17c1a8f7d1aa2c985e7fe81a06da6 ) y platform-3.5.2.jar (sha1 beac07d13858ef3697ceeab43897d70aeb5113c9 )
  • La versión binaria de Cassandra, bajada de la página del proyecto. En este caso se ha usado el fichero apache-cassandra-1.2.6-bin.tar.gz (sha1 25b9c63eb33c3ce483390e6edab4a5d1bb95eb4c ). En este caso existe una firma GPG que se puede verificar (keyid 2B5C1B00)

Una vez que se ha descargado todo el software, se va al directorio raíz del usuario que va a ejecutar Cassandra (se va a suponer que es /Users/cassadmin) s para crear la estructura de directorios que utiliza se va a usar y descomprimir el software:

cd /Users/cassadmin
mkdir -p logs/cassandra
mkdir -p lib/cassandra/{data,commitlog,saved_caches}
tar zxvf apache-cassandra-1.2.6-bin.tar.gz
ln -s apache-cassandra-1.2.6 cassandra
cp jna-3.5.2.jar platform-3.5.2.jar cassandra/lib/

  • El directorio donde se va a guardar los ficheros de logs que genere la base de datos será /Users/cassadmin/logs/cassandra
  • El directorio donde se va a almacenar los datos y que utilizará para trabajar la base de datos será /Users/cassadmin/lib/cassandra. La sintaxis empleada funciona con la shell bash.
  • El enlace simbólico se crea para hacer más sencillo el uso de varias versiones del producto.
  • Se copian los ficheros de clases del JNA al directorio lib de cassandra para que el sistema pueda encontrarlos.

Configurar la base de datos para que utilice la estructura de directorios que se ha creado. Se edita el fichero /Users/cassadmin/cassandra/conf/cassandra.yaml y se cambian los siguientes parámetros para usar la estructura de directorios creada

data_file_directories:
- /Users/cassadmin/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
data_file_directories:
- /Users/cassadmin/lib/cassandra/data
# commit log
commitlog_directory: /Users/cassadmin/lib/cassandra/commitlog
saved_caches_directory: /Users/cassadmin/lib/cassandra/saved_caches

Configurar el log4j para que almacene los registros en el directorios que interesa. Para ello se editar el fichero /Users/cassadmin/tmp/cassandra/conf/log4j-server.properties para modificar la propiedad que apunta al fichero de registro del sistema:

log4j.appender.R.File=/Users/cassadmin/log/cassandra/system.log

Por último se arranca el programa con la orden:

cassandra/bin/cassandra -f
Este último comando supone que estamos en el directorio $HOME del usuario cassadmin. El parámetro -f hace que el programa permanezca en primer plano para poder ver los errores que genere al escribir los mismos a la consola.

Notas

  1. Se puede bajar la versión que interese utilizar del Java Runtime Enviroment (JRE) desde Java.com. Ajustando las variables PATH y JAVA_HOME se puede seleccionar la versión del JRE a usar de las instaladas.

Technorati Tags: ,,

jueves, junio 27, 2013

De móviles en frigoríficos y otras hierbas

Esta tarde me ha llamado la atención las noticias en la prensa donde se relata como, Edward Snowden - perseguido por EEUU por filtrar a la prensa que los estados espían las comunicaciones -, tuvo una reunión secreta donde insistió que sus asesores introdujeran los móviles en un frigorífico. La idea es crear una Jaula de Faraday, la cual impide la recepción y emisión de ondas electromagnéticas.

Este hecho me resulta curioso, quizás porque la manera más sencilla de crear dicha jaula es la de envolver el móvil en papel de aluminio. Cualquiera puede hacer este experimento en su casa para ver el efecto. Pero lo que me sorprende de todo esto es que si fueron con los móviles encendidos hasta la reunión con Snowden no habrán tenido ningún problema en localizarle por triangulación. Me explico:

Aunque tengo los recuerdos borrosos y no tengo el Transmisión por Radio de Hernando Rábanos a mano, el GSM utiliza células con diferentes frecuencias asociadas en racimos. El tamaño de las células depende del tráfico que tienen que soportar, siendo más pequeñas en ciudades donde tienen que dar servicios a muchos terminales móviles. Creo recordar que el diámetro de dichas células podía rondar los quinientos metros. Un móvil en una ciudad puede recibir información de varias estaciones base a la vez, y éstas captar la señal que radia el móvil - decir que el tamaño mayor de una célula de GSM recuerdo que estaba entorno a los 30 km -. Las estaciones base tienen el hardware suficiente para poder saber qué teléfono móvil está radiando - recordar, todos tiene un IMEI único - , en que dirección y con qué potencia. A nada que envíen esos datos - y he visto centrales de tránsito de telefónica hacerlo de manera instantánea - tendrán localizado al sujeto en cuestión con una precisión de decenas de metros (más en localización GSM)


Technorati Tags: