El extraño caso de : El botón de Archivos de Compatibilidad que no existe en Windows 8
Avanzado
Nota: Este artículo surge como respuesta a una pregunta de mi amigo Jose A. Velarde pero lo que sería una respuesta en Facebook decidí convertirlo en un artículo de blog porque se que será del agrado de todos ustedes.
En Windows Vista existía un botón llamado "Archivos de compatibilidad" que aparecía en el explorador de Windows al visitar algunas carpetas del sistema, este botón ya no aparece en Windows 8 y tampoco hay forma de hacerlo ver.
De qué trata esta funcionalidad? existe en Windows 8?
De qué trata lo explicaré en este artículo, en Windows 8el botón fue removido porque por estadísticas de usablidad solo un porcentaje muy pequeño, casi nulo de usuarios lo usaban.
Se los explicaré de dos formas, la primera para quien quiera hacerse una idea y complementando con una segunda para quienes, como yo adoran conocer como funcionan las cosas a bajo nivel.
De qué trata este botón?
Recordarán que Windows Vista se caracterizo por ser un sistema muy restrictivo con las aplicaciones en comparación con su predecesor que fue Windows XP, Vista fue odiado por eso, lo que pocos saben es que gracias a eso hoy tenemos un sistema tan maravilloso como Windows 7 o mejor aún como Windows 8.
Windows Vista fue un sistema incomprendido.
Eran tiempos muy rudos…
Antes de Windows Vista los desarrolladores y sus creaciones (todo poderosos somos) , solíamos utilizar muchas rutas del sistema de archivo inapropiadas sin que nadie nos dijera nada en gran parte porque todos los usuarios eran administradores y por ende las aplicaciones se ejecutaban siempre con privilegios elevados.
Es así como miles aplicaciones podían escribir sus archivos de trabajo, temporales o lo que quisieran en cualquier carpeta incluyendo las carpetas de instalación y de trabajo del sistema operativo incluso en el directorio raíz.
Algo sumamente inconveniente primero por orden y buenas prácticas y segundo por seguridad, si una aplicación podría escribir en System32/ podía fácilmente escribir en uno de los drivers del sistema y dañarlos, de igual forma podría hacerlo en cualquier directorio reservado para otras aplicaciones.
No eran pocas las aplicaciones que de manera caprichosa escribían sus archivos en cualquiera de estos folder así que cuando te asomabas por ejemplo a c:\ encontrabas decenas de archivos que no podias siquiera borrar porque no había forma de saber que aplicación lo necesitaba para algo, misma situación si revisabas las carpetas del sistema donde decenas de archivos generados por cualquier aplicación compartían su ubicación con archivos del sistema que son ‘sagrados’.
Esta situación era el paraíso para todo malware, poder escribir en carpetas o archivos de sistema y poder pasar desapercibidos para el usuario.
Tiempo de poner la casa en orden
XP fue un sistema excelente, pero fue concebido en otra época donde el internet no era el principal agujero de seguridad de todo sistema, con el auge de internet se hizo evidente las falencias que tenia, muchas de ellas fueron subsanadas por Microsoft con el famosísimo service pack 2 que lo cambio todo.
Pero no había forma de que Windows pudiera soportar un sistema de seguridad más adecuado para los tiempos modernos sin hacer cambios de raíz en varios componentes de su kernel y en la forma en que las aplicaciones de Windows habían funcionado por años, era tiempo de poner la casa en orden y esto implicaba tomar decisiones severas para frenar a miles de aplicaciones que se habían programado mal y que al sistema antes no le importaba pero ahora y de manera radical tendría que importarle.
Windows Vista fue la pesadilla de la compatibilidad miles de aplicaciones que funcionaban de repente dejaron de hacerlo, los usuarios ya no eran administradores por defecto y aunque lo fueran las aplicaciones no se ejecutaban con credenciales de administrador salvo que se lo dijéramos explícitamente, les suena? si :UAC (User Account Control).
Nuevas restricciones a nivel de todo el sistema fueron un freno de mano que hizo que el sistema fuera detestado, pero créanme no haberlo hecho habría sido mucho peor.
Sin embargo pese a que muchos programas dejaron de funcionar muchos otros siguieron funcionando, fueron y son miles de programas que con los cambios introducidos en Windows Vista deberían haberse sumado a la orda de orcos, oops perdón, a la inmensa cantidad de programas que de por si no funcionaron más.
Pero Microsoft se encargo de tomar medidas atenuantes, si… pareciera que no pero fueron miles de miles de aplicaciones que siguieron funcionando y que no deberían hacerlo por los motivos que fueron expuestos y gracias a estas medidas siguieron y siguen funcionando hasta nuestros tiempos sin que la mayoría nos enteremos de ellos.
Son varias de estas medidas pero para este artículo solo nos interesan unas cuantas.
Explicación básica
Desde Windows Vista se incorporó funcionalidades para que programas antiguos "XP Style" que accedían a carpetas e incluso a entradas de registro ahora restringidas pudieran seguir funcionando sin inconvenientes.
El botón "Archivos de Compatibilidad" muestra todos los archivos que aplicaciones antiguas escriben en las carpetas restringidas y que por defecto no se muestran por una sencilla razón: NO ESTAN ALLÍ.
What??? así es no están allí pero las aplicaciones los escriben y los leen en esas ubicaciones porque Windows se encarga de enmascarar las solicitudes para que las aplicaciones no se revienten y crean que el sistema esta haciendo lo que piden, pero no es así.
El sistema se da cuenta que son aplicaciones compiladas para Windows XP o sistemas anteriores y en lugar de arrojar una excepción por escribir en un folder restringido crea una carpeta donde escribe los archivos que quiere escribir la aplicación y redirecciona a esa carpeta todos los llamados que se hacían dentro de la carpeta restringida.
El programa cree que todo esta funcionando como lo esperaba, pero realmente no es así.
Explicación avanzada
UAC, User Account Control es una característica que engloba muchísimas otras, todos recordamos e identificamos el dialogo de elevación de privilegios de una aplicación que sale desde Windows Vista. Pero dentro de esta funcionalidad hay muchas otras.
La característica que hemos revisado que permite a las aplicaciones escribir en carpetas restringidas hace parte UAC y se llama “Virtualización del Sistema de Archivos.”
Como lo vimos básicamente se encarga de hacer creer a la aplicación que esta trabajando en un directorio cuando realmente lo esta haciendo en otro sitio.
Cómo funciona?
Esta característica debe funcionar a nivel de todo el sistema y debe ser lo suficientemente rápida para que aplicaciones que usen activamente el sistema de archivos no se vean afectadas, además al ser una característica de seguridad dentro del sistema debe estar por encima de cualquier aplicación, esto es un driver, los drivers se ejecutan en modo kernel con privilegios elevados por ello tienen acceso a muchas más cosas del sistema.
En Windows Vista se incorporo el driver Luafv.sys que es un driver tipo filtro, este se encarga de recibir todas las peticiones al sistema de archivos justo antes de pasar los llamados al driver Ntfs.sys y es el responsable de realizar el enmascaramiento.
Si el driver detecta que es una aplicación compilada para un sistema igual a posterior a Windows Vista envía la solicitud directamente el driver del sistema de archivos dónde en efecto fallará si se trata de escribir en una ubicación a la que no se tiene permiso de escribir.
Si el driver detecta que es una aplicación compilada para un sistema anterior a Windows Vista y que esta tratando de acceder a un directorio restringido inmediatamente procede a enmascarar el path de la solicitud redireccionándolo a %userprofile%\AppData\Local\VirtualStore
y es luego envía la solicitud al sistema de archivos dónde la solicitud ya no arrojaría una excepción puesto que ya no esta escribiendo en un directorio restringido.
Luafv.sys debe funcionar rápidamente así que el no verifica todas las imágenes ejecutables en memoria para saber si es un ejecutable compilado para sistemas antiguos, en su lugar lo hace revisando un atributo del proceso que indica si se esta utilizando Virtualización de UAC, este atributo es asignado por el loader del proceso.
No te creo, demuéstramelo
Quería crear una demostración haciendo un programa, pero a sabiendas que esto le puede servir a muchas personas, no solo a desarrolladores he ideado esta demostración sin necesidad de una sola línea de código.
Abrimos una consola de comandos y vamos al directorio c:\Windows\ donde crearemos un archivo de texto con la frase “Hola Mundo” de la siguiente forma, obteniendo como resultado: Acceso denegado.
Ahora, sin cerrar la consola, abrimos una nueva consola pero esta vez nos aseguramos de ejecutarla como administrador y repetimos la operación obteniendo resultado exitoso, podemos revisar el archivo:
Si revisamos en el explorador de Windows vemos que el archivo esta allí:
Ya que lo hemos verificado, borrémoslo.
Hasta acá todo normal, porqué?
porque el ejecutable cmd.exe que es el de la consola de comandos esta compilado en este caso para Windows 8 así que esta haciendo las cosas bien, pero que pasaría si estuviera compilado para Windows XP?
Bien, al lanzar el proceso el loader carga el ejecutable y de acuerdo al formato PE (Portable Executable) busca en el header información que le indica para que sistema fue compilado.
Con base en ello, ya en memoria se establece un atributo llamado "UAC Virtualization" , todo ejecutable lo tiene y lo podemos comprobar revisando en el administrador de tareas de Windows donde debemos indicarle que muestre ese atributo en una columna adicional:
Revisando los dos procesos de la consola de comandos nos encontramos con esto
La que fue lanzada como administrador no permite virtualización de UAC, es lógico, y la otra lo permite pero esta deshabilitado dado que es un ejecutable compilado para Windows 8.
Sin embargo el administrador de tareas nos permite habilitar la virtualización de UAC, sobre el proceso donde esta Deshabilitada damos clic derecho y activamos la virtualización de UAC así:
Esto nos arrojará una advertencia que debemos aceptar.
Regresamos a la consola de comandos abierta sin elevación de privilegios y repetimos la operación solo que ahora el resultado es aparentemente exitoso:
Si vamos al explorador de Windows no vemos el archivo, es más, si damos la instrucción de búsqueda de archivo en la consola el archivo aparece pero el mismo comando en la consola abierta con privilegios no arroja nada!!!
Estamos viendo la virtualización del sistema de archivos en vivo y en directo!! Luafv.sys en acción!
Pero si el archivo no esta allí, dónde está?
Abrimos esta ruta en el explorador de Windows %userprofile%\AppData\Local\VirtualStore/Windows/
y … taraaaaaaaaaaaaaan!
Espero que les haya gustado esta visita a las entrañas de Windows!
hasta la próxima.