Nos puede ocurrir que una aplicación web que utiliza un ActiveX para acceder al disco local, y que lleva bastante tiempo en producción sin presentar ningún tipo de problema, nos dé errores por Permiso Denegado (Permission Denied) cuando la utilizamos desde un cliente con Windows 7 e IE8 (o Windows Vista + IE7).

ActiveX_ModoProtegido_1

Cuando revisamos el problema, determinamos que el control ActiveX está provocando el error al acceder (modo escritura) o crear un archivo, cosa que antes, desde un cliente Windows XP con IE6 o IE7, no pasaba.
El problema al que nos enfrentamos está relacionado con las características de seguridad que nos proporcionan Windows 7 e Internet Explorer 8, en concreto, con el Modo Protegido.

¿Qué es el modo protegido?

El modo protegido proporciona protección extra ante software malintencionado que puede estar presente en determinadas páginas web. También es responsable de controlar la autorización para la instalación de los controles ActiveX en nuestra máquina.

ActiveX_ModoProtegido_2 El Modo Protegido está presente desde Windows Vista e Internet Explorer 7 y depende de las siguientes características de seguridad:

Para el caso que nos ocupa, debemos entender un poco mejor cómo funciona el MIC, que es en realidad una extensión del modelo de control de acceso a los recursos del sistema, en el que aparte de verificar el la lista de control de acceso a un recursos (los permisos), también se verifica la “confiabilidad” del proceso que solicita el acceso.

Resumiendo mucho, el MIC se basa en tres puntos:

  1. Los objetos (directorios, archivos, claves de registro…) pueden tener una etiqueta de integridad, si no la tienen se asume "integridad media" por defecto.
  2. Los procesos se ejecutan a un determinado nivel de integridad (Integrity Level, IL).
  3. Un proceso no puede acceder a un objeto (para modificarlo) si su nivel de integridad es menor que el del objeto (o no tiene etiqueta de integridad).

¿Cuál es el problema?

Cuando Internet Explorer funciona en Modo Protegido, el MIC asigna al proceso de IE una etiqueta de integridad baja, o lo que es lo mismo, el MIC informa al sistema de que el proceso no es muy confiable (lo ejecute quien lo ejecute).

ActiveX_ModoProtegido_3

Por defecto, los directorios de nuestro equipo están marcados con una etiqueta de integridad “Media” (directorios de usuario) o “Alta” (directorios de sistema), excepto:

  • Directorio de Archivos Temporales (%TEMP%\Low, Internet y Windows).
  • Directorios de IE: Historial, Cookies y Favoritos.
  • Directorio de datos del usuario: %userprofile%\AppData\LocalLow

En conclusión, el Permiso Denegado se está produciendo porque el control ActiveX está intentando escribir en un directorio (o archivo) que está marcado con integridad media o alta, mientras que el proceso de Internet Explorer se está ejecutando con integridad baja y eso está explícitamente prohibido.

¿Cómo lo resolvemos?

Hay diferentes alternativas para solventar este problema:

  • Modificar el código para escribir en un directorio con baja integridad.
  • Cambiar la etiqueta de integridad del objeto (directorio o archivo) al que se quiere acceder.
  • Crear un enlace a un directorio (directory junction) con baja integridad.
  • Agregar la web a sitios de confianza.

Modificar el código

Si tenemos la oportunidad (disponemos del código fuente), lo mejor que podemos hacer es cambiar la carpeta destino sobre la que queremos actuar. Para ello modificaremos nuestro ActiveX para que escriba en “%temp%\Low” o en “%userprofile%\AppData\LocalLow\<MiDestino>”, dependiendo de si los archivos que se escriben deben ser perdurables o son temporales.
La ventaja de este cambio es que aplica a todos los clientes en cuanto se descarguen la nueva versión del control. El único inconveniente es que no siempre se dispone del código fuente.

Cambiar la integridad del destino

Si estamos seguros de que no vamos a comprometer la seguridad del cliente, podríamos modificar la etiqueta de integridad de la carpeta (o archivo) destino para asignarle un valor de “baja”. La manera de hacerlo es mediante el comando “icalcs”.

ActiveX_ModoProtegido_4

La ventaja de esta aproximación es que no hay que modificar el código fuente. La desventaja es que hay que aplicarla a cada uno de los clientes que manifiesten este problema. Si estamos en un entorno corporativo, podríamos distribuir el cambio mediante Políticas de Dominio o en un script de inicio de sesión.

Crear un enlace a un directorio

Otra alternativa posible es crear enlace a un directorio (directory junction) que redirija las actuaciones sobre el directorio en cuestión a una de las localizaciones que por defecto tienen una integridad baja. Para ello podemos utilizar el comando “mklink”.

ActiveX_ModoProtegido_5

Al igual que en la opción anterior, la única ventaja que encontramos a esta aproximación es que nos permite evitar el problema si no disponemos del código fuente. Además de que esta solución hay que aplicarla a cada cliente, hemos de tener en cuenta que los “directory junctions” se crean por perfil de usuario, de manera si un equipo es utilizado por varios usuarios, tendremos que crear los enlaces para cada uno de ellos.

Agregar la web a "sitios de confianza"

La última opción que tenemos es cambiar la configuración del navegador para que la web en cuestión no se ejecute en Modo Protegido.

El modo protegido está desactivado por defecto (en IE8) para la zona de seguridad "Intranet" y para la zona de seguirdad de "Sitios de Confianza". Si nos enfrentamos al problema descrito, se sobreentiende que el sitio no pertenece a la zona Intranet (a no ser que se haya activado el modo protegido) por lo que podemos hacer en este caso es agregar el sitio web en cuestión a los “Sitios de Confianza”.

ActiveX_ModoProtegido_6

Esta opción debe aplicarse por cada cliente o utilizando políticas de dominio (en entronos corporativos) y tenemos que ser conscientes de que hemos aumentado la superficie de exposición ante software malicioso, por lo que debemos asegurarnos de que la web es efectivamente confiable.

Acrónimos

IE6, IE7, IE8: Internet Explorer versión 6, 7 u 8
UAC: User Account Control
UIPI: User Interface Privilege Isolation
MIC: Mandatory Integrity Control
IL: Integrity Level