Virtualización de procesos II: Virtualización del Sistema de Archivos en Windows Vista

Dado que el mes pasado ha sido el primer mes que hemos impartido los HANDS ON LAB de virtualización en Windows Server 2008 después de la salida oficial de Hyper-V, me he animado a escribir la segunda parte del artículo sobre “virtualización de procesos” que ya publicamos hace unas semanas en este blog y que podéis ver aquí:


 

Virtualización de procesos I: Virtualización del registro en Windows Vista 

En esta ocasión abordaremos la virtualización de procesos ante los errores de escritura en el sistema de ficheros y ahondaremos más en esta tecnología para poder controlar que aplicaciones son virtualizadas y cuales no.

 

Haciendo un breve repaso, recordemos que Windows Vista es capaz de virtualizar aplicaciones ante errores de escritura tanto en el registro de Windows como en el sistema de ficheros, siempre y cuando tengamos el “Control de Cuentas de Usuario” (UAC), habilitado, ofreciéndonos la ventaja de conseguir que una mayor cantidad de aplicaciones, sobre todo aplicaciones antiguas y heredadas, sean capaces de funcionar sin requerir privilegios administrativos (recomiendo que releáis la primera parte del artículo para que no perdáis el hilo).

 

La virtualización del sistema de ficheros es similar a la virtualización del registro: cuando una aplicación “virtualizada” intenta escribir en una ubicación donde por defecto no tiene permisos de escritura (algo que generalmente ocurre por una mala programación o por una incompatibilidad cuando la aplicación procede de sistemas operativos anteriores), dicha escritura es redirigida a una ubicación donde el usuario si dispone de los permisos apropiados, “engañando” de esta manera al proceso afectado que no sabe que en realidad está escribiendo en otro sitio. De esta manera evitamos la necesidad de usar “privilegios administrativos” para ejecutar ciertas aplicaciones que por regla general no ofrecen ventaja administrativa alguna.

 

Hecho este repaso, vamos a realizar un ejemplo de virtualización con Windows Vista, similar al que ya realizamos en el anterior post sobre esta tecnología, pero cambiando el registro de Windows por el Sistema de ficheros.


 


 

Ejemplo de virtualización 

La aplicación elegida para la práctica en este caso es el CMD, que deberemos ejecutar mediante un usuario estándar sin privilegios administrativos, o bien (para los que entendáis como funciona esto del UAC), con un usuario administrativo pero ejecutando el CMD mediante el “token” de usuario corriente.

 

Una vez estemos en el CMD podemos probar a intentar crear un fichero o carpeta en alguna de las ubicaciones tradicionales donde por defecto un usuario corriente no tiene privilegios de escritura como %programfiles% o %Windir%. El mensaje que nos devolverá el sistema, como es lógico, es de “Acceso Denegado”.

 

 

Para evitar dicho “Acceso Denegado” vamos a virtualizar el CMD. Para ello nos dirigimos al “Administrador de Tareas” y pinchamos en la pestaña “Procesos”, abrimos el menú contextual sobre el proceso “cmd.exe”, seleccionamos “virtualización” y pulsamos en “Aceptar” sobre la advertencia que nos aparece de que la aplicación podría tener u comportamiento inesperado (precisamente eso es lo que buscamos).


 



 


 


Una vez que ya tenemos el CMD en estado “virtualizado”, regresamos a él e intentamos realizar un “mkdir” sobre cualquiera de las ubicaciones donde anteriormente nos devolvía acceso denegado ¡¡Se nos crea la carpeta sin devolvernos ningún error de acceso!! Y si jugueteamos un poquito más podemos comprobar que al hacer un “dir /ad” nos aparece listada la carpeta e incluso podemos crear ficheros en ella, sinembargo si navegamos a dicha ubicación con el explorador o abriendo un nuevo proceso cmd, la carpeta no aparece por ningún sitio. La carpeta solo es visible para procesos virtualizados, por ejemplo, si queréis ver la carpeta desde otro proceso cmd deberéis virtualizar también dicho proceso.

 

Ahora surge la pregunta clave: si la carpeta no existe realmente en la ubicación donde realizamos el mkdir ¿dónde se crea realmente? Pues en aquel lugar donde un usuario corriente tenga permisos de escritura, es decir, en el perfil del usuario, concretamente en “%userprofile%AppdataLocalVirtualStore”.


 

 

Después de divertirnos virtualizando procesos, si lo deseamos, podemos echar un vistazo al “visor de eventos” para comprobar la información que se ha registrado ahí referente a la virtualización.

 

 


 

Ahondando en la virtualización: 

Ya hemos visto como se puede virtualizar manualmente un proceso, y conocemos los aspectos más significativos de este sistema, pero nos falta dar respuesta a otras preguntas interesantes como:

 

¿Es posible auditar los intentos de escritura que son virtualizados?


¿Cómo sabe Windows Vista que aplicaciones debe virtualizar?


¿Cómo puedo hacer para que mis aplicaciones sean o no sean virtualizadas?

 

En esta parte del post iremos dando respuesta a estás preguntas a modo de FAQ y nos sumergiremos un poquito más en Virtualización y el UAC.

 

Vamos con la primera pregunta:


 

¿Es posible auditar los intentos de escritura que son virtualizados? 

Si, es posible auditar los intentos de escritura virtualizados, tanto en Windows Server 2008 como en Windows Vista.

 

Windows trata las escrituras virtualizadas como procesos de escritura “correctos” de cara a los registros de auditoría (no los trata como errores de escritura), de manera que habilitando la típica “auditoria de acceso a objetos” en las políticas, y la “auditoria correcta de escrituras” en la pestaña de seguridad de la carpeta correspondiente esteramos automáticamente auditando también los procesos de virtualización acontecidos sobre dicha carpeta.


 

¿Cómo sabe Windows Vista que aplicaciones debe virtualizar?  

Antes que nada debemos recordar que el propósito de la virtualización de procesos es que aplicaciones heredadas, no diseñadas para trabajar con Windows Vista, puedan funcionar sin ningún tipo de problema con bajos privilegios.

 

Las aplicaciones que se diseñen para Windows Vista o Windows Server 2008, deberían cumplir las especificaciones de este sistema operativo y ejecutarse sin problemas como un usuario  corriente avisando a este en el caso de que la aplicación requiera de privilegios administrativos. Por tanto las aplicaciones programadas para Windows Vista no deberían requerir virtualización.

 

Teniendo esto en cuenta vamos a comprobar las condiciones que deben cumplirse para que Windows determine que una aplicación “NO” necesite virtualizarse:

 

  • Aplicaciones de 64bits. Se considera que son aplicaciones modernas y por lo tanto deberían estar preparadas para ejecutarse correctamente según los requisitos de Windows Vista y Windows Server 2008.
 

  • Servicios de Windows. Aunque estos se ejecuten con una cuenta de usuario estándar.
 

  • Aplicaciones con una “solicitud de nivel de ejecución” declarada en su “manifiesto”. La “solicitud de nivel de ejecución” es un nuevo elemento de Windows Vista y Windows Server 2008 que permite a Programadores y Administradores personalizar la manera en que sus aplicaciones interactúan con el UAC. Se considera que todas las aplicaciones adaptadas a Windows Vista deberían incluir este elemento en sus manifiestos internos. Cuando una aplicación tiene configurada una “Solicitud de nivel de ejecución” en su manifiesto, se considera como “no heredada” y no se virtualizará.

 

¿Cómo puedo hacer para que mis aplicaciones sean o no sean virtualizadas? 

Según las condiciones que hemos visto en el punto anterior, todas las aplicaciones son automáticamente virtualizadas menos en casos específicos como que la aplicación sea de 64 bits o que en su manifiesto interno aparezca información para interactuar con el UAC. No obstante puede que nos interese virtualizar aplicaciones que no son virtualizas automáticamente o no virtualizar aquellas otras que se virtualizan de manera automática.

 

Si NO deseamos que nuestras aplicaciones sean virtualizadas de manera automática tenemos tres opciones:

 

  • Deshabilitar el UAC
 

  • Configurar la política de grupo oportuna, como ya mencione en el primer post sobre este asunto.
 

  • Agregar en el manifiesto de la aplicación una entrada de “solicitud de nivel de ejecución”  (Ver Caso Practico)

 


Caso Práctico: Impidiendo la virtualización de aplicaciones heredadas mediante la edición de su manifiesto:


Como acabamos de ver, la manera más interesante para impedir la virtualización de una aplicación es modificar su manifiesto, pero ¿que es un manifiesto?


 


Un manifiesto es un pequeño fichero XML que describe aspectos de una aplicación, como la versión, el fabricante, las dll requeridas, las dependencias etc. Dicho manifiesto  puede ser interno (integrado en la propia aplicación) o externo (en un fichero con el mismo nombre pero con la extensión .manifest).


 


En su origen los manifiestos nacieron como una manera sencilla y eficaz de solucionar el conocido como “Infierno de las dlls”, al hacer la propia aplicación referencia a la versión de DLL que deseaba utilizar. Con el tiempo, los manifiestos han sido utilizado para diversos propósitos incluida la interacción de las aplicaciones con el UAC en el caso de Windows Vista.


 


Bueno, ahora que sabemos lo que es un manifiesto, solo nos queda editarlos, pero ¿como podemos editar un manifiesto de una aplicación? Pues con una herramienta versatil, sencilla y gratuita como XNResourceEditor 


 


Lo único que teneis que hacer es ejecutar la aplicación, pulsar en “OPEN” y seleccionar el .exe que deseeis editar.


 



 


Aunque nos aparecen varias carpetas de recursos, la que nos interesa en nuestro caso es la etiquetada como “XP Theme Manifest” que nos mostrará el manifiesto de la aplicación seleccionada, si este existe.


 


Si comparamos los manifiestos de una aplicación basada en XP (imagen superior) con otra basada en Windows Vista (imagen inferior) podremos ver una diferencia interesante ¿la encuentras?.


 



 


En efecto, la principal diferencia es algo asi como:


 


<trustInfo xmlns=”urn:schemas-microsoft-com:asm.v3″>
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel
                level=”asInvoker”
                uiAccess=”false”
            />
        </requestedPrivileges>
    </security>
</trustInfo>


 


Esta parte del manifiesto indica el modo en que la aplicación desea relacionarse con UAC, la conocida como “solicitud de nivel de ejecución” que ya indiqué con anterioridad.


 


Ya podemos ir uniendo hilos…


..si deseamos que nuestra aplicación de XP no se virtualice automaticamente, lo unico que tenemos que hacer es agregarle una “Solicitud de nivel de ejecución” similar a la de arriba.


 


Vamos a probarlo en la práctica. En mi caso voy a utilizar una herramienta tradicional de Windows XP que MUCHOS de nosotros echamos de menos en Windows Vista: “el PinBall”


 


Lo unico que tenemos que hacer es copiar la carpeta %programfiles%Windows NTPinball de un equipo con WindowsXP a otro con Windows Vista, ejecutar el juego y comprobar si Windows Vista lo virtualiza o no de manera automática desde el “Administrador de tarteas”


 



 


En la imagen superior podemos ver claramente que PINBALL.exe aparece como Virtualizado (la columna “Virtualización” no aparece de manera automática y es necesario agregarla desde “Ver>Seleccionar Columnas”)


 


Vamos a impedir que el PINBALL se virtualice, para ello abrimos el fichero PINBALL.exe con la aplicación XNResourceEditor, vamos a “XP Theme Manifest” y bajo la etiqueta </dependency> pegamos la “Solicitud de nivel de ejecución” que deseemos (copiada de una aplicación de Windows Vista o de este mismo blog). Guardamos la aplicación en la carpeta del juego como PinBallNOVIRT.exe (XNResourceEditor no es capaz de sobreescribir el fichero desde el que esta leyendo por lo que debemos guardarlo con otro nombre) y lo ejecutamos.


 



 



 


¡¡¡FUNCIONA!!! Ya no aparece como virtualizado…


 


Para terminar, el último caso que puede interesarnos es virtualizar un determinado intento de escritura para una aplicación que no sea automáticamente virtualizada. Lógicamente la manera más sencilla de hacerlo sería modificar el manifiesto de la aplicación y eliminar la entrada de “solicitud de nivel de ejecución” para que la aplicación se considere como heredada, no obstante Microsoft nos ofrece una alternativa, más compleja, pero más profesional: “Application compatibility Toolkit 5.0” (ACT 5.0)

 

ACT5.0 está pensada para solucionar los problemas de compatibilidad que una aplicación puede presentar en Windows Vista. Es una herramienta ideada para que las empresas puedan identificar y distribuir soluciones a problemas de compatibilidad conocidos de manera corporativa y en forma de pequeños parches. Podéis descargar esta herramienta gratuitamente desde el siguiente enlace:


 


http://www.microsoft.com/downloads/details.aspx?FamilyID=24da89e9-b581-47b0-b45e-492dd6da2971&displaylang=en

 

ACT5.0 no virtualiza las aplicaciones de la misma forma que hemos tratado en este post, pero si es capaz de “virtualizar” o “redirigir” determinadas escrituras para que una aplicación funcione con normalidad. No obstante ACT es una herramienta extensa, que dará para varios posts en este mismo Blog en un futuro, y esto ya me esta quedando demasiado largo (como de costumbre), de manera que con la mención a esta herramienta creo que puedo dar por finalizado este tema…

 

Como siempre, gracias por vuestro tiempo, y os animo a seguir cotilleando lo que hay “dentro” de vuestro Windows Vista, que no es poco.

  

5 comentarios en “Virtualización de procesos II: Virtualización del Sistema de Archivos en Windows Vista”

  1. Muchas gracias por tus dos artículos, me han ayudado a entender un poco mas WV y a abandonar algunos pre-juicios (me acuerdo de lo de las campañas constatadas de los creadores de malware).

    Quedan muchas cosas por descubrir pero me gustaría saber tu opinión sobre dos cuestiones sobre la ‘mentalidad’ de WV, que me surjen de la lectura de tus dos trabajos:

    1 Al elegir virtualizar en el menú emergente del administrador de tareas, WV responde con una ventana que dice que la operación de cambio de virtualización solo debe hacerse a efectos de depuración. ¿no significa esto que este no debería ser el camino? Es como si dijera que para resolver el problema de los programas que requieren privilegios que no les corresponde, WV tuviera otra solución (dentro de WV, quiero decir).

    2 ¿Por qué para poder virtualizar una aplicación manualmente, – por un ‘mindundi’, se entiende – , WV ha considerado necesario utilizar el administrador de tareas, con la aplicación en ejecución? ¿Que pasa si la aplicación requiere los privilegios del administrador para arrancar?

  2. Un saludo José, vamos con la respuesta a tus cuestiones:

    1º- El mensaje que te devuelve Windows Vista avisandote de que la operación solo debería realizarse por depuración es completamente lógica.

    Windows Vista solo virtualiza aplicaciones de manera automática si se determina que proceden de versiones de Windows anteriores (si no disponen de una configuración de petición de elevación en su manifiesto). Esto significa que aquellas aplicaciones que puedas virtualizar desde el “administrador de tareas” son nativas de Windows Vista y por tanto necesitarían ser virtualizadas a no ser que fuera por labores de depuración.

    En los ejemplos que tomamos en los articulos usamos el “regedit.exe” y el “cmd.exe” que son nativos de Windows y no necesitan ser virtualizados, pero son muy representativos para mostrar el funcionamiento de este sistema.

    2º-Cuando ejecutas algo con privilegios administrativos (el TOKEN de administrador en el UAC), dicha aplicación tiene plenos privilegios sobre %windir% y %programfiles% por lo que no se virftualizan sus accesos.

    La “virtualización manual” se realiza a nivel de procesos, por lo que el “Administrador de procesos” es la mejor herramienta para hacerlo, recuerda que cualquier aplicación heredada de Windows XP no necesita de una virtualkización manual dado que se virtualiza automaticamente.

    Un saludo Jose, y gracias por leernos.

  3. En el trabajo me asignaron un nuevo equipo con Windows Vista, respalde mi información de la maquina anterior con Windows xp, pero al visualizar con el Explorer de la nueva maquina, en las carpetas respaldadas no se visualizan ciertos archivos como los .exe, .scr y otros, tengo entendido que están ahí porque cuando comparo el tamaño de las carpetas en las dos maquinas me da la misma cantidad de archivos pero no los puedo visualizar esto en todas las carpetas que respaldé, como le hago? Espero respuesta mi correo es wandatgz@hotmail.com gracias

  4. En el trabajo me asignaron un nuevo equipo con Windows Vista, respalde mi información de la maquina anterior con Windows xp, pero al visualizar con el Explorer de la nueva maquina, en las carpetas respaldadas no se visualizan ciertos archivos como los .exe, .scr y otros, tengo entendido que están ahí porque cuando comparo el tamaño de las carpetas en las dos maquinas me da la misma cantidad de archivos pero no los puedo visualizar esto en todas las carpetas que respaldé, como le hago? Espero respuesta mi correo es wandatgz@hotmail.com gracias nota: un dato mas tengo cuenta de administrador y la información la guarde en una carpeta llamada respaldo en la raiz de C:

  5. Hola,
    Ante todo muchas gracias por los 2 post, muy interesantes.

    En mi trabajo realizo pruebas de software sobre un Vista Home Basic, con UAC desactivado. Sin embargo cuando instalo una aplicación, guarda la información en Appdata, y no el en la raiz (c:program files), es decir virtualiza la instalación. La aplicación fue desarrollada para Windows XP, pero se modificaron dll para hacerla compatible con Vista. Se puede desactivar la virtualización a nivel de registro?
    El Vista Home basic no tiene políticas de grupo.

    Muchas gracias!

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *