Condividi tramite


Progettazione di applicazioni da eseguire a un livello di integrità basso

Un modo semplice per eseguire un processo applicazione a basso livello di integrità consiste nell'impostare il livello di integrità del file di programma eseguibile su un'integrità ridotta. Quando viene avviato il file di immagine, il processo dell'applicazione viene avviato con un livello di integrità basso. Si supponga, ad esempio, di voler eseguire l'applicazione Calcolatore di Windows in un processo di integrità basso.

Per eseguire calc.exe a bassa integrità

  1. Creare una copia di c:\Windows\system32\calc.exe in una cartella temporanea.

  2. Usare il programma icacls per impostare il livello di integrità del file temporaneo, lowcalc.exe, su un'integrità ridotta usando il comando icacls:

    icacls lowcalc.exe /setintegritylevel Low

  3. Eseguire la versione a bassa integrità di calc.exe.

L'immagine seguente illustra i passaggi per eseguire Windows Calculator in un processo di integrità ridotta.

Figura 9 Avvio di Windows Calculator a bassa integrità

È possibile usare Esplora processi per verificare che il file di immagine, lowcalc.exe, sia effettivamente in esecuzione a bassa integrità. La colonna Livello di integrità si trova sul lato destro dell'immagine.

Figura 10 Processo calcolatore basso

Non tutti i programmi applicazioni verranno eseguiti correttamente in un processo di bassa integrità. Un processo di integrità basso non dispone dell'accesso in scrittura alla maggior parte delle aree nell'area del profilo locale dell'utente del file system o del Registro di sistema in HKCU. L'incapacità di un processo a bassa integrità di ottenere l'accesso in scrittura al profilo utente è un'ottima cosa se il programma è software dannoso indesiderato. Tuttavia, per le applicazioni come Internet Explorer in modalità protetta, è possibile che sia necessaria una riprogettazione per ottenere tutte le funzionalità dell'applicazione che si comportano correttamente.

Usare strumenti utili, ad esempio Monitoraggio processi da Sysinternals.com per ottenere un'idea delle risorse del file e del Registro di sistema attualmente usate da un'applicazione per l'accesso in scrittura che avrà esito negativo durante l'esecuzione a bassa integrità.

Anche se è possibile modificare un'applicazione per l'esecuzione interamente a bassa integrità, alcune funzionalità dell'applicazione possono funzionare correttamente solo quando vengono implementate in un processo di integrità media. Un'applicazione in esecuzione a bassa integrità può avere una parte dell'applicazione in un processo di bassa integrità, ad esempio per gestire dati non attendibili da Internet. Un'altra parte dell'applicazione può essere implementata in un processo di "broker" di integrità media per gestire un piccolo set di azioni avviate dall'utente. La comunicazione tra i processi di integrità bassa e di integrità media nell'applicazione può essere gestita usando vari meccanismi IPC. La parte di integrità media dell'applicazione deve presupporre che tutti i dati e il codice nel processo di bassa integrità non siano attendibili.

Modalità protetta Internet Explorer è un'applicazione riprogettata da eseguire in un processo di integrità ridotta. Per altre informazioni su Internet Explorer in modalità protetta, vedere Informazioni e utilizzo in modalità protetta Internet Explorer (https://go.microsoft.com/fwlink/?LinkId=90931).

Gli argomenti principali per la progettazione di un'applicazione da eseguire a bassa integrità sono i seguenti:

  • Avvio di un processo figlio a bassa integrità
  • Posizioni scrivibili per applicazioni di integrità bassa
  • Comunicazione tra processi a basso livello di integrità e di livello superiore

Avvio di un processo a bassa integrità

Per impostazione predefinita, i processi figlio ereditano il livello di integrità del processo padre. Per avviare un processo a bassa integrità, è necessario avviare un nuovo processo figlio con un token di accesso a bassa integrità usando la funzione CreateProcessAsUser. Per avviare un processo a bassa integrità da un processo di integrità media, è necessario avviare il nuovo processo in modo esplicito come bassa integrità.

Per avviare un processo di integrità bassa

  1. Duplicare l'handle del processo corrente, ovvero a livello di integrità medio.

  2. Usare SetTokenInformation per impostare il livello di integrità nel token di accesso su Basso.

  3. Usare CreateProcessAsUser per creare un nuovo processo usando l'handle per il token di accesso a integrità bassa.

CreateProcessAsUser aggiorna il descrittore di sicurezza nel nuovo processo figlio e il descrittore di sicurezza per il token di accesso in modo che corrisponda al livello di integrità del token di accesso a bassa integrità.

L'esempio di codice seguente illustra questo processo.

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;
}

Posizioni scrivibili a bassa integrità

Windows Vista include posizioni specifiche del file e del Registro di sistema assegnate a etichette basse obbligatorie per consentire l'accesso in scrittura alle applicazioni a bassa integrità. La tabella 10 mostra queste posizioni scrivibili.

Tabella 10 Percorsi scrivibili per etichette obbligatorie basse

Posizione Area scrivibile

Registro

I processi di integrità bassa possono scrivere in e creare sottochiave in HKEY_CURRENT_USER\Software\AppDataLow

File system

I processi di integrità ridotta possono scrivere e creare sottocartelle in %USER PROFILE%\AppData\LocalLow

Riduzione di un'etichetta obbligatoria per le risorse

A causa di potenziali rischi di sicurezza, non è consigliabile progettare un processo di integrità superiore per accettare l'input o condividere le risorse con processi di integrità ridotta. Il processo di integrità bassa potrebbe tentare un comportamento dannoso. Tuttavia, potrebbe essere necessario eseguire questa azione in base alla progettazione.

Nota

Le applicazioni che accettano l'input da o condividono risorse con processi di integrità inferiore devono presupporre che i processi di integrità inferiore non possano essere attendibili e quindi eseguire la convalida appropriata. Ad esempio, Internet Explorer in modalità protetta visualizza la finestra di dialogo Salva con nome dal processo di Gestione utenti di Internet Explorer. Ciò consente agli utenti di confermare che vogliono salvare un file usando un processo che viene eseguito con diritti superiori rispetto a Internet Explorer in modalità protetta.

Poiché le applicazioni a bassa integrità possono scrivere solo in risorse di integrità ridotta, è necessario ridurre il livello di integrità delle risorse condivise.

Per ridurre il livello di integrità delle risorse condivise

  1. Creare un descrittore di sicurezza SDDL che definisce un'etichetta obbligatoria ridotta.

  2. Convertire la stringa SDDL in un descrittore di sicurezza.

  3. Assegnare l'attributo di integrità bassa al descrittore di sicurezza.

  4. Assegnare il descrittore di sicurezza alla risorsa condivisa.

Nell'esempio di codice seguente viene illustrato questo processo.

#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);
 }
}

I processi dell'applicazione possono impostare l'integrità degli oggetti a protezione diretta solo a livelli a o al di sotto del livello di integrità del processo dell'applicazione.

Comunicazione tra processi di integrità bassa e integrità superiore

I processi a bassa integrità non sono completamente isolati da altre applicazioni. Possono interagire con altri processi. Infatti, senza alcune forme di collaborazione, le applicazioni in esecuzione a bassa integrità potrebbero sembrare completamente interrotte dall'utente.

Alcune forme di IPC sono disponibili per i processi a bassa integrità per comunicare con processi di integrità più elevati. I componenti in Windows Vista bloccano i tipi di comunicazione seguenti.

  • La maggior parte dei messaggi di finestra e dei hook di elaborazione viene bloccata dall'interfaccia utente.

  • L'apertura di un processo e l'uso di CreateRemoteThread viene bloccato dall'etichetta obbligatoria negli oggetti processo.

  • L'apertura di una sezione di memoria condivisa per l'accesso in scrittura viene bloccata.

  • L'uso di un oggetto denominato creato da un processo di integrità superiore per la sincronizzazione viene bloccato dall'etichetta obbligatoria predefinita.

  • L'associazione a un'istanza in esecuzione di un servizio COM è bloccata.
    Tuttavia, è possibile usare altri tipi di comunicazione tra un processo di integrità bassa e un processo di integrità superiore. I tipi di comunicazione che è possibile usare includono:

  • Appunti (copia e incolla)

  • Remote procedure call (RPC)

  • Socket

  • Messaggi di finestra che il processo di integrità superiore è stato consentito in modo esplicito di ricevere da processi di integrità inferiore chiamando ChangeWindowMessageFilter

  • Memoria condivisa, in cui il processo di integrità superiore riduce in modo esplicito l'etichetta obbligatoria nella sezione memoria condivisa

    Importante

    Questo è particolarmente pericoloso e il processo di integrità superiore deve essere attento a convalidare tutti i dati scritti nella sezione condivisa.

  • Interfacce COM, in cui i diritti di attivazione di avvio vengono impostati a livello di codice dal processo di integrità superiore per consentire l'associazione da client di integrità bassa

  • Pipe denominate, in cui l'autore imposta in modo esplicito l'etichetta obbligatoria sulla pipe per consentire l'accesso ai processi di integrità inferiore

Questi meccanismi di comunicazione consentono al processo di bassa integrità di interagire con altri processi dell'applicazione, ad esempio un processo broker, progettati in modo specifico per accettare input o chiamate dall'origine a bassa integrità.

Linee guida generali per la progettazione di interfacce che un processo di integrità bassa chiamerà non deve mai considerare attendibile il chiamante o i dati di input. Un broker di integrità media può fornire un'interfaccia per creare un file specificato un percorso e consentire a un'applicazione a bassa integrità di chiamare l'interfaccia. Tuttavia, questo elimina lo scopo di eseguire un'app a bassa integrità. Una progettazione migliore è un processo di bassa integrità per chiamare un'interfaccia che richiede all'applicazione di integrità media di presentare un dialogo di file comune all'utente, che il processo di integrità bassa non può guidare usando i messaggi della finestra. In questo modo, si consente all'utente di esplorare e selezionare il file da aprire o creare e il processo di integrità media esegue tutte le operazioni di file. Questo tipo di scenario Salva con nome è un esempio del modo in cui Internet Explorer modalità protetta usa il proprio processo broker per gestire il salvataggio di una pagina Web da qualche parte nel profilo dell'utente.

Molte funzionalità dell'applicazione possono essere eseguite correttamente in un processo di bassa integrità. Non esiste un set comune di strumenti per l'esecuzione di applicazioni a bassa integrità. Ogni applicazione è diversa e non tutte le applicazioni devono essere eseguite a bassa integrità.