Compartir a través de


Diseño de aplicaciones para ejecutarse en un nivel de integridad bajo

Una manera fácil de ejecutar un proceso de aplicación en un nivel de integridad bajo es establecer el nivel de integridad del archivo de programa ejecutable en una integridad baja. Cuando se inicia ese archivo de imagen, el proceso de aplicación se inicia con un nivel de integridad bajo. Por ejemplo, supongamos que queremos ejecutar la aplicación Calculadora de Windows en un proceso de integridad baja.

Para ejecutar calc.exe en una integridad baja

  1. Realice una copia de c:\Windows\system32\calc.exe en una carpeta temporal.

  2. Use el programa icacls para establecer el nivel de integridad del archivo temporal, lowcalc.exe, en una integridad baja mediante el comando icacls:

    icacls lowcalc.exe /setintegritylevel Low

  3. Ejecute la versión de integridad baja de calc.exe.

En la imagen siguiente se muestran los pasos para ejecutar la calculadora de Windows en un proceso de integridad baja.

Figura 9 Iniciar la calculadora de Windows con una integridad baja

Puede usar el Explorador de procesos para confirmar que el archivo de imagen, lowcalc.exe, se está ejecutando realmente en una integridad baja. La columna Nivel de integridad se encuentra en el lado derecho de la imagen.

Figura 10 Proceso de calculadora baja

No todos los programas de aplicación se ejecutarán correctamente en un proceso de baja integridad. Un proceso de integridad baja no tiene acceso de escritura a la mayoría de las áreas del área de perfil local del usuario del sistema de archivos o del registro en HKCU. La incapacidad de un proceso de baja integridad para obtener acceso de escritura al perfil de usuario es algo bueno si el programa es software malintencionado no deseado. Sin embargo, en el caso de las aplicaciones como el modo protegido de Internet Explorer, es posible que sea necesario algún rediseño para que todas las características de la aplicación se comporten correctamente.

Use herramientas útiles como Monitor de procesos de Sysinternals.com para obtener una idea de qué recursos de archivo y registro usa actualmente una aplicación para el acceso de escritura que producirá un error al ejecutarse con poca integridad.

Aunque es posible cambiar una aplicación para que se ejecute completamente en una integridad baja, algunas características de la aplicación pueden funcionar correctamente solo cuando se implementan en un proceso de integridad media. Una aplicación que se ejecuta en una integridad baja puede tener una parte de la aplicación en un proceso de baja integridad, por ejemplo, para controlar datos que no son de confianza desde Internet. Otra parte de la aplicación se puede implementar en un proceso de "agente" de integridad media para controlar un pequeño conjunto de acciones iniciadas por el usuario. La comunicación entre los procesos de integridad baja e integridad media en la aplicación se puede controlar mediante varios mecanismos IPC. La parte de integridad media de la aplicación debe asumir que todos los datos y el código del proceso de baja integridad no son confiables.

Modo protegido Internet Explorer es una aplicación que se rediseña para ejecutarse en un proceso de baja integridad. Para obtener más información sobre el modo protegido Internet Explorer, vea Descripción y funcionamiento en modo protegido Internet Explorer (https://go.microsoft.com/fwlink/?LinkId=90931).

Los temas principales para diseñar una aplicación para ejecutarse en una integridad baja son los siguientes:

  • Iniciar un proceso secundario en una integridad baja
  • Ubicaciones que se pueden escribir para aplicaciones de baja integridad
  • Comunicación entre procesos de bajo nivel e integridad

Inicio de un proceso en una integridad baja

De forma predeterminada, los procesos secundarios heredan el nivel de integridad de su proceso primario. Para iniciar un proceso de baja integridad, debe iniciar un nuevo proceso secundario con un token de acceso de baja integridad mediante la función CreateProcessAsUser. Para iniciar un proceso de integridad baja a partir de un proceso de integridad media, debe iniciar el nuevo proceso explícitamente como integridad baja.

Para iniciar un proceso de integridad baja

  1. Duplique el identificador del proceso actual, que está en el nivel de integridad medio.

  2. Use SetTokenInformation para establecer el nivel de integridad en el token de acceso en Bajo.

  3. Use CreateProcessAsUser para crear un nuevo proceso mediante el identificador del token de acceso de baja integridad.

CreateProcessAsUser actualiza el descriptor de seguridad en el nuevo proceso secundario y el descriptor de seguridad del token de acceso para que coincida con el nivel de integridad del token de acceso de baja integridad.

En el ejemplo de código siguiente se muestra este proceso.

void CreateLowProcess()
{
 
    BOOL                  fRet;
    HANDLE                hToken        = NULL;
    HANDLE                hNewToken     = NULL;
    PSID                  pIntegritySid = NULL;
    TOKEN_MANDATORY_LABEL TIL           = {0};
    PROCESS_INFORMATION   ProcInfo      = {0};
    STARTUPINFO           StartupInfo   = {0};

 // Notepad is used as an example
 WCHAR wszProcessName[MAX_PATH] =
   L"C:\\Windows\\System32\\Notepad.exe";

 // Low integrity SID
 WCHAR wszIntegritySid[20] = L"S-1-16-1024";
 PSID pIntegritySid = NULL;

    fRet = OpenProcessToken(GetCurrentProcess(),
                            TOKEN_DUPLICATE |
                              TOKEN_ADJUST_DEFAULT |
                              TOKEN_QUERY |
                              TOKEN_ASSIGN_PRIMARY,
                            &hToken);

    if (!fRet)
    {
        goto CleanExit;
    }

    fRet = DuplicateTokenEx(hToken,
                            0,
                            NULL,
                            SecurityImpersonation,
                            TokenPrimary,
                            &hNewToken);

    if (!fRet)
    {
        goto CleanExit;
    }

    fRet = ConvertStringSidToSid(wszIntegritySid, &pIntegritySid);

    if (!fRet)
    {
        goto CleanExit;
    }

    TIL.Label.Attributes = SE_GROUP_INTEGRITY;
    TIL.Label.Sid        = pIntegritySid;

    //
    // Set the process integrity level
    //

    fRet = SetTokenInformation(hNewToken,
                               TokenIntegrityLevel,
                               &TIL,
                               sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid));

    if (!fRet)
    {
        goto CleanExit;
    }

    //
    // Create the new process at Low integrity
    //

    fRet  = CreateProcessAsUser(hNewToken,
                                NULL,
                                wszProcessName,
                                NULL,
                                NULL,
                                FALSE,
                                0,
                                NULL,
                                NULL,
                                &StartupInfo,
                                &ProcInfo);

CleanExit:

    if (ProcInfo.hProcess != NULL)
    {
        CloseHandle(ProcInfo.hProcess);
    }

    if (ProcInfo.hThread != NULL)
    {
        CloseHandle(ProcInfo.hThread);
    }

    LocalFree(pIntegritySid);

    if (hNewToken != NULL)
    {
        CloseHandle(hNewToken);
    }

    if (hToken != NULL)
    {
        CloseHandle(hToken);
    }

    return fRet;
}

Ubicaciones que se pueden escribir en una integridad baja

Windows Vista tiene ubicaciones específicas de archivos y registros a las que se les asignan etiquetas obligatorias bajas para permitir el acceso de escritura de aplicaciones de baja integridad. En la tabla 10 se muestran estas ubicaciones que se pueden escribir.

Tabla 10 Ubicaciones que se pueden escribir para etiquetas obligatorias bajas

Location Área que se puede escribir

Registro

Los procesos de baja integridad pueden escribir y crear subclaves en HKEY_CURRENT_USER\Software\AppDataLow

Sistema de archivos

Los procesos de baja integridad pueden escribir y crear subcarpetas en %USER PROFILE%\AppData\LocalLow

Reducir una etiqueta obligatoria de recursos

Debido a posibles riesgos de seguridad, no se recomienda diseñar un proceso de mayor integridad para aceptar entradas o compartir recursos con procesos de baja integridad. El proceso de baja integridad podría intentar un comportamiento malintencionado. Sin embargo, es posible que tenga que realizar esta acción por diseño.

Nota

Las aplicaciones que aceptan entradas de o comparten recursos con procesos de integridad inferior deben suponer que los datos que proporcionan procesos de integridad inferior no pueden ser de confianza y, a continuación, deben realizar la validación adecuada. Por ejemplo, el modo protegido Internet Explorer muestra el cuadro de diálogo Guardar como del proceso de Agente de usuario de Internet Explorer. Esto permite a los usuarios confirmar que quieren guardar un archivo mediante un proceso que se ejecuta con derechos superiores a Internet Explorer en modo protegido.

Dado que las aplicaciones de baja integridad solo pueden escribir en recursos de baja integridad, debe reducir el nivel de integridad de los recursos compartidos.

Para reducir el nivel de integridad de los recursos compartidos

  1. Cree un descriptor de seguridad sdDL que defina una etiqueta obligatoria baja.

  2. Convierta la cadena SDDL en un descriptor de seguridad.

  3. Asigne el atributo de integridad baja al descriptor de seguridad.

  4. Asigne el descriptor de seguridad al recurso compartido.

En el ejemplo de código siguiente se muestra este proceso.

#include <sddl.h>
#include <AccCtrl.h>
#include <Aclapi.h>

void SetLowLabelToFile()
{
 // The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity 
 #define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
 DWORD dwErr = ERROR_SUCCESS;
 PSECURITY_DESCRIPTOR pSD = NULL;  

 PACL pSacl = NULL; // not allocated
 BOOL fSaclPresent = FALSE;
 BOOL fSaclDefaulted = FALSE;
 LPCWSTR pwszFileName = L"Sample.txt";

 if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
     LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL)) 
 {
  if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, 
     &fSaclDefaulted))
  {
   // Note that psidOwner, psidGroup, and pDacl are 
   // all NULL and set the new LABEL_SECURITY_INFORMATION
   dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName, 
         SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION, 
         NULL, NULL, NULL, pSacl);
  }
  LocalFree(pSD);
 }
}

Los procesos de aplicación solo pueden establecer la integridad de los objetos protegibles en niveles en el nivel de integridad o por debajo del nivel de integridad del proceso de aplicación.

Comunicación entre procesos de baja integridad e integridad superior

Los procesos de baja integridad no están completamente aislados de otras aplicaciones. Pueden interactuar con otros procesos. De hecho, sin algunas formas de colaboración, las aplicaciones que se ejecutan en una integridad baja pueden parecer que el usuario está completamente rota.

Algunas formas de IPC están disponibles para procesos de baja integridad para comunicarse con procesos de mayor integridad. Los componentes de Windows Vista bloquean los siguientes tipos de comunicación.

  • La mayoría de los mensajes de ventana y los enlaces de proceso están bloqueados por UIPI.

  • La etiqueta obligatoria bloquea la apertura de un proceso y el uso de CreateRemoteThread en los objetos de proceso.

  • Se bloquea la apertura de una sección de memoria compartida para el acceso de escritura.

  • El uso de un objeto con nombre creado por un proceso de integridad superior para la sincronización está bloqueado por la etiqueta obligatoria predeterminada.

  • El enlace a una instancia en ejecución de un servicio COM está bloqueado.
    Sin embargo, puede usar otros tipos de comunicación entre un proceso de baja integridad y un proceso de mayor integridad. Los tipos de comunicación que puede usar incluyen:

  • Portapapeles (copiar y pegar)

  • Llamada a procedimiento remoto (RPC)

  • Sockets

  • Mensajes de ventana que el proceso de mayor integridad se ha permitido explícitamente recibir de procesos de integridad inferior mediante una llamada a ChangeWindowMessageFilter

  • Memoria compartida, donde el proceso de mayor integridad reduce explícitamente la etiqueta obligatoria en la sección memoria compartida.

    Importante

    Esto es especialmente peligroso y el proceso de mayor integridad debe tener cuidado de validar todos los datos escritos en la sección compartida.

  • Interfaces COM, donde los derechos de activación de inicio se establecen mediante programación mediante el proceso de mayor integridad para permitir el enlace desde clientes de baja integridad.

  • Canalizaciones con nombre, donde el creador establece explícitamente la etiqueta obligatoria en la canalización para permitir el acceso a procesos de integridad inferior.

Estos mecanismos de comunicación permiten que el proceso de baja integridad interactúe con otros procesos de aplicación, como un proceso de agente, diseñado específicamente para aceptar entradas o llamadas del origen de baja integridad.

Una guía general para diseñar interfaces a las que llamará un proceso de baja integridad nunca es confiar en el autor de la llamada o en los datos de entrada. Un agente de integridad media puede proporcionar una interfaz para crear un archivo dado una ruta de acceso y permitir que una aplicación de baja integridad llame a la interfaz. Sin embargo, esto derrota el propósito de ejecutar una aplicación con una integridad baja. Un mejor diseño es para un proceso de baja integridad para llamar a una interfaz que solicita a la aplicación de integridad media que presente un cuadro de diálogo de archivo común al usuario, que el proceso de baja integridad no puede conducir mediante mensajes de ventana. De este modo, permite al usuario examinar y seleccionar qué archivo se va a abrir o crear, y el proceso de integridad media realiza todas las operaciones de archivo. Este tipo de escenario Guardar como es un ejemplo de cómo El modo protegido Internet Explorer usa su propio proceso de agente para controlar el guardado de una página web en algún lugar del perfil del usuario.

Muchas características de la aplicación se pueden ejecutar correctamente en un proceso de baja integridad. No hay ningún conjunto común de herramientas para ejecutar aplicaciones con poca integridad. Cada aplicación es diferente y no todas las aplicaciones deben ejecutarse con poca integridad.