Esporta (0) Stampa
Espandi tutto

Informazioni sugli shim

Funzionamento degli shim

La fruibilità e la compatibilità delle applicazioni nei sistemi operativi Microsoft® Windows® rappresentano due fattori fondamentali dello sviluppo del sistema operativo stesso, nonché delle sue prestazioni, affidabilità e gestibilità. Per ridurre i costi di distribuzione e accelerare l'adozione, Microsoft investe in soluzioni tecnologiche avanzate per garantire l'ampia compatibilità del software esistente, integrando la compatibilità nei processi di progettazione e rilascio.

L'infrastruttura di compatibilità delle applicazioni Microsoft Windows (infrastruttura shim) è una di queste potenti soluzioni tecniche. Con l'evolversi del sistema operativo Windows di versione in versione per supportare nuove tecnologie, integrare nuove correzioni e implementare cambiamenti nella strategia, le modifiche apportate all'implementazione di alcune funzioni possono influire sulle applicazioni che vi dipendono. A causa della natura del software, una nuova modifica della funzione per risolvere un problema di compatibilità può danneggiare altre applicazioni o impedire il progredire di Windows, indipendentemente dal miglioramento che l'implementazione alternativa possa offrire. Benché sia possibile eludere questa eventualità inserendo rami direttamente nel codice sorgente di Windows, questa scelta rappresenta una sfida a lungo termine per gestibilità e affidabilità del sistema operativo Windows. Utilizzando l'infrastruttura shim, tuttavia, è possibile occuparsi di una correzione specifica, ma solo per una determinata applicazione e, in genere, solo per determinate versioni dell'applicazione, mantenendo tali correzioni esternamente alle funzioni di base di Windows e gestendole separatamente.

L'infrastruttura shim implementa una forma di hook delle API. In particolare, tale infrastruttura sfrutta la natura dei collegamenti per reindirizzare le chiamate alle API da Windows a codice alternativo, ovvero lo shim stesso. La specifica basata sui formati PE (Portable Executable) e COFF (Common Object File Format) include diverse intestazioni e le directory di dati in queste intestazioni offrono un livello di indirizzamento indiretto tra l'applicazione e il file collegato. Le chiamate a file binari esterni vengono eseguite tramite la tabella IAT (Import Address Table). Di conseguenza, una chiamata in Windows viene eseguita analogamente a quanto illustrato nella figura 1.

643f2bee-8329-4018-9d90-2ffcc7c76a6c

Figura 1   Applicazione che esegue una chiamata in Windows tramite la tabella IAT

In particolare, è possibile modificare l'indirizzo della funzione di Windows risolta nella tabella IAT e quindi sostituirlo con un puntatore a una funzione nel codice shim alternativo, come illustrato nella figura 2.

Immagine

Figura 2   Applicazione reindirizzata allo shim prima della chiamata a Windows

Questo indirizzamento indiretto viene eseguito per file con estensione dll collegati staticamente durante il caricamento dell'applicazione. È inoltre possibile eseguire lo shim dinamico dei file con estensione dll tramite l'hook dell'API GetProcAddress.

Implicazioni di progettazione per l'infrastruttura shim

Nel determinare la strategia di utilizzo degli shim, possono verificarsi alcune conseguenze pertinenti correlate alla progettazione dell'infrastruttura shim.

Come illustrato nella figura 2 "Applicazione reindirizzata allo shim prima della chiamata a Windows", innanzitutto, il codice in esecuzione all'interno di uno shim è comunque esterno a Windows. Di conseguenza, Windows applica al codice shim le stesse limitazioni di sicurezza applicate al codice stesso dell'applicazione. In Windows, infatti, il codice shim viene considerato codice dell'applicazione. Di conseguenza, non è possibile utilizzare shim per ignorare alcun meccanismo di sicurezza in Windows. Non sono disponibili shim, ad esempio, per ignorare le richieste di Controllo dell'account utente di Windows 7 quando l'applicazione viene eseguita con autorizzazioni elevate. È possibile eseguire lo shim dell'applicazione perché non vengano richiesti diritti di amministrazione o perché vengano richiesti. Per ricevere diritti di amministrazione con Controllo dell'account utente attivato, tuttavia, l'utente dovrà approvare l'elevazione dei privilegi. La stessa regola si applica al codice personalizzato.

Nel valutare le implicazioni sulla sicurezza dell'utilizzo di shim nell'organizzazione, si consideri pertanto che il sistema non verrà esposto ad alcun rischio aggiuntivo per la sicurezza. L'utilizzo di shim per evitare di dover esporre i descrittori di sicurezza o di rendere meno efficaci i criteri di sicurezza, infatti, costituisce in genere la scelta più sicura. Senza gli shim, ad esempio, potrebbe essere possibile prevenire un problema di compatibilità rendendo più esposti gli elenchi di controllo di accesso in una directory specifica. Questa decisione, tuttavia, avrebbe effetto sull'intero sistema. Tramite gli shim è possibile reindirizzare l'accesso ai file in un percorso distinto per ogni utente per l'applicazione. Quale ulteriore esempio, si consideri un'applicazione che controlla in modo esplicito i diritti di amministratore. Senza gli shim, potrebbe essere necessario concedere diritti di amministratore dell'applicazione per superare questo controllo. Se il controllo non è necessario, tuttavia, uno shim potrebbe semplicemente mentire sulla disponibilità o meno di diritti di amministratore da parte dell'utente, consentendo l'esito positivo del controllo senza esporre ulteriore superficie di sicurezza.

Poiché, inoltre, l'infrastruttura shim inserisce essenzialmente codice aggiuntivo nell'applicazione prima della chiamata in Windows, qualsiasi azione preventiva per cui è possibile utilizzare shim può essere applicata modificando il codice stesso dell'applicazione. È possibile che l'applicazione includa almeno codice simile a quello implementato da Windows nello shim immediatamente prima della chiamata nelle API Windows.

Poiché, infine, gli shim vengono eseguiti come codice in modalità utente all'interno di un processo dell'applicazione in modalità utente, non è possibile utilizzare uno shim per correggere codice in modalità kernel. Non è possibile, ad esempio, utilizzare shim per risolvere problemi di compatibilità con driver di dispositivo o con altro codice in modalità kernel. Il codice di alcuni antivirus, firewall e antispyware, ad esempio, viene eseguito in modalità kernel.

Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft