Seguridad

UAC y Windows 7. Microsoft escucha.

Hace no mucho hablaban en kriptópolis sobre un fallo de seguridad en la configuración del UAC en Windows 7 que permitía a cualquier programa malicioso cambiar la configuración del UAC sin avisar al usuario, hasta desactivarlo, y por tanto poner en peligro todo el sistema.

Inicialmente en el blog de desarrollo de Windows 7 se descolgaron diciendo que:

Microsoft’s position that the reports about UAC do not constitute a vulnerability is because the reports have not shown a way for malware to get onto the machine in the first place without express consent

que traducido viene a ser que eso no es una vulnerabilidad porque los informes no han mostrado aún una forma de infiltrar malware en una máquina si que se le de consentimiento expreso... lo cual, a decir verdad, nos sonaba a todos como excusa barata.

Por suerte, en un movimiento tardío pero en mi opinión muy acertado, tras recibir bastantes feedback negativos, parece que se han echado atrás y han decidido que, efectivamente, constituye una vulnerabilidad:

we are going to deliver two changes to the Release Candidate that we’ll all see. First, the UAC control panel will run in a high integrity process, which requires elevation. That was already in the works before this discussion and doing this prevents all the mechanics around SendKeys and the like from working. Second, changing the level of the UAC will also prompt for confirmation.

Es decir, en primer lugar el UAC apartir de la release candidate pasará a ejecutar como un proceso de alta integridad, lo cual significa que no se puede atacar con procedimientos comunes (como el SendKeys que permite mandar pulsaciones de teclado a la aplicación) y por otro, TODA acción sobre el UAC que requerirá una elevación de privilegios.

Es sin duda una noticia excelente, por un lado por el fallo de seguridad que, en efecto, consituía el tipo de funcionamiento anterior, y por otro por comprobar que la gente de Microsoft, responde y tiene muy encuenta los comentarios que recibe de sus usuarios.

SQL Injection explicado

Introducción

La técnica de ataque de SQL Injectión (Inyección de SQL) explota una vulnerabilidad de la capa de acceso a datos de la aplicación. Es genérica a cualquier aplicación, no solo, como mucha gente cree, a aplicaciones web aunque debido al mayor acceso a través de internet así como al "descuido" de los desarrolladores web en muchas ocasiones a la hora de tratar los parametros GET ha hecho que este tipo de ataque se popularice en la web.

Anatomía del ataque

Un ataque basado en inyección de sql responde a una estructura de código en la que vamos a realizar una consulta o comando sobre una base de datos que contiene algunos parametros que nos suministra el usuario.

El problema se plantea cuando no se comprueba que dichos parametros sean válidos sino que el programador se ha limitado a concatenarlos en las partes correspondientes de la consulta, por ejemplo:

string consulta = "SELECT Count(*) FROM Users WHERE Name='" +
                   txtNombre.Text + "' AND Password = '" + txtPassword.Text + "'";

dicha consulta en principio devuelve el número de usuarios cuyo nombre y password coincide con los suministrados en los campos de texto indicados. El problema asociado a un atáque SQL Injection viene dado, no porque el código sea incorrecto sino porque se asume que los parametros de entrada son correctos, es decir, no se tienen en cuenta todas las posibilidades. Así si suponemos los siguientes valores para los campos

Buffer overflow explicado

Sin duda muchos de vosotros habréis oído hablar de una vulnerabilidad basada en un buffer overflow pero no os ha llegado a quedar claro que significa exactamente esto.

En general, cuando aparecen dichas noticias suelen ir asociadas al término "ejecución de código arbitrario" que es, en realidad, el verdadero problema. Vamos a ver un poco más a fondo lo que significa una vulnerabilidad de buffer overflow y lo que implica.

En primer lugar, la palabra overflow procede del inglés y quiere decir desbordamiento (de hecho existe el término desbordamiento de buffer en español, pero como tantas otras cosas, es mucho más habitual escuchar el término inglés). ¿Que significa esto? Pues ni más ni menos que lo que indica su nombre, que tenemos un buffer cuya capacidad se ha visto desbordada.

En la mayoría de los lenguajes de programación un buffer hace referencia a un puntero a memoria reservada que tiene un determinado tamaño, si intentamos meter datos de más tamaño del del buffer, este se desborda.

Podríamos pensar que cuando esto pasa se produce una excepción y listo (y en algunos lenguajes esto es exactamente lo que pasa) sin embargo en la mayoría de los lenguajes no ocurre, con resultados generalmente desastrosos.