Leçon 3.6 · Triage statique· 45 min
Rédiger un rapport de triage
Faites du triage statique un rapport exploitable : verdict et confiance, capacités rattachées à ATT&CK, IOC neutralisés, détections et étapes suivantes.
Objectifs
- Structurer un rapport de triage autour des décisions que ses lecteurs doivent prendre, en commençant par l’essentiel
- Énoncer les verdicts avec des niveaux de confiance explicites et séparer les faits observés des inférences
- Rattacher les capacités aux identifiants de techniques MITRE ATT&CK et présenter les IOC hôte et réseau sous forme neutralisée
- Étiqueter les rapports avec TLP pour leur partage et savoir quand exporter les IOC en STIX ou MISP
- Mener un triage limité dans le temps et évaluer votre propre rapport à l’aide d’une grille
Le triage n’est terminé que lorsque quelqu’un d’autre peut agir en conséquence. Vous avez peut-être identifié le fichier, lu ses chaînes et ses imports, mesuré son entropie et écrit une règle YARA, mais si ces connaissances restent dans l’historique de votre terminal, le SOC ne sait toujours pas s’il faut isoler l’hôte, l’équipe détection n’a aucune règle à déployer, et l’analyste suivant refera votre travail de zéro.
Un rapport de triage est le produit de la première étape de l’entonnoir d’analyse présenté dans Qu’est-ce que l’analyse de malwares ?. Il est court, il se rédige en quelques heures plutôt qu’en quelques jours, et il existe pour appuyer des décisions. Cette leçon couvre ce qu’il contient, comment formuler ce que vous savez et ce que vous ne faites que soupçonner, et comment le partager. Elle se termine par un exemple de rapport complet et un lab chronométré.
Un rapport existe pour appuyer des décisions
Tout rapport de triage répond à quatre questions, dans cet ordre d’urgence :
- Est-ce malveillant ? Ou bénin, ou potentiellement indésirable, ou inconnu.
- Que fait-il ? Ses capacités, au niveau de détail que permet le triage.
- Que bloquer et que rechercher ? Les IOC (indicateurs de compromission) et le contenu de détection.
- Faut-il une analyse plus approfondie ? Et si oui, quelles questions restent ouvertes.
Si un lecteur ne trouve pas la réponse à la question 1 dans les dix premières secondes, le rapport a échoué, quelle que soit la qualité de son contenu technique.
Écrire pour vos lecteurs
Des personnes différentes lisent des parties différentes du même rapport :
| Lecteur | Veut savoir | Lit |
|---|---|---|
| Responsable SOC / réponse à incident | Faut-il confiner ? Quels hôtes ? Quelle urgence ? | Résumé, verdict, actions recommandées |
| Ingénieur détection | Quoi déployer, et avec quel niveau de bruit | Contenu de détection, IOC, capacités |
| Threat hunter | Quoi rechercher dans les données historiques | IOC, techniques ATT&CK |
| Analyste CTI | Famille connue ? Liens avec d’autres activités ? | Identification, hashs de similarité, notes |
| Rétro-ingénieur (étape suivante) | Par où commencer, ce qui est déjà fait | Questions ouvertes, notes de l’analyste, outillage |
| Direction | Le risque et l’impact en termes simples | Résumé uniquement |
La réponse non technique vient donc en premier, suivie de sections de plus en plus techniques, chacune utilisable indépendamment.
Anatomie d’un rapport de triage
Résumé (BLUF)
L’essentiel d’abord (bottom line up front). Deux à cinq phrases : ce qu’est le fichier, le verdict avec sa confiance, la ou les deux capacités qui comptent, et l’action la plus importante. Aucun nom d’outil, aucun hexadécimal, aucun jargon qu’un manager devrait aller chercher. Rédigez-le en dernier, placez-le en premier.
Verdict et confiance
Une ligne pour chaque élément : le verdict (malveillant, suspect, potentiellement indésirable, bénin, inconnu), la famille si elle est identifiée, et la confiance. Puis une courte justification qui renvoie aux sections de preuves plus bas.
Identification du fichier
Un tableau contenant tout ce qu’il faut pour retrouver ce fichier exact : noms de fichier observés, taille, type, MD5, SHA-1, SHA-256, et les hashs de similarité vus dans Identifier et hacher les fichiers (imphash, ssdeep ou TLSH). Ajoutez la provenance du fichier (hôte, chemin, e-mail, ticket), la date de collecte, et l’horodatage de compilation avec une note indiquant qu’il peut être falsifié.
Capacités rattachées à ATT&CK
Listez ce que l’échantillon peut faire, chaque capacité avec sa preuve et un identifiant de technique MITRE ATT&CK comme T1140 ou T1071.001. Les identifiants ATT&CK offrent aux threat hunters et aux ingénieurs détection un vocabulaire commun, et permettent à une équipe CTI de comparer cet échantillon à d’autres. La sortie de capa vue dans Lire les capacités à partir des imports est un bon point de départ, mais chaque rattachement que vous publiez engage votre responsabilité : vérifiez-le.
Ne rattachez que ce que les preuves étayent, et précisez de quel type de preuve il s’agit. Un import de CreateRemoteThread est la preuve d’une capacité, pas la preuve que l’échantillon l’utilise.
Indicateurs de compromission
Séparez les IOC selon l’endroit où un défenseur les cherchera :
- Indicateurs hôte : hashs, chemins et noms de fichiers, mutex, pipes nommés, clés de registre, noms de services, noms de tâches planifiées, chemins PDB.
- Indicateurs réseau : domaines, IP, URL, user-agents, motifs d’URI, certificats TLS ou empreintes JA3/JA4.
Donnez à chaque IOC un type, une valeur et une courte note de contexte : « mutex créé au démarrage, probablement une vérification d’instance unique » est bien plus utile qu’une chaîne brute. Signalez les IOC qui n’ont été vus qu’en statique, car ils peuvent être inutilisés ou servir de leurres.
Neutralisez (defang) les indicateurs réseau pour que personne ne clique dessus ni ne les résolve automatiquement, et pour que les filtres de messagerie et les clients de chat ne les transforment pas en liens actifs :
| Forme active | Forme neutralisée |
|---|---|
http://update.example.com/gate.php | hxxp://update[.]example[.]com/gate[.]php |
https://cdn.example.net | hxxps://cdn[.]example[.]net |
203.0.113.7 | 203.0.113[.]7 |
ops@example.org | ops[@]example[.]org |
Neutralisez dans la prose et les tableaux destinés aux humains ; fournissez un export lisible par machine (voir plus bas) avec les valeurs d’origine pour les outils.
Contenu de détection
Les règles YARA d’Écrire vos premières règles YARA, plus tout ce que vous avez produit d’autre : Sigma, requêtes EDR, signatures Suricata. Pour chaque règle, indiquez contre quoi elle a été testée (variantes, corpus de goodware) et son bruit attendu. Une règle non testée doit le dire.
Actions recommandées
Concrètes, attribuées et ordonnées : bloquer ces hashs, déployer cette règle en mode alerte seule pendant une semaine, rechercher ce mutex sur l’ensemble du parc, réinstaller cet hôte. Adaptez les actions au verdict et à la confiance ; un verdict à faible confiance ne doit pas déclencher de blocage sur tout le parc.
Questions ouvertes et étapes suivantes
Ce que le triage n’a pas pu établir, et l’analyse qui permettrait de l’établir : « La charge utile de deuxième étape est chiffrée dans RT_RCDATA ; une analyse dynamique ou la rétro-ingénierie du décodeur à 0x401A20 est nécessaire pour la récupérer. » Cette section est le passage de relais vers l’étape suivante de l’entonnoir, et elle vous oblige à rester honnête sur les limites du triage.
Notes de l’analyste et outillage
Qui l’a analysé, quand, en combien de temps, avec quels outils et quelles versions, et tout élément étrange que vous avez remarqué sans pouvoir l’expliquer. Les versions des outils comptent : les jeux de règles capa et les modules YARA évoluent, et un lecteur doit pouvoir reproduire vos résultats.
Dire à quel point vous êtes sûr
« C’est un malware » et « c’est peut-être un malware » conduisent à des actions très différentes : la confiance doit donc être explicite et utiliser des termes cohérents. Une convention courante, empruntée à l’analyse du renseignement :
| Formulation | Signification | Fondement typique |
|---|---|---|
| Nous estimons avec une confiance élevée | Le jugement est bien étayé ; il pourrait encore être faux, mais ce serait surprenant | Plusieurs observations indépendantes concordantes ; famille confirmée par le code, pas seulement par des chaînes |
| Nous estimons avec une confiance modérée | Crédible et plausible, mais pas assez corroboré pour une confiance élevée | Un indicateur fort, ou plusieurs plus faibles |
| Nous estimons avec une faible confiance | Plausible, mais les preuves sont fragmentaires ou pourraient avoir d’autres explications | Une seule chaîne, un résultat de réputation, une similarité uniquement |
Associez la confiance aux jugements, pas aux faits. « Le fichier importe WriteProcessMemory » n’a besoin d’aucun niveau de confiance : c’est observé. « L’échantillon injecte du code dans d’autres processus » est un jugement, et en a besoin.
Observé ou inféré
L’erreur la plus fréquente dans un rapport de triage consiste à présenter une inférence comme une observation. Séparez-les visiblement :
| Observé (fait) | Inféré (évaluation) |
|---|---|
La chaîne LabAgent/1.0 (...) est présente dans .rdata | L’échantillon utilise probablement ce user-agent pour son trafic HTTP |
| Aucune DLL réseau n’est importée | Les fonctions réseau, s’il y en a, sont résolues dynamiquement ou absentes |
Les sections s’appellent UPX0, UPX1, UPX2, et UPX1 a une entropie de 7,7 | L’échantillon est packé avec UPX |
| Son imphash correspond à trois échantillons de notre dépôt | Il partage peut-être un environnement de build avec eux |
Des mots comme observé, présent, importe, contient signalent des faits. Estimer, probablement, suggère, compatible avec signalent une inférence.
Astuce : Lorsqu’une preuve statique contredit une hypothèse, dites-le. « Une chaîne de user-agent est présente, mais aucun import réseau n’a été observé ; la chaîne est peut-être inutilisée, ou les API réseau sont peut-être résolues à l’exécution » est un constat de triage parfaitement valable, et il indique à l’analyste suivant exactement quoi vérifier.
Partage : TLP, STIX et MISP
Étiquetez chaque rapport avec le Traffic Light Protocol (TLP 2.0, maintenu par le FIRST) pour que les destinataires sachent jusqu’où ils peuvent le diffuser :
| Étiquette | Peut être partagé avec |
|---|---|
TLP:RED | Les destinataires nommés uniquement |
TLP:AMBER+STRICT | L’organisation du destinataire uniquement |
TLP:AMBER | L’organisation du destinataire et ses clients, selon le besoin d’en connaître |
TLP:GREEN | La communauté élargie du destinataire, pas publiquement |
TLP:CLEAR | Tout le monde, sous réserve du droit d’auteur |
Placez l’étiquette en tête du rapport et sur toute donnée exportée. Les rapports internes sur un incident en cours sont généralement en TLP:AMBER ou plus strict ; une analyse expurgée d’une famille grand public peut être en TLP:CLEAR.
Pour une consommation par des machines, les IOC circulent sous forme de données structurées plutôt que de prose. STIX 2.1 (un standard OASIS) modélise les indicateurs, les malwares, les relations et les motifs ATT&CK sous forme d’objets JSON, généralement échangés via TAXII. MISP est une plateforme de partage open source largement déployée, avec son propre format d’événements et d’attributs et un import/export STIX. Votre rapport renvoie à l’événement ou au bundle ; le rapport en prose reste la référence lisible par un humain.
Un modèle de rapport
Copiez ce squelette et remplissez-le. Chaque titre est conservé, même si son contenu est « rien d’observé », pour que les lecteurs sachent que vous avez vérifié.
TLP:<LABEL>
# Triage report: <file name or family> (<report ID>)
Analyst: <name> | Date: <YYYY-MM-DD> | Time spent: <minutes>
## 1. Executive summary
<2-5 sentences, plain language, verdict + confidence + key action>
## 2. Verdict
Verdict: <malicious | suspicious | PUA | benign | unknown>
Family: <name or "unidentified">
Confidence: <low | moderate | high>
Rationale: <1-3 bullets pointing at sections 4-5>
## 3. File identification
| Field | Value | (names, size, type, MD5, SHA-1, SHA-256, imphash,
ssdeep/TLSH, compile time, source, collection time)
## 4. Capabilities
| Capability | Evidence (observed / inferred) | ATT&CK |
## 5. Indicators of compromise
### Host | Type | Value | Context |
### Network | Type | Value (defanged) | Context |
## 6. Detection content
<rules, what they were tested against, expected noise>
## 7. Recommended actions
<ordered, concrete, with owners>
## 8. Open questions and next steps
## 9. Analyst notes and tooling
<tools and versions, environment, anything unexplained>Exemple de rapport : LabImplant v1 (fictif)
Attention : Tout le contenu de cette section est un exemple fictif rédigé à propos du programme d’entraînement bénin compilé dans Écrire vos premières règles YARA. Il n’y a ni incident, ni hôte, ni acteur malveillant réels. Les hashs proviennent d’un build de ce programme ; les vôtres différeront.
TLP:CLEAR · Rapport TR-2026-0929-01 · Analyste : A. Analyst · 2026-09-29 · Temps passé : 30 minutes
1. Résumé
Un fichier nommé lab_implant.exe, trouvé dans le laboratoire de formation à l’analyse de malwares, a fait l’objet d’un triage statique. Nous estimons avec une confiance élevée qu’il n’est pas malveillant : il s’agit d’un programme d’entraînement qui contient des chaînes ressemblant à des artefacts d’implant (un user-agent personnalisé, un nom de mutex, un nom de pipe nommé et une chaîne de configuration), mais qui n’a aucune capacité réseau, de persistance ou d’injection. Aucun confinement n’est nécessaire. Une règle YARA a été produite pour que les copies du lab soient reconnues et ne soient pas remontées comme de vrais incidents.
2. Verdict
- Verdict : Bénin (artefact d’entraînement)
- Famille : Aucune ; programme interne du lab « LabImplant »
- Confiance : Élevée
- Justification : La table des imports ne contient que des fonctions du runtime C et de
KERNEL32.dllliées par le runtime mingw-w64 (section 4) ; les chaînes évoquant un implant ne sont référencées par aucune API qui les utiliserait ; le code décode un blob de 5 octets en le textedemo!et affiche ses chaînes.
3. Identification du fichier
| Champ | Valeur |
|---|---|
| Nom de fichier | lab_implant.exe |
| Taille | 17 408 octets |
| Type | Exécutable PE32+ (console), x86-64, stripped to external PDB |
| MD5 | de4d02e98a521e93dcfdb01c6a5025e9 |
| SHA-1 | 625d683cad6ccd138c7cdce4069ffa1bf9690988 |
| SHA-256 | a603a2f93afc7ecdf9f88d5f6c05055b9cfcfa21074df4088ad527980b240495 |
| Imphash | 3659d62105a06dba325698c81e1cd172 (partagé par les programmes console mingw-w64 triviaux ; non distinctif) |
| Horodatage de compilation | 2026-09-29 13:21:24 UTC (valeur de l’en-tête ; falsifiable) |
| Nom du PDB | lab_implant.pdb |
| Sections | 10, structure mingw-w64 standard ; entropie de .text 5,88 |
| Packer | Aucun détecté ; entropie du fichier entier 4,71 |
| Source | Répertoire de build du laboratoire de formation, collecté le 2026-09-29 |
4. Capacités
| Capacité | Preuve | Type | ATT&CK |
|---|---|---|---|
Décode un blob embarqué avec une clé XOR dépendant de la position (0x5A + i) | Boucle de décodage dans .text ; le blob de 5 octets dans .data se décode en demo! | Observé (statique) | T1140 Deobfuscate/Decode Files or Information |
| Stocke des données sous forme encodée | Même blob de 5 octets | Observé (statique), à échelle triviale | T1027 Obfuscated Files or Information |
| Communication HTTP | Chaîne de user-agent présente ; aucun import WinINet, WinHTTP ou Winsock ; aucun import de GetProcAddress | Non étayé par les preuves | (T1071.001 s’appliquerait si c’était confirmé) |
| Vérification d’instance unique par mutex | Chaîne de nom de mutex présente ; aucun import de CreateMutex | Non étayé par les preuves | Aucune |
VirtualProtect, VirtualQuery et Sleep figurent dans la table des imports. Ils sont importés par le code de démarrage du runtime mingw-w64, et non par les fonctions propres au programme, et ne sont pas considérés comme des preuves de capacité.
5. Indicateurs de compromission
Indicateurs hôte
| Type | Valeur | Contexte |
|---|---|---|
| SHA-256 | a603a2f93afc7ecdf9f88d5f6c05055b9cfcfa21074df4088ad527980b240495 | Ce build uniquement |
| Nom de mutex (chaîne) | Global\LabDemoMutex | Présent sous forme de chaîne ASCII ; jamais créé |
| Pipe nommé (chaîne) | \\.\pipe\lab-demo-pipe | Chaîne UTF-16LE ; jamais ouvert |
| Marqueur de configuration | LABCFG{interval=3600;jitter=20;mode=demo} | Affiché à l’exécution |
| Nom du PDB | lab_implant.pdb | Enregistrement de débogage CodeView |
Indicateurs réseau
| Type | Valeur | Contexte |
|---|---|---|
| User-agent HTTP | LabAgent/1.0 (Windows NT 10.0; lab-build) | Chaîne uniquement ; aucune capacité réseau observée |
| Domaines, IP, URL | Aucun observé | Chaînes, sortie de FLOSS et ressources vérifiées |
6. Contenu de détection
MAL_Win_LabImplant_Strings version 1.2 (règle complète dans la leçon YARA). Testée : correspond aux builds v1 (-O0) et v2 (-O2, version 1.1) ; aucune correspondance lors d’une analyse de /usr/bin avec la vérification d’en-tête désactivée ; ne correspond pas à la copie packée avec UPX (SHA-256 4b956e927c41f7c4d9499840733f8cc44bad66b5893309d2d5d56d5dc92e9532), qui n’est détectée que par la règle de chasse générique SUSP_PE_FewSections_NoText. Bruit attendu : aucun connu.
7. Actions recommandées
- Équipe du lab : ajouter la règle au scanner du lab avec l’étiquette
training, pour que les copies du lab soient clôturées automatiquement plutôt que remontées. - SOC : aucune action sur les systèmes de production.
- Ingénierie de détection : utiliser cet échantillon et cette règle comme test de non-régression du banc de test YARA.
8. Questions ouvertes et étapes suivantes
- Un futur build importera-t-il des API réseau ou de synchronisation ? Si oui, refaire le triage : le verdict repose sur leur absence.
- La variante packée avec UPX n’est pas couverte par la règle sur les chaînes. Si des builds packés sont distribués, ajouter un déploiement de la règle en analyse mémoire ou une règle pour l’image dépaquetée.
9. Notes de l’analyste et outillage
Analyse statique uniquement ; l’échantillon n’a pas été exécuté. Outils : file, strings, FLOSS, Python pefile, x86_64-w64-mingw32-objdump, YARA 4.5.4, Detect It Easy. Hôte d’analyse : VM de laboratoire isolée, sans réseau.
Lab : un triage chronométré de 30 minutes
Prenez l’un des binaires que vous avez compilés dans ce module : build/v2/lab_implant.exe, le lab_implant_upx.exe packé avec UPX, ou une variante issue des labs sur le hachage, les chaînes, les imports ou les packers. Pour un test honnête, demandez à un collègue d’en choisir un et de le renommer sample.bin. Lancez un chronomètre et suivez la liste de contrôle ; arrêtez-vous à 30 minutes quel que soit l’état d’avancement, car le triage se définit par sa limite de temps.
-
Suivez la liste de contrôle en consignant les constats directement dans le modèle :
Minutes Étape Outils À consigner dans le rapport 0–3 Hacher et identifier le fichier ; noter la taille et le type réel sha256sum,file, Detect It EasySection 3 3–5 Recherche de réputation par hash uniquement ; vérifier votre propre dépôt Recherche VirusTotal, dépôt interne Section 3, notes 5–9 En-têtes et sections : horodatage, noms de sections, tailles, entropie pefile, PE-bear Section 3 ; packer oui/non 9–12 Si packé : identifier le packer, le noter, décider s’il faut l’unpacker maintenant Detect It Easy, upx -tSections 2 et 8 12–17 Chaînes : ASCII, UTF-16 et décodées, y compris les stackstrings et les chaînes chiffrées par XOR ; présélectionner les artefacts strings, FLOSSCandidats pour la section 5 17–21 Imports et capacités ; séparer le bruit du runtime pefile, capa Section 4 21–23 Ressources et overlay pefile, Resource Hacker Sections 4 et 5 23–27 Rédiger et tester une règle YARA contre l’échantillon et un dossier de goodware yara -sSection 6 27–30 Verdict, confiance, résumé, étapes suivantes Votre jugement Sections 1, 2, 7, 8 -
Remplissez chaque titre du modèle. Écrivez « rien d’observé » plutôt que de supprimer une section.
-
Étiquetez chaque affirmation des sections 4 et 5 comme observée ou inférée, et associez un niveau de confiance au verdict.
-
Neutralisez chaque indicateur réseau, puis échangez vos rapports avec un collègue (ou attendez un jour) et notez-le avec la grille ci-dessous.
Grille d’autoévaluation. Notez chaque ligne 0 (absent), 1 (partiel) ou 2 (fait) ; visez 16 ou plus sur 20.
| # | Critère | 2 points signifie |
|---|---|---|
| 1 | L’essentiel d’abord | Le verdict et l’action principale figurent dans les deux premières phrases, sans jargon |
| 2 | Confiance explicite | Le verdict utilise faible / modérée / élevée et la justification étaye ce niveau |
| 3 | Identification complète | Les trois hashs cryptographiques, un hash de similarité, la taille, le type, la source |
| 4 | Faits ou inférences | Chaque capacité est marquée observée, inférée ou non étayée |
| 5 | Rattachement ATT&CK | Les identifiants sont corrects, à jour et appuyés par des preuves citées |
| 6 | IOC utiles | Séparés en hôte et réseau, chacun avec un type et un contexte |
| 7 | Neutralisation et TLP | Tous les IOC réseau neutralisés ; étiquette TLP en tête |
| 8 | Détection testée | Règle testée sur l’échantillon, une variante ou une copie packée, et un ensemble de goodware, avec les résultats indiqués |
| 9 | Recommandations exploitables | Concrètes, ordonnées, proportionnées à la confiance |
| 10 | Limites assumées | Les questions ouvertes nomment ce que le triage n’a pas pu établir et comment l’établir ; outils et versions listés |
Questions : Avez-vous terminé en 30 minutes, et quelle étape a débordé ? Lesquelles de vos affirmations sur les capacités changeraient s’il s’avérait que l’échantillon résout ses imports à l’exécution ? Si vous avez trié la copie packée avec UPX, que pouviez-vous honnêtement dire de ses capacités, et avec quelle confiance ? Votre résumé aurait-il un sens pour quelqu’un qui n’a jamais entendu parler d’un fichier PE ?
À retenir
- Un rapport de triage appuie des décisions : est-ce malveillant, que fait-il, que bloquer et que rechercher, faut-il une analyse plus approfondie.
- Commencez par l’essentiel et un verdict assorti d’une confiance explicite ; ordonnez le reste du moins technique au plus technique pour que chaque lecteur trouve sa partie.
- Séparez les faits observés des inférences, et associez les niveaux de confiance aux jugements, pas aux faits.
- Ne rattachez les capacités à ATT&CK que là où les preuves les étayent, séparez les IOC en hôte et réseau, et neutralisez chaque indicateur réseau.
- Incluez un contenu de détection testé, des actions recommandées concrètes, les questions ouvertes et les versions des outils, et étiquetez le rapport avec TLP avant de le partager, lui ou son export STIX/MISP.