Exportar (0) Imprimir
Expandir todo
Expandir Minimizar

Exploración del Web y lectura de mensajes de correo electrónico de manera segura como administrador

18 de Julio de 2005

Publicado: 15 de noviembre de 2004

Michael Howard
Microsoft Security Engineering

Resumen: Michael Howard explica cómo se puede trabajar como administrador y tener acceso seguro a los datos de Internet prescindiendo de los privilegios administrativos innecesarios al utilizar una herramienta para obtener acceso a Internet. (10 páginas impresas.) (Este artículo contiene vínculos a páginas en inglés.)

Descargar el archivo DropMyRights.msi.

Aunque ya lo he dicho muchas veces, lo repetiré una vez más: "Trabajar con una cuenta administrativa puede perjudicar la salud del equipo y de los datos". Por tanto, siempre que alguien dice que debe trabajar en su equipo como administrador, intento convencerlo de que no es una buena idea desde el punto de vista de la seguridad. Una vez dicho esto, a veces encuentro a alguien que tiene un motivo válido. Por ejemplo, si utilizo uno de los equipos de mi oficina para instalar la última versión de Windows, necesito ser un administrador para instalar el sistema operativo. Sin embargo, y es un punto importante, no leo mi correo electrónico, exploro el Web ni consulto Internet de ninguna manera mientras estoy trabajando como administrador en dicho equipo. Y no lo hago, porque el Web es hoy en día el origen de la mayoría de los ataques más desagradables.

¿Y qué ocurre si alguien quiere explorar el Web, leer su correo electrónico o utilizar la mensajería instantánea y, por algún motivo, debe hacerse en el contexto administrativo? Si observa las principales amenazas a las que se enfrentan los equipos, éstas surgen de la interacción del usuario con el Web mediante herramientas como exploradores y clientes de correo electrónico. Evidentemente, hay ataques que no resultan de la interacción, como el Blaster (http://www.cert.org/advisories/CA-2003-20.html) o el Lion (http://www.sans.org/y2k/lion.htm), pero ese es en parte el motivo por el que se activó el firewall en Windows XP SP2.

Nota

Para consultar las prácticas recomendadas cuando no se trabaja como administrador, les invito a consultar el blog de Aaron Margosis para ver sugerencias sobre cómo trabajar en Windows cuando no se es administrador.

Por qué no se debe trabajar como administrador

Existe cierto código dañino muy desagradable que funciona únicamente porque el usuario que explora el Web es un administrador. Un buen ejemplo lo constituye una variante reciente del gusano Bagle/Beagle llamada W32.Beagle.AV@mm. Le recomiendo que lea sobre los efectos del gusano una vez que se le ha invitado al sistema de un equipo. Symantec tiene una descripción bastante buena en la dirección http://securityresponse.symantec.com/avcenter/venc/data/w32.beagle.av@mm.html. He utilizado la palabra "invitado" porque el código dañino no se aprovecha de un defecto de diseño o de código. Utiliza un sencillo error humano para ejecutarse.

Entre las muchas acciones que lleva a cabo este código dañino, todas las cuales requieren derechos de administrador, se encuentran:

  • Creación de archivos en el directorio system32.

  • Finalización de varios procesos.

  • Desactivación del firewall de Windows.

  • Descarga y escritura de archivos en el directorio system32.

  • Eliminación de valores de registro de HKLM.

Todos estos fallan si el usuario que ejecuta el cliente de correo electrónico no es un administrador.

Por tanto, sería muy útil (es decir, más seguro) explorar el Web, leer el correo electrónico, etc. sin ser el administrador, aunque sea necesario realizar las tareas habituales diarias como administrador. Afortunadamente, Windows XP, Windows Server 2003 y posteriores admiten esta posibilidad mediante identificadores restringidos.

Más detalles

Windows XP, Windows Server 2003 y posteriores incluyen una funcionalidad denominada directiva de restricciones del software, también conocida como SAFER, que permite a un usuario o a un desarrollador de software ejecutar código con un nivel inferior de privilegios sin tener que incluir la información sobre las credenciales del usuario al iniciar la aplicación. Por ejemplo, un administrador puede ejecutar una aplicación como un usuario normal, retirando determinados SID y privilegios del identificador de la aplicación al iniciar la aplicación. Algunas aplicaciones, en especial aplicaciones con acceso a Internet, como los exploradores Web, los programas de mensajería instantánea o los clientes de correo electrónico, no deben ejecutarse nunca en un contexto administrativo.

La aplicación DropMyRights

DropMyRights es una aplicación muy sencilla que ayuda a los usuarios que deben trabajar como administradores a ejecutar aplicaciones en un contexto mucho más seguro, el de un usuario que no es administrador. Para ello, toma el identificador del usuario actual, elimina varios privilegios y SID del identificador para, a continuación, utilizar dicho identificador para iniciar otro proceso, como Outlook o Internet Explorer. Esta herramienta funciona igualmente bien con el correo electrónico Mozilla Firefox, Eudora o Lotus Notes.

El código no podría ser más sencillo. A continuación, podemos ver el código básico:

////////////////////////////////////////////////////////////////////////////////// 
DWORD wmain(int argc, wchar_t **argv) { 
 
   DWORD fStatus = ERROR_SUCCESS; 
 
   if (2 != argc & 3 != argc) { 
      Usage(); 
      return ERROR_INVALID_PARAMETER; 
   } 
 
   // get the SAFER level 
   DWORD hSaferLevel = SAFER_LEVELID_NORMALUSER; 
   if (3 == argc & argv[2]) { 
      switch(argv[2][0]) { 
         case 'C' :  
         case 'c' :  hSaferLevel = SAFER_LEVELID_CONSTRAINED;  
                  break; 
         case 'U' : 
         case 'u' :   hSaferLevel = SAFER_LEVELID_UNTRUSTED; 
                  break; 
 
         default  :   hSaferLevel = SAFER_LEVELID_NORMALUSER; 
                  break; 
      } 
   } 
 
   // get the command line, and make sure it's not bogus 
   wchar_t *wszPath = argv[1]; 
   size_t cchLen = 0; 
   if (FAILED(StringCchLength(wszPath,MAX_PATH,&cchLen))) 
      return ERROR_INVALID_PARAMETER; 
 
    SAFER_LEVEL_HANDLE hAuthzLevel = NULL; 
    if (SaferCreateLevel(SAFER_SCOPEID_USER, 
                         hSaferLevel, 
                         0,  
             &hAuthzLevel, NULL)) { 
 
        //  Generate the restricted token we will use. 
        HANDLE hToken = NULL; 
        if (SaferComputeTokenFromLevel( 
            hAuthzLevel,    // SAFER Level handle 
            NULL,           // NULL is current thread token. 
            &hToken,        // Target token 
            0,              // No flags 
            NULL)) {        // Reserved 
 
         STARTUPINFO si; 
         ZeroMemory(&si, sizeof(STARTUPINFO)); 
         si.cb = sizeof(STARTUPINFO); 
         si.lpDesktop = NULL; 
        
         // Spin up the new process 
         PROCESS_INFORMATION pi; 
         if (CreateProcessAsUser(  
            hToken, 
            wszPath, NULL, 
            NULL, NULL, 
            FALSE, CREATE_NEW_CONSOLE, 
            NULL, NULL,   
            &si, &pi)) { 
 
               CloseHandle(pi.hProcess); 
               CloseHandle(pi.hThread); 
 
         } else { 
            fStatus = GetLastError(); 
            fwprintf(stderr,L"CreateProcessAsUser failed (%lu)\n",fStatus); 
         }  
      } else { 
         fStatus = GetLastError(); 
      } 
 
      SaferCloseLevel(hAuthzLevel); 
 
   } else { 
      fStatus = GetLastError(); 
   } 
 
   return fStatus; 
}

El código fuente y el ejecutable están disponibles al principio de este artículo. Ahora veamos cómo configurar la aplicación para ejecutar las aplicaciones con menos privilegios.

Configuración

Sólo tiene que copiar DropMyRights.exe en una carpeta. A continuación, para cada aplicación que desee ejecutar con menos privilegios, siga los pasos que se indican en las siguientes tres secciones.

Creación de un acceso directo

Cree un acceso directo e incluya DropMyRights.exe como el ejecutable de destino, seguido de la ruta de acceso de la aplicación que desea ejecutar con menos privilegios.

Por ejemplo:

C:\warez\dropmyrights.exe "c:\program files\internet explorer\iexplore.exe"

La figura 1 muestra lo que se verá aproximadamente en la pantalla.

Figura 1. Ruta de acceso de la aplicación que se desea ejecutar con menos privilegios

Actualización del nombre del acceso directo

A continuación, actualice el nombre del acceso directo para que corresponda al destino ejecutable y no a dropmyrights. Por lo general, coloco la palabra "(seguro)" después del nombre de la aplicación que indica que esta aplicación se ejecutará en un contexto de seguridad más protegido. También suelo utilizar "(Non-admin)", como se puede ver en la figura 2.

Figura 2. Actualización del nombre del acceso directo

Configuración del icono y del modo de ejecución

Por último, una vez creado el acceso directo, establezca la opción Ejecutar del acceso directo como Minimizada y, si lo desea, seleccione un nuevo icono.

Figura 3. Configuración de la opción Ejecutar en Minimizada y cambio opcional del icono

Opciones avanzadas

Los argumentos de DropMyRights son:

DropMyRights {path} [N|C|U]

Los significados de las variables son:

  • Path es la ruta de acceso completa de la aplicación que se va a iniciar.

  • N indica que la aplicación se ejecutará como un usuario normal. Es el valor predeterminado si no se proporciona un argumento.

  • C indica que la aplicación se ejecutará como un usuario restringido.

  • U indica que la aplicación se ejecutará como un usuario en el que no se confiará. Hay que tener en cuenta que esto hará que algunas aplicaciones no funcionen.

La mejor manera de identificar qué es lo que hace cada una de estas configuraciones consiste en examinar el identificador de proceso resultante. Las siguientes tablas muestran los cambios realizados al identificador del proceso.

Tabla 1. Cuenta administrativa

SIDS

Restricción de SIDS

Privilegios

DOMAIN\Usuarios del dominio

Todos

BUILTIN\Administradores

BUILTIN\Usuarios

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

\LOCAL

Ninguno

SeChangeNotifyPrivilege

SeSecurityPrivilege

SeBackupPrivilege

texto texto

SeRestorePrivilege

SeSystemtimePrivilege

SeShutdownPrivilege

SeRemoteShutdownPrivilege

SeTakeOwnershipPrivilege

SeDebugPrivilege

SeSystemEnvironmentPrivilege

SeSystemProfilePrivilege

SeProfileSingleProcessPrivilege

SeIncreaseBasePriorityPrivilege

SeLoadDriverPrivilege

SeCreatePagefilePrivilege

SeIncreaseQuotaPrivilege

SeUndockPrivilege

SeManageVolumePrivilege

SeCreateGlobalPrivilege

SeImpersonatePrivilege

Tabla 2. Usuario normal ('N')

SIDS

Restricción de SIDS

Privilegios

DOMAIN\Usuarios del dominio

Todos

BUILTIN\Administradores

BUILTIN\Usuarios

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

\LOCAL

Ninguno

SeChangeNotifyPrivilege

Tabla 3. Restringido ('C')

SIDS

Restricción de SIDS

Privilegios

DOMAIN\Usuarios del dominio

Todos

BUILTIN\Administradores

BUILTIN\Usuarios

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

\LOCAL

DOMAIN\Usuarios del dominio

Todos

BUILTIN\Usuarios

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

LOCAL

NT AUTHORITY\RESTRICTED

SeChangeNotifyPrivilege

Tabla 4. No de confianza ('U')

SIDS

Restricción de SIDS

Privilegios

DOMAIN\Usuarios del dominio

Todos

BUILTIN\Administradores

BUILTIN\Usuarios

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

\LOCAL

NT AUTHORITY\RESTRICTED

Todos

NT AUTHORITY\INTERACTIVE

NT AUTHORITY\Usuarios autenticados

BUILTIN\Usuarios

SeChangeNotifyPrivilege

La marca roja indica que el SID sigue estando en el identificador, pero es un SID de denegación. Un SID con este atributo es un SID de sólo denegación. Cuando el sistema realiza una comprobación de acceso, comprueba si hay ACE de acceso denegado que se apliquen al SID, pero ignora las ACE de acceso permitido para el SID.

La mayor diferencia de privilegios y de SID se encuentra entre la cuenta administrativa y la cuenta de usuario normal. Como puede ver, se quitan todos los privilegios del identificador salvo el privilegio de comprobación del paso a través de directorios (también conocido como SeChangeNotifyPrivilege). Para los usuarios restringidos y no confiables, la diferencia respecto al usuario normal es inferior y es posible que empiece a ver que algunas aplicaciones no funcionan debido a errores de restricción de seguridad. Mi consejo es utilizar Normal (el valor predeterminado) en la mayoría de las ocasiones y Restringido si cree que explorará sitios hostiles o potencialmente peligrosos.

Detección del error de seguridad

Un buen número de lectores resolvió el error mencionado en mi último artículo. La función CreateFile abre el archivo para el archivo completo, pero el código sólo lee del archivo. FILE_ALL_ACCESS debe reemplazarse por GENERIC_READ o similar. Esto supone un problema porque y que, con toda probabilidad, sólo un administrador y no un usuario normal puede utilizar este código. Con frecuencia me encuentro con este error.

¿Puede ver el error de este código? Esta pregunta me llegó el otro día como un error en un tema de DNS de Java. Se trata de un error interesante, que he reescrito en C# para generalizarlo.

Int16 req;
...
while (true) {
    getRequest();
    req++;
    arr[req] = DateTime.Now;
}

Michael Howard es administrador de productos de seguridad (Security Program Manager) en el grupo Secure Engineering de Microsoft y coautor de Writing Secure Code, ya en su segunda edición, así como autor principal de Designing Secure Web-based Applications for Windows 2000. También es el coeditor de Basic Training en IEEE Security & Privacy Magazine. Su principal objetivo en la vida es que no se diseñe, cree, compruebe ni documente nada en un sistema de seguridad que no sea seguro. Su cita favorita es "El rasgo de una persona es la hazaña de otra".

Mostrar:
© 2014 Microsoft