Introducció
La deserialització insegura és una vulnerabilitat que es produeix quan una aplicació deserialitza dades no confiables. Aquest procés pot permetre a un atacant executar codi arbitrari, manipular dades o provocar altres comportaments maliciosos. La deserialització és el procés de convertir dades d'un format serialitzat (com JSON, XML o binari) en un objecte utilitzable per l'aplicació.
Conceptes Clau
- Serialització: Procés de convertir un objecte en un format que es pot emmagatzemar o transmetre.
- Deserialització: Procés invers a la serialització, on les dades serialitzades es converteixen de nou en un objecte.
- Dades no confiables: Dades que provenen de fonts externes o no verificades, com ara usuaris finals, API externes, etc.
Exemples de Deserialització Insegura
Exemple 1: Deserialització de JSON en Python
import json
# Dades JSON no confiables
dades_json = '{"nom": "Usuari", "rol": "admin"}'
# Deserialització insegura
usuari = json.loads(dades_json)
print(usuari['nom'])
print(usuari['rol'])En aquest exemple, si les dades JSON provenen d'una font no confiable, un atacant podria manipular el contingut per incloure codi maliciós.
Exemple 2: Deserialització d'Objectes en Java
import java.io.*;
class Usuari implements Serializable {
public String nom;
public String rol;
}
public class DeserialitzacioInsegura {
public static void main(String[] args) {
try {
// Dades binàries no confiables
byte[] dades = obtenirDadesNoConfiables();
// Deserialització insegura
ByteArrayInputStream bis = new ByteArrayInputStream(dades);
ObjectInputStream ois = new ObjectInputStream(bis);
Usuari usuari = (Usuari) ois.readObject();
System.out.println(usuari.nom);
System.out.println(usuari.rol);
} catch (Exception e) {
e.printStackTrace();
}
}
private static byte[] obtenirDadesNoConfiables() {
// Simulació de dades no confiables
return new byte[]{/* dades binàries */};
}
}En aquest cas, si les dades binàries provenen d'una font no confiable, un atacant podria enviar dades manipulades per executar codi maliciós en el sistema.
Exercici Pràctic
Exercici: Identificació de Deserialització Insegura
- Objectiu: Identificar i corregir una vulnerabilitat de deserialització insegura en un fragment de codi.
- Codi Insegur:
import pickle # Dades binàries no confiables dades_binàries = obtenirDadesNoConfiables() # Deserialització insegura objecte = pickle.loads(dades_binàries) print(objecte)
- Tasques:
- Identificar per què el codi és insegur.
- Proposar una solució per evitar la deserialització insegura.
Solució Proposada
-
Identificació de la Vulnerabilitat:
- El mòdul
pickleen Python permet la deserialització d'objectes arbitràriament, cosa que pot ser explotada per executar codi maliciós si les dades provenen d'una font no confiable.
- El mòdul
-
Solució:
- Utilitzar formats de dades més segurs per a la deserialització, com JSON, i validar les dades abans de deserialitzar-les.
import json
# Dades JSON no confiables
dades_json = obtenirDadesNoConfiables()
# Validació de les dades
try:
objecte = json.loads(dades_json)
print(objecte)
except json.JSONDecodeError:
print("Dades no vàlides")Errors Comuns i Consells
- No validar les dades abans de deserialitzar-les: Sempre valida les dades abans de deserialitzar-les per assegurar-te que són segures.
- Utilitzar formats de deserialització insegurs: Evita utilitzar formats de deserialització que permetin l'execució de codi arbitrari, com
pickleen Python o objectes serialitzats en Java. - No aplicar controls d'accés: Assegura't que només les dades de fonts confiables es deserialitzin.
Conclusió
La deserialització insegura és una vulnerabilitat crítica que pot tenir conseqüències greus per a la seguretat de les aplicacions web. És essencial comprendre els riscos associats amb la deserialització de dades no confiables i implementar mesures de seguretat adequades per mitigar aquests riscos. En el proper tema, explorarem l'ús de components amb vulnerabilitats conegudes i com evitar aquest tipus de problemes.
Curs d'OWASP: Directrius i Estàndards per a la Seguretat en Aplicacions Web
Mòdul 1: Introducció a OWASP
Mòdul 2: Principals Projectes d'OWASP
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Mòdul 3: OWASP Top Ten
- A1: Injecció
- A2: Pèrdua d'Autenticació
- A3: Exposició de Dades Sensibles
- A4: Entitats Externes XML (XXE)
- A5: Control d'Accés Trencat
- A6: Configuració Incorrecta de Seguretat
- A7: Cross-Site Scripting (XSS)
- A8: Deserialització Insegura
- A9: Ús de Components amb Vulnerabilitats Conegudes
- A10: Registre i Monitoratge Insuficients
Mòdul 4: OWASP ASVS (Application Security Verification Standard)
Mòdul 5: OWASP SAMM (Software Assurance Maturity Model)
Mòdul 6: OWASP ZAP (Zed Attack Proxy)
- Introducció a ZAP
- Instal·lació i Configuració
- Escaneig de Vulnerabilitats
- Automatització de Proves de Seguretat
Mòdul 7: Bones Pràctiques i Recomanacions
- Cicle de Vida de Desenvolupament Segur (SDLC)
- Integració de Seguretat en DevOps
- Capacitació i Sensibilització en Seguretat
- Eines i Recursos Addicionals
Mòdul 8: Exercicis Pràctics i Casos d'Estudi
- Exercici 1: Identificació de Vulnerabilitats
- Exercici 2: Implementació de Controls de Seguretat
- Cas d'Estudi 1: Anàlisi d'un Incident de Seguretat
- Cas d'Estudi 2: Millora de la Seguretat en una Aplicació Web
