domingo, 16 de octubre de 2011

Cerebros artificiales

Si la máquina más perfecta que conocemos es el cerebro humano, no es de extrañar que científicos de diferentes disciplinas, se esfuercen desde décadas en conseguir reproducir esta maravilla de la evolución.

En agosto de este año, IBM anunciaba la creación de un chip que imita el funcionamiento del cerebro humano, ahora, da un paso más y anuncia que en diez años tendrá listo un cerebro artificial, con un rendimiento similar a las 100.000 millones de neuronas de un cerebro humano. Pero como digo, este afán no es nuevo, ni siquiera por parte de IBM, que ya que en 1956 realizó una simulación cortical de 512 neuronas.

En este caso no se tratará de cerebros positrónicos formados por un globo esponjosos de platino e iridio, como los que la Doctora Susan Calvin construía en los libros de Asimov para la US Robots and Mechanical Men, Inc.

La literatura y el cine de ciencia ficción han abundado sobre este fenómeno; por llamarlo de alguna forma; con ordenadores “inteligentes” capaces de tomar sus propias decisiones, como VIKI, Skynet o HAL 9000, solo por citar algunos ejemplos, aunque si nos ceñimos a estos ejemplos concretos, quizá no debiéramos seguir por este camino, pero eso ¿cuando nos ha importado?. Quizá por ello, ya en 1942, en su libro “Runaround”, Issac Asimov describía las tres leyes de la robótica, como patrón de conducta esencial para todos sus robots.

Durante décadas, innumerables investigaciones han ido recopilando datos acerca del funcionamiento del cerebro humano y aunque este posee una complejidad extrema, se ha avanzado notablemente en su comprensión, pero esto no es suficiente y aún hoy son un misterio, por ejemplo, las causas por las que en determinados casos, las neuronas, las sinapsis entre ellas, etc., dejan de funcionar en el modo en el que lo venían haciendo y dan lugar a enfermedades como la Esquizofrenia, el Alzheimer, el Autismo y un largo etcétera, que las neurociencias tratan de desvelar y aún no lo han conseguido.

Quizá uno de los problemas que se han encontrado los científicos, es que a lo largo de un siglo de investigaciones en neurociencias, se ha producido una ingente cantidad de información, que nunca ha sido reunida de forma que se pueda ser aprovechada completamente.

En este momento, la tecnología se encuentra lo suficientemente avanzada como para permitir un salto cualitativo en esta materia, pero como indica el neurocientífico Henry Markram del Brain Mind Institute de Lausana (Markram trabaja en el Blue Brain Project desde 2005, que por cierto, utiliza el servidor Blue Gene de IBM), el problema es que... 

 “aunque técnica y biológicamente sea posible, el proyecto es extremadamente caro”.

Las vertientes por las que discurren las investigaciones orientadas a reproducir el cerebro humano, son diversas y en cierto modo, con distintos propósitos. La mayoría de las investigaciones se orientan hacia la comprensión de enfermedades y síndromes neurológicos, pero quizá no todas ellas tengan un fin similar. Me sorprenden, por ejemplo, artículos como el publicado en 2004, en el que asegura que...
“un científico de Florida ha desarrollado un cerebro que es capaz de hacer volar un avión de combate virtual. Este ordenador viviente se cultivó a partir de 25.000 neuronas que se extrajeron del cerebro de un ratón y se colocaron sobre una cuadrícula de sesenta electrodos en una placa de Petri.”
Ahora, en el anuncio que hacía IBM hace unos días, respecto de tener desarrollado un cerebro artificial en diez años, se indicaba que para este proyecto, IBM está trabajando con la Defense Advanced Research Projects Agency (DARPA), para la ejecución de la segunda fase del proyecto SyNAPSE (Systems of Neuromorphic Adaptive Plastic Scalable Electronics). Evidentemente, esto por si solo no quiere decir absolutamente nada, pero ¿por que ha elegido IBM como partner a una organización militar?.

Quizá estemos ante el preludio de una nueva fundación ;-).

lunes, 3 de octubre de 2011

Ataques por SQLInjection, un clásico

Afortunadamente, cada vez es más difícil encontrar una web vulnerable a un ataque por SQLInjection, en realidad solo es cuestión de aplicar buenas prácticas en el desarrollo. Algo tan sencillo como hacer convenientemente un parseo previo de los datos introducidos en nuestra web, nos puede evitar sobresaltos por ataques como SQLInjection o XSS, por ejemplo.

Aunque por lo general, protegerse ante este tipo de ataques es una práctica habitual, como tan habitual es protegerse ante un fallo inesperado de tu programa, sencillamente con instrucciones Try/Catch, por ejemplo, la verdad es que aún podemos encontrar "descuidos". Estos descuidos son muy fáciles de corregir, pero de no hacerlo a tiempo, si los "señores del sombrero negro" lo descubren, a buen seguro lo van a aprovechar, o sencillamente se van a divertir borrando o manipulando nuestros datos.

De vez en cuando, navegando por la red, cuando accedo a un formulario de Usuario/Contraseña, suelo tener la tentación de comprobar si han sido cuidadosos o no, con la diferencia de que cuando lo encuentro; yo, que soy un caballero :-); aviso de la desprotección.

Por lo general, cuando un formulario de Usuario/Contraseña está un poco descuidado de aspecto, es probable que también esté descuidado en protección.

Algo tan sencillo como introducir una comilla [ ' ] en el campo del Usuario y si al Aceptar tenemos algo así como:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Comilla no cerrada antes de la cadena de caracteres '' AND CLAVE=''.
/xxxx/yyy/login.asp, línea zz

estamos ante uno de estos "descuidos". Ya solo es cuestión de seguir poco a poco para "colarse hasta la cocina". 

En realidad, todo se basa en hacer fallar el procesamiento del formulario y que la información de fallo que nos muestre, nos vaya dando pistas acerca de nombre de tabla, nombres de campos o los propios datos en sí.

No hace falta buscar con demasiado ahínco en la red, para encontrar auténticos manuales de como hacer un SQLInjection. Con esto y unos conocimientos básicos de SQL, en muchos casos es suficiente para colarse en una web, modificar datos o directamente borrarlos, dependiendo de "la mala leche" del que lo encuentre.

No pretendo hacer apología del SQLInjection, ni mucho menos. Cualquiera que tenga el más mínimo interés en el tema, encontrará en la red, información más detallada y precisa de lo que yo pueda mostrar, a modo de ilustración, en este post.  

Como indicaba anteriormente, el proceso consiste en ir provocando sucesivos fallos en cada paso, de forma que cada uno, nos aporte información adicional a usar en los pasos sucesivos.

Veamos un ejemplo:
Para empezar, un primer dato...
Introduciendo como Usuario' HAVING 1=1 -- , el error que se nos muestra, es la punta del ovillo que estábamos buscando:

[Microsoft][ODBC SQL Server Driver][SQL Server]La columna 'CLIENTES.IDCLIENTE' de la lista de selección no es válida, porque no está contenida en una función de agregado y no hay cláusula GROUP BY. 

ya tenemos dos datos, el nombre de la tabla y el primero de sus campos. Ahora a por los siguientes...
Introduciendo como Usuario' GROUP BY CLIENTES.IDCLIENTE HAVING 1=1-- , tenemos el siguiente dato:

[Microsoft][ODBC SQL Server Driver][SQL Server]La columna 'CLIENTES.NOMBRECLIENTE' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.

... y así campo por campo hasta conocer la estructura de toda la tabla.

El siguiente paso es hacer fallar el sistema en la conversión de un tipo de dato, para que nos muestre el valor del dato que no se puede convertir.
Introduciendo como Usuario: ' AND CLIENTES.IDCLIENTE IN (SELECT TOP 1 CLIENTES.NOMBRECLIENTE FROM CLIENTES WHERE CLIENTES.NOMBRECLIENTE LIKE '%A%') -- , tenemos el siguiente dato:

[Microsoft][ODBC SQL Server Driver][SQL Server]Error de sintaxis al convertir el valor varchar 'Mi Nombre de Cliente' para una columna de tipo de datos int.

Este es solamente un ejemplo; que por prudencia no he querido mostrar completo, para ilustrar lo simple que puede ser acceder a unos datos en una web vulnerable a este tipo de ataque. 

Como se puede ver, no hace falta ser un avezado hacker, para realizar este tipo de intrusiones, aunque evidentemente, no todos los casos son tan sencillos como este.