domingo, febrero 07, 2010

El percherón mortal


Como muchos de vosotros siempre leo algo todas las noches antes de quedarme dormido en la cama. Puede ser un ensayo, un comic, una novela, un libro técnico o una hojas impresas. El tiempo que me quedo leyendo suele ser muy variable. Pueden ser 2 minutos, o como me ha pasado con el último libro tres horitas cuando al día siguiente tenía que ir a trabajar.

Eso es lo que tienen los libros que enganchan, que como los buenos juegos son adictivos.

"El percherón mortal" (The Deadly Percheron) es una novela de un autor muy poco conocido como es John Franklin Bardin (1916-1981). Tan poco conocido que al parecer ni siquiera lo conocen muchísimos aficionados a la novela negra.

Se escribió en 1946 y aunque el campo de la psiquiatría ha podido ampliarse mucho desde entonces, te conmoverá todo el conocimiento que plasma el autor.

Desde el comienzo hasta el final la trama te sorprenderá. No puedo decir más.

Saludos.

martes, febrero 02, 2010

Z520 vs N270


Mi amiga Bo necesita un portátil a ser posible ligerito porque viaja mucho. Me pregunta por dos modelos concretos. Voy a darle el consejito, pero por supuesto se admiten sugerencias.

Ha mirado un poco lo que hay y le gustan dos modelos (que conste que a mí no me gustan tan pequeñitos):

1.-ASUS EEE PC 1001 HA. Me dice que viene con Windows 7 y cuesta 269 euros.
2.-ACER ASPIRE ONE 751. No me dice el S.O., aunque en el enlace que me ha enviado pone que Windows XP Home Edition. Bo me indica que la diferencia con el anterior son 30 euros, pero no me dice si más barato o más caro :-(

Esto es lo que dicen las cifras:

Pantalla Asus: 10,1 pulgadas.
Pantalla Acer: 11,6 pulgadas.

Peso Asus: <>
Peso Acer: 1,25-1,35 kg dependiendo de la batería que lleve.

Procesador y placa Asus: Intel Atom N270 de 1.6 GHz.
Procesador y placa Acer: Intel Atom Z520.

Disco duro Asus: 160 Gb.
Disco duro Acer: 160 Gb.

Memoria Asus: 1024 Mb DDR2.
Memoria Acer: DDR2 667/800 MHz 1Gb.

La chuleta para comparar los procesadores: http://ark.intel.com/ProductCollection.aspx?familyID=29035

Viendo estos datos yo te diría esto, Bo:

1.-La pantalla del Acer es mayor. No sé si esto es mejor o peor para tí. Mirando las medidas veo que el Acer es más ancho y largo, pero algo más fino que el Asus (muy muy poco).

2.-El procesador del Asus (N270) es ligeramente diferente al del Acer (Z520) y tienes que entender las diferencias para elegir el que prefieras.

  • En principio son de la misma fecha (2008).
  • Los dos tienen 1 core (nucleo) y 2 threads.
  • El Z520 funciona a 1,33 GHz en lugar de los 1,6 GHz del N270. Esto confunde un poco a la gente que puede pensar que el Z520 es inferior. Digamos que la ventaja de que funcione con una frecuencia menor es que consume menos watios y por lo tanto se calienta menos y las baterías duran más.
  • El Z520 trabajo con menos voltaje (0,75-1,1) que el N270 (0,9-1,1625).
  • Los dos incorporan tecnología Hyper-threading.
  • El Z520 incorpora Virtualization Technology (VT-x) y el N270 no. Esto a ti te da igual, pero para un informático puede ser importante. Aquí hay una lista de programas "especiales" que requieren el Intel VT o AMD-V.
  • El Z520 tiene "Idle States" y el N270 no. Esto sí te puede interesar cuando tiras de batería y el PC está bastante tiempo con poco uso. Se trata de entrar en la BIOS del aparato y activar un estado de bajo consumo. Me imagino que el procesador "tirará" menos, pero la batería durará más.
  • El z520 tiene una cosa llamada "Intel Demand Based Switching" y el N270 no. No creo que lo vayas a utilizar. Se trata de forzar por software una mayor frecuencia de reloj para mejorar el rendimiento del procesador. Lógicamente aumentarías el consumo.
3.-Con estas cosas que te he dicho creo que te estarás decantando por el Acer, pero tienes que tener en cuenta la última cosa: A mí me daría igual si no tuviera Sistema Operativo, si trajera un Linux, si viniera con XP, Vista,... Pero si vas a comprarlo con Windows creo que a estas alturas deberías elegir algo con el 7.

El Asus me decías que venía con Windows 7, pero en el enlace que me has pasado el Acer viene con XP. No creo que cueste mucho encontrarlo actualizado.

Saludos, y ahora sí, me tienes que decir que pone en el letrero Chino ese que me has regalado.

domingo, enero 31, 2010

Errores Oracle ORA-01033, ORA-01219, ORA-03113


Normalmente el sistema de codificación de errores Oracle ofrece información clara de lo que está ocurriendo. Sin embargo en algunas ocasiones surgen códigos de error que dan información demasiado imprecisa, y también puede ocurrir que depediendo de lo que intentemos salgan errores diferentes.

En una ocasión, una avería en la UPS (Uninterruptible Power Supply) provocó un corte de suministro eléctrico en un servidor Oracle. Se arrancó el servidor, pero cada vez que se intentaba acceder por SQL*Plus, Toad, Aplicaciones, etc. aparecía el error ORA-01033: Oracle initialization or shutdown in progress.

El servicio Oracle se encontraba corriendo sobre un cluster activo-pasivo (Service Guard de HP) y el comando #cmviewcl mostraba que el cluster estaba levantado y el paquete Oracle corriendo.

Por supuesto lo primero fue reiniciar el cluster:

cmhaltpkg oracle_servicio
-> Se para el paquete.

cmhaltcl -> Se para el cluster.

cmviewcl -> Todo aparece Down.

cmruncl -> Cluster levantado, todos los elementos UP.

Pero no resultó. Aunque el paquete parecía estar UP, Oracle no estaba en estado abierto. Daba el mismo error ORA-01033. Así que tocaba ver que estaba ocurriendo.

Desde la misma máquina, iniciando sesión con el usuario "oracle" entramos en sqlplus:

SQL>sqlplus “/as sysdba”

Y al probar ejecutar cualquier sentencia SQL, nos apareció un error similar al anterior, pero diferente...

SQL>select * from user_tables; -> Error ORA-01219. Database not open.

Con esos dos mensajes ya vemos lo que está ocurriendo. Por una parte nos indican que Oracle se está inicializando y por otra que la base de datos no está abierta.

Entoces toca saber cual es el estado de la base de datos...

SQL>select open_mode from v$database; -> MOUNTED.

Si la base de datos está montada lo siguiente sería abrirla. Intentamos levantarla...

SQL>alter database open; -> Error ORA-03113: End-of-file on communication channel.

Vaya, un tercer error diferente, y este ya no hace más que despistar. Lo que ocurre es que ha interrumpido la acción y ha dado por terminada la comunicación.

Probamos a desmontar y montar la base de datos y a ver si arranca de una vez:

SQL> shutdown immediate -> OK

SQL> startup mount -> OK

SQL> alter database open; -> Error ORA-03113: End-of-file on communication channel.

Está claro que necesitamos algo más de información. Vamos al log de Oracle (fichero alert_servicio.log) para ver si ha recogido algún detalle más:

Vemos que cada vez que hemos intentado el ALTER DATABASE OPEN, se registra el mismo error: ORA-00600: Internal error code. Arguments: [kcratr1-lastbwr]

Vaya, un error genérico de los que no dicen nada salvo por el argumento kcratr1-lastbwr.

Bien, pues llegamos al final. En mi caso ese "Internal Error" se solucionó simplemente con una recuperación de la Base de Datos. Esta recuperación consiste en aplicar los cambios almacenados en los ficheros de REDO (redolog files).

Teniendo la base de datos montada, hacemos una recuperación de la base de datos:

SQL> recover database; -> Media recovery complete.

SQL> alter database open; -> Database altered.

De esta forma la base de datos ya se quedó funcionando con normalidad.

Saludos.

miércoles, enero 27, 2010

Datacore caído

Puede que tengas alguna solución de alta disponibilidad basado en dos servidores Datacore.

Datacore es el producto líder en virtualización de almacenamiento. Además hay que remarcar que no es una solución propietaria de los grandes fabricantes como IBM, HP, etc. sino que puede funcionar con la mayoría de cabinas del mercado.

Una configuración habitual con dos cabinas y dos nodos suele ser la siguiente:

Cabina1 ---> Datacore1 ---> Servidores
Cabina2 ---> Datacore2 ---> Servidores


Los servidores Datacore se encargan de la replicación de datos entre ellos.
Cada servidor Datacore sólo ve su Cabina.

Si se cae una cabina, no pasa nada porque el otro servidor Datacore seguirá dando servicio.

Durante las pruebas realizadas en abril de 2009, teniendo Oracle en auténtica ebullición, quité la fibra que conectaba uno de los Datacores a los switch de fibra. La base de datos ni se inmutó. El mérito aparte de Datacore es también del HP-UX por supuesto.

El caso es, que creo que es necesario tener claro qué hacer si algún día se caen los dos servidores Datacore.

El problema ante una caída simultanea es que no es suficiente con volver a arrancar las cabinas, los servidores Datacore, y los servidores finales (en ese orden), porque los servidores Datacore van a quedarse en estado de Double Failure hasta que hagamos una serie de acciones.

En la imagen se ven los volúmenes virtuales (Virtual Volume) en estado de Double Failure y en diagnóstico: "primary and secondary volumes down".

Cuando en la ventana de arriba seleccionamos un Virtual Volume concreto, en la sección de volúmenes lógicos (Logical Volumes) de abajo vemos que tanto el volumen primario como el secundario están caídos (estado Down).

Pero tranquilos que tiene solución:

Primero hay que elegir entre uno de los Datacores. La consistencia se ha perdido por la caída y tenemos que indicar cual de los dos tiene los datos "buenos".

En igualdad de condiciones mejor coger como buenos los volúmenes primarios, ya que los servidores se habrán configurado para que preferentemente utilicen estos (preferred path). Pero bueno, todo depende de cómo esté el datacore de los volúmenes primarios (averiado...), de si pensamos que uno se ha apagado antes que el otro, ...

Lo que hay que hacer es ir a Logical Volumes, coger el primario o el secundario, darle al botón derecho y "star recovery using this volume as recovery base". En unos cuantos minutos el volumen lógico pasará a estado UP como se ve en la imagen. En la sección del Virtual Volume, el volumen virtual estará todavía en estado: "redundancy compromised".

El otro volumen (en la imagen de arriba sería el secundario) empieza a recuperar los datos a partir del que esta up. En la descripción viene: "Down. Local full recovery pending". Este proceso puede tardar incluso 20 horas para un volumen de 1 Tb. Después de esa larga espera los Datacores volverán a tener el volumen con la replicación activa y mostrarán el estado "Healthy".

Importante:

Una vez tomada la decisión de elegir uno de los datacores para la recuperación, no se debe solicitar lo mismo para el otro datacore porque se perderían todos los datos.

Si como en mi caso, los 4 volúmenes son para un servidor Oracle, la lógica dice que recuperes todos los volúmenes del mismo servidor Datacore. Recuerda que si Oracle encuentra ficheros con distintas marcas de tiempo no va a arrancar.

Saludos.

domingo, enero 24, 2010

Dangling cursor snarfing II

Vamos a analizar el ejemplo concreto de Dangling Cursor Snarfing II que proponía David Litchfield en 2006.

El otro día comenté las líneas generales de un ataque de este tipo. Recordad para el futuro que traduje el título como Snarfing de Cursor Colgado.

El paper original se encuentra en www.databasesecurity.com/dbsec/cursor-snarfing.pdf.

Este procedimiento se crearía por ejemplo con el usuario SYS y se le daría permiso de ejecución al resto de usuarios: Grant Execute on pwd_compare to public;

¿Qué hace el procedimiento?

  • Recibe como parámetro el usuario que lo está ejecutando.
  • Mira si el usuario es diferente que SYS.
  • Abre un Cursor con el paquete DBMS_SQL. Este paquete es un interfaz para utilizar SQL dinámico.
  • Ejecuta la sentencia SQL creada dinámicamente que lo que hace es buscar la password del usuario en la tabla SYS.DBA_USERS.
  • Compara esa password con un string concreto, y si coincide saca un mensaje.
  • Cierra el Cursor.
Pues en esta secuencia existen ya los elementos peligrosos que vimos el otro día para este tipo de ataque:

  1. El procedimiento se ha creado con un usuario privilegiado respecto al que lo ejecuta.
  2. Hay alguna comprobación antes de abrir el Cursor que va a dar guerra.
  3. Se abre un Cursor con SQL dinámico. En la SQL construida se utiliza un parámetro que le pasa el usuario que ejecuta.
  4. No hay captura de excepciones. Si se produce un error el Cursor va a permanecer abierto.

¿Qué puede hacer un usuario malicioso?

Se supone que el usuario (puede ser una aplicación) ejecuta el procedimiento de esta forma:

Ejecución del procedimiento PWD_COMPARE del usuario SYS:

SYS.PWD_COMPARE(X);

El desarrollador piensa que como parámetro del procedimiento (X) le van a pasar el nombre del usuario ejecutante, pero y si hace...

FOR I IN 1..10000 LOOP
X:='B' || X;
END LOOP;
SYS.PWD_COMPARE(X);

O sea, que ha creado un bucle que se va a ejecutar 10.000 veces.
En es bucle va concatenando la letra 'B' a la variable. Así que la cosa terminará con 10.000 B-s:

BBBBBBBBBBBBBBBBBBBBBBBBBB....BBBBBB.....BBBB....

Y pasa como parámetro esas 10.000 letras B.

Como el procedimiento no hace ninguna comprobación de longitud se producirá un error en la ejecución del paquete DBMS_SQL.

Ahora bien, se ha producido una excepción, pero no se ha capturado (para cerrarlo), y el cursor continúa en memoria.

Los cursores tienen como nombre un número entero. El atacante no lo conoce pero puede probar con un bucle probando con el 1, el 2, el 3, etc. Cuando lo encuentre podrá ejecutarlo tal cual, sin pasar por los controles previos del procedimiento original. En este caso particular podrá ejecutarlo indicando que es el usuario SYS. De esta forma obtendría la password del usuario SYS.

CURSOR_NAME:=1 (luego probará con el 2, 3, 4, 5, etc.)
DBMS_SQL.BIND_VARIABLE(CURSOR_NAME, ':u', 'SYS');
DBMS_SQL.DEFINE_COLUMN(CURSOR_NAME, 1, PWD, 30);
I := DBMS_SQL.EXECUTE(CURSOR_NAME);
IF DMBS_SQL.FETCH_ROWS(CURSOR_NAME) > 0 THEN
DBMS_SQL.COLUMN_VALUE(CURSOR_NAME, 1, PWD);
END IF;
DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
DBMS_OUTPUT.PUT_LINE('PWD: ' || PWD);

¿Y el antídoto?

Capturar la excepción y cerrar el cursor.

EXCEPTION WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(CURSOR_NAME) THEN
DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
END IF;

Por supuesto a nivel de aplicación siempre habría que limitar con una longitud máxima los campos que rellenan los usuarios.

Saludos.

martes, enero 19, 2010

Dangling Cursor Snarfing

Esta técnica debía ser "nueva" sobre noviembre de 2006 cuando David Litchfield publica su paper Dangling Cursor Snarfing: A new Clas of Attack in Oracle.

Hoy veremos el concepto y otro día ya veremos casos concretos. Entre esos ejemplos analizaremos el del paper, pero creo que el autor no fue muy afortunado con el ejemplo propuesto.

No he visto ninguna traducción de la denominación, pero creo que podría ser algo así como "Snarfing de Cursor colgado" (colgado o desconectado).

La idea es esta:

En la organización hay un proceso que lo pueden ejecutar los usuarios (por medio de alguna aplicación) de forma controlada. Este proceso puede ser un procedimiento PL-SQL creado con un usuario privilegiado de Oracle como SYSTEM, SYS, o cualquier otro al que un usuario o aplicación normal no tendría acceso.

La idea es que se les da a los usuarios o aplicaciones permiso de ejecución de ese procedimiento. La aplicación lo ejecuta, pero el mismo procedimiento realiza unas comprobaciones antes de abrir el cursor. Esas comprobaciones son necesarias porque por ejemplo hay que limitar el número de veces que se ejecuta al día, o hay que controlar el perfil del usuario de aplicación que lo ejecuta, etc. etc.

El cursor se construye dinámicamente en tiempo de ejecución y en la SQL participa un argumento que ha recibido el procedimiento por parte de la aplicación. Imaginemos que el dato lo obtiene la aplicación a partir del usuario.

Pues el "Snarfing de Cursor colgado" consiste en lo siguiente:

1.-El usuario malicioso pasa un argumento envenenado al procedimiento que provoca una excepción después de abrir el cursor y antes de que se cierre. Esto hace que el cursor se quede colgado en memoria.

2.-Como el desarrollador no captura la excepción para cerrar el cursor, el cursor sigue en memoria.

3.-El usuario, que es un pillo, sabe que el cursor se ha quedado abierto. Lo busca y bingo!!! Ya puede ejecutarlo sin las comprobaciones previas que el procedimiento realizaba antes de abrir el cursor.

En cuanto veamos unos cuantos ejemplos enseguida veréis lo peligroso que puede ser esto.

Saludos.

lunes, enero 18, 2010

Oracle hacking

Hoy en día Oracle es la base de datos estrella del mercado. Cualquier hacker que se precie lo conocerá tan bien como los desarrolladores. Teniendo en cuenta además lo que comentaba el otro día... es el sistema que más peligro tiene en tu organización y probablemente el más sencillo de ser hackeado.


"No hay que olvidar que el 70% de los ataques suele ser por parte de personal interno (Inside Factor). Este artículo está muy bien: http://www.segu-info.com.ar/amenazashumanas/amenazashumanas.htm "

Realmente el artículo es muy recomendable y explica lo que puede estar detrás de un ataque de este tipo. Símplemente como curiosidad os comento que según el estudio, el intruso interno más habitual suele ser el curioso.

Este post es el primero de una pequeña serie sobre oracle-hacking, o más bien de lo contrario: buenas prácticas para evitar el oracle-hacking.

Por cierto, os habéis preguntado de donde viene el término ORACLE?

Muchos dicen en broma que de ELCARO (ORACLE al revés) por el precio de las licencias. Pero el origen real es de lo más curioso.

Parece ser que el nombre tiene que ver con un antiguo proyecto de base de datos de la CIA denominado ORACLE que es ORÁCULO en inglés.
El oráculo es la respuesta de los Dioses a través de los sacerdotes, pitonisos,... Hay que reconocer que el nombre es de lo más apropiado.

Ya es tarde. Mañana más.
Saludos.

domingo, enero 17, 2010

Cansancio extremo


Como el año pasado por estas fechas, hoy también ha tocado hacer la que me parece la carrera más dura del mundo: La subida al Apuko (Apuko Igoera). La diferencia es que en lugar de la modalidad mountain bike este año he preferido la de "a pie". Y es que en esta prueba, la bicicleta no hace más que estorbar.

Si ya el año pasado el perfil era duro (16 km), este año lo han covertido en media maratón. Lo que ocurre es que ha debido haber un pequeño error y en la salida han avisado que había un exceso de 1 km.

22,2 km en total con bastante desnivel como se ve en la foto de arriba.

El Petu, sintiéndolo bien poco, no ha podido venir, jejeje, normal viendo lo que ocurrió el año pasado.


Bonita foto esta que he visto en la web del año pasado:


Nunca nunca nunca vayáis a una carrera de estas con una parrilla de estudiante... que vais a parecer unos globeros.


Por cierto, en el sorteo que ha habido entre los participantes me ha tocado un cuadro de bicicleta, así que el año que viene igual toca modalidad mountain bike.

Saludos.

jueves, enero 14, 2010

Sólo Internet difunde el drama


No todo es basura y pirateo en Internet a pesar de lo intentan transmitirnos. La última catástrofe ocurrida en Haití demuestra una vez más que hay situaciones en las que los mismos periodistas no tienen otra forma de saber lo que ocurre que conectarse a la Red.



Como señala el autor de este artículo, son muchos los casos en las que la prensa tradicional no llega y es a través de Internet como se conocen los hechos.

Por supuesto es un tema que no gusta nada a los Gobernantes que ven crecer un poder que no controlan. Ahora cierran webs por orden del Ministerio en cuatro días para proteger a los "artistas", mañana puede que nos quieran proteger de nosotros mismos y nos desenchufen Internet.

Saludos.

miércoles, enero 13, 2010

País de pandereta II


Continuando con el post del otro día...

Empieza a haber tímidas reacciones en contra de la decisión del Gobierno de censurar Internet en favor de un supuesto derecho fundamental que se lo han sacado de la manga para atacar otros derechos fundamentales que se supone que estaban garantizados.

Por decir algo diferente comentaré que lo más grave de toda esta serie de medidas (canon, cierre de webs, nueva Ley de desarrollo sostenible, estudio de corte de conexiones, etc.), es que según parece se negociaron en privado antes de las pasadas elecciones, y sin embargo no se metieron en ningún programa electoral. Esto da la sensación de que da igual lo que vote la gente que los partidos harán lo que les de la gana (así aumenta la abstención elección a elección, cosa que preocupa tanto a los políticos).

Recojo algunas de las reacciones:




Resulta que "Red Sostenible" ha cambiado de aspecto hoy mismo. Ahora es como lo he puesto en el encabezado de este post.



Y por último "La lista de Sinde". Recordad que Sinde es la Ministra de Cultura. Su nombramiento se consideró una provocación para los Internautas, y ahora ya sabemos de qué iba la cosa.



Como sigan "defendiendo la cultura" de esta forma van a terminar convirtiendo Internet en una mierda que sólo vale para ver pornografía.

Saludos.