Infrastruttura di sicurezza: gestione delle eccezioni | soluzioni di prevenzioneSecurity Frame: Exception Management | Mitigations

Prodotto o servizioProduct/Service ArticoloArticle
WCFWCF
API WebWeb API
Applicazione WebWeb Application

WCF - non includere il nodo serviceDebug nel file di configurazioneWCF- Do not include serviceDebug node in configuration file

TitoloTitle DettagliDetails
ComponenteComponent WCFWCF
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies Generico, .NET Framework 3Generic, NET Framework 3
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences MSDN, Fortify KingdomMSDN, Fortify Kingdom
PassaggiSteps I servizi Windows Communication Framework (WCF) possono essere configurati per esporre le informazioni di debug.Windows Communication Framework (WCF) services can be configured to expose debugging information. Le informazioni di debug non devono essere usate in ambienti di produzione.Debug information should not be used in production environments. Il tag <serviceDebug> definisce se è abilitata la funzionalità di informazioni di debug per un servizio WCF.The <serviceDebug> tag defines whether the debug information feature is enabled for a WCF service. Se l'attributo includeExceptionDetailInFaults è impostato su true, le informazioni di eccezione dell'applicazione saranno restituite ai client.If the attribute includeExceptionDetailInFaults is set to true, exception information from the application will be returned to clients. Gli utenti malintenzionati possono sfruttare le informazioni aggiuntive che acquisiscono dall'output di debug per sferrare attacchi su framework, database o altre risorse usate dall'applicazione.Attackers can leverage the additional information they gain from debugging output to mount attacks targeted on the framework, database, or other resources used by the application.

EsempioExample

Il file di configurazione seguente include il tag <serviceDebug>:The following configuration file includes the <serviceDebug> tag:

<configuration> 
<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name=""MyServiceBehavior""> 
<serviceDebug includeExceptionDetailInFaults=""True"" httpHelpPageEnabled=""True""/> 
... 

Disabilitare le informazioni di debug nel servizio.Disable debugging information in the service. È possibile eseguire questa operazione rimuovendo il tag <serviceDebug> dal file di configurazione dell'applicazione.This can be accomplished by removing the <serviceDebug> tag from your application's configuration file.

WCF - non includere il nodo serviceMetadata nel file di configurazioneWCF- Do not include serviceMetadata node in configuration file

TitoloTitle DettagliDetails
ComponenteComponent WCFWCF
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes Generico, .NET Framework 3Generic, NET Framework 3
RiferimentiReferences MSDN, Fortify KingdomMSDN, Fortify Kingdom
PassaggiSteps Esponendo pubblicamente informazioni su un servizio è possibile consentire agli hacker di comprendere in che modo possono sfruttare il servizio stesso.Publicly exposing information about a service can provide attackers with valuable insight into how they might exploit the service. Il tag <serviceMetadata> abilita la funzionalità di pubblicazione dei metadati.The <serviceMetadata> tag enables the metadata publishing feature. I metadati del servizio potrebbero contenere informazioni riservate che non devono essere accessibili pubblicamente.Service metadata could contain sensitive information that should not be publicly accessible. Come minimo, consentire solo agli utenti attendibili di accedere ai metadati e assicurarsi che le informazioni non necessarie non siano esposte.At a minimum, only allow trusted users to access the metadata and ensure that unnecessary information is not exposed. Ancora meglio, disabilitare completamente la possibilità di pubblicare metadati.Better yet, entirely disable the ability to publish metadata. Una configurazione di WCF sicura non conterrà il tag <serviceMetadata>.A safe WCF configuration will not contain the <serviceMetadata> tag.

Assicurare una gestione appropriata delle eccezioni in API Web ASP.NETEnsure that proper exception handling is done in ASP.NET Web API

TitoloTitle DettagliDetails
ComponenteComponent API WebWeb API
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies MVC 5, MVC 6MVC 5, MVC 6
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Gestione delle eccezioni in API Web ASP.NET, convalida del modello in API Web ASP.NETException Handling in ASP.NET Web API, Model Validation in ASP.NET Web API
PassaggiSteps Per impostazione predefinita, la maggior parte delle eccezioni non rilevate in API Web ASP.NET vengono convertite in una risposta HTTP con codice di stato 500, Internal Server ErrorBy default, most uncaught exceptions in ASP.NET Web API are translated into an HTTP response with status code 500, Internal Server Error

EsempioExample

Per controllare il codice di stato restituito dall'API, è possibile usare HttpResponseException come illustrato di seguito:To control the status code returned by the API, HttpResponseException can be used as shown below:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return item;
}

EsempioExample

Per controllare ulteriormente la risposta di eccezione, è possibile usare la classe HttpResponseMessage come illustrato di seguito:For further control on the exception response, the HttpResponseMessage class can be used as shown below:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent(string.Format("No product with ID = {0}", id)),
            ReasonPhrase = "Product ID Not Found"
        }
        throw new HttpResponseException(resp);
    }
    return item;
}

Per intercettare le eccezioni non gestite che non sono del tipo HttpResponseException, è possibile usare filtri eccezioni.To catch unhandled exceptions that are not of the type HttpResponseException, Exception Filters can be used. I filtri eccezioni implementano l'interfaccia System.Web.Http.Filters.IExceptionFilter.Exception filters implement the System.Web.Http.Filters.IExceptionFilter interface. Il modo più semplice per scrivere un filtro eccezioni è derivare la classe System.Web.Http.Filters.ExceptionFilterAttribute ed eseguire l'override del metodo OnException.The simplest way to write an exception filter is to derive from the System.Web.Http.Filters.ExceptionFilterAttribute class and override the OnException method.

EsempioExample

Ecco un filtro che converte le eccezioni NotImplementedException nel codice di stato HTTP 501, Not Implemented:Here is a filter that converts NotImplementedException exceptions into HTTP status code 501, Not Implemented:

namespace ProductStore.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;

    public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotImplementedException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }
}

Esistono diversi modi per registrare un filtro eccezioni API Web:There are several ways to register a Web API exception filter:

  • Tramite un'azioneBy action
  • Tramite un controllerBy controller
  • A livello globaleGlobally

EsempioExample

Per applicare il filtro a un'azione specifica, aggiungere il filtro come attributo per l'azione:To apply the filter to a specific action, add the filter as an attribute to the action:

public class ProductsController : ApiController
{
    [NotImplExceptionFilter]
    public Contact GetContact(int id)
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

EsempioExample

Per applicare il filtro a tutte le azioni in un controller, aggiungere il filtro come attributo per la classe controller:To apply the filter to all of the actions on a controller, add the filter as an attribute to the controller class:

[NotImplExceptionFilter]
public class ProductsController : ApiController
{
    // ...
}

EsempioExample

Per applicare il filtro a livello globale per tutti i controller API Web, aggiungere un'istanza del filtro alla raccolta GlobalConfiguration.Configuration.Filters.To apply the filter globally to all Web API controllers, add an instance of the filter to the GlobalConfiguration.Configuration.Filters collection. I filtri eccezioni in questa raccolta si applicano a qualsiasi azione del controller API Web.Exception filters in this collection apply to any Web API controller action.

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotImplExceptionFilterAttribute());

EsempioExample

Per la convalida del modello, lo stato del modello può essere passato al metodo CreateErrorResponse come illustrato di seguito:For model validation, the model state can be passed to CreateErrorResponse method as shown below:

public HttpResponseMessage PostProduct(Product item)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
    // Implementation not shown...
}

Controllare i collegamenti nella sezione Riferimenti per altre informazioni sulla gestione delle eccezioni e la convalida del modello in API Web ASP.NetCheck the links in the references section for additional details about exceptional handling and model validation in ASP.Net Web API

Non esporre informazioni di sicurezza nei messaggi di erroreDo not expose security details in error messages

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences N/DN/A
PassaggiSteps

I messaggi di errore generici vengono forniti direttamente all'utente senza includere dati sensibili dell'applicazione.Generic error messages are provided directly to the user without including sensitive application data. Esempi di dati sensibili:Examples of sensitive data include:

  • Nomi dei serverServer names
  • Stringhe di connessioneConnection strings
  • Nomi utenteUsernames
  • PasswordPasswords
  • Procedure SQLSQL procedures
  • Dettagli di errori SQL dinamiciDetails of dynamic SQL failures
  • Analisi dello stack e righe di codiceStack trace and lines of code
  • Variabili archiviate in memoriaVariables stored in memory
  • Percorsi di unità e cartelleDrive and folder locations
  • Punti di installazione dell'applicazioneApplication install points
  • Impostazioni di configurazione dell'hostHost configuration settings
  • Altri dettagli di un'applicazione internaOther internal application details

Intercettando gli errori all'interno di un'applicazione e presentando messaggi di errore generici, nonché abilitando gli errori personalizzati all'interno di IIS, è possibile evitare la divulgazione di informazioni.Trapping all errors within an application and providing generic error messages, as well as enabling custom errors within IIS will help prevent information disclosure. La gestione delle eccezioni del database di SQL Server e .NET, tra le altre architetture, di gestione degli errori, è particolarmente dettagliata ed estremamente utile a un utente malintenzionato che esegue la profilatura dell'applicazione.SQL Server database and .NET Exception handling, among other error handling architectures, are especially verbose and extremely useful to a malicious user profiling your application. Non visualizzare direttamente il contenuto di una classe derivata dalla classe di eccezione .NET e assicurarsi di disporre della gestione delle eccezioni appropriata in modo che un'eccezione imprevista non venga generata direttamente a disposizione dell'utente.Do not directly display the contents of a class derived from the .NET Exception class, and ensure that you have proper exception handling so that an unexpected exception isn't inadvertently raised directly to the user.

  • Fornire messaggi di errore generici direttamente all'utente che omettono dettagli specifici rilevati direttamente nel messaggio di eccezione o erroreProvide generic error messages directly to the user that abstract away specific details found directly in the exception/error message
  • Non consentire direttamente all'utente di visualizzare il contenuto di una classe di eccezione .NETDo not display the contents of a .NET exception class directly to the user
  • Intercettare tutti i messaggi di errore e se necessario informare l'utente tramite un messaggio di errore generico inviato al client dell'applicazioneTrap all error messages and if appropriate inform the user via a generic error message sent to the application client
  • Non esporre il contenuto della classe di eccezione direttamente all'utente, in particolare il valore restituito da .ToString(), oppure i valori delle proprietà del messaggio o dell'analisi dello stack.Do not expose the contents of the Exception class directly to the user, especially the return value from .ToString(), or the values of the Message or StackTrace properties. Registrare in modo sicuro queste informazioni e mostrare un messaggio più innocuo all'utenteSecurely log this information and display a more innocuous message to the user

Implementare la pagina di gestione degli errori predefinitiImplement Default error handling page

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Modificare la finestra di dialogo delle impostazioni pagine di errore ASP.NETEdit ASP.NET Error Pages Settings Dialog Box
PassaggiSteps

Quando un'applicazione ASP.NET ha esito negativo e causa un errore Server interno HTTP/1.x 500 o una configurazione di funzionalità (ad esempio, il filtro richieste) impedisce la visualizzazione di una pagina, verrà generato un messaggio di errore.When an ASP.NET application fails and causes an HTTP/1.x 500 Internal Server Error, or a feature configuration (such as Request Filtering) prevents a page from being displayed, an error message will be generated. Gli amministratori possono scegliere se nell'applicazione viene visualizzato un messaggio descrittivo per il client, il messaggio di errore dettagliato per il client o il messaggio di errore dettagliato solo a localhost.Administrators can choose whether or not the application should display a friendly message to the client, detailed error message to the client, or detailed error message to localhost only. Il tag in web.config ha tre modalità:The tag in the web.config has three modes:

  • On: specifica che gli errori personalizzati sono attivati.On: Specifies that custom errors are enabled. Se non viene specificato alcun attributo defaultRedirect, gli utenti visualizzato un errore generico.If no defaultRedirect attribute is specified, users see a generic error. Gli errori personalizzati vengono visualizzati sui client remoti e sull'host localeThe custom errors are shown to the remote clients and to the local host
  • Off: specifica che gli errori personalizzati sono disattivati.Off: Specifies that custom errors are disabled. Gli errori ASP.NET dettagliati vengono visualizzati sui client remoti e sull'host localeThe detailed ASP.NET errors are shown to the remote clients and to the local host
  • RemoteOnly: specifica che gli errori personalizzati vengono visualizzati solo sui client remoti e gli errori ASP.NET vengono visualizzati sull'host locale.RemoteOnly: Specifies that custom errors are shown only to the remote clients, and that ASP.NET errors are shown to the local host. Si tratta del valore predefinitoThis is the default value

Aprire il file web.config per il sito/applicazione e assicurarsi che per il tag sia definito <customErrors mode="RemoteOnly" /> o <customErrors mode="On" />.Open the web.config file for the application/site and ensure that the tag has either <customErrors mode="RemoteOnly" /> or <customErrors mode="On" /> defined.

Impostare il metodo di distribuzione al dettaglio in IISSet Deployment Method to Retail in IIS

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase DistribuzioneDeployment
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Element distribuzione (schema impostazioni ASP.NET)deployment Element (ASP.NET Settings Schema)
PassaggiSteps

Lo switch <deployment retail> deve essere usato dai server IIS di produzione.The <deployment retail> switch is intended for use by production IIS servers. Questo switch viene usato per gestire applicazioni con le migliori prestazioni possibili e minime fughe di informazioni di sicurezza disabilitando la capacità dell'applicazione per generare l'output di traccia in una pagina, disattivando la possibilità di visualizzare messaggi di errore dettagliati per gli utenti finali e disattivando l'opzione di debug.This switch is used to help applications run with the best possible performance and least possible security information leakages by disabling the application's ability to generate trace output on a page, disabling the ability to display detailed error messages to end users, and disabling the debug switch.

Spesso, gli switch e le opzioni che sono destinati agli sviluppatori, ad esempio traccia delle richieste no riuscite e debug, sono abilitati durante lo sviluppo attivo.Often times, switches and options that are developer-focused, such as failed request tracing and debugging, are enabled during active development. È consigliabile che il metodo di distribuzione in qualsiasi server di produzione sia impostato su vendita al dettaglio.It is recommended that the deployment method on any production server be set to retail. aprire il file machine.config e assicurarsi che <deployment retail="true" /> resti impostato su true.open the machine.config file and ensure that <deployment retail="true" /> remains set to true.

Le eccezioni devono avere esito negativo in modo sicuroExceptions should fail safely

TitoloTitle DettagliDetails
ComponenteComponent Applicazione Web.Web Application
Fase SDLSDL Phase CompilareBuild
Tecnologie applicabiliApplicable Technologies GenericoGeneric
Attributes (Attributi) (Attributi)Attributes N/DN/A
RiferimentiReferences Esito negativo in modo sicuroFail securely
PassaggiSteps L'applicazione deve avere esito negativo in modo sicuro.Application should fail safely. Per qualsiasi metodo che restituisce un valore booleano, in base al quale vengono prese determinate decisioni, è necessario creare con attenzione un blocco delle eccezioni.Any method that returns a Boolean value, based on which certain decision is made, should have exception block carefully created. Esistono molti errori logici che causano problemi di sicurezza quando il blocco delle eccezioni è scritto senza fare attenzione.There are lot of logical errors due to which security issues creep in, when the exception block is written carelessly.

EsempioExample

        public static bool ValidateDomain(string pathToValidate, Uri currentUrl)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(pathToValidate))
                {
                    var domain = RetrieveDomain(currentUrl);
                    var replyPath = new Uri(pathToValidate);
                    var replyDomain = RetrieveDomain(replyPath);

                    if (string.Compare(domain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        //// Adding additional check to enable CMS urls if they are not hosted on same domain.
                        if (!string.IsNullOrWhiteSpace(Utilities.CmsBase))
                        {
                            var cmsDomain = RetrieveDomain(new Uri(Utilities.Base.Trim()));
                            if (string.Compare(cmDomain, replyDomain, StringComparison.OrdinalIgnoreCase) != 0)
                            {
                                return false;
                            }
                            else
                            {
                                return true;
                            }
                        }

                        return false;
                    }
                }

                return true;
            }
            catch (UriFormatException ex)
            {
                LogHelper.LogException("Utilities:ValidateDomain", ex);
                return true;
            }
        }

Il metodo sopra indicato restituirà sempre True, se si verificano alcune eccezioni.The above method will always return True, if some exception happens. Se l'utente finale fornisce un URL in formato non valido, che il browser rispetta, ma il costruttore Uri() no, verrà generata un'eccezione e la vittima riuscirà ad accedere all'URL valido, ma in formato non valido.If the end user provides a malformed URL, that the browser respects, but the Uri() constructor doesn't, this will throw an exception, and the victim will be taken to the valid but malformed URL.