Check the presence of the OpenSSL's bug Heartbleed (CVE-2014-0160)

What is it?

The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. This weakness allows stealing the information protected, under normal conditions, by the SSL/TLS encryption used to secure the Internet. SSL/TLS provides communication security and privacy over the Internet for applications such as web, email, instant messaging (IM) and some virtual private networks (VPNs).

The Heartbleed bug allows anyone on the Internet to read the memory of the systems protected by the vulnerable versions of the OpenSSL software. This compromises the secret keys used to identify the service providers and to encrypt the traffic, the names and passwords of the users and the actual content. This allows attackers to eavesdrop on communications, steal data directly from the services and users and to impersonate services and users.

What leaks in practice?

We have tested some of our own services from attacker’s perspective. We attacked ourselves from outside, without leaving a trace. Without using any privileged information or credentials we were able steal from ourselves the secret keys used for our X.509 certificates, user names and passwords, instant messages, emails and business critical documents and communication.

How to stop the leak?

As long as the vulnerable version of OpenSSL is in use it can be abused. Fixed OpenSSL has been released and now it has to be deployed. Operating system vendors and distribution, appliance vendors, independent software vendors have to adopt the fix and notify their users. Service providers and users have to install the fix as it becomes available for the operating systems, networked appliances and software they use.

How to check if my server (https) or application (linked with OpenSSL library) has it?

For your web server Heartbleed test site and specify the hostname (or IP address) and port of your HTTPS server

For your Android’s mobile apps, install Bluebox Heartbleed Scanner and run it, it will check for any vulnerable apps installed on your phone.

Resources

Permisos de archivos/directorios incorrectos para el servidor de páginas en GNU/Linux

Introducción

El problema mas común que impide que se pueda acceder correctamente a un sitio o aplicación web que se está instalando o desarrollando es que los archivos y directorios no cuenten con los permisos de acceso apropiados para que el servidor de páginas (Apache por ejemplo) pueda accederlos correctamente.  En estos casos se obtiene un mensaje de error similar al  mostrado a continuación.

failed to open stream: Permission denied in /ruta/al/proyecto/index.php on line xx

La solución

En términos generales, los directorios deben contar con permisos 755 (drwxr-xr-x) y los archivos -como .php- 644 (-rw-r–r–).  Esta modificación puede realizarse de manera recursiva aprovechando la flexibilidad del comando find de la siguiente manera.

$ find /ruta/al/proyecto -type d -exec chmod 755 {} ;
$ find /ruta/al/proyecto -type f -exec chmod 644 {} ;

Inclusive es posible establecer filtros a los nombres de los recursos actualizados para mayor precisión en el cambio.

$ find /ruta/al/proyecto -type f -name '*.php' -exec chmod 644 {} ;

Instalación de NodeJS en GNU/Linux Ubuntu/Mint

Introducción

NodeJS es  una plataforma de desarrollo de alta escalabilidad para aplicaciones en red basada en un único hilo de ejecución, una arquitectura orientada a eventos y un manejo asíncrono de E/S.  Esta plataforma se programa utilizando Javascript del lado del servidor.

En el presente artículo se describen los pasos realizados para su instalación siguiendo dos estrategias diferentes.

Instalación

Utilizando el gestor de paquetes

En este caso la instalación es mas rápida y sencilla ya que el gestor de paquetes, apt/aptitude en este caso, se hace cargo de la descarga e instalación del software y sus dependencias.

Utilizando los repositorios por defecto

Los repositorios incluídos por defecto con el sistema operativo permiten instalar a NodeJS sin embargo no en su versión mas reciente sino un par de números atrasada.

Versión de NodeJS disponible en los repositorios de Ubuntu
Versión de NodeJS disponible en los repositorios de Ubuntu

Para realizar su instalación se debe ejeuctar el siguiente comando.

$ sudo aptitude install nodejs

Utilizando los repositorios del proyecto

Este método permite actualizar los repositorios del sistema operativo con el repositorio oficial del proyecto de donde se podrán descargar versiones mas recientes.  Para hacer esto se deben ejecutar los siguientes comandos.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update

Versión de NodeJS disponible en los repositorios del proyecto
Versión de NodeJS disponible en los repositorios del proyecto

Una vez incluído el nuevo repositorio se procede a instalar el paquete normalmente.

$ sudo aptitude install nodejs

Desde el código fuente

Este método permite compilar una distribución de NodeJS para la versión específica del sistema operativo que se está utilizando.  Esto requiere que se cuente con el soporte requerido de las herramientas de desarrollo y dependencias necesarias para construír el proyecto.

Descargar el código fuente de la última versión disponible (la 0.6.7 en este caso) desde la siguiente ubicación.

http://nodejs.org/#download

$ wget http://nodejs.org/dist/v0.6.7/node-v0.6.7.tar.gz

$ tar zxvf node-v0.6.7.tar.gz $ cd node-v0.6.7/

$ ./configure --prefix=/home/jimezam/nodejs/0.6.7

Aviso!  Si desea instalar NodeJS en una ubicación central haciéndolo disponible para todos los usuarios del sistema operativo, omita el parámetro –prefix de la ejecución anterior, de lo contrario ajuste su ruta según la ubicación específica donde desee instalarlo.

Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok  
Checking for program gcc or cc           : /usr/bin/gcc
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for gcc                         : ok  
Checking for library dl                  : yes
Checking for openssl                     : yes
Checking for library util                : yes
Checking for library rt                  : yes
Checking for fdatasync(2) with c++       : yes
‘configure’ finished successfully (0.776s)

El siguiente paso consiste en construír la distribución compilando su código fuente.

$ make

Y finalmente se debe instalar la distribución recién construída en la ubicación elegida.

$ make install

Aviso!  Si se eligió instalar NodeJS en una ubicación central, la ejecución del comando anterior deberá ser hecha por el usuario root de la siguiente manera: sudo make install.

Actualizar el PATH para que incluya la ubicación de las herramientas de NodeJS recién instaladas.  Realizar esta modificación en el .bash_profile/.bashrc del usuario o /etc/profile para tener un alcance global y garantizar que esta modificación persista cada vez que se inicia la máquina.

$ PATH=/home/jimezam/nodejs/0.6.7/bin:$PATH

Si el ajuste fue exitoso la aplicación node ya podrá ser accedida directamente desde la línea de comando.

$ which node

/home/jimezam/nodejs/0.6.7/bin/node

Prueba de funcionamiento: Hola Mundo NodeJS!

Crear el siguiente archivo de código Javascript para crear un servicio extremadamente simple que responda “Hola Mundo” ante las peticiones web de los clientes a través de navegadores.

$ vi prueba.js

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hola Mundo NodeJS!n');
}).listen(7777, '127.0.0.1');

console.log('Servidor ejecutándose en http://127.0.0.1:7777');

Para iniciar el servicio se debe invocar el comando node de la siguiente manera.

$ node prueba.js

Servidor ejecutándose en http://127.0.0.1:7777

Desde un navegador web acceder a la dirección mencionada.

Hola Mundo consultándose desde NodeJS
Hola Mundo consultándose desde NodeJS

 

Enlaces

Experimentando con jQuery Mobile: The Simple List 0.1

Introducción.

Después de experimentar con jQTouch durante la implementación de un prototipo de aplicación para el 6CCC, me ha tomado unas cuantas horas para elaborar un nuevo prototipo de aplicación web móvil, esta vez utilizando jQuery Mobile como framework para el nivel de presentación.

Su uso es muy similar al visto anteriormente, sin embargo considero que este proyecto cuenta con mejor documentación que el primero.  Ambos se basan en la mejora progresiva (Progresive Enhancement) y en la degradación aceptable (Graceful degradation) lo que los hace fáciles de entender por parte de los desarrolladores que estén habituados al uso de HTML/CSS/Javascript.

El prototipo.

Esta aplicación permite administrar una lista simple de elementos al estilo de las cosas por hacer.  La idea con este prototipo es el experimentar el uso del framework jQuery Mobile.

Para la persistencia se utiliza la facilidad del LocalStorage provisto por HTML5 y que es soportado por los navegadores web modernos incluyendo los incorporados en los sistemas operativos de los dispositivos móviles.

Estas son a grandes razgos las funcionalidades y flujos de información del prototipo.

The Simple List 0.1
The Simple List 0.1

 

Estas son algunas de las pantallas (page) de la aplicación web.

El prototipo puede probarse en línea a través de la web (ver sección de enlaces) y ya que su código fuente se encuentra completamente documentado, servirá también como ejemplo práctico para quienes estén interesados en aprender a desarrollar utilizando este framework web.

Enlaces.

Charla "Mercadeo en la era de la web 2.0"

Gracias a la invitación que me extendió la facultad de Comunicación Social y Periodismo de la Universidad del Quindío, el de hoy en horas de la tarde (6:30 pm.) estaré dictando una charla muy interesante acerca de las implicaciones de las tecnologías y el nuevo modo de pensar de las personas que trajo la llegada de la Web 2.0 a principios de este siglo.  El objetivo principal de la charla es unificar conceptos y plantar las bases de la necesidad y las posibilidades que tiene una empresa establecer su presencia en Internet.  Están cordialmente invitados todos quienes puedan asistir.

Invitación a la charla

He publicado la presentación que voy a utilizar bajo la licencia CreativeCommons Attribution-NonCommercial-ShareAlike 3.0 Unported License y puede ser consultada a continuación.

Aplicación para el 6CCC: cómo llego ? Version web móvil

Introducción.

Otro prototipo que estuve preparando para el sexto Congreso Colombiano de Computación fue una aplicación web móvil basada en jQTouch para facilitarle a los visitantes consultar fácilmente la agenda de las conferencias y obtener la ruta que se deberá recorrer para llegar a los lugares del evento o demás sitios de interés de la ciudad.

El prototipo.

  • Como se mencionó, se desarrolló utilizando jQTouch el cual es un plugin de jQuery por ende, la mayor parte de la aplicación se encuentra desarrollada en Javascript.
  • La estructura de la información se encuentra implementada en HTML5 (sin validar aún).
  • Se utilizó el servicio de mapas y rutas de Bing Maps ya que según los requerimientos de esta aplicación Bing cuenta con mejor información de Colombia que los demás proveedores.
  • La aplicación realiza la geocodificación de la ubicación del usuario, intentando identificar la dirección en que se encuentra.
  • También permite realizar la geocodificación inversa (de dirección a posición geográfica) según solicitud del usuario.  En este caso parece que la calidad del servicio de Bing es inferior a la de Google y valdría la pena cambiar al proveedor de este servicio específico.
  • Por restricciones de seguridad de los navegadores web modernos, es necesario que el usuario autorice el acceso al GPS por parte de la aplicación web.  Si esto no se realiza, la aplicación no podrá contar con la posición del usuario en la ciudad.
  • Para la demostración se manipuló el código de la aplicación para que en el momento de trazar una ruta siempre se tome una ubicación en Manizales (Caldas) como posición del usuario y permitir así experimentar con esta funcionalidad del prototipo.

Conclusiones.

  • Por falta de tiempo no pudo hacerse pública la aplicación web móvil ya que no fue posible realizar suficientes pruebas con dispositivos móviles reales.
  • Es necesario investigar mas acerca de jQTouch para utilizarlo en aplicaciones reales en producción.  Hasta el momento me parece una opción muy interesante para el desarrollo fácil de aplicaciones web móviles sin embargo hasta el momento no he encontrado buena documentación al respecto.
  • La mayor parte del prototipo se encuentra lista, espero en un futuro cercano realizar mayores pruebas y ajustes para publicarlo como una versión final.

Enlaces.

Aplicación para el 6CCC: nuevo estilo para la programación

Introducción.

Esta es una aplicación muy sencilla que se desarrolló en PHP para el sexto Congreso Colombiano de Computación.  Todo comenzó cuando no me resultó cómoda la manera como el sitio web desplegaba la programación del evento: por bloques de auditorios siendo las filas conferencias y las columnas los días de las mismas.

Programación del 6CCC (versión original)
Programación del 6CCC (versión original)

Este estilo de presentación no es conveniente ya que no me permite visualizar fácilmente que conferencias se están realizando en un momento dado para poder decidir a cual de ellas asisto, es decir, el estilo idóneo de presentación de las conferencias debería ser en el que cada bloque representa un día del evento, cada fila un rango de tiempo específico y cada columna un auditorio donde se estén realizando las conferencias.  De esta manera, una vez ubicado el rango de tiempo que se desea consultar sólo será necesario revisar las columnas para determinar las conferencias a las que se puede asistir.

Ya que manipular manualmente esta información  para poder determinar cuales eran las conferencias que quería ver era demasiado engorroso decidi implementar una solución computacional muy simple.  Inicialmente la iba a desarrollar en Javascript por completo manipulando el árbol DOM pero me dí cuenta que podría serle de utilidad a otras personas también y preferí no sobrecargar al navegador del cliente con las operaciones de transformación del contenido del programa.  El resultado final fue el siguiente.

 

Programación del 6CCC (versión mejorada)
Programación del 6CCC (versión mejorada)

El prototipo.

Las premisas eran las siguientes.

  • No sobrecargar al cliente con cálculos en Javascript para facilitar la consulta desde móviles.
  • No requerir que se ingrese la información de la programación nuevamente, se debería tomar de la programación existente directamente.
  • Actualizarse automáticamente a la par de la programación original (esta última debería respetar su estructura HTML).
  • Facilitar la lectura de la información.
  • Facilitar la consulta de las conferencias presentándose en un momento específico del día y cuales se están presentando en este mismo momento.
  • Permitir la personalización de la presentación (esto se obtuvo mediante la implementación de una vista independiente de la lógica de procesamiento y de clases CSS).

El prototipo se implementó en PHP sin ningún tipo de framework especializado y utilizando la técnica de web scraping para obtener directamente la información de la página web original de la programación, de ahí que fuera necesario que esta respetara su estructura HTML durante las actualizaciones.  Para esto se utilizó la librería phpQuery la cual permite entre otras cosas obtener secciones de código HTML mediante rutas de selectores CSS de manera similar a jQuery.

Conclusiones.

  • El uso de phpQuery para las necesidades del prototipo no fue tan simple ni intuitivo como lo es el uso de jQuery, sin embargo una vez entendida su implementación, permitió desarrollar la funcionalidad necesaria.
  • La programación original contaba con múltiples inconsistencias: diferentes formatos de fecha, la presencia de un día adicional en la programación general, la presencia de las temáticas generales de los bloques de conferencias en el mismo contenido de las conferencias, conferencias sin hora específica y, filas y columnas vacías para generar espacios en las tablas.  Por este motivo el prototipo incluye varias validaciones para solventar estos problemas que dificultan la adquisición de la información.
  • El prototipo toma la fecha y hora del sistema para determinar las conferencias que se están presentando actualmente (tanto para resaltarlas en el listado como para mostrarlas al inicio de la programación).  No se tuvieron en cuenta diferencias en la zona horaria.
  • El prototipo no pudo ser incluído en el sitio web del congreso ya que fue desarrollado utilizando PHP 5.3 (utiliza una función anónima en PHP) mientras que el hosting utilizado por la página era 5.2 y no se contaba con la información necesaria para convertir la sintáxis de la función anónima al estilo antiguo.
  • El código fuente del prototipo fue liberado bajo la licencia Creative Commons Attribution 3.0.

Enlaces.