Michael Howard 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. |
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".