24 Deadly Sins of Software Security Programming Flaws and How To Fix Them (091 120) .En - It
24 Deadly Sins of Software Security Programming Flaws and How To Fix Them (091 120) .En - It
com
Restituisci EVAL_BODY_INCLUDE;
}
} altro {
restituisce EVAL_BODY_INCLUDE;
}
}
E infine, ecco alcuni JSP di esempio che richiamano il codice del tag appena definito:
<html>
<body bgcolor="bianco">
<htmlencoder:htmlencode><script
type="javascript">BadStuff()</script></htmlencoder:htmlencode>
<htmlencoder:htmlencode>testin</htmlencoder:htmlencode> <script
type="badStuffNotWrapped()"></script>
</corpo>
</html>
<?php
$nome=$_GET['nome'];
if (asset($nome)) {
if (preg_match('/^\w{5,25}$/',$nome)) {
echo "Ciao, " . htmlentities($nome); } altro {
echo "Vattene!";
}
}
?>
# !/usr/bin/perl
usa CGI;
usa HTML::Entità;
usare rigoroso;
if ($nome =~ /^\w{5,25}$/) {
print "Ciao, " . HTML::Entità::codifica($nome); } altro {
print "Vattene!";
}
Se non vuoi caricare, o non puoi caricare, HTML::Entites, puoi usare il seguente codice
per ottenere lo stesso risultato:
sub html_encode
mio $in = turno;
$in =~ s/&/&/g;
$in =~ s/</</g;
$in =~ s/>/>/g;
$in =~ s/\"/"/g;
$in =~ s/#/#/g;
$in =~ s/\(/(/g;
$in =~ s/\)/)/g;
$in =~ s/\'/'/g;
$in =~ s/\%/%/g;
$in =~ s/\+/+/g;
$in =~ s/\-/-/g;
ritorna $in;
}
# !/usr/bin/perl
usa Apache::Util;
usa Apache::Request;
usare rigoroso;
my $apr = Apache::Request->new(Apache->request); mio $nome
= $apr->param('nome');
$apr->content_type('text/html'); $apr-
>send_http_header;
if ($nome =~ /^\w{5,25}$/) {
$apr->print("Ciao, " . Apache::Util::html_encode($name)); } altro {
$apr->print("Vattene!");
}
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 55
1. Aggiungere un valore segreto alla sessione del client Web e del server Web; questo valore non
dovrebbe essere incluso nel cookie.
Questo è il motivo per cui l'aggiunta di un timeout è importante, in quanto chiude la finestra di opportunità
dell'attaccante.
È interessante notare che questo è un tipo di vulnerabilità della sicurezza in cui la convalida dell'input non
aiuta perché tutto l'inputÈvalido. Inoltre, un bug XSS in qualsiasi punto del sito Web consentirà di aggirare
qualsiasi mitigazione XSRF.
Si noti che l'ora è rappresentata come ora UTC anziché come ora locale; questo renderà neutrale il
fuso orario del tuo codice. Infine, la chiave MAC, _key, è una variabile globale generata all'avvio
dell'applicazione.
in altre parole, richieste idempotenti. Le richieste che modificano lo stato, ad esempio un'operazione che potrebbe
creare, aggiornare o eliminare dati, devono utilizzare un POST.
L'utilizzo di POST anziché GET può aiutare contro gli attacchi che utilizzano exploit in stile <img
src=xxx>, ma l'utilizzo di POST non interrompe l'attacco. Un utente malintenzionato può semplicemente
utilizzare un modulo HTML con JavaScript per montare l'attacco:
<copione>
document.nuke.submit(); </
script>
- Galletto di apertura
La ragione di ciò è che se consentiamo qualsiasi tag in grassetto (<b>), ad esempio, un utente malintenzionato
potrebbe essere in grado di aggiungere eventi onmouseover=nastyscript e chiaramente non lo vogliamo.
stringa r = Regex.Replace(s,
@"<(/?)(i|b|p|em|h\d{1})>", "<$1$2>",
RegexOptions.IgnoreCase);
Se utilizzi questo tipo di codice, è importante che tu imposti anche una code page, perché i
caratteri “<” e “>” potrebbero non essere validi in alcune code page.
Fare riferimento alla sezione "Altre risorse" alla fine di questo capitolo per ulteriori
informazioni. Puoi impostarlo in Visual Basic e ASP.NET con questa sintassi:
sessione.cookie_httponly=1
O
setcookie("myCookie", $data, 0, "/", "www.example.com", 1, 1);
Usa Apache::TaintRequest
Il mod_perl di Apache offre Apache::TaintRequest per aiutare a rilevare quando l'input diventa output
senza essere prima convalidato. Fare riferimento alla sezione "Altre risorse" in questo capitolo per
ulteriori informazioni.
Usa UrlScan
UrlScan di Microsoft per Internet Information Server 5.0 consente di rilevare e rifiutare molte
classi di vulnerabilità XSS nel codice dell'applicazione Web.
60 24 peccati capitali della sicurezza del software
UrlScan non è necessario con Internet Information Server 6.0 e versioni successive (IIS) poiché IIS dispone di
funzionalità simili integrate. Per ulteriori informazioni, consultare la sezione "Altre risorse" in questo capitolo.
ISO-8859-1, chiamato anche Latin-1, è una codifica di caratteri standard di 191 caratteri della
scrittura latina.
In ASP.NET puoi impostare globalmente la codepage per la tua applicazione web con quanto
segue:
<sistema.web>
<globalizzazione
requestEncoding="iso-8859-1"
responseEncoding="iso-8859-1"/> </
system.web>
Oppure per una singola pagina ASP.NET o un insieme di pagine, puoi utilizzare questo:
In JSP, puoi usare una linea come questa nella parte superiore delle tue pagine web:
ALTRE RISORSE
- “Segnalare vulnerabilità è per i coraggiosi”: http://
www.cerias.purdue.edu/site/blog/post/
reporting-vulnerabilities-is-for-the-brave/
- Common Weakness Enumeration (CWE) Software Assurance Metrics e valutazione degli
strumenti: http://cwe.mitre.org
- 2009 CWE/SANS Primi 25 errori di programmazione più pericolosi:
http://cwe.mitre.org/top25
- “Divide et impera: suddivisione della risposta HTTP, attacchi Web Cache
Poisoning e argomenti correlati”: www.securityfocus.com/archive/1/356293
Peccato 2: vulnerabilità legate al server Web (XSS, XSRF e Response Spl itt ing) 61
- Attenuazione degli script tra siti con cookie solo HTTP: http://
msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/
httponly_cookies.asp
- Convalida della richiesta: prevenzione degli attacchi di
script: www.asp.net/faq/requestvalidation.aspx
- Come prevenire i problemi di sicurezza degli script tra siti in CGI o ISAPI: http://
support.microsoft.com/default.aspx?scid=kb%3BEN-US%3BQ253165
- Come posso: prevenire un difetto di sicurezza di contraffazione di richieste tra siti in
un'applicazione ASP.NET? http://msdn.microsoft.com/en-us/security/bb977433.aspx
RIEPILOGO
- Farecontrollare tutti gli input basati sul Web per verificarne la validità e l'affidabilità.
- Farestare al passo con le nuove vulnerabilità in stile XSS, poiché è un campo minato in continua
evoluzione.
- Nonfa eco all'input basato sul Web senza verificare prima la validità.
- Nonfare affidamento su elenchi "non consentiti" (ovvero blacklist o blocklist) come unica difesa.
- Nonutilizzare le richieste GET per le operazioni che modificano i dati del server
63
64 24 peccati capitali della sicurezza del software
- Gadget e widget
- Pagine HTML statiche sul computer dell'utente
- Ticker di borsa
- Feed RSS
- Note adesive
- Informazioni di sistema
- Dati meteorologici
- Orologi
- Sveglie
- Mini giochi
- Risultati sportivi
Una bellezza dei gadget è che possono essere facilmente creati utilizzando le tecnologie attuali. Non sono
richieste abilità speciali. Ora pensaci per un momento. Siamo tutti favorevoli ad abbassare la barriera all'ingresso per
la scrittura di domande, ma ciò significa anche che le persone hanno poca o nessuna considerazione
Peccato 3: Vulnerabilità correlata al client Web (XSS) 65
per sicurezza puoi scrivere questo codice che si trova accanto alle tue altre applicazioni,
facendo chissà cosa! Una rapida occhiata ai siti Web di Microsoft, Yahoo!, Google e
Apple mostra decine di migliaia di gadget disponibili per Windows, Mac OS X e iPhone
e per i siti Web di Google, Yahoo e Windows Live. È un sacco di codice scritto
prevalentemente da dilettanti.
Nel caso di Windows Vista, questi gadget vengono visualizzati nella barra laterale. In
Windows 7 il processo Sidebar esiste ancora, ma non è visibile sullo schermo, quindi i gadget
appaiono essenzialmente ovunque sullo schermo. In Mac OS X, i widget vengono visualizzati
nella Dashboard.
Il problema fondamentale è che i gadget possono eseguire il rendering di input non attendibili che
potrebbero contenere codice, portando a vulnerabilità simili a una vulnerabilità XSS di tipo 1. La grande
differenza è piuttosto che commettere peccati mentre si chiama il codice del server Web, come
Response.Write, un gadget peccaminoso o una pagina HTML sul computer client utilizza in modo non sicuro
costrutti HTML Document Object Model (DOM), come document.location e document. scrivere, solo per
citarne alcuni.
RIFERIMENTI CWE
Le seguenti voci CWE (Common Weakness Enumeration), entrambe elencate nella
CWE/SANS Top 25 Most Dangerous Programming Errors, forniscono informazioni
dettagliate sulle vulnerabilità XSS-0:
- CWE-79: mancata sanificazione delle direttive in una pagina Web (ovvero "Cross-site
scripting" [XSS])
LINGUE INTERESSATE
Qualsiasi linguaggio di programmazione che può essere visualizzato in un browser è suscettibile a questi
peccati; inclusi JavaScript, Ruby e Python. La maggior parte delle pagine e dei gadget HTML sono scritti
utilizzando HTML con chiamate a JavaScript che potrebbero potenzialmente manipolare il Document Object
Model (DOM).
IL PECCATO SPIEGATO
Un tipo 0 o DOM XSS è un bug che consente a un utente malintenzionato di manipolare il DOM tramite
input non attendibile. Un esempio semplice e in qualche modo innocuo è un file HTML o un gadget che
esegue il rendering, magari chiamando document.innerHTML, il seguente script senza verificarlo
prima:
Questo codice attraversa il DOM per la pagina web o il gadget corrente e modifica ogni tag di
ancoraggio <a> in modo che punti a http://www.example.com.
Naturalmente, un vero exploit sarebbe un po' subdolo "codificando" l'URL; e ci sono
numerosi modi nefasti per codificare l'intero payload in modo che l'utente non abbia idea di
quale sia l'input.
Certo, è tutto divertimento e giochi, ma un attacco di questa natura potrebbe essere molto peggio; è
anche possibile iniettare codice nel DOM. Ad esempio, un utente malintenzionato potrebbe forzare la pagina
HTML o il gadget a eseguire il rendering di un file QuickTime o Flash non valido per l'esecuzione di codice
arbitrario. Questo non è diverso da un classico attacco "drive-by" basato sul Web in cui l'utente visita una
pagina Web che contiene un file malformato e dannoso. Fondamentalmente, i gadget che vengono eseguiti su
un desktop dovrebbero essere trattati come file eseguibili.
Ripetiamo quest'ultimo punto. I gadget possono avere lo stesso accesso a un computer
di un binario x86 completo e dovrebbero essere creati con la stessa cura di un'applicazione
binaria.
Se hai bisogno di più convincente, ecco un commento dal sito web di Apple:
Le funzionalità di HTML, CSS e JavaScript non definiscono l'intero spettro di ciò che è
possibile in un Widget. In realtà, segnano solo il punto di partenza. Da lì, puoi
accedere alle funzionalità approfondite di Mac OS X.
Comandi UNIX
Dall'oggetto widget è possibile accedere a qualsiasi comando o script UNIX, inclusi quelli
scritti in sh, tcsh, bash, tcl, Perl o Ruby nonché AppleScript. Questa capacità di attingere alla
riga di comando significa che è possibile accedere a un'incredibile quantità di potenza da
qualsiasi widget.
Ora immagina di poter sfruttare quelle "capacità profonde" tramite una vulnerabilità
XSS in un gadget!
Peccato 3: Vulnerabilità correlata al client Web (XSS) 67
funzione GetData(url){
se (XMLHttpRequest){
var xhr = nuovo XMLHttpRequest(); }altro{
. figlioNodi[0]
. figlioNodi[0]
. nodoValore;
}
}
}
xhr.send(nullo);
}
- Prende l'input da una fonte non attendibile, che in pratica significa qualsiasi cosa al di fuori
del Web e poi . . .
- documento.url
- documento.posizione
- Web.Network.createRequest
- XMLHttpRequest
O
var req = new ActiveXObject("Microsoft.XMLHTTP");
Dopo aver individuato questi punti di ingresso nella pagina HTML o nel gadget,
cerca i seguenti punti di uscita:
Peccato 3: Vulnerabilità correlata al client Web (XSS) 69
* . innerHtml
* . html
document.write
* . insertAdjacentHTML
valuta()
tag <oggetto>
System.Sidebar.* in particolare System.Sidebar.Execute (Windows)
filesystem.* e sistema* (Yahoo!)
framework.system (Google)
widget.* (Nokia e Apple), in particolare widget.system. (Mela)
Informazioni di sistema (Nokia)
ESEMPIO PECCATI
Le seguenti voci sul sito Web Common Vulnerabilities and Exposures (CVE) (http://
cve.mitre.org/) sono esempi di XSS e delle relative vulnerabilità.
come i messaggi 500 e 404. Se guardi attentamente il codice, DocURL contiene dati non
attendibili e questo finisce per trovare la strada per un document.write. Ops!
<COSCRIZIONE>
{
...
g_viewElements.FeedItems[i].innerHtml = feedItemName;
In questo caso feedItemName non è attendibile; è arrivato direttamente dal Web e poi è
stato scritto nel DOM del gadget. Succedono cose brutte se feedItemName contiene script.
Se un utente malintenzionato sfruttasse la vulnerabilità dei titoli dei feed RSS della barra laterale di
Windows Vista e fornisse la seguente stringa (sarebbe codificata, non proprio così!) come nome
dell'elemento del feed (variabile feedItemName), potrebbero accadere cose brutte.
<object id="webcam"
classid="CLSID:E504EE6E-47C6-11D5-B8AB-00D0B78F3D48" > </object>
<copione>
webcam.TargetName="Il codice exploit di sovraccarico del buffer va qui"; </
script>
La lezione da questo è che se crei qualsiasi forma di codice mobile, quel codice dovrebbe essere il
più sicuro possibile perché quel codice potrebbe essere riutilizzato in modi che non ti saresti mai
aspettato.
FASI DI RISCATTO
La redenzione più fondamentale è non fidarsi degli input; è sempre così semplice! Quindi,
quando esegui una revisione del codice, guarda dove i dati entrano nel sistema e guarda dove
escono dal sistema e assicurati che da qualche parte tra questi due punti, il codice verifichi che i
dati siano corretti.
La prossima redenzione è non usare costrutti potenzialmente pericolosi e terribilmente
peccaminosi; per esempio, perché usare innerHTML quando innerText sarà sufficiente?
Diamo un'occhiata a ciascuno con esempi di codice.
sito web. Puoi correggere la mancanza di autenticazione utilizzando correttamente SSL/TLS; ne parleremo più
dettagliatamente più avanti nel libro, in Sin 22 e 23.
funzione getStockInfo(ticker) {
xhr.send();
if (xhr.readyState == 4) {
if (xhr.statusText == "OK") {
var risposta = xhr.responseText;
if (risposta.lunghezza <= MAX_RESPONSE_LEN) {
risposta di ritorno;
}
}
}
funzione isValidStockInfo(stock) {
var re = /^[A-Z0-9\.\,\"\s]{1,18}$/ig; return
re.test(stock);
}
pagina o gadget, lo script viene visualizzato come testo. In effetti, il tuo commento predefinito quando vedi il codice
che imposta innerHTML dovrebbe essere "perché questo non è innerText?"
Evita di costruire codice HTML e di inserirlo nel DOM utilizzando metodi come
insertAdjacentHTML. Piuttosto, crea un elemento HTML usando createElement, popola le
sue proprietà e poi inseriscilo nel DOM usando i metodi appendChild o insertBefore, come
mostrato qui:
ALTRE RISORSE
- Archivio XSS: http://www.xssed.com/archive/special=1
- 2009 CWE/SANS Primi 25 errori di programmazione più pericolosi:
http://cwe.mitre.org/top25
- Widget W3C: 1.0d http://www.w3.org/2008/webapps/wiki/Main_Page
- L'oggetto XMLHttpRequest: http://www.w3.org/TR/XMLHttpRequest/
- “Apple dà accesso ai ladri di identità”: http://www.boston.com/business/
personaltech/articles/2005/05/16/
apple_gives_identity_thieves_a_way_in?pg=full
- Sviluppo di widget Dashboard: http://
developer.apple.com/macosx/dashboard.html
- Strumenti e documentazione di Konfabulator: http://widgets.yahoo.com/tools/
- “Ispeziona il tuo gadget" di Michael Howard e David Ross:
http://msdn.microsoft.com/en-us/library/bb498012.aspx
74 24 peccati capitali della sicurezza del software
RIEPILOGO
- Fareconvalidare tutti i dati della rete esterna.
- Nonfidati di tutti i dati che entrano nella tua pagina web o gadget.
- Nonusa eval() a meno che non ci sia altro modo per scrivere la tua applicazione.
75
76 24 peccati capitali della sicurezza del software
RIFERIMENTI CWE
Il progetto Common Weakness Enumeration include le seguenti voci correlate a questo
peccato:
LINGUE INTERESSATE
Qualsiasi lingua o tecnologia utilizzata per creare un sito Web può essere influenzata; ad
esempio, PHP, Active Server Pages (ASP), C#, VB.NET, ASP.NET, J2EE (JSP, Servlet), Perl, Ruby,
Python e Common Gateway Interface (CGI), nonché in misura minore , C++.
IL PECCATO SPIEGATO
Ci sono due errori distinti associati a questo peccato, quindi diamo un'occhiata a loro uno alla
volta.
URL magici
Il primo errore è URL magici o URL che contengono informazioni sensibili o informazioni che
potrebbero portare un utente malintenzionato a informazioni sensibili. Guarda il seguente URL:
http://www.example.com?id=TXkkZWNyZStwQSQkdzByRA==
Peccato 4: uso di URL magici, cookie prevedibili e campi modulo nascosti 77
Ci chiediamo, cos'è quello dopo l'id? Probabilmente è codificato in base64; puoi dirlo dal
piccolo sottoinsieme di caratteri ASCII e dai caratteri di riempimento "=". Passando rapidamente
la stringa attraverso un decodificatore base64 si ottiene "My$ecre+pA$$w0rD". Puoi vedere
subito che questa è in realtà una password "crittata", dove l'algoritmo di "crittografia" è base64!
Chiaramente, questo è insicuro.
Il seguente frammento di codice C# mostra come codificare e decodificare una stringa in base64:
In breve, i dati contenuti ovunque nell'URL, o nel corpo HTTP per quella materia, che sono
potenzialmente sensibili sono peccaminosi se il payload non è protetto dalle difese crittografiche
appropriate.
Qualcosa da considerare è la natura del sito web. Se i dati dell'URL vengono utilizzati per scopi di
autenticazione, probabilmente hai un problema di sicurezza. Tuttavia, se il sito Web utilizza i dati per
l'iscrizione, forse non è un grosso problema. Ancora una volta, dipende da cosa stai cercando di
proteggere.
Cookie prevedibili
Alcuni siti Web peccaminosi emettono un cookie prevedibile dopo l'autenticazione riuscita. Ad esempio,
utilizzando un valore a incremento automatico nel cookie. Questo è negativo perché basta che un
utente malintenzionato veda che quando si connette al sito un paio di volte, il valore del cookie è
1000034 e poi 1000035, quindi l'attaccante forza il cookie a 1000033 e dirotta la sessione di un altro
utente. Tutto su SSL se necessario!
Immagina il seguente scenario: costruisci e vendi un sito web fotografico online che consente agli utenti
di caricare le foto delle loro vacanze. Questo potrebbe essere considerato un sistema di appartenenza perché
le foto probabilmente non sono sensibili o classificate. Tuttavia, immagina se un utente malintenzionato
(Mallet) potesse vedere le credenziali di un altro utente (Dave) (nome utente, password o valore "magico" o
prevedibile) volare attraverso il cavo nell'URL o nel payload HTTP, incluso il cookie. Mallet potrebbe creare un
payload che include le credenziali di Dave per caricare materiale pornografico sul sito web. A tutti gli utenti del
sistema, queste immagini sembrano provenire da Dave, non da Mallet.
Peccati correlati
A volte gli sviluppatori web compiono altri peccati, in particolare il peccato di usare una crittografia
scadente.
- Le informazioni sensibili vengono lette dall'app Web da un cookie, un'intestazione HTTP, un modulo
o un URL.
- I dati vengono utilizzati per prendere decisioni sulla sicurezza, sulla fiducia o sull'autorizzazione.
mod_perl Apache::Richiesta
ISAPI (C/C++) Lettura da un elemento dati in
EXTENSION_CONTROL_BLOCK, come
lpszQueryString; o da un metodo, come
GetServerVariable o ReadClient
Peccato 4: uso di URL magici, cookie prevedibili e campi modulo nascosti 79
Per i campi modulo nascosti, il compito è un po' più semplice. Scansiona tutto il codice del tuo server web
e verifica la presenza di eventuali HTML inviati al client contenenti il seguente testo:
tipo=nascosto
Regex r = nuovo
Regex("type\\s*=\\s*['\"]?hidden['\"]?",RegexOptions.IgnoreCase); bool isHidden =
r.IsMatch(stringToTest);
Oppure in Perl:
my $isHidden = /type\s*=\s*['\"]?hidden['\"]?/i;
Per ogni elemento nascosto che trovi, chiediti perché è nascosto e cosa accadrebbe se un
utente malintenzionato modificasse il valore nel campo nascosto con un altro valore.
Puoi anche fare in modo che Fiddler trovi ed evidenzi le pagine web che contengono moduli nascosti creando
una regola personalizzata:
- Apri il violinista
if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")) {
// Rimuovi qualsiasi compressione o suddivisione in
blocchi oSession.utilDecodeResponse();
var oCorpo =
System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes); if
(oBody.search(/<input.*hidden.*>/gi)>-1) {
oSessione["ui-bold"] = "vero"; oSessione["ui-
color"] = "rosso";
FiddlerObject.playSound("Notifica");
}
}
Qualsiasi pagina Web con un modulo nascosto apparirà in grassetto rosso nel riquadro Sessioni Web e
Fiddler emetterà un segnale acustico.
Peccato 4: uso di URL magici, cookie prevedibili e campi modulo nascosti 81
ESEMPIO PECCATI
La seguente voce in Common Vulnerabilities and Exposures (CVE), su http://
cve.mitre.org/, è un esempio di questo peccato.
CVE-2005-1784
Questo è un bug in uno strumento di amministrazione host chiamato Host Controller; ha una pagina web non
sicura userprofile.asp che permette agli utenti di modificare i dati del profilo di altri utenti semplicemente
impostando il loro indirizzo e-mail nel campo emailaddress.
FASI DI RISCATTO
Quando pensi alle minacce agli URL magici e ai moduli nascosti e alle possibili
contromisure, considera sempre le seguenti minacce: