Title: ASP.NET%20Security
1ASP.NET Security
"Non esiste una patch per la stupidità"
http//www.sqlsecurity.com
- Raffaele Rialdi MVP.NET
- malta_at_vevy.com
- http//mvp.support.microsoft.comMVP Profile
http//snipurl.com/7vyf
2Agenda
Spoofing / Tampering
Spying
Sql/script Injection
D.O.S.
Autenticazione ("chi sei?")
Autorizzazione ("cosa posso fare?")
IIS
- Anonymous
- Basic
- Windows
- Certificate
- NTFS Access Control List (ACL)
Asp.net.aspx, .asmx, .asax, .ascx, .soap, .rem,
...
- UrlAuthorizationModule
- FileAuthorizationModule
Web Application
- None
- Windows
- Forms
- Passport
NTFS
LDAP
SQL
3Meccanismi diAutenticazione
- IIS
- Anonima
- Basic
- Digest
- Certificate
- Windows
- Asp.net
- Passport
- Forms
IIS mappa l'utente su IUSR_nomemacchina Asp.net lo vede come "" Utente non viene riconosciuto anche se è in Lan
Usano lo store delle credenziali di Windows Richiedono una CAL per ogni utente
La password non viaggia sulla rete
Credenziali in chiaro (necessita SSL)
4Windows Authenticationstep-by-step
- Web.config di default è pronto
- Impostare le autorizzazioni
- Disabilitare l'autenticazione anonima in IIS ...
(prossime slide) - L'utente autenticato è (stringa vuota se
anonimo) - L'utente usato dal worker process è
ltauthentication mode"Windows" /gt
ltauthorizationgt ltdeny users"?" /gt ltallow
users"" /gt lt/authorizationgt
? ? utente anonimo ? tutti gli utenti
HttpContext.Current.User.Identity.Name
System.Security.Principal.WindowsIdentity.GetCurre
nt().Name
5Internet Information ServerIIS5 (Windows 2000 /
XP Pro)
6Internet Information ServerIIS6 (Windows 2003)
7IIS6 Application pool
8Impersonation(solo con Windows Authentication)
- Il token di security a livello di thread viene
sostituito con quello dell'utente autenticato.Il
token di processo rimane invariato. - Se l'utente è anonimo, viene impersonato
IUSR_NomePc - Sintassi (web.config) ltidentity impersonatetrue
/gt - IIS5 non può eseguire più worker process sotto
identità diverseSoluzione impersonation di un
utente specificoltidentity impersonatetrue
user"xxx" password"zzz" /gt
9I problemi architetturali di Impersonation
- Molti vogliono usare la security di Sql server
- Se il db è in rete, impersonation non funziona ma
ci vuole invece delegation - Si perde il controllo centralizzato della
security(accedere a Ntfs, Ldap, risorse in rete,
DB) - La security 'per righe' fatta con sql server è un
incubo
10I problemi tecnologici di Impersonation
- Il token dell'utente non può essere usato per
accedere a risorse remote (per es. la webapp non
può usarlo per accedere un db in rete)La
soluzione viene con Delegation che è di default
disabilitata (proprio perchè è pericolosa!) - Impersonation implica contesti diversi per
ciascun utente. Questo significa niente
connection pooling - Protezione limitata. Un eventuale buffer overrun
può usare sia il token di thread (impersonato)
che quello di processo (worker process) usando
RevertToSelf. - Se chiamo un componente COM che sta in un
apartment diverso, COM non userà il token di
impersonazione ma quello di processo
11Forms Authenticationstep-by-step
- Abilitare l'autenticazione anonima in IIS
- Impostare l'autenticazione e i suoi parametri
- Impostare le autorizzazioni
- Creare la pagina di login controllare l'utente e
autorizzarlo
ltauthentication mode"Forms"gt ltforms
name"myCookieName" loginUrl"/Login.aspx"
/gt lt/authenticationgt
ltauthorizationgt ltdeny users"?" /gt ltallow
users"" /gt lt/authorizationgt
? ? utente anonimo ? tutti gli utenti
if(UserDB.Check(txtUsername.Text,
txtPassword.Text)) FormsAuthentication.Redirect
FromLoginPage( txtUsername.Text,
ckRemember.Checked)
12Forms Authenticationgestire i ruoli
- Gestire l'evento Application_AuthenticateRequest
- Impostare le autorizzazioni per singole parti del
sito
protected void Application_AuthenticateRequest(Obj
ect sender, EventArgs e) UserDB.AssignRoles()
ltlocation path"Backoffice.aspx"gt ltsystem.webgt
ltauthorizationgt ltdeny users"?" /gt ltallow
roles"admins" /gt ltdeny users""
/gt lt/authorizationgt lt/system.webgt lt/locationgt
L'ordine di valutazione delle autorizzazioni è
dal primo verso l'ultimo. Il primo 'match' vince.
13Forms AuthenticationGestione utenti e ruoli
- Si costruisce una piccola classe
public class UserDB public static bool
CheckUser(string Username, string
Password) return (Username Password)//
Solo per la demo!!! -) public static void
AssignRoles() IPrincipal CurrentUser
HttpContext.Current.User if(CurrentUser !
null CurrentUser.Identity.IsAuthenticated
CurrentUser.Identity.AuthenticationType
"Forms") string User CurrentUser.Identity
.Name string roles GetRolesForUser(User)
CurrentUser new System.Security.Principal.Ge
nericPrincipal (CurrentUser.Identity,
roles) private static string
GetRolesForUser(string User) string roles
new string2 roles0 "Administrators"
roles1 "Users" return roles // Solo per
la demo!
14Principal e IdentityLa sicurezza basata sui
ruoli secondo il framework
- IIdentity rappresenta l'identità di un
utenteWindowsIdentity, FormsIdentity,
PassportIdentity, GenericIdentity - IPrincipal contiene l'Identity e i
ruoliWindowsPrincipal, GenericPrincipal
- String. "Windows", "Forms", "Passport", ...
- Bool. Indica se l'utente è autenticato
- String. Nome dell'utente
AuthenticationType
IsAuthenticated
Name
- IIdentity.
- Bool. Indica se l'utente appartiene ad un certo
ruolo (gruppo)
Identity
IsInRole
15Forms AuthenticationGestione utenti
- Gli utenti si possono anche gestire nel
web.config ma è sconsigliato
ltauthentication mode"Forms"gt ltforms
name"myCookieName" loginUrl"/Login.aspx"gt ltcr
edentials passwordFormat "SHA1" ltuser
name"UserName1" password"SHA1EncryptedPassword1"
/gt lt/credentialsgt lt/formsgt lt/authenticationgt
16EsempioForms Authentication
17Forms AuthenticationTip
- Diciamo di avere due Web Application ...
- Prendiamo in considerazione
- Nome del cookie della Forms authentication
- Path del cookie
- Il tag ltmachineKey ... /gt nel web.config(vedi
http//support.microsoft.com?id312906) - Se sono identici, l'utente potrà navigare da una
all'altra senza doversi ri-autenticare - Se almeno uno di questi è diverso, sarà
necessario ri-autenticarsi
18Autenticazione mistaWindows / Forms
- Il problema
- In Windows Authentication, l'header HTTP
"LOGON_USER" contiene il nome utente - Se IIS è configurato come anonimo, NON viene
passato il nome utente anche se siamo loggati sul
dominio - ... Ma la Forms authentication richiede che IIS
sia configurato come anonimo(altrimenti compare
la dialog di autenticazione)
19Autenticazione mistaWindows / Forms
- La soluzione
- Due pagine di Login Forms e Windows
- Web.config configurato per la Forms
- Autorizzazione a tutti per la pagina di Login
Windows - IIS WebApp abilitare accesso anonimo
- IIS LoginWin.aspx togliere accesso anonimo
- LoginWin.aspx Crea il ticket della Forms
authenticaion a partire dalle credenziali Windows
ltlocation path"LoginWin.aspx"gt ltsystem.webgt lta
uthorizationgt ltallow users""
/gt lt/authorizationgt lt/system.webgt lt/locationgt
20EsempioAutenticazione mista
21Forms Authenticationcon LDAP
- LDAP è un protocollo per dialogare con Active
Directory - Posso chiedere con LDAP
- di verificare le credenziali di un utente su AD
- di darmi l'elenco dei gruppi a cui appartiene
quell'utente - Il codice per fare queste due cose è
quihttp//support.microsoft.com/?id326340 - Metodo 1 Public Function IsAuthenticated(ByVal
domain As String, ByVal username As String, ByVal
pwd As String) As Boolean - Metodo 2 Public Function GetGroups() As String
- Un ottimo motivo per usarla è nelle WebApp con
autenticazione mista Windows Forms
22Dove siamo?
Autenticazione
IISBasic, Win, ...
Asp.netPassport, Form
Raffaele
Pagina si/no
Autorizzazione
IISNTFS
Asp.netltauthorization ... /gt
Codice si/no
Controllo Imperativo
Controllo dichiarativo
Asp.netPrincipalPermission, etc.
23Sicurezzaimperativa e dichiarativa
- Gli attrezzi del mestiere
- IPrincipal.IsInRole() ? Imperativa (bool)
- PrincipalPermission.Demand() ? Imperativa
(SecurityException) - PrincipalPermissionAttribute ? Dichiarativa
(SecurityException)
if(User.IsInRole("Admins")) ...
PrincipalPermission perm new PrincipalPermission
(null, "Admins") perm.Demand()
PrincipalPermissionAttribute PrincipalPermission
(SecurityAction.Demand, Role"Admins") public
void MyAdminMethod() ...
24Esempio SecureHandlerRole Based Authorization
25Mai dare informazioni preziosedefault
ltcustomErrors mode"RemoteOnly" /gt
- Qualsiasi informazione sugli errori può essere
sfruttata da un hacker. - Gli errori custom (che nascondono i dettagliati)
- mode"Off" ? mostrati a nessuno
- mode"On" ? mostrati a tutti
- mode"RemoteOnly" ? solo in remoto
- Questo meccanismo è poco elastico
- Possiamo usare un HttpModule per migliorare la
situazione ....
26CustomErrorHandler(esempio)
- Web.ConfigltcustomErrors mode"On"
defaultRedirect"/HttpErrors.aspx" /gt....
lthttpModulesgt ltadd type"CustomErrorHandler.RafE
rrorModule, CustomErrorHandler"
name"RafErrorModule"/gtlt/httpModulesgt - Due pagine di gestione erroreSoftError.aspx
(per utenti) e HardError.aspx (per admin) - Il Module redirige gli errori a seconda del ruolo
dell'utente - Il Module gestisce gli errori Http e le Exception
- ... vediamo il codice ...
27EsempioCustomErrorHandler
28SQL Injection
- Un pirata può devastare il db ...
string strSql "Select from authors where
au_lname like '" TextBox1.Text
"'" SqlCommand cmd new SqlCommand(strSql,
Cnn) SqlDataReader dr cmd.ExecuteReader()
Select from authors where au_lname like ' '
drop authors - - '
Prima query
Seconda query
Scartato
29SQL Injection... usare i parameters!!! ...
- I Parameters incrementano anche le performance
- non c'è conversione da string a tipo sul db
- la query rimane compilata e preparata sul db
server
string strSql "Select from authors where
au_lname like _at_au_lname" SqlCommand cmd new
SqlCommand(strSql, Cnn) cmd.Parameters.Add("_at_au_l
name", SqlDbType.VarChar,40) SqlDataReader dr
cmd.ExecuteReader()
exec sp_executesql N'Select from authors where
au_lname like _at_au_lname', N'_at_au_lname
varchar(40)', _at_au_lname ' ' ' drop
authors - - '
apice raddoppiato da ADO.NET
Gli apici non sono l'unico problemaselect
from titles where royalty 0 drop authors
30XSS Cross Site Scripting
From Hacker To Raffaele Subject Free
gift Click here to win
?
?
?
?
?
?
- Normale navigazione
- Email con link contenente un attacco XSS
- Il link effetua una GET sul sito della banca con
la QueryString - La banca (non protetta da XSS) restituisce nella
pagina html lo script inviato - Lo script viene eseguito dal browser e le
informazioni riservate arrivano al pirata
31Contromisura di asp.net 1.1lt_at_ Page
validateRequest"true" gt(true by default)
- Riconosce un eventuale input malizioso
dell'utente e lancia l'eccezione
HttpRequestValidationException - Se però voglio accettare una stringa html/script
dall'utente? - Opzione 1 validateRequest false (vale per
tutta la pagina) e validarla. - Opzione 2 criptare sul client, decrittarla sul
server e validarla. - Sul client (durante la onsubmit) si cripta il
contenuto con encode di javascript - il contenuto criptato si mette dentro un ltinput
typehiddengt - sul server si usa HttpUtility.UrlDecode per
decodificare la stringa - La validazione ...
- si può usare Server.HtmlEncode per farlo apparire
sulla pagina - si può fare il parsing per eliminare i tag
pericolosi
32ltInput typehidden /gt
- Spesso viene usato un campo hidden per conservare
i dati tra un postback e l'altro - La modifica (tampering) dei campi hidden è banale
e, se non controllata adeguatamente, può
comportare un duro attacco. - Soluzione
- Criptarli prima di mandarli al client
- Decrittarli dentro un try/catch quando tornano al
server
33Protezione del Viewstate
- Il Viewstate di default è un campo ltinput
typehidden /gt - Il Viewstate contiene lo stato dei controlli sul
lato server - Se non è criptato, è facilmente
visibilehttp//www.pluralsight.com/toolcontent/V
iewStateDecoder11.zip - Soluzioni
- Criptarlo lt_at_ Page enableViewStateMactrue
/gtMac machine authentication check - La chiave e il metodo di encryption sono
specificati nel tag ltmachineKeygt del
machine.config (autogenerazione) - Per crearne e specificarne di nuovi nel
web.config Q312906 - Salvarlo sul serverhttp//www.aspalliance.com/ar
ticleViewer.aspx?aId72vIdpIdhttp//msdn.micr
osoft.com/msdnmag/issues/03/02/CuttingEdge/default
.aspx
34Proteggere le risorse
- Molti file non devono poter essere scaricati via
http dall'utente - Nel machine.config Asp.net protegge di default
alcuni tipi di file dal download (.cs, .config,
...) - Soluzione 1 custodirlo fuori dalla cartella
virtuale - Soluzione 2 proteggere il file via NTFS (se si
usa impersonation.) - Soluzione 3 proteggere con asp.net
- Associare i file da proteggere in IIS all'Isapi
di Asp.net - Proteggere (ad esempio) i file mdb nel
web.configlthttpHandlersgt ltadd verb""
path".mdb" type"System.Web.HttpForbiddenHandl
er" /gtlt/httpHandlersgt
35Mappare una estensione in IIS
- Affinchè asp.net (e quindi handlers e moduli)
abbiano il controllo di un tipo di file (.jpg
nell'esempio) è necessario configurare IIS
Path dell'isapi di asp.net (copiarla da quella di
.aspx)
36Q A