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
pickle
en 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
pickle
en 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