3 de diciembre de 2011

Peleando con Gentoo y con el DNI-E (3/3)


conjuntoEntradas() {
  Peleando con Gentoo y con el DNI-E (1/3)
  Peleando con Gentoo y con el DNI-E (2/3)
  Peleando con Gentoo y con el DNI-E (3/3)
}

Configurando Firefox

La configuración de Firefox, es muy simple, pero a mí me toco el gordo; están fácil como ir al menú “editar → preferencias”, en el cuadro de dialogo ir a la sección “Avanzadas” y allí pulsar sobre el botón “Dispositivos de seguridad” y luego botón “cargar” y en el cuadro de dialogo poner el nombre que queramos para el módulo (¿DNI-E?) e indicar la ruta a la librería (*.so) del módulo PCKS#11, en este caso el del opensc-dnie.
Probar que funciona con una web que se solicité el DNI-E, como la de test que ofrecen la FNMT.

Porque me toco el gordo a mí, pues porqué por algún motivo el Firefox 6.0 que tenía instalado, el paquete binario, cuando lo indicaba que utilizase el módulo PKCS#11, decía algo así como que no era apropiado; me rompí la cabeza mirando, volviendo a mirar, probando, volviendo a probar y aunque se me había pasado por la cabeza ya en varias ocasiones quitar la instalación del paquete binario e instalar el paquete convencional (el que se descarga el código fuente y lo compila) no lo hice y continué probando hasta que ya estando muy cansado decidí hacer, como última prueba antes de abandonar, esa sustitución que acabo de mencionar y hecho y resuelto.

Me cagué en todo, pero realmente estaba contento porque por fin funcionaba sobre Firefox y podía hacer los putos trámites con la pu.. AEAT.

Cambiando el PIN con el PAD Virtual

Otra de las cosas que me interesaba hacer es cambiar el PIN del DNI-E que me habían dado cuando me lo dieron, ya que la secuencia aleatoria generada es poco probable que la pueda memorizar por mucho tiempo, ya que es algo que por ahora, tampoco uso muy a menudo; además el PIN proporcionado es una cadena de caracteres demasiado corta para mi gusto.

Para hacer este cambio, según explican en la Web del DNI-E, tienes dos opciones, o te vas a las comisarias a cambiarlo a través de las maquinitas que tienen allí o lo cambias con un aplicación que llaman PAD Virtual y que puedes descargar de aquí.

Como el tiempo no me sobra mucho, y al ver que estaba hecha en JAVA, di por supuesto que no me iba a llevar mucho trabajo utilizarla, ya que siendo multiplataforma con descargarlar y ejecutarla y seguir en siguiente, siguiente, siguiente.... finalizar podía hacer el cambio.

Pues bien, la descargué y la ejecuté, y se abrió el típico dialogo de siguiente, siguiente, siguiente... finalizar, no obstante el intento fue decepcionante, ya que llegué a un punto que apareció el siguiente error:

Mensaje de error en la aplicación PAD virtual al intentar utilizarla

Y verdaderamente después de buscar el error en Google, yo no he encontrado de manera rápida, cual puede ser el problema, así que decidí, en aquel momento, resignarme a cambiar el PIN desde mi máquina que funciona con Gentoo.


Hasta la proxima enfermos.

Peleando con Gentoo y con el DNI-E (2/3)


conjuntoEntradas() {
  Peleando con Gentoo y con el DNI-E (1/3)
  Peleando con Gentoo y con el DNI-E (2/3)
  Peleando con Gentoo y con el DNI-E (3/3)
}

El driver del DNI-E

Leyendo la información de la instalación de la wiki del CENATIC te indican instalar la versión de opensc generada para el DNI-E y antes de ellos desinstalar, si es el caso, la versión anterior o cualquier otro versión de opensc.

Como ya era de esperar, no obstante no costaba nada hacer una búsqueda, en el portage no hay ni rastro del DNI-E, si que lo hay de opensc, pero no nos sirve si queremos seguir las recomendaciones.

Así que me puse a seguir los pasos que se indican en la wiki del CENATIC y los que seguí al pie de la letra no comento, ya que e mejor consultarlos directamente.

En mi caso cuando llegué al paso de configurar la compilación, opté por cambiar las rutas en las que se instala la librería por defecto; lo hice así porque como me gusta complicarme la vida y no me gusta mucho donde se instalan por defecto las cosas que no instalo directamente del portage, ya que luego puedo tener un lió de sobreescritura de ficheros, colisiones entre versiones, etc., si un día optó por instalar lo mismo desde el portage, es decir que lo cambié y lo configuré para que se instalara en /opt y todo colgara de ese directorio.

bash$ ./configure –prefix=/opt/dnie


Después a compilar la aplicación con el clásico make y la instalación con make install y ha probar si todo este berenjenal funciona.
Algo que ya podíamos esperar es que si intentamos ejecutar un comando de las herramientas del opensc-dnie desde un terminal, es que el sistema no encontrara el comando, ya que como le he cambié la ruta por defecto, y no lo metí en las clásicas rutas donde Linux busca por defecto los ejecutables, el sistema no los encontraba.

bash$ dnie-tool -d -w
-bash: dnie-tool: command not found


Así que tenemos que tocar un poco las configuraciones del sistema para que éste busque los nuevos ejecutables que hay en esa nueva ruta.

Una opción para no tener que alterar las configuraciones del sistema es hacer un symlink a cada uno de los ejecutables en el directorio por defecto de la instalación, pero eso es una faena y si encima un día lo cambias de ubicación te toca reenlazarlos todos de nuevo; por este motivo opté por cambiar la configuración del sistema, además que para este tipo de cosas, Gentoo, ofrece una manera de poder añadir estos directorios sin la necesidad de modificar el fichero que configura el valor de la variable PATH a nivel general del sistema y tampoco tener que configurar el valor en un fichero en el HOME del usuario, algo que a mí no me mola mucho si son ejecutables que se han instalado a nivel global de la máquina, es decir no es una aplicación instalada en el propio HOME del usuario.

¿Como se hace esto? Pues bién, el handbook de Gentoo lo explica muy bien aquí en el apartado 5.b.

En mi caso lo que hice es crear un fichero, en /etc/env.d, llamado 999Opensc-dnie con el contenido siguiente:

PATH="/opt/dnie/bin" 
LDPATH="/opt/dnie/lib" 
MANPATH="/opt/dnie/share/man"

Luego ejecuté los comandos env-update && source /etc/profile que nos permiten releer las variables de entorno del sistema sin la necesidad de tener que reiniciar la sesión o el sistema, y como bien se refleja en el handbook:

Y de nuevo a probar.


bash$ dnie-tool -d -w
Waiting for a card to be inserted...
DNIe Number: NNNNNNNNX
SurName: FRAIXEDES
Name: IVAN SERGIO


Ahora sí, ya era hora.

En la siguiente entrada comentaré, la parte más sencilla, como integrar esto en Firefox para poder utilizarlo en el acceso a las Webs del estado Español que permiten hacer trámites con el DNI-E.

Hasta la proxima enfermos.

26 de noviembre de 2011

Peleando con Gentoo y con el DNI-E (1/3)


conjuntoEntradas() {
  Peleando con Gentoo y con el DNI-E (1/3)
  Peleando con Gentoo y con el DNI-E (2/3)
  Peleando con Gentoo y con el DNI-E (3/3)
}

Introducción

Hace un par de seman...., mmm mejor casi un par de meses, motivado porque me iba a tocar emplear una parte de mi tiempo a realizar unos cuantos tramites para la pu.. AEAT, me decidí a pasarme el fin de semana mirando de conseguir hacer funcionar el DNI-E sobre mi equipo de casa, el que tengo instalado un Gentoo, y sobre el cual he escrito, en varias ocasiones, entradas en este blog.

Era algo que tenía pendiente desde que hace poco más de un año, pasé del DNI “analógico” a el nuevo DNI-E, el “digital”; no obstante son de esas cosas que se van dejando pasar hasta que un día te se antoja meterte con el tema o simplemente llega el día que te toca meterte porque lo vas a tener que utilizar.

Desde hace algún tiempo, que ya se dio soporte para usar el DNI-E sobre el sistema operativo Linux, no obstante, todos sabemos que distribuciones de Linux hay unas cuantas, aunque muchas de ellas están basadas sobre una de las populares. En el caso de Gentoo, que es con la que yo lidié, no es tan es simple como tener una paquete en el portage para instalar de manera sencilla mediante emerge, ni tampoco te puedes descargar desde la web oficial un paquete de instalación como si que encuentras para las distribuciones Ubuntu, Debian, Fedora y OpenSuSE, bueno es lo que se tiene que sufrir por haberse liado la manta a la cabeza y haber decido utilizar un Gentoo.

Finalmente la cosa me llevo un rato de un sábado y otro de un domingo, entre directos, crochetes y uppercuts.

El lector de tarjetas

Lo primero, que uno tiene que hacer es comprarse un lector, algo que ya hice bastante tiempo, enchufarlo y hacer que funcione; esto, en mi caso, tenía que ser la parte fácil, ya que el fabricante del lector que compré (C3PO) indicaba que funciona sobre Linux, no obstante como antes, se indica que lo puedes instalar directamente desde el repositorio de las clásicas distribuciones, de las que no se encuentra Gentoo, y para el resto te deja del enlace al middleware necesario para que el SO hable con la smart card a través del lector; aunque finalmente, a los de Gentoo no nos hace falta descargarlo, para luego configurarlo, compilarlo, etc..., sino que lo emergimos del portage y así nos simplificamos la vida.
Buscamos los paquetes de PCSC disponibles:

bash$ emerge -s pcsc
* sys-apps/pcsc-lite
Latest version available: 1.6.6
Latest version installed: 1.6.6
Size of files: 468 kB
Homepage: http://pcsclite.alioth.debian.org/
Description: PC/SC Architecture smartcard middleware library
License: as-is

* sys-apps/pcsc-tools
Latest version available: 1.4.17-r2
Latest version installed: 1.4.17-r2
Size of files: 110 kB
Homepage: http://ludovic.rousseau.free.fr/softwares/pcsc-tools/
Description: PC/SC Architecture smartcard tools
License: GPL-2


Vemos que hay dos paquetes, uno que es propio middle ware PCSC y otro que son herramientas para operar con este; aunque parece que las herramientas no son estrictamente necesarias, por el espacio en disco que ocupan, yo preferí instalar los dos paquetes.

Una vez hecho esto, había que probar si el sistema ya reconoce y puede interactuar con el lector, así que vamos a arrancar el servicio:

$ /etc/init.d/pcscd start
* Caching service dependencies ... [ ok ]
* Starting pcscd ...
* WARNING: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead


Arrancar, arrancó pero ya hay algo que no mola: WARNING.
Vamos a mirar un poco más en detall a que se puede deber aunque parece que así que consulté el /var/log/messages:

Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: mode 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: clear_term 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: eu_automerg 
e 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: rm_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: mv_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: cp_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: pager 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: diff_comman 
d 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: using_editor 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: merge_command 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 2 in /etc/shells: /bin/bash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 3 in /etc/shells: /bin/csh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 4 in /etc/shells: /bin/esh 
ct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 5 in /etc/shells: /bin/fish 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/shells: /bin/ksh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 7 in /etc/shells: /bin/sash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 8 in /etc/shells: /bin/sh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 9 in /etc/shells: /bin/tcsh 
Oct  8 21:39:37 IVAN input in flex scanner failed 
Oct  8 21:39:37 IVAN pcscd: pcscdaemon.c:655:clean_temp_files() Cannot remove /var/run/pcscd/pcscd.comm: No such file or directory

Primera impresión: “Joder, ¿que pasa?, parece que hay errores en el fichero de configuración etc-update.conf, pero que coño tiene que ver ahora este fichero; bien calma vamos a analizar un poco con más detalle los mensajes del log”.

Después de leer con más tranquilidad la salida me di cuenta que cada mensaje, viniese lo que viniese luego (/etc/etc-update.conf, /etc/shells:/bin/bash, …), todo estaba introducido por “pcsc”, así que llegué a la tanta simple conclusión, que todo el problema debía venir del fichero de configuración, por lo tanto lo abrí y encontré esto:

#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/pcsc-lite/files/pcscd-init.3,v 1.1 2010/12/04 02:08:39 flameeyes Exp $

depend() {
 need localmount
}

start() {
 if ! [ -d /var/run/pcscd ]; then
  mkdir -p /var/run/pcscd
 fi

 chgrp pcscd /var/run/pcscd
 chmod 0775 /var/run/pcscd

 ebegin "Starting pcscd"
 start-stop-daemon --start \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid \
  --chuid nobody:pcscd \
  -- ${EXTRA_OPTS}
 eend $?
}

stop() {
 ebegin "Stopping pcscd"
 start-stop-daemon --stop \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid
 eend $?
}

Primera impresión: “Y aquí que cojones debe estar mal”.
Bueno, como antes, me puse a analizar de nuevo todo la información del problema; empezando por el principio, vemos que el WARNING, ya nos decía: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead
Así que parece que la opción -c/--chuid que está para la jubilación y que hay que sustituirlo por la opción -u/--user; así que con todo esto si nos revisamos de nuevo el fichero /etc/init.d/pcscd y en el buscamos --chuid, vemos que aparece en la función start(), es decir en el arranque del servicio; dada la situación lo primero era seguir la recomendación del WARNING, por lo tanto sustituí la opción, guardé los cambios y volví a ejecutar el servicio y solo con esto el servicio se ejecutó sin queja alguna.

Ahora ya tenemos el lector funcionando en el sistema, en la siguiente entrada comentaré el asalto con la instalación de lo que es el propio driver del DNI-E.

Hasta la próxima enfermos.

17 de septiembre de 2011

No cON Name 2011 (2/2)




conjuntoEntradas() {
  No cON Name 2011 (1/2)
  No cON Name 2011 (2/2)
}

Continuamos con el resumen de las ponencias del segundo día de la NcN.

7) Técnicas oscuras para combatir la pederastía en Internet
By Juan Antonio Callés y Pablo González

Juan Antonio y Pablo, después de presentarse y a que se dedican hacen, han pasado a exponernos los ciberdelitos que afectan, en gran medida a menores, que corren hoy por la red. Posteriormente nos han hecho un breve resumen de hasta dónde llegan las leyes para erradicar este tipo de delitos, en España y en Colombia, ya que han tenido la experiencia de colaborar, o más bien de que les pidiesen a ellos ayuda, para desarrollar una versión a medida de su “troyano” open source, para utilizarlo por la propia policía Colombiano en la captura de un criminal que extorsionaba a una menor de este país; experiencia que nos han explicado como empezó y fue evolucionando hasta terminal con la captura del delincuente.

Luego nos han hecho 6 demos de varias de las utilidades que tiene el su troyano Flu para que viésemos de lo que es capaz y aprovechar para ver si nos animamos a colaborar en este gran proyecto.
Verdaderamente ha sido muy acertada, por parte de la organización, de meter esta charla tan amena al principio de la sesión del segundo día.

8) La Sibila (The Sibyl)
By Pedro Fortuny y Rafael Casado

Pedro nos ha explicado con un gran sentido del humor una posible solución que han diseñado y desarrollado que evita los ataques de fuerza bruta sobre los típicos hashes utilizados para no almacenar las contraseñas en claro en las BBDD, sin tener que obligar al usuario a utilizar combinaciones de caracteres de ésas que ponen los pelos de punta a los usuarios que no están paranoicos con la seguridad.

La solución propuesta permite entre otras cosas, aislar la autenticación a otra máquina que solo haga eso y así se mejora la prevención de comprometer la máquina a través de otros servicios, es decir el concepto de que los servidores sean definidos por roles y no que hagan de todo. En la parte de cifrado de las contraseñas se utilizan claves RSA y cadenas aleatorias, permitiendo aumentar la seguridad ofrecida por los sistemas más habituales (hashes).
Podéis consultar todos los detalles y descargar el sistema para que lo utilicéis en vuestro sistema en, ya que es open source, aquí.

9) (In)seguridad para jugones: apuestas, casinos y otros juegos de azar
By Rafael Rodríguez

Rafael no has explicado las mil y una pirulas que los amigos del lado oscuro aplican en los distintos tipos de juego y no juego, como máquinas de cambio de billetes, etc., para llevarse bypaseando las reglas de juego establecidas por los tan “lícitos” casinos.

Hemos escuchado, de todo, desde trucos relacionados con soporte interno o sin él, pasando por el hacking de máquinas, redes, etc. y terminando con truqillos de obtención de información relevante para tomar decisiones óptimas en las futuras jugadas, vamos todo un festival.
Luego ha dado el salto al negocio de los casinos on-line, donde has explicado que se han liberado de los problemas que se les presentan con los medios que utilizan para caer en los problemas que las TIC tienen, es decir ha sido la bienvenida al festival 2.0.

Finalmente nos ha explicado las contramedidas que se toman los dueños de este gran negocio para evitar estas pirulas, para que a más de uno no caiga en la tentación de creer que este tipo de timos es como la gallina de los huevos de oro, es decir para que no seamos malos.

Nos hemos entretenido a lo grande viendo todos los artilugios que emplean y aplican estos individuos.

10) Debugging (Exploit) Payloads
By Jose Serlvi

Jose nos ha dejado, o al menos a mí, atónitos con su charla; es la segunda que vez que asisto a una de sus charlas y como la primera esta hecha para absorber una cantidad de conocimientos increíbles. Ha sido una charla de 100% técnica donde nos ha explicado de que se trata el mundo de los exploits, pero centrándose en los payloads.

Para meterse en el mundo de los payloads nos ha explicado una dos de sus experiencias, una sobre el conocido 0 day de Internet Explorer que usaron los chinos para atacar a Google y otro para abrir un reverse shell en un iPad.

En su primera experiencia hizo uso de metasploit con el payload de aurora (el 0 day comentado en el párrafo anterior) pero en ella tuvo que analizar el payload para conseguir que le funcionase en el entorno que tenía que auditar, por aspectos de idioma, y raíz de eso vio que es lo que el payload hace y también vio que si se usa como una demostración sobre un entorno real luego hay que avisar al administrador del equipo afectado para que restaure las configuraciones, ya que el payload los modifica para su menester pero no los restaura.

En su segunda experiencia, partió de la base que si había una web donde se puede hacer un jailbreak de IOS 4.3 entonces es que tiene un exploit. Así que se puso manos a la obra para ver que hacía ese botón gordo de la web para conseguir el jailbreak, para posteriormente utilizar el exploit para ejecutar su payload que abre la conexión con la shell invertida.

11) Retorno de Inversión en la adecuación a la normativa PCI-DSS
By Javier Moreno Molinero

Javier ha hecho una ponencia de temática menos entretenida ya que las normativas aunque importantes, son un tostón; no obstante, considero que este tipo de charlas, no son menos ni importantes ni menos útiles.

Por la parte que profesional que a mi me toca, no es que PCI-DSS me afecte de manea directa, pero puedo establecer una analogía de la defensa de la adopción de la normativa PCI-DSS, por parte de una empresa, frente los costes económicos defendidos por parte de los financieros, ya que en bastantes ocasiones me tengo que pegar de ostias con estos y los directivos para defender necesidades que normalmente se imputan como un gasto sin ningún beneficio vistos desde fuera del departamento de TI, es decir la defensa que tenemos que hacer con el famoso ROI (Return of Investment) para conseguir presupuesto en la aplicación de normativas legales, adquisición de vienes (hardware y software), etc.

12) Reversing / Forensic Android
By Sebastián Guerrero

Otra de las charlas con un listón altísimo, tanto de contenido como el propio ponente.

Sebastián ha dado una charla de esas densas, no ha apenas respirado desde la primera sílaba hasta la última, momento en que ya se ha pasado a la ronda de preguntas; no obstante para nada se ha hecho pesada y mucho menos difícil de procesar la información, le ha dado humor por un tubo, mientras comentaba todo le iba metiendo inyecciones de bromas, coñas, etc.

El contenido ha sido de lujo, partiendo de la pila de capas de la que se compone Android, pasando luego por de que se componen una aplicación de Android, herramientas útiles para hacer reversing, como se hace un reversing y análisis forense, para posteriormente decirnos como saltarse las protecciones para usar aplicaciones de pago by de face y finalizando con una demo de la PoC (Proof of Concept) que han desarrollado para cargar cualquier payload y conseguir hacer un touchjacking.



Ahora toca la mesa redonda, pero aquí sobre esta no va ha haber nada así que si os interesa las tendréis que ver en GlobbTv.

Hay que agradecer a la organización No cON Name la profesionalidad que ha tenido en la planificación, organización y ejecución del congreso, todo ha estado currado a tope, tanto contenido de las ponencias, ponentes, como el orden de estas, que ha garantizado combinar las charlas que te mantiene despierto sea cual sea tu condición y otras que por temática, no menos importante, hagan del cansancio tu pero enemigo.


Esto es todo amigos sobre este congreso; hasta la próxima enfermos.

16 de septiembre de 2011

No cON Name 2011 (1/2)



Este año he repetido por segunda vez mi asistencia a la No cON Name y por ahora ha sido igual o más fructuosa que el año pasado.

conjuntoEntradas() {
  No cON Name 2011 (1/2)
  No cON Name 2011 (2/2)
}

Con esta esta entrada os dejo un breve resumen de cada una de las ponencias del primer primer día.

1) Show me your Kung Fuzz
By Iñaki Rodríguez

Iñaki nos ha explicado inicialmente que es el fuzzing, que básicamente lo ha resumido como: “Se trata de generar mucha mierda para que una aplicación reviente”.

Inicialmente nos ha dicho para que nos puede servir el fuzzing; lo que me gustaría destacar de estos es que a remarcado que no solo es un ámbito interesante para las empresas que se dedican a aspectos de seguridad, sino que también tiene un gran valor para el resto de empresas que han desarrollado aplicaciones y quieren descubrir posibles vulnerabilidades que tienen, claro está para corregirlas y ofrecer aplicaciones más robustas a tus clientes, en el caso que las comercialices, o a tus usuarios, en el caso que sea para uso interno.

Luego de darnos la introducción nos ha mostrado un conjunto de aplicaciones, dentro de la lista interminable que hay, de aplicaciones para hacer fuzzing, básicamente, como es normal, nos ha nombrado las que él utiliza, posteriormente nos ha dado una pequeña lista de lo que necesitaremos para montarnos un pequeño laboratorio de fuzzing, unas cuantas máquinas, unas cuantas aplicaciones, un poco de conocimientos de programación en algún lenguaje de scripting y muchas ganas de ponerse a currar y a gastar horas jugando con todo esto. Poca broma con éste ámbito, el fuzzing es entendible a todo, explotación de vulnerabilidades ficheros, aplicaciones locales, de red, protocolos de red, aplicaciones web, etc.

Luego ya han venido un par de demos, mostrándonos cómo en pocos minutos ha encontrado un agujero en una aplicación comercial cuyo coste no es que sea precisamente “low cost”.

Posteriormente un resumen de lo encontrado, de los problemas que surgen en el proceso de fuzzing; algo que quiero mencionar es que como un aplicación pasa por múltiples estados, no podemos decir que una aplicación está libre de vulnerabilidades si no hemos encontrado ninguna en nuestro proceso de fuzzing ya que es posible que solo hayamos barrido un % muy pequeño de todos estos estados.

2) Seguridad en el diseño: desde el principio
By Ricardo J. Rodríguez

Ricardo nos ha explicado y ha defendido en su ponencia que el diseño de un sistema tiene que incorporar la también la seguridad; es decir que actualmente, el diseño de sistemas, eso que se trata de pensar y valorar la solución que necesitamos para cumplir con los requerimientos que el sistema tiene que cumplir, ya ha obtenido un cierto reconocimiento a nivel mundial, y lenguajes como UML ya se han consolidado como estándar, pero por ahora la seguridad no es uno de los ámbitos que se tiene en cuenta en el diseño de un sistema, y eso es lo que él y sus compañeros del equipo de investigación de la universidad están trabajando para conseguir obtener una aprobación teórica que agrade a los que necesitan que todo esto sea práctico, es decir, como de costumbre en el campo de la investigación, pasar de las demostraciones teóricas a la práctica que el mundo de los negocios requiere.

No me voy a meter en concreto en metodologías, estándares, etc, que ha comentado en la ponencia, esa información puede obtenerse de manera amplia en los papers de investigación que han publicado.

Lo que me ha gustado de la ponencia, es que yo soy 100% partidario de pensar, reflexionar y valorar las múltiples variable que pueden afectar a lo que pretendes crear o poner en funcionamiento, ya que eso garantiza que en el momento del despliegue se reduzca el riesgo de que surjan imprevistos y después durante la explotación tenga un mayor nivel de control sobre las incidencias que puedan surgir garantizando velocidad de detección de la fuente del problema y de la velocidad de reacción; es decir que al haber defendido que la seguridad tiene que estar incluida en la fase de diseño de un sistema como en el desarrollo de software es algo que me ha llegado al alma, porque en mi día a día profesional me veo obligado a vivir en el caos y con una mínima dedicación a la planificación y a la organización, y no será porque lo pongo constantemente encima de la mesa, teniendo que sufrir que me tomen como un paranoico.

3) Geolocalización Wi-Fi basada en API
By Yayo F. Hansen

Primero de todo hay que mencionar la entrada inicial que ha hecho Yago en su ponencia, la musiquita, el texto que aparecía en pantalla y finalmente su entrada a oscuras con un sombrero en la cabeza, creo, que nos ha permitido a todos partirnos la caja.
Dejando de banda el show, nos ha dado un repaso sobre los sistemas de geolocalización y los virtudes y demencias de cada una; de cada sistema GPS, GSM, Wi-Fi y GeoIP, nos ha explicado como operan y como accedemos a esa información.
Lo más destacable y que más ha expuesto, de ahí el título de la ponencia, es la geolicalización Wi-Fi que está un poco en auge, con lo del HTML 5 y la famosa API de Google que tanto ha dado que hablar, y con razón.
Me he puesto algo más al día de como está todo este embrollo de la geolocalización, además de meterme el miedo sobre la seguridad de los sistemas móviles Android, algo que ya conocía, pero su manea de decirlo y de interpretarlo, y ahora que hace un par de semanas que llevo un Android en el bolsillo, el miedo se me ha calado todavía más al fondo, por lo que me va tocar a dedicar un poco de tiempo al cacharraro que va en mi bolsillo, porque en estas dos últimas semanas apenas he tenido tiempo para explorarlo a fondo y ver como puedo, al menos, conseguir tener algo más de control sobre éste.
Verdaderamente ha sido una ponencia estupenda, y se ha hecho muy amena, gracias a la pizca de humor que ha ido aplicando durante su presentación.

4) Terminal Hackapplications – old and new tricks hacking Citrix and Terminal Services
By Chema Alonso y Juan Garrido

De esta ponencia, no voy a describir muy concretamente lo que nos han mostrado, ya que tiene una una gran densidad técnica, mediante demo en directo, para el tiempo que tenían; además muchos de vosotros habréis ido siguiendo lo que Chema y Juan escriben en sus respectivos blogs, además de poder ver esta misma ponencia, presentada en la Black Hat USA 2011, donde la presentaron, que la podéis ver en algún vídeo colgado por ahí.

Como en todas las que he asistido, las ponencias de Chema son todo un show, que os voy a contar, el nivel de conocimiento que se expone y que puedes absorber es increíble, ya que técnicamente son muy buenas y amenas, y con el cachondeo que se trae, los conocimientos entran solos; quiero resaltar que el duo que esta vez ha hecho con Juan, ha sido muy muy bueno, yo siempre lo había visto exponer solo, pero la mezcla con Juan y la interpretación de este han dejado el listón tal alto, como siempre él me había dejado en sus exposiciones en solitario.

Bueno resumiendo rápido, nos han expuesto como explotar AGUJEROS de seguridad en aplicaciones de Terminal Services y Citrix, tan de moda hoy en día y publicadas en Internet sin mucho reparo, verdaderamente si yo tuviese este tipo de entornos ya me veo solicitando una reunión con dirección para exponer la seriedad del asunto y pedir los recursos necesarios para aplicar las consecuencias con las medidas que Chema y Juan nos han indicado, aunque la soluciones sean muy complicadas, llevan mucho tiempo y aún así, no te garantizan que lo hayas cerrado todo.

5) Ejercicios de demostración JWID (Joint Warrior Interoperability Demostration)
By Pedro Sánchez

Pedro nos ha expuesto los esfuerzos de los estados por conseguir tener herramientas, desarrollar estrategias y estar al día en la defensa/ataque frente a los ataques cibernéticos, englobados a los que ellos entienden como ciberguerra.

Nos explicado que hay congresos, concursos, etc, sobre todo esto; la verdad es que es impactante que pueda llegar el día que si tienes una idea feliz, le dedicas tiempo y llegas a algo útil que pueda ser útil en este campo, puedas acabar en un congreso sobre esto, lleno de “tíos con uniforme”, de esos que hasta ahora la mayor parte de la población piensa que llevan un fusil en la mano, cuando hoy en día ya parece que está creciendo el número de “tíos de estos” que ya no llevan un fusil en la mano, sino un ordenador.

Estoy sorprendido ya que pensaba que los estados no estaban invirtiendo tantos esfuerzos como lo que Pedro ha expuesto, y sobre todo algo que me deja más tranquilo, es que están subcontratando servicios profesionales para mejorar la seguridad en este ámbito; tendré que empezar a creerme que nuestro estado nos defiende.

6) Medical Device Security: State of Art
By Shawn Meginger

Shawn no ha puesto al día con todo lo relacionado con la seguridad que hay en los dispositivos y aplicaciones del ámbito médico.

Ha sido una ponencia muy descriptiva de como está este ámbito; a descripto tipo de dispositivos y aplicaciones que hay y que problemas de seguridad pueden tener y el alcance que puede tener un ataque sobre uno de estos.
También ha reclamado que es un aspecto peliagudo, los fallos de estos ponen en juego la vida de un grupo de personas, pero aún así los fabricantes de este ámbito parece que ignoren la seguridad by defautl.

Finalmente ha listado los investigadores que han escrito papers y descubierto agujeros de seguridad en productos de este ámbito, además también ha citado ciertos grupos de investigación, “normativas” que se han desarrollado o están en desarrollo y algo más que seguro que me dejo.




Finalmente el día ha terminado con la mesa redonda que estaba anunciada, “Ataques a las grandes Corporaciones”, la cual ha estado entretenida, pero no voy a dar más detalle; los interesados que no han podido asistir seguro que tendrán la posibilidad de verla retransmitida por algún lugar.


Nos vemos mañana enfermos.

10 de septiembre de 2011

Root power a lo old school


Después de haber caído de nuevo en la tentación de dar preferencias a otros temas profesionales y personales por distintas causas antes que a este blog, aprovecho esta tarde de sábado, de un fin de semana de esos que estoy agotado físicamente por liarme a organización de eventos deportivos, concretamente de BTT, para escribir una de las entradas que hace tiempo que tenía ganas de escribir.

Bueno después de lavarme la conciencia con excusas vamos al lío.

Menciono de antemano que nadie se tome el contenido de esta entrada como una buena práctica, y menos para usuarios no catalogados como frikis de muchos de las distribuciones Linux que corren por ahí, sino como algo totalmente de gusto personal, aunque muchas de los aspectos los argumente desde un sentido que pueda parecer racional. Advertidos estáis, paso a meterme de lleno en el tema.

Todos sabemos que desde ya hace bastante tiempo en gran parte de las distribuciones de Linux viene con la herramienta sudo instalada y con una configuración básica que permite ejecutar cualquier comando del sistema desde el usuario que se crea en la instalación del SO.

A mi la herramienta me parece cojonuda, pero cuando me topé con ella sin haber consultado su documentación y habiendo enterado de ella cuando volví a la carga con un SO Linux, después de un tiempo sin usarlo, me saltaron chispas al ver que no podía entrar con la cuenta de root al sistema; en ese tiempo sabático que me tomé después de haber terminado la universidad y haber empezado lo que podríamos llamar entre comillas “mi vida completamente laboral/profesional”, no estuve muy al día sobre el mundo Linux y los recuerdos que me quedaron fueron los de la universidad, tiempo en el que la herramienta sudo o no existía, o yo no la conocía, y con las distribuciones que tocaba, no venía instalada y preconfigurada como ahora viene, es decir, que cuando instalabas un Linux, metía las contraseña de root y luego según si eras aplicado y te dejabas recomendar, optabas por crear una cuenta sin privilegios administrativos para usar el sistema tu día a día.

El momento inicial me jodí y adopte lo que venía dado, ejecutar todo lo que necesitaba derechos administrativos con sudo.

El tiempo ha ido pasando, y finalmente en mi mundo personal (el de trastear por casa con los equipos que más utilizo) opté por seguir cultivándome con Linux, ya que en el mundo profesional estaba y estoy inmerso en el mundo Microsoft (que esto no se tome como una discriminación entre ambos, cada uno, como todo en este mundo, tiene cosas buenas y otras malas, cosas que nos gustan y que no nos gustan, pero yo soy de los de según lo que necesitemos optar por la que mejor cumpla las necesidades de cada momento, sin casarme con nadie); eso si mi cultivo no era el de productor agrario sino el del típico dominguero que tiene un huerto en su segunda residencia, es decir que gran parte de mi tiempo libre me dedico a jugar en este inmenso mundo de la informática, con ojos de generar beneficio económico, pero si no lo hay, me divierto un poco según lo que me voy topando y también si me va viniendo en gana.

Hace algún tiempo, le tocó el turno a profundizar un poco en el tal sudo; algo que no vino antes, porque como mi evolución del uso personal de un Linux, cambió de distribución, de una Ubuntu a una Gentoo, perdí de manera intrínseca las cadenas que me ataban a no ser el amo del sistema, y que vino más tarde porque me metí un poco en aspectos de la seguridad, añadiéndola a la lista de curiosidades tecnológicas que me gustan, aprovechando que encima, eran importantes para mi posición profesional actual.

Después de ver de manera general como funciona la herramienta, no es que sea un gurú de ésta, la configuré sobre mi Gentoo, para evitar tener que ir cambiando de cuenta cuando a la vez que administraba el sistema, por ejemplo lo actualizaba, tuviese que estar constantemente cambiando de sesión con mi cuenta de usuario cuando la tarea administrativa toma algún tiempo, ya que la opción de usar el sistema de manera convencional (navegar por internet, etc.) desde un Dios, no me gusta nada, porque ya somos muy vulnerables para encima meter más leña al fuego. No obstante la configuración no fue como la que acostumbra a venir por defecto en la instalación de varias de las distribuciones disponibles, sino que limité las aplicaciones y/o comandos a ejecutar como root desde el usual usuario, así creo que hay menos riesgo si me usurpan la contraseña de éste.

Mi vida con Gentoo fue tirando así, pero ya hace bastante menos tiempo, que decidí cambiar la configuración de sudo del Ubuntu que tengo instalado en mi netbook, máquina que uso para llevármela por ahí y para estar tirado en algún lugar de casa haciendo el ganso, como ahora mientras escribo este post, es decir que necesito que esté estable de manera fácil lo máximo posible y que el hardware esté disponibles sin tener que romperme mucho la cabeza, sin perder lo que ya he mencionado, estar inmerso en el mundo y filosofía Linux en mi tiempo libre. La configuración que establecí partió del mismo concepto que la de Gentoo pero como root continuaba sin ser accesible mediante una sesión tuve que investigar el porque, ya que hasta entonces lo ignoraba, descubriendo el porque no se podía iniciar sesión, que concretamente es porque la cuenta root es bloqueada con la opción --lock, comando passwd.

Descripción de la opción --lock del comando passwd

Así que activé la cuenta root con la manera tan fácil como asignándole un nuevo password ya que entiendo que al no haberme pedido ninguno en el momento de la instalación la cuenta estaba bloqueada pero no tenía ninguno asignado y si lo tenía lo desconocía, y desde ese momento ya podía hacer lo que siempre había deseado, que si quiero dedicarme a solo administrar la máquina no tenga que estar constantemente ejecutando sudo.

Bueno ya acabando con esto voy a responder algunas de las preguntas que yo mismo me hice.
  1. Con el cambio que he hecho en la configuración de sudo ¿mi sistema es más vulnerable?
    Yo entiendo que no, incluso menos, porque habiendo quitado la configuración estándar de sudo, que viene por defecto en la instalación de Ubuntu, he eliminado aspectos, como el tiempo que se guarda la autorización, cambiándola a 0 segundos, es decir que cada ejecución de sudo siempre me pide el password, independientemente del tiempo que haga de la última ejecución, y además he limitado que V solo autorice un número limitado de comandas y/o aplicaciones en vez de poder ejecutar cualquiera de estos.

  2. Ahora que root puede logearse en el sistema mi equipo ¿es más vulnerable?
    Podría ser lo si no le hemos asignado ningún password, o si hacemos mal uso de ella, utilizándola para otros menesteres que no sean los de administrar. Además, aunque tenga poco impacto, y sea una paranoia personal, teniendo otra cuenta con otro password que nos permita administrar la máquina, considero que es más seguro porque también exponer mucho menos el password, ya que usando sudo cada vez que ejecutas aplicaciones con derechos administrativos necesitas proporcionar el password de usuario exponiendo esté continuamente.

  3. ¿Es aplicable esta configuración a todos los distintos perfiles/tipos de usuarios?
    Considero que no, que la configuración por defecto de la instalación del SO es más aceptable para un usuario si no conocemos a que tipo pertenece, ya que los usuarios que no son unos frikis de los sistemas, no les gusta hacer muchos esfuerzos en mantener dos cuentas de usuarios, teniendo que recordar dos passwords distintos, así que configurándolo como a mi me mola, creo que una parte de estos caería en la tentación de utilizar la cuenta de root como la habitual, dejando olvidado la de usuario, corriendo el riesgo que se corre ejecutando la mayor parte de las aplicaciones con derechos administrativos, y más concretamente hoy en día, con la manera masiva en que utilizamos los navegadores conjuntamente con Internet.



Hasta la próxima enfermos.

13 de agosto de 2011

Otro vulgar scammer más


Aunque ya me ha pasado el 90% de las veces que me pongo a vender algo en segundamano.es, está va a ser la primera vez que publico los mails que me he cruzado con el vulgar scammer de turno, más bien motivado, porque estoy de vacaciones, aunque esto no quiere decir que me haya sobrado el tiempo, ya que vuelvo al curro la semana que viene y en la pila de cosas que quería hacer no se ha quedado en 0 elementos.

La historia es la de siempre; aprovechando el servicio de segundamano.es me he puesto a vender un artilugio que tenía por casa el cual no tengo intención de utilizar más y ya que el mundo físico no se comportar de manera tan boyante como el mundo virtual, en términos de espacio de almacenamiento, decido venderlo para sacarle algo de provecho, es decir algo de pasta.
El primer mail del vulgar scammer no era más que una pregunta que hace muchos de los posibles interesados por artículo:


Toma de contacto del scammer

Aunque ya se empezaba a notar las complicaciones que estos individuos acostumbran a tener con el Español y las costumbres que nosotros tenemos y que estos no es que se hayan informado mucho.

El tío se llama “Jose María”, vamos que más Español, el nombre no podía ser y con la gramática que había utilizado ya no encajaba mucho, pero bueno aunque es un indicio, la gente que contacta a través del formulario web no suele esmerarse mucho en escribir más o menos correcto, y cuento las faltas de ortografía, ya también soy bastante malo para eso; luego resulta que la dirección de mail es mariajose12000@yahoo.com, dejando lo de 12000, se deberá al overbooking que hay de “mariajose” en las direcciones bajo el dominio yahoo.com, el tío parece que le mola lo del cambio de sexo, y con esto no es que yo tenga algún problema con ello, tengo 100% de respeto a este asunto, ya que para mí esto es una práctica de la libertad de un derecho que no hace daño a los demás, pero no nadie negará que no es una situación extraña, sobre todo cuando las costumbres de muchos países de habla no española suelen tener un apellido y muchas veces cuando tu vas con dos apellidos se piensan que tu 1er apellido es parte de tu nombre (nombre compuesto) y el segundo es tu único apellido, con esto ya me encontré en las oficinas de Google de Zurich, cuando me fuí a visitar a un colega, no había manera de que lo encontraran, por este mismo hecho.

Dicho esto, continuamos con la historia:

El scammer se interesa en comprar al artículo y te cuenta la típica historia paternal para tocarte el corazón

Ahora le dí un poco de juego para ver como reacciona sobre una posible víctima:

Que sí que sí que me creo tu historia

Que conste que el número de cuenta, que por supuesto no es mío, lo saque de una de las múltiples webs que meten su número de cuenta bancaria para recibir cobros de clientes, es decir que la he sacado de entre información que está accesible al público.

Y ahora viene lo mejor, BANK OF AMERICAN, hace ofrece un tipo de servicios que en mi vida he visto, será porque los norte americanos son así de serviciales con los clientes que les dan bien de comer.

Bank of American nos confirma la transferencia que ha hecho el comprador, joder como se lo curran

"Ostia, no sabía yo que esto de la crisis había tocado tanto a los bancos que han tenido que vender sus dominios al mejor postor y empezar a utilizar dominos más asequibles (bank.of.american@v.gg)"

Por cierto este mail, al contrario que el resto, si que gmail, lo metió en el buzón de SPAM.

Continuamos viendo el problema detectado con el nombre utilizado, ¿es un tío o una tía?

Por si no te quedó claro con el mail anterior que encima te lo envían a ti con copia a ti mismo, el banco te envía otro, pero ahora con os he cargado las imágenes para que veáis lo corporativos que son:


Si no te ha quedado claro, te mandamos otro mail, pero con nuestras bonitas imágenes corporativas

Es más parece que si te meten unos cuantos dolares al final del mail, te va a convencer más que esto no es un bulo:

El final del segundo mail enviado por el banco viene con unos cuantos dólares

Ahora, que todo está hecho el scammer te dice que todo está hecho y te suelta el rollo de que el banco ha confirmado que el dinero está listo para entrar en tu cuenta.

"joder que amables y confiados son estos extranjeros y sobre todo agradecidos, me han dado 50 € más de lo que pedía; esto son buenos clientes y lo demás son tonterías"

El scammer informando que ha pagado y encima más de lo que pedías

Bueno llegado a este punto ya me cansé de jugar así que como no he respondido al último mail con lo que pide me ha enviado otro soltando un rollo de que es una persona honrada y que está al corriente de este tipo de timos, pero que él/ella no es así.

  El scammer jurando que es una hermanita de la caridad


Visto esto y todas las veces que me ha pasado siempre que intento vender algo en segundamano.es (y eso que ellos mismos avisan de este tipo de prácticas), creo que me queda claro que aunque a este tipo de timos se le vé el plumero por todos lados, parece que siempre, aunque parezca mentira, debe picar alguien por eso de la ley de los grande números, sino ¿porqué lo continúan intentando?

Bueno por si alguien duda estos días y decide meter buscar en google las direcciones mariajose12000@yahoo.com y bank.of.american@v.gg para ver si alguien ha reportado algo, al menterlas aquí espero que alguien dé con el post y le queden claras todas sus dudas.

Por otra parte, para quien no esté al corriente, hay que tener en cuenta que por mucho que vengan los mails de direcciones con el dominio apropiado a la entidad bancaria, no es una fuente de garantía, y si usáis gmail, hace un tiempo, no sé si actualmente continúa igual, no siempre avisa.


Hasta la próxima enfermos.

10 de agosto de 2011

Gnome loves ConsoleKit


El otro día, como hago cada semana durante el fin de semana que es cuando uso mi PC de casa para frikear, me puse a actualizar el Gentoo que tengo instalado, es decir que ejecute el comando:

$ emerge --deep --update --newuse world

No obstante, como también siempre hago, revisé que es lo que iba a actualizar (opción -pv), y sin ver nada que me llamará la atención o actualizaciones que requieren que luego haga otra cosa, como actualización de las fuentes del kernel, las cuales me implican migrar el fichero de configuración de la versión anterior a la versión recientemente descargada y luego compilar y reconfigurar el boot, lancé la ejecución del comando mencionado.
Entre las distintas actualizaciones había la actualización del Gnome, escritorio que utilizo, a la versión 2.30.

Hasta aquí nada raro, se empezó a descargarse cada paquete en el orden estipulado, a compilarse y desplegarse. Una vez terminada las actualizaciones a reiniciar la máquina, y a partir de aquí fue cuando empezaron los dolores de cabeza por una estupidez, pero que se me alargo unas cuantas horas, todo por que Mr. Google, no me daba la respuesta que quería, con las preguntas que yo le hacía, seguramente porque no estaba haciendo las preguntas correctas.

Los inconvenientes que tuve después de actualizar, no eran graves, pero si toca pelotas:
  1. No podía apagar, reiniciar, hibernar, etc. la máquina desde la sesión del usuario, sin privilegios, que utilizo día a día; no solo era porque no tenía derechos, sino porque en el menú de la interfaz gráfica no aparecían los botones correspondientes.
  2. Los Pen Drives, que pinchaba no se automontaban, así que tenía que hacerlo manualmente desde un usuario con privilegios.
Después de leer varias historias de la peña que va preguntando en posts, otros que escriben en blogs, como yo estoy haciendo ahora, respuestas de listas de correo y otras de las distintas fuentes que corren por este mundo intangible, no encontré nada que me dijera como tenía que solucionar el problema.

Así que con todo lo que iba leyendo, iba enterándome de cosas que desconocía, y mezclándolas con las cosas que ya conozco, empecé a trastear en el sistema que si meto las entradas en el /etc/fstab de los Pen Drives, que si reviso la configuración de Gnome con el gconf-editor, a revisar los servicios iniciados, etc.

Algo que ya sabía y que debido a la antigüedad de alguna de la información que encontraba, no estaba reflejado, es que HAL (Hardware Abstraction Layer) ya no se usa, es decir que está deprecated, así que lo de cargar el servicio HAL, nada de nada; otras de las historias que me llevo a trastear eran las referencias que la peña hacía a udev y udisk y apartir de aquí, junto con la frase que venía a decir algo así como “Gnome necesita ConsoleKit para su correcto funcionamiento”, que obtuve de la documentación del propio proyecto de Gnome, me encaminé hacia la dirección correcta para solucionar el problema.

El servicio udev estaba iniciado, pero udisks no se iniciaba, daba un error al hacerlo, así que algo pasaba; a raíz de esto y de la frase que he comentado que obtuve de la documentación del proyecto Gnome, revisé si ConsoleKit estaba iniciado, y no lo estaba así que lo inicié y entonces si que udisks se iniciaba así que parecía que todo estaba solucionado, añadí al inicio del sistema la ejecución del servicio:

$ rc-update add consolekit boot

y a reiniciar para acabar de ver si solucionaba los inconvenientes.
Inicio sesión con mi usuario sin privilegios y buahlá ya tenía botones de apagar, reiniciar, suspender e hibernar la máquina y si pinchaba un Pen Drive, grrrrr, nada de nada, “espera, espera, ….. que antes he tocado el /etc/fstab y no lo he dejado como estaba, así que vamos a borrar esas entradas (la del Pen Drive) que había metido y que no he quitado”; y ahora sí los Pen Drives ya vuelven a automontarse de nuevo.

Así que solucioné los inconvenientes, me enteré de bastantes cosas, como habitualmente me pasa cuando me veo obligado a solucionar problemas, esta es una de las razones por las que instalé un Gentoo, y de rebote solucione el inconveniente que tenía desde el inicio del sistema, que las unidades ópticas (DVD-ROM, etc) no se automontaban, ¿porqué? Porque había metido las entradas en el /etc/fstab.

Así que ya sé para la siguiente vez que el Gnome haga cosas raras revisar si ConsoleKit está iniciado ya que con algún cambio del sistema puede que no se inicie o directamente haya desparecido de la lista de servicios a iniciar en el arranque del sistema.

Hasta la próxima enfermos.

21 de julio de 2011

Ponencia-Taller de Dr. Metrics


El pasado día 19 de Julio del 2011, me pasé por una Ponencia-Taller que realizaba Dr. Metrics (Enric Quintero), organizado por Iniciador Barcelona, sobre Web Anlytics (Análisis Web) para ver que podía sacar de allí para abrir mi mente a futuras ideas, expectativas profesionales, absorber algo más de conocimiento y si se daba la ocasión, hacer algo de networking.

En el anunció del “Taller” se indicaba que Dr. Metrics era un crack de los productos Google Analytics y Optimizer, así que me hizo pensar que spamearia bastante de estos productos, algo que ya me parecía bien, por eso asistí, porque seguro que siempre se puede aprender algo; no obstante la ponencia me sorprendió porque el nivel de SPAM sobre Google fue bajo, además de ser crítico con lo que estos productos aportan y no aportan.

Dr. Metrics, claramente, anunció que el analizar el éxito de tu site no solo se trata de el número de visitas, que páginas se han visitado y cuanto tiempo se ha visitado cada página, sino que al final toda esa información es importante si puedes ligarla con otros aspectos que te puedan describir el comportamiento de los visitantes y del porque de sus interacciones.

Lo que espera todo el mundo cuando consulta las métricas de su site, es ver que beneficio le está aportando, definiendo beneficio como venta de productos, venta de servicios, presentación de la empresa para posterior contacto, fama, etc.

Dr. Metrics dejó claro que las métricas son importantes, pero solo son una pieza de un puzzle, es decir que sin relacionarlas con otros aspectos, se puede decir que no sirven para nada. Entre las otras piezas del puzzle mencionó aspectos como análisis de lo que sucede en tu backend (por ejemplo las transacciones interesantes realizadas en la BBDD, como sería el cierre de un proceso de compra), encuestas al usuario cuando decide abandonar tu site en procesos importantes no finalizados (por ejemplo en medio de el pago con tarjeta de crédito de una compra o contratación de servicio) y algunos aspectos más que mencionó.

Me entusiasmo la idea que recalcó sobre de buscar “los tres pies al gato” cuando ves que las visitas de tu site son bajas o que hay bastantes abandonos en páginas que no tiene mucho sentido (por ejemplo en medio del proceso de compra); lo primero que dijo sobre este aspecto es que antes de ponerse a cruzar datos como un loco es que revises la infraestructura donde se organiza todo este circo, es decir si tu/s servidor/es a lo largo del mundo, plataforma y horario tienen un adecuado rendimiento, tienen una disponibilidad adecuada y todo tu site funciona bien y no van errores 400, 500, … Resumiendo que primero empieces la casa por los fundamentos y no por el tejado, así que primero a invertir en un desarrollo con un nivel adecuado de calidad (incluyendo seguridad) y óptimo, eso si desde mi punto de vista no te pases con lo de óptimo, que luego el desarrollo, llamemos código, es un Jeroglífico solo entienden los iluminados que lo han creado y como esto se larguen de la empresa ya verás los dolores de cabeza que tendrás; y una vez tengas un desarrollo de calidad aceptable te va a tocar invertir en servidor/es, comunicaciones, y buen sys admin que sepa configurar y optimizar, y no nos olvidemos de securizar, los cabr... que van a servir tu site.

Sobre los sistemas/servicios/implementaciones de análisis de métricas, también habló, y no solo de Google Analytics, sino de otros como Yahoo Analytics, u otros sistemas de uso privado como el archiconocido, no gratuito, Urchin; no obstante finalizó este apartado venerando a Google Analytics por su facilidad de uso para usuarios no técnicos, es decir que Google, parece tener “la madre del cordero” en usabilidad dando la importancia que tiene en el hecho de sacarle provecho, ya que tener muchas funcionalidades no sirve de nada si luego no sabes usarlas.

Finalmente llegó el tuno de las preguntas, se preguntaron unas pocas, pero realmente solo recuerdo la mía, así que la voy a dejar aquí, que para eso es mi blog:
¿Te has planteado como va a cambiar todo este mundo de analizar a los usuarios ahora que los gobiernos se están poniendo las pilas en legislaciones de privacidad y que se están realizando, por fin, unas campañas de concienciación sobre la privacidad de los datos en la red? (bueno no fue exactamente así, pero similar)

Y la conclusión de al respuesta fue que la información no es gratis, aunque lo parezca, así que si vas a querer que tus usuarios dejen en tu site tu rastro tendrás que recompensarlos, por ejemplo, descuentos, sorteos, etc; algo que deberían tomar no ta muchos de los explotadores que corren por este país, que parece que todo los tiene que salir gratis, es decir a cambio de nada.

Podéis consultar el resumen de la ponencia realizado por Iniciador Barcelona, junto con slides de la presentación, aquí (y si queréis verme a mí, lo podéis hacer en la foto que hay al público).


Hasta la próxima enfermos.

8 de julio de 2011

[PHP] Verificación de entradas en arrays multidimensionales (2/2)

conjuntoEntradas() {
  [PHP] Verificación de entradas en arrays multidimensionales (1/2)
  [PHP] Verificación de entradas en arrays multidimensionales (2/2)
}


Llegado al punto que al no ser las dos opciones comentadas en el primer post de esta serie de mi gusto por el motivo que ya expuse, además estar desfavorecidas frente a otras, por su menor rendimiento en velocidad de ejecución, podría haber optado por tirar por el derecho y decidir utilizar la función isset(), es decir la que en el comentario de la documentación de función is_null(), se dejaba claro que era la más óptima entre estas tres opciones.

No obstante, durante mi búsqueda de como hacer la verificación de la existencia de claves dentro de los arrays multidimensionales, me tope con otra función, que por nombre y definición (Verifica si el índice o clave dada existe en el array) debería ser la más apropiada para realizar dicho menester; estoy hablando de la función array_key_exists().

No obstante, en los comentarios de la documentación de array_key_exists(), alguien y había comentado la diferencia de velocidad de ejecución con isset(), siendo de nuevo, favorable para ésta última.

Aún habiendo este comentario, yo quería hacer mis pruebas, ya que al final del comentario, se menciona que la diferencia de rendimiento no es tan grande en un sistema operativo Mac o Linux, como lo es un MS Windows; además la prueba del comentario se realiza sobre un array unidimensional y no multidimensional, que son con los que yo me iría encontrando en mis implementaciones y por otra parte, me entró la vena friki por realizar la prueba sobre un profiler, y como ya había utilizado en una vez anterior, el elegido fue Xdebug, utilizando, con el mismo motivo, el visor KCachegrind; así que manos, la obra.

Primero la implementación de las funciones que me permitirán discernir entre las dos distintas formas de verificar la presencia de claves en arrays multidimensionales con la función array_key_exists().

function aa_verificacion_a_una_instruccion_fallo_2d($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave2.5', $var1['clave1.3'])) {
        }
    }
}

function ab_verificacion_por_dimension_fallo_2d($var1) {
    for ($i = 0; $i < 10000; $i++) {
        if (array_key_exists('clave1.3', $var1) && 
                (array_key_exists('clave2.5', $var1['clave1.3']))) {
        }
    }
}

function ba_verificacion_a_una_instruccion_fallo_3d($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave4.1', $var1['clave1.3']['clave2.1'])) {
        }
    }
}

function bb_verificacion_por_dimension_fallo_3d($var1) {
    for ($i = 0; $i < 10000; $i++) {
        if (array_key_exists('clave1.3', $var1) && 
                array_key_exists('clave2.1', $var1['clave1.3']) &&
                array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']) ) {
        }
    }
}

function ca_verificacion_a_una_instruccion_fallo_4d($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']['clave3.0'])) {
        }
    }
}

function cb_verificacion_por_dimension_fallo_4d($var1) {
    for ($i = 0; $i < 10000; $i++) {
        if (array_key_exists('clave1.3', $var1) && 
                array_key_exists('clave2.1', $var1['clave1.3']) &&
                array_key_exists('clave3.0', $var1['clave1.3']['clave2.1']) &&
                array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']['clave3.0'])) {
        }
    }
}


function da_verificacion_a_una_instruccion_fallo_3d_sobre_4d($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']['clave3.1'])) {
        }
    }
}

function db_verificacion_por_dimension_fallo_3d_sobre_4d($var1) {
    for ($i = 0; $i < 10000; $i++) {
        if (array_key_exists('clave1.3', $var1) && 
                array_key_exists('clave2.1', $var1['clave1.3']) &&
                array_key_exists('clave3.1', $var1['clave1.3']['clave2.1']) &&
                array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']['clave3.0'])) {
        }
    }
}
Aunque se podía intuir con total certeza que la verificación a una instrucción, directamente haciendo referencia a la clave en la dimensión que se quiere verificar, será más óptima que la verificación dimensión por dimensión hasta llegar a la profundidad de la dimensión que realmente se quiere comprobar; opté por realizar la prueba y así poder ver de manera cuantificable la diferencia que había, y tener que tragarme mis gustos y optar por hacer la comparación con isset(), haciendo referencia a posiciones de memoria inexistentes si las dimensiones de menor profundidad a al que se quiere verificar, ya no existen, como a comenté en la primera entrada de esta serie. Los resultados obtenidos fueron estos:

 Diagrama de llamadas a funciones de comparación de la dos maneras de utilizar array_key_exists()

Diagrama de llamadas a funciones de comparación de la dos maneras de utilizar array_key_exists() de menos a mayor % utilizado 

Bueno, una vez hecho un poco el ganso, tocaba realizar la comprobación definitiva, comparar la eficiencia de ejecución entre array_key_exists() e isset(), así que esté fue el script que utilicé:
function aa_usando_array_key_exists($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave4.1', $var1['clave1.3']['clave2.1']['clave3.0'])) {
        }
    }
}

function ab_usando_isset($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (isset($var1['clave1.3']['clave2.1']['clave3.0']['clave4.1'])) {
        }
    }
}

function ba_usando_array_key_exists_fallo_dimension_anterior($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (@array_key_exists('clave4.1', $var1['clave1.3']['clave2.5']['clave3.0'])) {
        }
    }
}

function bb_usando_isset_fallo_dimension_anterior($var1) {
   for ($i = 0; $i < 10000; $i++) {
        if (isset($var1['clave1.3']['clave2.1']['clave2.5']['clave4.1'])) {
        }
    }
}
Y los resultados obtenidos fueron estos:


Diagrama de llamadas a funciones de comparación entre la utilización de array_key_exists() e isset()


Diagrama de llamadas a funciones de comparación entre la utilización de array_key_exists() e isset() de menos a mayor % utilizado

Así que como dice el dicho, “una imagen vale más que 1000 palabras”, la eficiencia queda demostrada.

Para concluir solo me queda aclarar un aspecto que alguno le debe descuadrar; se trata de ¿porqué en el caso de la utilización de isset() no tengo ninguna pega por lo que he comentado con el resto? Me refiero al hecho de no gustarme hacer referencias a posiciones de memoria inexistentes. Pues bien, el caso de isset() lo veo sustancialmente distinto, ya que por definición la función sirve para “determinar si una variable esta definida y no es NULL”, así que aparte de considerar que lo que va a hacer es verificar la existencia o inexistencia de una posición de memoria (en términos de definición de posiciones de memoria alocadas en tu programa), si la posición no existe no aparece ningún mensaje de notificación informando de ello, claro está sin anteponer @ a la llamada de la función; así que no me da la sensación de estar realizando algo que no es del todo correcto.


Hasta la próxima enfermos.

1 de julio de 2011

Un poco de colaboración y organización de equipos de trabajo sobre SharePoint 2010


Esta semana, concretamente el martes, he terminado las jornadas de formación de SharePoint que ha realizado Gepesa.

A lo largo de los tres días me enterado del potencial de está herramienta, que hasta el momento lo único que sabía es que permitía trabajar con archivos en un entorno compartido por múltiples usuarios controlando los accesos y gestionando el acceso concurrente, bloqueado y/o detectando conflictos.

Ahora ya sé que no solamente ofrece esa funcionalidad sino muchas más, las cuales aumentan la productividad de los entornos de equipos de trabajo o, incluso, de una organización al completo.

No obstante, después de todo lo que tiene la herramienta, sigue sin proporcionar las necesidades del entorno que tiene la empresa donde prestó mis servicios. Actualmente y desde hace ya un largo tiempo la empresa utiliza una herramienta, desarrollada íntegramente dentro de esta misma, que hace la funcionalidad de explorador de ficheros sobre carpetas compartidas en los servidores, pero controlando y garantizando que sólo un usuario puede estar modificando un documentos al mismo tiempo, es decir lo que viene ha hacer SharePoint, pero aquí no hay copia del documento al disco local de la estación de trabajo sino que se trabaja directamente sobre el documento almacenado en el servidor (Esto, por lo que me contaron, sólo se da de serie en SharePoint sobre ficheros de MS Word y utilizando Office 2007 hacia arriba).

En el entorno que se da actualmente en la empresa, realmente, no se accede a los servidores de ficheros directamente sino que se hace a través de un DFS junto con su servicio de replicación (DFSR), replicando los archivos en los distintos servidores de las distintas sedes de la empresa.

En el entorno mencionado, los usuarios se quejan constantemente de la lentitud de acceso a los ficheros, y llevan razón si lo comparamos con un acceso a un fichero en el disco local, pero si lo comparamos con un acceso remoto no lo es tanto, con ciertas excepciones, justificada por la inversión en hardware que se hace y el tiempo y recursos que se asignan a “los informáticos” para optimizar los sistema.

En fin, que tal y como está ahora, sí le pedimos a los usuarios que tiene que descargar cada vez que tiene que modificar un fichero (se trabaja con ficheros de distintos tipos, ficheros de programa de cálculo, planos de Autocad, ofimáticos y bastantes más) y luego volverlo a subir y desbloquearlo, nos montan una revolución, y no sería sin razón, ya que estarían empleando más tiempo en hacer lo que ahora hacen, aunque quedaría por analizar si empezar a usar este entorno aportaría ciertos beneficios que compensasen el tiempo de más que tendrían que emplear cada usuario, es decir ver la relación entre el tiempo empleado en los procedimientos de trabajo y la productividad obtenida en global, por ejemplo, este proceso es más costoso pero se obtiene beneficios por otra parte que optimizan el tiempo de otros procesos, aumenta la satisfacción del cliente, etc.

Además de la funcionalidad comentada, que es la que justifica mi asistencia a las jornadas, y como ya he dicho, SharePoint ofrece otras funcionalidades que ahora he podido ver que en la empresa se realizan a través de Lotus Notes (principalmente me refiero a la funcionalidad de BBDD documentales y “flujos” de trabajo (Workflows)) pero ni de lejos se llega al nivel de funcionalidad requerido y menos todavía a la sencillez de parametrización; que conste que con esto no estoy diciendo que IBM no tenga una herramienta o complemento de Lotus Notes que permita ponerse al mismo nivel que SharePoint, y tampoco estoy diciendo que nosotros estemos utilizando correctamente la herramienta, pero con el nivel de conocimiento actual y con los recursos que se asignan al Dpo. de TI, ya es mucho lo que se consigue, y llegar más allá requería una inversión, aún más, de nuestro tiempo libre, el cual nunca será valorado y mucho menos recompensado de algún modo.

Bueno dejando de parte la precaria situación, quiero mencionar que SharePoint ofrece (a mi parecer) de manera sencilla la definición de flujos de trabajo, no obstante su sencillez, no quiere decir que los "flujos” se crean automáticamente, sólo es una herramienta, la lógica la pone una persona con conocimiento del negocio"; espero que este último comentario no ofenda a nadie debido a su trivialidad, pero hay muchos que están ahí, en las cumbres directivas, que viendo una demo de esto, como yo he visto, ya se piensan que todo esto se hace automáticamente o con sólo 5 minutos del tiempo de uno de los "frikis" del Dpo. de TI, y con este erróneo concepto, se limitan a comprar una licencia del producto, creyendo que con esto ya lo tienen todo; y aún peor pasa cuando existe una versión que no se paga, porque el día que se enteran te sueltan que “los del Dpo. de TI de la empresa son unos apalancados, no innovan nunca, sino ¡mira!, ¡mira! Esto es gratis y ¿porqué no lo tengo en mi empresa?, La empresa tal (la de un colega suyo) tienen un sistema que hace todo esto, y yo no acabo de entender porque no lo tengo en la mía, blabla blabla”.

En conclusión, SharePoint, como muchas otras que habrán pero que no he tenido la ocasión de ver en una demostración, es una potente herramienta para entornos de equipos de trabajo, ofrece múltiples funcionalidades que permiten controlar accesos a los recursos compartidos, organización de la información, definición de flujos de trabajo, creación de espacios para compartir el conocimiento, y todo eso que favorece (no hace, eso lo hace la dirección creando políticas organizativas) que un equipo y en general una empresa, sea lo que por definición es: una ORGANIZACIÓN.

Para finalizar, quiero agradecer a Gepesa por el buen trabajo que ha hecho organizando estas sesiones, ya que han sido de muy buena calidad, demostrando a nivel práctico un buen conjunto de las funcionalidades y posibilidades que ofrece SharePoint 2010.

Hasta la próxima enfermos.

19 de junio de 2011

[PHP] Verificación de entradas en arrays multidimensionales (1/2)

conjuntoEntradas() {
  [PHP] Verificación de entradas en arrays multidimensionales (1/2)
  [PHP] Verificación de entradas en arrays multidimensionales (2/2)
}

Ya hace un tiempo que empecé un desarrollo de unas de mis pajas mentales con el conocido framework Web MVC (Model View Controller) denominado Zend Framework. Desde que empecé este desarrollo, el cual he tenido que interrumpir en algunas algunas ocasiones por ciertas obligaciones las cuales me gusté o no tengo que darle preferencias, además de solo poderle dedicar parte de los días que no me empleo en la empresa en la cual estoy contratado a tiempo completo, y digo parte, porque me es imposible no dedicar una parte de esos días a descansar, atender asuntos personales, buscarme la vida por otras partes o hacer otros hobbies muy necesarios para mí, me han ido surgiendo dudas sobre ciertos aspectos del lenguaje PHP; uno de ellos ya lo dejé plasmado en una entrada en este mismo blog hace algún tiempo.

Cuando empecé a descubrir las cosas que me ofrece el propio framework, a día de hoy aún me queda alguna cosa que funcionalidad más bien no por descubrir, sino por utilizar y conocer bien como se utiliza, me dí cuenta que a medida que iba desarrollando mis idas de olla, podría ir modularizando ciertos componentes, que me podrían servir para futuras pajas mentales, además de poder utilizar de manera extensiva en el desarrollo de esta; es decir lo que resumiríamos en arquitecturar código de programación para favorecer el reaprovechamiento mediante creación de componentes genéricos; algo así como ya han hecho los propios desarrolladores de dicho Zend Framework, de ahí que haya acabado en eso, en un framework.

Con todas esta paranoia que me dio y me continúa dando, por el reaprovechamiento basándome en la modularización; una de las cosas que más utilizo es la configuración de los componentes mediante ficheros de configuración, ya sean INI o XML, para poder reutilizarlos sin tener que escribir código de programación.

Zend Framework, ofrece unas clases para leer este formato de ficheros, y alguno más, y después poder obtener un array multidimensional de clave=>valor para posteriormente poder tratar el contenido desde PHP de una manera sencilla. De hecho el propio framework utiliza estos formatos para especificar las configuraciones de la aplicación web que se va a desarrollar y también para configurar parte de sus componentes.

Al empezarlo a utilizarlos en mis componentes y ver que necesitaba, en muchos casos, verificar la existencia de ciertos parámetros obligatorios en los ficheros de configuración, y esto lo tenía que hacer con la verificación de la existencia de claves dentro de los arrays multidimensionales, descubrí que desde PHP se ofrecen varias funciones o maneras de poder verificar la existencia de valores dentro de arrays, así que la paranoia de la optimización se apoderó de mi, provocando una curiosidad, necesaria por hacer cada componente algo más óptimo, por saber cual de ellas tiene un mayor rendimiento en cuanto a velocidad de proceso.

En los comentarios que dejan los usuarios en la documentación de PHP, en varias de las funciones que se pueden utilizar para verificar la existencia de claves, ya se puede saber que algunas de ellas son más óptimas que otras, por ejemplo, la función is_null(), tiene un rendimiento mucho peor que la comparación directamente con NULL, pero esta tiene un rendimiento más bajo si la comparamos con isset(), no obstante de todos estas funciones, aunque nos podrían servir para verificar la existencia de una clave, a mí, particularmente, no me gusta mucho tener que hacer referencia a valores que no van a existir si la clave no existe, que sería lo que tendríamos que hacer con is_null() y con la comparación con NULL, pongamos un ejemplo:

Defino un array que voy a utilizar para todos mis ejemplos y pruebas, dentro de este conjunto de entradas

$var1 = array(
        'clave1.0' => 'valor1.0', 
        'clave1.1' => 'value1.1',
        'clave1.3' => array (
            'clave2.0' => 'value2.0', 
            'clave2.1' => array(
                'clave3.0' => array(
                    'clave4.0' => 'value4.0'
                )
            )
        )
    );

Si quisiéramos verificar la existencia de una clave, con las dos maneas que he comentado, tendríamos que hacer lo siguiente:

if (is_null($var1['clave1.4'])) {
      print "La clave1.4 no exise \n";
  }

  if($var1['clave1.4'] === NULL) {
      print "La clave1.4 no exise \n";
  }

Funcionar, funciona pero no me gusta, porque para la verificación accedemos a una posición del array inexistente, por lo cual se genera para ambos caso el siguiente mensaje de notificación (eso si tenemos el PHP configurado para que notifique los errores del nivel NOTICE):

  PHP Notice: Undefined index: clave1.4 in /path/al/script.php on line NN

Aunque dicho mensaje podríamos provocar que no apareciese anteponiendo @ delante la función o delante la variable en el caso de la comparación con NULL.


Hasta la próxima enfermos.