A la lliçó anterior vam situar el disseny com la fase de major retorn de l'S-SDLC, i la seva activitat estrella com el modelatge d'amenaces. Ja ho vam anticipar a la lliçó 03-05 (Disseny Insegur), on vam dir que una fallada d'arquitectura no es corregeix amb un pedaç i que la manera d'anticipar-la tenia nom propi, el desenvolupament del qual deixàvem per aquí. Ha arribat el moment. El modelatge d'amenaces és l'exercici estructurat d'imaginar, abans de construir, com un adversari intentaria abusar del sistema, per decidir quines defenses incorporar per disseny. És la disciplina que respon a la pregunta que un pentest només respon tard i car: què pot sortir malament? En aquesta lliçó construïm un threat model complet del checkout de BazarNube.
Contingut
- Què és el modelatge d'amenaces i quan fer-lo
- Les quatre preguntes de Shostack
- Diagrames de flux de dades (DFD) i límits de confiança
- STRIDE: un llenguatge de categories d'amenaça
- Priorització de riscos (DREAD i alternatives)
- Eines: Threat Dragon i pytm
- Threat model del checkout de BazarNube
- Errors comuns i consells
- Exercicis
- Conclusió
Què és el modelatge d'amenaces i quan fer-lo
Modelar amenaces és analitzar un disseny buscant de forma sistemàtica els seus punts febles i les contramesures apropiades. No requereix que el sistema estigui construït: es fa sobre diagrames i decisions, que és precisament el seu avantatge. És un exercici d'equip, no un informe que redacta un expert en solitari; el valor és tant al document resultant com a la conversa que el produeix.
Quan fer-lo?
- En dissenyar una funcionalitat nova amb dades sensibles o diners pel mig.
- Davant d'un canvi d'arquitectura rellevant (nou servei, nova integració externa, nou magatzem de dades).
- De forma periòdica sobre components crítics, perquè el sistema i les amenaces evolucionen.
- No és realista modelar cada commit: es reserva per al que importa, guiat per la classificació de dades que vam fer a la fase de requisits.
Les quatre preguntes de Shostack
Adam Shostack va popularitzar un marc de quatre preguntes que estructura qualsevol sessió de modelatge. OWASP l'adopta com a columna vertebral del procés.
| # | Pregunta | Què produeix |
|---|---|---|
| 1 | Què estem construint? | Un DFD amb els seus límits de confiança |
| 2 | Què pot sortir malament? | Llista d'amenaces (amb STRIDE) |
| 3 | Què farem al respecte? | Mitigacions i controls |
| 4 | Ho vam fer bé? | Verificació i revisió |
La quarta pregunta tanca el bucle: un threat model no és un artefacte mort, es revisa quan el disseny canvia. Fixem-nos en el paral·lelisme amb l'S-SDLC: la pregunta 3 alimenta requisits ASVS i la pregunta 4 es recolza en verificació (per exemple, ZAP comprovant que una mitigació funciona).
Diagrames de flux de dades (DFD) i límits de confiança
Per respondre "què construïm?" es dibuixa un Diagrama de Flux de Dades (Data Flow Diagram). Un DFD usa un vocabulari deliberadament petit:
- Entitat externa (rectangle): actor fora del nostre control (usuari, passarel·la de pagament).
- Procés (cercle): codi que transforma dades (una API, un servei).
- Magatzem de dades (dues línies paral·leles): base de dades, cau, cua.
- Flux de dades (fletxa): el moviment de dades entre els anteriors.
- Límit de confiança (línia discontínua): la frontera on canvia el nivell de confiança; travessar-la és on neixen la majoria de les amenaces.
Els límits de confiança són el concepte clau. Cada vegada que una dada en travessa un —d'Internet a la nostra API, de la nostra API a la base de dades, del nostre backend a un servei de tercers— hi ha una oportunitat per a l'atacant i una necessitat de validar, autenticar o xifrar. Modelar bé consisteix, en bona mesura, a enfocar l'atenció en aquests encreuaments.
STRIDE: un llenguatge de categories d'amenaça
Respondre "què pot sortir malament?" a mà porta a oblits. STRIDE, creat a Microsoft, és una mnemònica que força a considerar sis categories d'amenaça per a cada element del DFD. Cada categoria és la negació d'una propietat de seguretat desitjable.
| Lletra | Amenaça | Propietat violada | Exemple | Risc Top Ten relacionat |
|---|---|---|---|---|
| S | Spoofing (suplantació) | Autenticació | Fer-se passar per un altre usuari | A07 Fallades d'Identificació i Autenticació |
| T | Tampering (manipulació) | Integritat | Alterar el preu a la petició | A08 Fallades d'Integritat; A03 Injecció |
| R | Repudiation (repudi) | No repudi | Negar haver fet una comanda | A09 Fallades de Registre i Monitorització |
| I | Information disclosure | Confidencialitat | Veure dades de targeta d'un altre | A01 Control d'Accés; A02 Fallades Criptogràfiques |
| D | Denial of service | Disponibilitat | Saturar el checkout | A05 Configuració incorrecta (límits) |
| E | Elevation of privilege | Autorització | Usuari normal actua com a admin | A01 Control d'Accés Trencat |
Una tècnica pràctica és STRIDE-per-element: recórrer cada procés, magatzem i flux del DFD i preguntar-se quines lletres de STRIDE apliquen. No totes apliquen a tots els elements, i això està bé; el valor és la cobertura sistemàtica.
Priorització de riscos (DREAD i alternatives)
No totes les amenaces mereixen la mateixa atenció. Cal prioritzar per invertir l'esforç on importa. DREAD és un model clàssic que puntua cada amenaça en cinc eixos (típicament 1-3 o 1-10):
- Damage — dany potencial.
- Reproducibility — facilitat de reproduir l'atac.
- Exploitability — esforç per explotar-lo.
- Affected users — quants usuaris afecta.
- Discoverability — facilitat de descobrir la vulnerabilitat.
Se sumen els eixos i s'ordena. DREAD és simple però subjectiu (dues persones puntuen diferent), per la qual cosa molts equips prefereixen alternatives:
| Mètode | Avantatge | Inconvenient |
|---|---|---|
| DREAD | Ràpid, intuïtiu | Subjectiu, poc reproduïble |
| Matriu probabilitat x impacte | Alineada amb gestió de riscos general | Requereix calibrar escales |
| CVSS | Estàndard de la indústria | Pensat per a vulnerabilitats, no amenaces de disseny |
| OWASP Risk Rating | Adaptat a apps web, factors clars | Més passos |
Per a BazarNube usarem una simple matriu probabilitat x impacte (Alt/Mitjà/Baix), suficient per prioritzar i fàcil de consensuar en equip.
Eines: Threat Dragon i pytm
Modelar es pot fer en una pissarra, però hi ha eines que ajuden a mantenir el model viu i versionat:
- OWASP Threat Dragon: aplicació gràfica (web i escriptori) per dibuixar DFDs i anotar amenaces STRIDE. Guarda el model com a JSON, versionable a Git al costat del codi. Ideal per a equips que prefereixen el visual.
- pytm: framework de threat modeling as code en Python. Es descriu el sistema com a objectes (processos, magatzems, fluxos, límits) en un script i l'eina genera el DFD i un informe d'amenaces. Encaixa amb la filosofia "tot com a codi" que veurem a DevSecOps.
# Esbos minim amb pytm: el sistema es descriu com a codi
from pytm import TM, Server, Datastore, Actor, Boundary, Dataflow
tm = TM("Checkout BazarNube")
internet = Boundary("Internet")
interna = Boundary("Xarxa interna")
client = Actor("Client"); client.inBoundary = internet
api = Server("API Checkout (Node/Express)"); api.inBoundary = interna
db = Datastore("PostgreSQL Comandes"); db.inBoundary = interna
pagament = Dataflow(client, api, "Enviar dades de pagament (HTTPS)")
guardar = Dataflow(api, db, "Guardar comanda")
tm.process() # genera DFD i informe d'amenacesL'eina no substitueix el criteri: és l'equip qui decideix quines amenaces són reals i quines mitigacions apliquen.
Threat model del checkout de BazarNube
Apliquem les quatre preguntes al flux més sensible de BazarNube: el checkout, on convergeixen dades personals, adreces i el pagament.
Pregunta 1: Què construïm? (DFD)
graph LR
Client[Client navegador React]
API[API Checkout Node/Express]
Legacy[Servei preus Java/Spring]
DB[(PostgreSQL Comandes)]
Passarela[Passarela de pagament externa]
Client -->|1 dades comanda HTTPS| API
API -->|2 consulta preu| Legacy
API -->|3 guarda comanda| DB
API -->|4 tokenitza i cobra| Passarela
Passarela -->|5 webhook confirmacio| API
subgraph TB_Internet [Limit de confianca: Internet]
Client
end
subgraph TB_Interna [Limit de confianca: Xarxa interna]
API
Legacy
DB
end
subgraph TB_Tercer [Limit de confianca: Tercer]
Passarela
end
Els encreuaments de límit de confiança són: client→API (Internet a interna), API→passarel·la i el webhook passarel·la→API (interna a tercer). Aquí concentrem l'anàlisi.
Pregunta 2 i 3: Què pot sortir malament i què fem? (STRIDE + mitigacions)
| Element / flux | STRIDE | Amenaça concreta | Prob. x Impacte | Mitigació | Control OWASP |
|---|---|---|---|---|---|
| Client → API | T | Manipular el preu al JSON de la comanda | Alta x Alt | El preu es recalcula al servidor des del catàleg; mai es confia en el del client | A04 Disseny; ASVS V5 (validació) |
| Client → API | S | Usar la sessió/token d'un altre client | Mitjana x Alt | Tokens de sessió robustos, rotació, MFA en canvis sensibles | A07; ASVS V2, V3 |
| API (procés) | E | Usuari normal força la comanda d'un altre (IDOR) | Alta x Alt | Autorització per objecte: la comanda es lliga a l'usuari autenticat | A01; ASVS V4 |
| API → DB | I | Fuga de dades de comandes per injecció | Mitjana x Alt | Consultes parametritzades; mínim privilegi de l'usuari de BD | A03; ASVS V5 |
| API ↔ Passarel·la | I | Exposició de dades de targeta | Baixa x Molt alt | No emmagatzemar PAN; tokenització a la passarel·la; TLS | A02; ASVS V6, V9 |
| Webhook Passarel·la → API | S/T | Webhook falsificat que confirma un pagament inexistent | Mitjana x Alt | Verificar signatura HMAC del webhook; validar import contra la comanda | A08; ASVS V10 |
| Checkout (flux) | D | Abús de l'endpoint per esgotar stock o saturar | Mitjana x Mitjà | Rate limiting, control de concurrència sobre stock | A05; ASVS V11 |
| API (procés) | R | Client nega haver fet una comanda | Baixa x Mitjà | Registre íntegre i amb marca temporal de cada transacció | A09; ASVS V7 |
Observem com cada mitigació enllaça amb un control ja estudiat: el threat model no inventa defenses noves, sinó que decideix quines del catàleg Top Ten/ASVS apliquen a aquest disseny. El threat model tradueix riscos genèrics en requisits concrets i verificables. Aquest és exactament el pont cap a la fase de proves, on ZAP i les proves manuals confirmaran que la mitigació funciona.
Pregunta 4: Ho vam fer bé?
El Security Champion de l'equip revisa el model, es registren les mitigacions com a requisits d'acceptació (ASVS) al backlog, i es marca el model per a revisió quan canviï la passarel·la o s'afegeixi, per exemple, pagament ajornat. L'amenaça del webhook falsificat es converteix en una història amb la seva prova corresponent.
Errors Comuns i Consells
- Modelar el sistema perfecte, no el real. El DFD ha de reflectir com funciona de veritat, inclosos els dreceres i el servei legacy de Java. Un model idealitzat oculta les amenaces reals.
- Buscar l'exhaustivitat absoluta. És impossible enumerar tota amenaça. Prioritza els encreuaments de límit de confiança i les dades sensibles; un model "prou bo" i revisat supera un de perfecte que mai s'acaba.
- Convertir-lo en un document mort. Si el model no es revisa quan canvia el disseny, caduca. Vincula'l al procés (pregunta 4) i guarda'l versionat al costat del codi.
- Fer-lo en solitari. El valor és a la conversa entre desenvolupament, seguretat i producte. Sense l'equip, es perd el coneixement del sistema real.
- Consell: comença petit. Un DFD en pissarra d'una hora sobre el flux més crític aporta més que un curs teòric. L'habilitat es desenvolupa modelant.
Exercicis
Exercici 1. Al DFD del checkout, un desenvolupador proposa que el frontend enviï el preu total ja calculat "per estalviar una consulta". Identifica la categoria STRIDE del risc i la mitigació correcta.
Exercici 2. Classifica cada amenaça amb la lletra STRIDE adequada: (a) un atacant repeteix un webhook de pagament capturat, (b) un usuari canvia l'order_id de la URL i veu la comanda d'un altre, (c) el log no registra qui va cancel·lar una comanda.
Exercici 3. BazarNube afegirà "iniciar sessió amb Google". Dibuixa mentalment el nou flux i indica un nou límit de confiança i una amenaça STRIDE que apareix amb aquesta integració.
Solucions
Solució 1. És Tampering (manipulació d'integritat): confiar en un preu enviat pel client permet alterar-lo en trànsit o des del navegador i comprar per menys. La mitigació és no confiar mai en dades del client per a decisions de diners: el servidor recalcula el preu des del catàleg autoritzat. Relaciona amb A04 (Disseny Insegur) i ASVS V5 (validació).
Solució 2.
- (a) Tampering i/o Spoofing (webhook de replay/falsificat); es mitiga amb signatura HMAC i control anti-replay (nonce/timestamp).
- (b) Elevation of privilege / control d'accés trencat (IDOR); autorització per objecte.
- (c) Repudiation; registre íntegre amb identitat i marca temporal.
Solució 3. Apareix un nou límit de confiança amb el proveïdor d'identitat extern (Google) i el flux OAuth/OIDC que travessa a un tercer. Una amenaça típica és Spoofing: acceptar un token d'identitat no validat correctament (signatura, audiència, emissor, expiració) permetria suplantar un usuari. Es mitiga validant el token segons l'estàndard OIDC i lligant el compte local de forma segura. Relaciona amb A07 i ASVS V2/V3.
Conclusió
El modelatge d'amenaces és la pràctica que dona contingut a la fase de disseny de l'S-SDLC: amb un DFD i els seus límits de confiança responem "què construïm", amb STRIDE "què pot sortir malament", amb mitigacions enllaçades al Top Ten i ASVS "què fem", i amb la revisió "ho vam fer bé". A BazarNube hem convertit un flux de checkout en una llista prioritzada de requisits verificables. Però un bon disseny només se sosté si la resta del procés el respecta de forma automàtica i contínua. A la lliçó següent, 07-03, portem aquestes mitigacions al terreny de l'automatització: com DevSecOps converteix aquests controls en comprovacions que el pipeline executa a cada canvi.
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)
- Altres Projectes Clau: WSTG, Cheat Sheets i Dependency-Check
Mòdul 3: OWASP Top Ten 2021 en Profunditat
- A01:2021 – Pèrdua de Control d'Accés
- A02:2021 – Errors Criptogràfics i Exposició de Dades Sensibles
- A03:2021 – Injecció
- Cross-Site Scripting (XSS) en Profunditat
- A04:2021 – Disseny Insegur
- A05:2021 – Configuració de Seguretat Incorrecta
- Entitats Externes XML (XXE)
- A06:2021 – Components Vulnerables i Desactualitzats
- A07:2021 – Errors d'Identificació i Autenticació
- A08:2021 – Errors d'Integritat de Programari i Dades (Deserialització Insegura)
- A09:2021 – Errors de Registre i Monitorització
- A10:2021 – Server-Side Request Forgery (SSRF)
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)
- Modelatge d'Amenaces (Threat Modeling)
- Integració de Seguretat en DevOps (DevSecOps)
- Formació i Conscienciació 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
