Visualizzazioni:

Problema:

Le richieste HTTP alla piattaforma DocuWare di un sistema Cloud restituiscono il codice di stato 403 - Vietato con il messaggio di risposta "Request bloccata dal firewall di DocuWare".

 

Esempio:

curl https://{{url}}/docuware/platform/Organizations -H "Authorization: Bearer {{AccessToken}}" -H "Accept: application/json\r\n"
403 - Request bloccata dal firewall di DocuWare

 

Causa principale:

Questo comportamento si verifica quando il firewall di DocuWare respinge le richieste contenenti potenziali attacchi di tipo request-splitting e può essere causato da una o più intestazioni di richiesta che utilizzano CRLF per inviare stringhe a più righe.

 

.NET/ApplicationsInsights: Molto probabilmente la strumentazione in stile .NET / App Insights aggiunge un header di tracciamento distribuito legacy. Gli stack .NET/App Insights più vecchi propagano il bagaglio nell' intestazione non standard Correlation-Context. Le chiavi/valori in tale intestazione sono codificati in URL. %0D%0A è il valore codificato in URL per CRLF, che molti WAF/firewall segnalano come request-splitting e bloccano.

La chiave specifica che molto probabilmente si vede è traceStartInfo, che è il nome di una voce del bagaglio. (Si tratta di un concetto di diagnostica lato Microsoft; lo stesso nome è presente nei percorsi del codice di tracciamento .NET).

 

  • Il propagatore legacy .NET (e i vecchi SDK di Application Insights, che si basano su di esso) scrive il bagaglio dell'applicazione nell' intestazione della richiesta Correlation-Context, ad esempio Correlation-Context: name1=value1,name2=value2... con valori codificati in URL. Se un valore contiene CR/LF, diventa %0D%0A, che il firewall di DocuWare considera sospetto.
  • Lo standard del settore oggi è W3C Trace Context + W3C Baggage, ovvero propagare il tracciamento tramite traceparent/tracestate e inviare il bagaglio in un' intestazione bagaglio separata (non Correlation-Context). Le nuove versioni di .NET si sono mosse in questa direzione.
  • A partire da .NET 10, il propagatore predefinito è W3C (usa il bagaglio, non Correlation-Context). Se si vede ancora Correlation-Context, è probabile che si stia utilizzando un vecchio runtime, una vecchia strumentazione o che si sia optato esplicitamente per il propagatore legacy.

 

Ulteriori informazioni sull'intestazione http Correlation-Context sono disponibili qui: https://github.com/AloisReitbauer/distributed-tracing/blob/master/correlation_context/HTTP_HEADER_FORMAT.md

 

Soluzione generale:

Disconoscere le stringhe multilinea in tutte le intestazioni HTTP evitando tutti i valori CRLF nelle intestazioni HTTP.

 

Soluzione .NET A: interrompere l'emissione di Correlation-Context e passare al W3C.

Aggiornare il runtime/strumentazione in modo che il default sia il propagatore W3C, oppure impostarlo esplicitamente all'avvio dell'applicazione. Questo fa sì che il bagaglio fluisca attraverso l' intestazione baggage e il tracciamento attraverso traceparent/tracestate, eliminando l' intestazione Correlation-Context.

Se si dispone di strumentazione con OpenTelemetry o con la distro OTel di Azure Monitor, mantenere solo i propagatori W3C (TraceContext + Baggage). In questo modo si evita completamenteCorrelation-Context.

 

Per ulteriori informazioni, vedere qui.

 

Soluzione .NET B: mantenere l'implementazione legacy, ma sanificare ciò che si inserisce nel bagaglio

Se dovete mantenere Correlation-Context per compatibilità, assicuratevi di non aggiungere mai CR o LF ai valori del bagaglio. Cercare nel codice qualcosa come Activity.Current?.AddBaggage("traceStartInfo", ...). Eliminare \r e n ed evitare le stringhe a più righe.

 

Soluzione .NET C: Rimuovere le stringhe a più righe dai valori di intestazione

Assicurarsi di igienizzare tutte le intestazioni per rimuovere CR\LF da tutti i valori delle intestazioni HTTP.

 

Soluzione JS di Application Insights:

Se l'intestazione proviene dal browser tramite l'Application Insights JS SDK, è possibile disabilitare temporaneamente le intestazioni di correlazione o l'ambito in cui vengono aggiunte. L'SDK decide se aggiungere intestazioni di correlazione. Il controllo di queste impostazioni impedisce l'emissione di intestazioni problematiche verso determinate origini.

 

new ApplicationInsights({

config: {

// ..

disableCorrelationHeaders: true

}

});