domingo, septiembre 09, 2007

Sobre el servicio de licencias de Windows Vista

Hace unas semanas me encontré con un equipo con Windows Vista instalado que tenía el siguiente problema: Al intentar abrir Panel de control, simplemente se abría una ventana de Explorador de Windows que, segundos después, se cerraba automáticamente. Después de analizar el problema por un tiempo, decidí depurar con Windbg para clarificar el asunto.

Al depurar Control.exe (el ejecutable encargado de cargar ficheros de Panel de control) no obtuve nada reseñable. De hecho, Control.exe es un proceso efímero que dura poco tiempo en ejecución. Es el proceso Explorer.exe el que se hace cargo de la inicialización del Panel de control en última instancia (esto puede comprobarlo ejecutando "control.exe" con Process Explorer abierto). Así que decidí depurar Explorer.exe a partir de funciones conocidas de Shell32.dll que están relacionadas con la carga de Panel de control. También podría "volcar" los símbolos de Shell32.dll y poner "breakpoints" en aquellas funciones que, por el nombre, le parezca que están relacionadas con la carga de Panel de control. De pronto me encontré con una llamada a la DLL Slc.dll, una nueva DLL en Windows Vista que implementa funciones relacionadas con el servicio de licencias de software de Windows Vista. El servicio de licencias de software (Slsvc.exe) es un nuevo servicio de Windows Vista encargado de consultar la licencia del equipo (estado de la activación, si el sistema es genuino o no, qué funcionalidades permite la versión de Vista instalada, etc.).

Decidí poner "breakpoints" en funciones con el patrón "slc!*" y reiniciar la depuración. Llegué en primer lugar a una función de Slc.dll encargada de obtener información sobre la versión de Windows instalada.



Seguidamente, al retornar de la función se obtuvo el código de error 0x80070426, que significa que el servicio no está iniciado. Por ser la función Slc.dll, inmediatamente relacioné esto con el servicio Slsvc antes mencionado. Efectivamente comprobé que dicho servicio no estaba iniciado, así que lo inicié, reinicié el sistema y el problema quedó solucionado.



La función que realiza la llamada al servicio de licencias como ve es CPLD_GetRegModules. Esta función delega toda su actividad en otra función proxy: CPLD_GetRegModulesWorker, encargada de leer la caché de ficheros .cpl del sistema, almacenada en el Registro en la clave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Controls Folder.

Curiosidad: En la clave anterior hay dos valores: Presentation Cache, que contiene la caché propiamente dicha así como un "flag" que indica que esa caché es posterior a octubre de 2001, fecha en la cual se introdujo un arreglo en el código del Panel de control que invalida toda caché anterior. También está el valor Presentation LCID, que contiene el ID del idioma de la caché.


El motivo de emplear una función "representante" (proxy) es que no se quiere que ciertas funciones se ejecuten sin realizar antes una comprobación de la licencia del equipo.

En resumen, el servicio "Licencias de software" es muy importante para Windows Vista, muchas funciones del sistema operativo realizan antes de ejecutarse una llamada a este servicio. La licencia incluye, entre otras cosas, el máximo número de conexiones permitido, si se permite ejecutar Windows Aero o no, si se incluye un codec MPEG2, Control parental, Media Center, etc.). La conexión con el servicio de licencias evita que, por ejemplo, sustituyendo binarios de versiones distintas de Vista se obtenga una característica que no permita la licencia instalada. Como curiosidad final, durante la inicialización del núcleo de NT y del administrador de memoria (Ntoskrnl.exe), se consulta también la licencia del equipo para saber si se puede inicializar uno o dos procesadores, y el máximo tamaño de RAM direccionable, pero esto quizá lo muestre experimentalmente en un próximo artículo.

sábado, agosto 11, 2007

En lo que a seguridad se refiere, usar el navegador X en lugar del navegador Y influye más bien poco

En diversos foros de Internet hay abiertos muchos debates sobre si Internet Explorer es menos seguro que cierto navegador X, y se suele acabar recomendando usar ese navegador X en lugar de Internet Explorer. A decir verdad, ante un ataque malicioso, el usar el navegador X o el navegador Y no influye apenas en nada, y sólo genera una sensación de falsa seguridad. Quizá lo más influyente en esa situación de ataque es de qué privilegios disponga el navegador en ese momento. Si dispone de privilegios administrativos, está perdido.

Cuando un usuario ejecuta cierta aplicación -o el propio sistema operativo- con privilegios administrativos, automáticamente está diciendo que confía plenamente en esa aplicación que va a abrir y que le dejará hacer lo que le plazca con el sistema. Cuando se instala y se ejecuta un juego, es de esperar que ese juego se limite a "mover triángulos" y, si acaso, conectarse a Internet para descargar actualizaciones o poder jugar en red. Pero ciertamente ese juego es un potencial vector de ataque, por haber sido ejecutado con privilegios administrativos (cuando no se requieren). Simplemente cualquier usuario malicioso podría tomar el control del sistema al aprovecharse de una vulnerabilidad de ese programa.

El ejecutar un navegador aparentemente muy seguro en un entorno con privilegios administrativos, no sirve casi para nada. Al navegar por algún sitio infectado, si el sistema operativo no está actualizado o el sitio web intenta aprovechar alguna vulnerabilidad no corregida del navegador (cosa que todos tienen), se instalarán, sin que el usuario note nada, ficheros en \system32, tareas programadas, procesos residentes, entre otras cosas. Un navegador es una aplicación muy delicada, pues está en contacto con un mundo -Internet- en el que las amenazas de malware y virus están a la orden del día. De nada sirve haber diseñado el navegador más robusto del mundo cuando sus usuarios lo ejecutan con privilegios administrativos. Y navegar por Internet es una actividad que no requiere privilegios administrativos.

En conclusión, si usa Windows Vista debería tener activado Control de cuentas de usuario (UAC) y Modo protegido de IE7. Hay mucha gente que lo desactiva, por resultar demasiado pesado, pero deben ser conscientes de que si lo hacen estarán navegando con privilegios administrativos, y cualquier desarrollador de un sitio malicioso está ansioso por encontrarse con visitantes que le faciliten la instalación automática de adware. Si usa otro navegador distinto de IE, debería ejecutarlo siempre con privilegios limitados. La seguridad de un sistema no consiste nunca en usar únicamente tal o cual producto, sino en seguir unas pautas para reducir la posibilidad de ataque (usar antivirus, cortafuegos y actualizar el software a menudo, por ejemplo), y mitigar las consecuencias en el caso de que ocurra algo malo (ejecutar la aplicación sin privilegios administrativos, por ejemplo).

domingo, agosto 05, 2007

Sobre el nuevo Monitor de fiabilidad de Windows Vista

Continuando con los artículos referidos a cómo funcionan los nuevos componentes de Windows Vista, he elaborado un pequeño conjunto de preguntas y respuestas sobre el nuevo Monitor de confiabilidad (Reliability Monitor) de Windows Vista, componente que entre otras cosas se encarga de otorgar una puntuación numérica al equipo según el grado de estabilidad del sistema durante un periodo de tiempo.

¿Qué se tiene en cuenta a la hora de calcular la puntuación?

El índice de un día depende del número de "interrupciones" que ha sufrido el usuario en una sesión de trabajo en Windows. Por "interrupción" se refiere a cualquier suceso que esté en alguna de estas categorías: fallos de aplicaciones o "cuelgues" (eventos 1000 y 1002, respectivamente), fallos de hardware y fallos del sistema operativo (errores graves, pantallas azules o "bugchecks"). El número de "interrupciones", una vez filtrado mediante un algoritmo pendiente de patente, se hace corresponder con una puntuación de 1 a 10, ya sea directamente o mediante interpolación lineal.

¿Cuántos días se tienen en cuenta para el cálculo de la estabilidad?

Depende de la versión de Windows. Si es de la rama cliente, 28; si es de la rama servidora, 120.

¿Es cierto que la estabilidad depende de los días anteriores?

Sí, además la suma que se realiza es una suma ponderada, en la que la puntuación de los días más recientes tiene más peso que la puntuación de los días más alejados en el tiempo. Con esto se consigue observar un efecto de recuperación paulatina en la situación de un equipo que haya sufrido problemas de estabilidad durante un periodo determinado, pero que en estos momentos todo funcione correctamente pues se logró dar con el causante.

¿Se cuentan todos y cada uno de los eventos de fallo?

Se cuentan siempre y cuando no puedan ser emparejados, esto es, si son muy cercanos en el tiempo, o bien si tienen relación directa (por ejemplo, un evento que haga referencia a una pantalla azul y otro que explique que el equipo se reinició por un error grave). En estos casos sólo se tiene en cuenta uno de ellos.

¿Quién se encarga de recopilar toda esa información?

Un módulo denominado Racagent.exe y que se ejecuta programadamente en cada inicio del sistema operativo. Se ejecuta con bajas prioridades de CPU, E/S y memoria para tener un impacto mínimo en el arranque del sistema operativo. Su DLL asociada, RacEng.dll, se encarga de calcular un índice de estabilidad para la sesión en curso (si no ha sido calculado ya) y almacenarlo en el correspondiente repositorio.

¿Dónde se almacena toda la información sobre instalación de aplicaciones, desinstalación, errores de software, etc.?

Se almacenan en el directorio C:\ProgramData\Microsoft\RAC\PublishedData\, en los siguientes ficheros:
  • PublishedRacMonIndex.dat: Almacena el índice (puntuación).
  • PublishedRacMonSWITable.dat: Almacena las instalaciones de programas.
  • PublishedRacMonAFLTable.dat: Almacena fallos de aplicaciones.
  • PublishedRacMonHFLTable.dat: Almacena fallos de hardware.
  • PublishedRacMonOSFTable.dat: Almacena fallos del sistema operativo.
  • PublishedRacMonCLKTable.dat: Almacena fallos del sistema operativo.

El Monitor de fiabilidad es un componente muy útil para los administradores de sistemas que quieran observar, de un vistazo, el estado de la estabilidad del equipo, en qué momento surgieron los problemas y cuáles podrían ser sus causantes.