09.03.03 — Skills Black-hat (6)#
Idéations de vulnérabilités de logique métier — pas d’exécution : « security testing is functional and static, never active ».
Listing (potentiellement non exhaustif)#
| Skill | Cible |
|---|---|
business-logic-vulnerability-ideation | Faire tomber le produit via des chemins d’usage légitimes mais malicieux |
incoherence-attack-ideation | Chaque étape prise isolément a l’air innocente ; mais des combinaisons de ces étapes peuvent causer une incohérence dans le système |
persistence-attack-ideation | Tentatives répétées sur une action bloquée |
permission-appropriateness-audit | Le modèle d’accès est-il lui-même approprié ? |
bfcache-exposure-ideation | Attaques BFCache |
lateral-resource-ideation | IDOR via la barre d’adresse uniquement |
Périmètre#
Tous ces skills imaginent des attaques que l’IA pourrait formuler.
L’humain :
- Évalue la pertinence (« est-ce que ce gap est plausible ? »).
- Décide d’en faire un test (fonctionnel, via l’UI).
- Écrit le test (avec l’aide d’autres skills, p.ex.
extend-coverage).
L’IA ne lance jamais d’attaque active. C’est interdit.
business-logic-vulnerability-ideation#
input : les SFD + le code source du SUT (si open source)
output : liste d'usages légitimes mais malicieux
exemples (CURA et apps similaires) :
- past-date booking (G-DATA-1)
- duplicate booking (G-DATA-2)
- overlapping appointments (G-DATA-2)
- book at non-business hours
- book a date "100 ans dans le futur"
- book with empty visit_date if HTML5 required bypassed→ L’IA brainstorme. L’humain trie. Pour chaque idée retenue, on écrit un gap test (assertive fail si le système devrait rejeter le comportement).
incoherence-attack-ideation#
exemple : geographically impossible same-day booking
- book Hongkong CURA @ 10:00 (autorisé en soi)
- book Tokyo CURA @ 12:00 (autorisé en soi)
- combinaison : impossible (le patient ne peut pas téléporter)persistence-attack-ideation#
exemple : un user bloqué par rate-limit / permission manquante
→ essaie 100 fois consécutives
→ vérifie si le système release après N attempts ou si le block tient→ Sur CURA : pas de rate-limit (G-SEC-3), donc rien à tester. Sur d’autres SUTs, peut révéler des bugs de logique de blocage.
permission-appropriateness-audit#
input : les SFD + l'observation du modèle d'accès
output : audit du modèle :
- tel rôle a-t-il accès à telle ressource sans raison ?
- tel endpoint requiert-il l'auth mais ne devrait pas ?
- tel endpoint ne requiert pas l'auth mais devrait ?→ Révèle souvent des gaps dans les SFD (« on n’avait pas pensé à ce cas »).
bfcache-exposure-ideation#
input : pages protégées par authentification du SUT
output : pour chaque page, recette back-then-reload :
- login → naviguer vers la page → logout → back() → expect redirect
- si pas de redirect : refresh() → expect redirect (= BFCache hit)
- sinon : vrai gap server-sidelateral-resource-ideation#
input : URLs de ressources avec ID (`/order/123`, `/user/456`, …)
output : pour chaque ressource, propose :
- login en tant qu'utilisateur A
- tenter d'accéder à `/order/<id_utilisateur_B>`
- vérifier que le système refuseC’est de l’IDOR (Insecure Direct Object Reference), mais via la barre d’adresse uniquement — pas de payload, pas de Proxy MITM. Juste un humain qui tape une URL.
Discipline transversale#
Tous les skills black-hat imaginent, mais n’exécutent jamais.
Si une idée méritte d’être testée :
- L’humain valide l’idée.
- La traduit en gap test fonctionnel (via
extend-coverage). - Le test passe par l’UI/des comportements normaux couverts par le test fonctionnel.
- Le test PASS ou FAIL (intentionnel).
- Tout est documenté dans
IDENTIFIED_GAPS.md.
Aucun payload, aucun cross-origin POST, aucun fuzzing scriptés. Cf. ../../08-ai-example/05-security-gaps.md section « « Security testing is functional and static — never active » ».