@remnux/mcp-server 0.1.41 → 0.1.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1372 @@
1
+ // GENERATED by scripts/sync-report-guidance.ts — DO NOT EDIT BY HAND.
2
+ // Source: https://zeltser.com/media/docs/malware-analysis-writing-guidelines.yaml
3
+ // https://zeltser.com/media/archive/malware-analysis-report-template.md
4
+ // Re-sync with: pnpm run sync:report-guidance
5
+ //
6
+ // The report template is licensed CC BY 4.0; the writing guidelines are
7
+ // © Lenny Zeltser. Both are by Lenny Zeltser — see https://zeltser.com/malware-analysis-report.
8
+ /** The malware analysis report template (Markdown, CC BY 4.0, attribution embedded). */
9
+ export const REPORT_TEMPLATE = "# Malware Analysis Report Template\n\n*[Use this template to produce a structured, informative report on a malware sample, whether a single file or a set of related artifacts such as a dropper plus its payload chain. When the sample is a set, document each artifact's role and details in the [Component Inventory](#component-inventory) and organize the analysis by role.*\n\n*The text in square brackets is meant to guide you; remove it before finalizing the report. The title above is generic; rename to match your specific report.*\n\n*This template was [created by Lenny Zeltser](https://zeltser.com/malware-analysis-report) and distributed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/) (CC BY 4.0). The license covers the template; any report you produce with it is yours.]*\n\n*[Specify this document's classification or handling marking, such as a [TLP](https://www.first.org/tlp/) label, so the sharing restriction is visible before the report is read or shared.]*\n\n## Contents\n\n*[Update if you add, remove, or reorder sections.]*\n\n- [Executive Summary](#executive-summary)\n- [Sample Snapshot](#sample-snapshot)\n- [Malware Family Identification](#malware-family-identification)\n- [Component Inventory](#component-inventory)\n- [Runtime Requirements](#runtime-requirements)\n- [Sources](#sources)\n- [Capabilities](#capabilities)\n- [Indicators of Compromise](#indicators-of-compromise)\n- [Analysis Details](#analysis-details)\n- [What We Don't Know](#what-we-dont-know)\n- [Infection Vector (Optional)](#infection-vector-optional)\n- [Detection Engineering (Optional)](#detection-engineering-optional)\n- [About this Report](#about-this-report)\n- [Appendix: Analysis Environment](#appendix-analysis-environment)\n- [Appendix: Analysis Scripts (Optional)](#appendix-analysis-scripts-optional)\n\n## Executive Summary\n\n*[Provide a paragraph that explains what the malware sample is, how it gets in, and what it does. This is the main takeaway for the reader who only reads the summary. Write it to stand on its own when it's handed to a non-analyst, such as a manager deciding whether to escalate. If your audience is a specific organization, include organization-specific context, including significance.]*\n\n## Sample Snapshot\n\n*[Fill in the table to provide a quick-reference profile for the sample.]*\n\n| | |\n|---|---|\n| **Malware Family** | *[Lead with the family you believe this sample belongs to and your confidence in that call, highlighting the most likely conclusions from the [Malware Family Identification](#malware-family-identification) section.]* |\n| **Key Capabilities** | *[A short list of the sample's representative capabilities. This should be an excerpt of the contents of the [Capabilities](#capabilities) section.]* |\n| **Target Platform** | *[Where the sample runs, such as an OS or an ecosystem (e.g., web browser extensions, npm packages, AI agent skills). Summarize the platform context from the [Runtime Requirements](#runtime-requirements) section.]* |\n| **Primary Artifact** | *[The artifact this report centers on. Name it by its Role from the [Component Inventory](#component-inventory) and give its authoritative identifier, a SHA-256 for a file or the ecosystem identifier. Full per-artifact hashes are in the [Indicators of Compromise](#indicators-of-compromise) section.]* |\n| **Infection Vector** | *[How the sample arrives, such as phishing attachment, drive-by download, or supply-chain compromise. Summarize from the [Infection Vector](#infection-vector-optional) section.]* |\n\n## Malware Family Identification\n\n*[Capture the family you believe this sample belongs to, the evidence behind the call, and your confidence (high, moderate, or low). Add rows when considering alternative possibilities. Basis is the evidence type (YARA rule, string overlap, code reuse, behavioral pattern, vendor detection).]*\n\n| Family | Basis | Confidence |\n|---|---|---|\n| *[BRICKSTORM]* | *[YARA rule match against Mandiant's published signature]* | *[High]* |\n\nThis report rates confidence in family identification as high, moderate, or low, following [ICD-203](https://www.dni.gov/files/documents/ICD/ICD-203.pdf).\n\n## Component Inventory\n\n*[List each file or artifact in the sample, one per row. Use Role for the component's primary role (e.g., dropper, loader, payload, config, decoy). Per-component identifiers and context (e.g., bundle IDs like com.example.app), if relevant, can go into Notes. List per-component hashes in the [Indicators of Compromise](#indicators-of-compromise) section's Hash Values row, labeled by Role. The table will have one row if the sample has a single file.*\n\n*A row may lack a file name or hash, such as an in-memory stage or a package identified only by name and version. Fill what you have and leave the rest blank rather than dropping the row. When the sample's identity is a version chain rather than a set of files, such as a package that turned malicious in a specific release, note the relevant versions, for example the last clean and the first malicious, by Role.]*\n\n| Role | File Name | File Type | Notes |\n|---|---|---|---|\n| | | | |\n| | | | |\n| | | | |\n\n*[For multi-component samples, also add a short paragraph or numbered list below the table describing how the components flow into each other, such as \"Stage 1 dropper extracts Stage 2 script, which spawns Stage 3 PowerShell payload.\" Omit for single-file samples.]*\n\n## Runtime Requirements\n\n*[Document what the sample needs to run. For OS-targeted samples, examples include required DLLs, configuration files, registry keys, network resources, and runtime versions. For ecosystem-targeted samples, examples include required permissions, manifest declarations, host application versions, marketplace identifiers, and abused APIs. Distinguish bundled dependencies from those the sample expects to find on the target system. For a native executable, note the CPU architecture, endianness, and whether it is statically or dynamically linked. A statically linked big-endian MIPS binary, for example, suggests an embedded or IoT target rather than a desktop.]*\n\n## Sources\n\nThis section identifies where the sample and supporting data came from.\n\n*[Document sources used, such as internal telemetry, third-party sharing, OSINT, and partner-shared samples. Common OSINT sources include [VirusTotal](https://www.virustotal.com), passive-DNS lookup services, and shared threat-intelligence platforms. Note where the sample was first observed and any chain-of-custody details.]*\n\n## Capabilities\n\nThis report uses the [Malware Behavior Catalog](https://github.com/MBCProject/mbc-markdown) (MBC) to characterize what the sample does.\n\n*[Above the table, write a brief prose summary of the sample's top-level MBC Objectives. Examples include Defense Evasion, Discovery, Credential Access, Collection, Impact, Anti-Behavioral Analysis, and Anti-Static Analysis. Pick the behaviors that most clearly characterize the sample. If the sample collects or exfiltrates data, name what it targets, such as credentials, session tokens, SMS or two-factor codes, or financial data. Use the Notes column for per-behavior caveats or specifics.*\n\n*When an observed procedure has no fitting MBC behavior, record it under the closest MBC objective and cite the relevant [ATT&CK](https://attack.mitre.org/) technique in the Notes column, such as T1548.002 for a UAC bypass.]*\n\n| MBC Behavior | Procedure Observed | Notes |\n|---|---|---|\n| | | |\n| | | |\n| | | |\n\n## Indicators of Compromise\n\n*[The table is tiered by [David Bianco's Pyramid of Pain](https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html), from lowest to highest cost to the adversary, plus a cloud-resource tier. Pick the most informative indicators per tier and leave a tier's row blank if none apply.]*\n\n*[Use the Context column for each indicator's role and any other useful detail (status, timing, relationships). Role examples include command-and-control server, drop site, persistence artifact, and exfiltration host. Keep role descriptions consistent with the behaviors documented in [Capabilities](#capabilities).]*\n\n*[Supply the full set of indicators separately, such as a [STIX](https://oasis-open.github.io/cti-documentation/stix/intro) bundle or [MISP](https://www.misp-project.org/) event, when someone needs to ingest them into their tooling.]*\n\n*[Defang URLs and bracket the dots in domains and IP addresses (e.g., hxxps://example[.]com and 192.0.2[.]1) to avoid clickable links or resolvable references.]*\n\n*[List an indicator only when the sample actually uses it, such as a domain it resolves, an IP it contacts, or a file it drops. Strings that merely match an indicator pattern, especially ones pulled from packed or encrypted data, are not indicators on their own. Corroborate them, or leave them in the Analysis Details section.]*\n\n| Type | Indicator | Context |\n|---|---|---|\n| Hash Values | *[SHA-256, an [imphash](https://www.mandiant.com/resources/blog/tracking-malware-import-hashing) for PE files, and a fuzzy hash such as ssdeep or [TLSH](https://github.com/trendmicro/tlsh). Add an MD5 or SHA-1 if your readers expect those legacy hashes. For multi-component samples, give each component its own row and name its Role from the Component Inventory in the Context column.]* | |\n| IP Addresses | | |\n| Domain Names | | |\n| Cloud Resources | *[Bucket URIs, IAM roles, cloud function IDs.]* | |\n| Network Artifacts | *[User-agent strings, URI patterns, distinctive HTTP headers, beaconing patterns.]* | |\n| Host Artifacts | *[Registry keys, mutexes, named pipes, service names, dropped file paths.]* | |\n\n## Analysis Details\n\n*[This section presents supporting evidence behind the Executive Summary and Capabilities sections. Most readers will likely skim this section, but analysts looking to validate and build upon your work will read it carefully. If you didn't perform a subsection's analysis, keep the subsection and add a note that it wasn't performed, which usually serves the reader better than removing it. For multi-component samples, organize each subsection by component using subheadings that match the Roles in the Component Inventory, such as \"### Stage 1 Dropper\" or \"### invoice.exe\".]*\n\n### Automated Analysis\n\n*[Summarize what automated tooling surfaced, such as a malware sandbox detonation. Note which tools were used. Depending on the workflow, these findings may simply orient the deeper analysis that follows, or they may account for much of the analysis itself. When an automated agent or an MCP-driven toolkit produced these findings, name the tool and the analysis depth it ran so a reader can weigh and reproduce them.]*\n\n### Static Properties Analysis\n\n*[List the static properties worth calling out and what each one tells you, rather than dumping every field. In the Property column, note the observation, such as entry point, packing or obfuscation, file or section entropy, codesigning status, key strings, embedded resources, imports and risky API patterns, exports, section hashes, or compile timestamp. In the Significance column, explain why it matters, such as high entropy suggesting packing, a PDB path revealing a possible attribution detail, or an imphash matching a known family. Note any matches to related samples via imphash, ssdeep, or TLSH. If the sample is packed or encrypted, say so and name the packer when you can, then state whether these properties describe the packed form or an unpacked one you produced.]*\n\n| Property | Significance |\n|---|---|\n| | |\n| | |\n\n### Behavioral Analysis\n\n*[Document what the sample does when executed in a controlled environment. Cover file system activity, registry activity, process activity, network activity, persistence, and privilege escalation. Cite the observations behind each claim.]*\n\n### Memory Analysis\n\n*[Document findings from memory forensics, such as rogue processes, injected or hollowed code, API hooks, unpacked payloads recovered from memory, and in-memory configuration or strings. Note the capture method and the tools used.]*\n\n### Code Analysis\n\n*[Document code-level findings from static disassembly, decompilation, emulation, and dynamic debugging. Reference instruction addresses or function names so other analysts can replicate the work.]*\n\n## What We Don't Know\n\n*[List what you couldn't resolve, trigger, or verify, and the source or methodology limitations behind these unknowns (such as inability to detonate in a representative environment, missing C2 telemetry, or restricted access to the original delivery context).]*\n\n## Infection Vector (Optional)\n\n*[Document how the sample reached the target, if known, referencing [MITRE ATT&CK Initial Access](https://attack.mitre.org/tactics/TA0001/) techniques where applicable. Examples include phishing attachment, drive-by download, supply-chain compromise, removable media, and exploit kit. Note the attack chain that preceded the sample's installation if the data shows it. Include the specific distribution URL or source path when known, such as the direct download link, watering-hole site, or app store listing. Write as a narrative paragraph or numbered list.]*\n\n## Detection Engineering (Optional)\n\n*[Provide detection logic that generalizes beyond the atomic indicators in the [Indicators of Compromise](#indicators-of-compromise) section, such as a [YARA](https://virustotal.github.io/yara/) rule keyed to code or string patterns that catches the family rather than a single listed hash. Behavioral hunting guidance, such as the combination of artifacts or activity to watch for, also belongs here. [Sigma](https://sigmahq.io/) and other SIEM or EDR rules are optional here, since they depend on the log sources and telemetry where they'll run, and are often better written by the team that runs those tools. Use the Notes column for log-source dependencies, false-positive characteristics, or per-row context.]*\n\n| Detection Content | Notes |\n|---|---|\n| | |\n| | |\n\n*[Include a link to where the rule code is stored, such as a separate file or repository.]*\n\n## About this Report\n\n| | |\n|---|---|\n| **Report Title** | |\n| **Author(s) and Organization** | |\n| **Publication Date** | |\n| **Report Classification** | *[Mark the report's sensitivity using your organization's data classification scheme. For external sharing with the security community, [TLP](https://www.first.org/tlp/) is a common option.]* |\n| **Follow-Up Contact** | *[Specify the person responsible for follow-up questions about this report.]* |\n\n### Report Changelog\n\n| **Date** | **Author** | **Change Description** |\n|---|---|---|\n| | | |\n\n## Appendix: Analysis Environment\n\n*[Document the environment in which the analysis was conducted so other analysts can replicate the work. Cover the analysis distro and version, such as [REMnux](https://remnux.org) or [FLARE VM](https://github.com/mandiant/flare-vm). Include the sandbox configuration, the network isolation setup, and, if relevant, tool versions. Note any environment-specific assumptions that affect the findings. If an automated or agentic tool drove the analysis, such as an MCP server orchestrating a toolkit, record it here with its version and the analysis depth.]*\n\n## Appendix: Analysis Scripts (Optional)\n\n*[Optionally, link the scripts you wrote or used to analyze the sample and reproduce the findings, such as config extractors, deobfuscation or unpacking scripts, and analysis notebooks. Point to where they're stored, such as a separate file or repository. Omit this appendix if you will not be sharing such scripts.]*\n";
10
+ /** Writing/methodology guidelines digest (canonical YAML minus website/MCP plumbing). */
11
+ export const GUIDELINES_DIGEST = {
12
+ "title": "Malware Analysis Writing Guidelines",
13
+ "version": "1.1.0",
14
+ "author": "Lenny Zeltser",
15
+ "date": "2026-05-29",
16
+ "license": "Copyright (c) 2026 Lenny Zeltser",
17
+ "baseUrl": "https://zeltser.com",
18
+ "articleUrl": "/malware-analysis-report",
19
+ "scope": "Methodology, frameworks, and writing guidance for malware analysis reports centered on a single sample or a set of related artifacts, such as a dropper plus its payload chain. This guidance analyzes the sample itself: what it is, what it can do, how it arrives, and how confident we are in identifying it.",
20
+ "limitation": "This guidance stops at the sample. For what defenders did during an incident, including containment, eradication, and recovery, use the `ir_*` tools. For the actor or campaign behind the sample, including attribution and victimology across many targets, use the `cti_*` tools. For an exposure-and-remediation decision, including a malicious or compromised dependency the organization needs to remove, use the `vuln_*` tools. Malware family identification by code reuse and string overlap stays here; threat-actor attribution does not.",
21
+ "briefPolicy": {
22
+ "hasCompanionBrief": false,
23
+ "rationale": "A brief exists to help a decision-maker act, and each sibling report describes something an organization must decide about. An incident response report describes an event, so a leader decides on containment and notification. A threat intelligence report describes an adversary, so a leader decides how much to care. A vulnerability investigation describes an exposure, so a leader decides whether and how fast to remediate. A malware analysis report's subject is an object, the sample. What it is, what it can do, how it arrives, and how confident we are in identifying it are inputs to a decision, not a decision on their own, so a brief derived only from the report carries no decision for the reader to make.",
24
+ "decisionLayerOwnership": [
25
+ {
26
+ "condition": "The organization is or may be affected",
27
+ "owner": "Incident Response brief and report (`ir_*` tools)"
28
+ },
29
+ {
30
+ "condition": "The sample ties to a threat actor or campaign the organization tracks",
31
+ "owner": "Cyber Threat Intelligence brief and report (`cti_*` tools)"
32
+ },
33
+ {
34
+ "condition": "The sample reached the environment through a malicious or compromised dependency or product, including the newsworthy supply-chain case",
35
+ "owner": "Vulnerability Investigation brief (`vuln_*` tools), and Incident Response once a compromise is confirmed"
36
+ },
37
+ {
38
+ "retainedHere": "Malware family identification by code-reuse and string-overlap lineage stays in the malware report. Threat-actor attribution does not."
39
+ }
40
+ ],
41
+ "shareableSummary": "The report's Executive Summary is the shareable skim layer a brief would otherwise provide. Coach the writer to make it stand on its own for a non-analyst, such as a manager deciding whether to escalate, so the report hands off cleanly to whichever sibling owns the decision.",
42
+ "authorNote": "This block is guidance for you, the AI. Don't surface 'there is no brief' to a template reader, and don't add a brief section, a brief field, or a brief tool. When the writer asks for a decision-maker one-pager, route to the sibling that owns the decision rather than distilling the malware report into a brief."
43
+ },
44
+ "applicabilityProfiles": [
45
+ {
46
+ "name": "organizational-report",
47
+ "description": "A formal report produced by a team, a security operations center, a CERT, or a vendor research group. Tables carry the facts, sections are explicit, and the report is filed, shared with partners, or published as a vendor advisory. Example: a malware analysis report from an in-house team to its incident responders, or a vendor research write-up published as a formal report.",
48
+ "requiredSections": [
49
+ "Executive Summary",
50
+ "Sample Snapshot",
51
+ "Malware Family Identification",
52
+ "Component Inventory",
53
+ "Capabilities",
54
+ "Indicators of Compromise",
55
+ "Analysis Details",
56
+ "About this Report"
57
+ ],
58
+ "recommendedSections": [
59
+ "Runtime Requirements",
60
+ "Sources",
61
+ "What We Don't Know",
62
+ "Appendix: Analysis Environment"
63
+ ],
64
+ "situationalSections": [
65
+ {
66
+ "section": "Infection Vector (Optional)",
67
+ "trigger": "The delivery path is known and the report should document how the sample reached the target."
68
+ },
69
+ {
70
+ "section": "Detection Engineering (Optional)",
71
+ "trigger": "The team is publishing detection logic or hunting guidance alongside the analysis."
72
+ },
73
+ {
74
+ "section": "Appendix: Analysis Scripts (Optional)",
75
+ "trigger": "The author is sharing config extractors, deobfuscation scripts, or analysis notebooks."
76
+ }
77
+ ],
78
+ "markingsThatApply": [
79
+ "A TLP marking at the top of the report",
80
+ "The organization's own data-classification label"
81
+ ],
82
+ "rationale": "Formal reports benefit from the full structure. The table-driven sections, the explicit confidence in the family call, and the reproducibility appendices all carry value when the report is filed, shared, or published."
83
+ },
84
+ {
85
+ "name": "researcher-narrative",
86
+ "description": "An individual researcher's write-up, often a blog post or a thread, that walks through the analysis as a narrative rather than a filed report. Sample Snapshot facts are woven into the prose, the tone is first-person, and classification is usually TLP:CLEAR or absent. Example: a reverse-engineer's blog post detailing how they unpacked and characterized a loader.",
87
+ "requiredSections": [
88
+ "Executive Summary",
89
+ "Capabilities",
90
+ "Indicators of Compromise",
91
+ "Analysis Details"
92
+ ],
93
+ "recommendedSections": [
94
+ "Malware Family Identification",
95
+ "What We Don't Know",
96
+ "Appendix: Analysis Scripts (Optional)"
97
+ ],
98
+ "situationalSections": [
99
+ {
100
+ "section": "Sample Snapshot",
101
+ "trigger": "The author wants a quick-reference table even in a narrative piece. Otherwise the snapshot facts live in the opening prose."
102
+ },
103
+ {
104
+ "section": "Detection Engineering (Optional)",
105
+ "trigger": "The researcher is sharing a YARA rule or hunting idea, which is common in this format."
106
+ }
107
+ ],
108
+ "markingsThatApply": [
109
+ "TLP:CLEAR, or no marking, since researcher write-ups are usually public"
110
+ ],
111
+ "rationale": "Researcher narratives often weave the snapshot facts into prose rather than a formal table, and they tend to lead with the reverse-engineering story. The same content matters, but the format is looser. Coach toward clarity and reproducibility rather than toward filling every table."
112
+ }
113
+ ],
114
+ "frameworks": [
115
+ {
116
+ "name": "Malware Behavior Catalog (MBC)",
117
+ "publisher": "The MBC Project (MITRE Corporation, with community contributors)",
118
+ "url": "https://github.com/MBCProject/mbc-markdown",
119
+ "primarySourceAccess": "fetched",
120
+ "primarySourceQuote": "The Malware Behavior Catalog (MBC) is a catalog of malware objectives and behaviors, created to support malware analysis-oriented use cases, such as labeling, similarity analysis, and standardized reporting.",
121
+ "role": "The primary vocabulary for the Capabilities section. MBC characterizes what a sample does in malware-analysis terms, organized into Objectives (the high-level categories) and Behaviors (the specifics under them).",
122
+ "objectivesVerbatim": [
123
+ "Anti-Behavioral Analysis",
124
+ "Anti-Static Analysis",
125
+ "Collection",
126
+ "Command and Control",
127
+ "Credential Access",
128
+ "Defense Evasion",
129
+ "Discovery",
130
+ "Execution",
131
+ "Exfiltration",
132
+ "Impact",
133
+ "Lateral Movement",
134
+ "Persistence",
135
+ "Privilege Escalation"
136
+ ],
137
+ "relationshipToAttack": "MBC builds on MITRE ATT&CK and, by design, doesn't duplicate it. Many MBC objectives share names with ATT&CK tactics, and Anti-Behavioral Analysis and Anti-Static Analysis are malware-specific additions. MBC expects you to cite ATT&CK technique IDs for procedures it doesn't carry a behavior for. See `capabilityModel` for how the template applies this."
138
+ },
139
+ {
140
+ "name": "MITRE ATT&CK",
141
+ "publisher": "The MITRE Corporation",
142
+ "url": "https://attack.mitre.org",
143
+ "branding": "First reference must be 'MITRE ATT&CK®'. Subsequent references can use 'ATT&CK'. Always capitalized, no hyphen, no abbreviation.",
144
+ "role": "Two uses in the malware report. In the Capabilities section, ATT&CK is the escape hatch for a procedure that has no fitting MBC behavior; cite the technique ID in the Notes column (see `capabilityModel`). In the Infection Vector section, ATT&CK Initial Access techniques name how the sample reached the target.",
145
+ "handoff": "The CTI guidance carries the canonical ATT&CK treatment (version, citation, design philosophy). This file covers only the malware-report use. Call `cti_get_guidelines` or attack.mitre.org for the rest."
146
+ },
147
+ {
148
+ "name": "Pyramid of Pain",
149
+ "author": "David J. Bianco",
150
+ "url": "https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html",
151
+ "role": "Orders the Indicators of Compromise table by cost to the adversary, so higher tiers are more durable for detection. The malware IOC tiering, including the report's own Cloud Resources addition and the no-loot rule, is in the `pyramidOfPain` block.",
152
+ "handoff": "Bianco's original tiers and the fuller treatment are in the CTI guidance. Call `cti_get_guidelines` for the canonical version."
153
+ },
154
+ {
155
+ "name": "ICD-203 (Analytic Standards)",
156
+ "publisher": "Office of the Director of National Intelligence (ODNI)",
157
+ "url": "https://www.dni.gov/files/documents/ICD/ICD-203.pdf",
158
+ "role": "Provides the confidence vocabulary (high, moderate, low) for the Malware Family Identification section. The malware-specific application is in the `confidence` block. The report does not use the ICD-203 likelihood ladder, since sample analysis is retrospective.",
159
+ "handoff": "The CTI and security-writing guidance carry the full ICD-203 treatment, including the confidence-versus-likelihood separation. Call `cti_get_guidelines` for it."
160
+ },
161
+ {
162
+ "name": "STIX 2.1",
163
+ "publisher": "OASIS Cyber Threat Intelligence Technical Committee",
164
+ "url": "https://docs.oasis-open.org/cti/stix/v2.1/os/stix-v2.1-os.html",
165
+ "role": "A machine-readable format for the full indicator set when a consumer needs to ingest it. The IOC section keeps the report's table short and points to a STIX bundle, or a MISP event (https://www.misp-project.org), for the complete set.",
166
+ "handoff": "The CTI guidance carries the canonical STIX treatment. Call `cti_get_guidelines` for it."
167
+ },
168
+ {
169
+ "name": "TLP 2.0 (Traffic Light Protocol)",
170
+ "publisher": "Forum of Incident Response and Security Teams (FIRST)",
171
+ "url": "https://www.first.org/tlp/",
172
+ "role": "The sharing-restriction marking placed at the top of the report and cited in the About this Report classification field. A common choice when sharing a malware report with the security community.",
173
+ "handoff": "The CTI and security-writing guidance carry the full TLP treatment, including the label definitions and the four-labels-plus-modifier detail. Call `cti_get_guidelines` for it."
174
+ }
175
+ ],
176
+ "capabilityModel": {
177
+ "primaryFramework": "Malware Behavior Catalog (MBC)",
178
+ "escapeHatch": "A MITRE ATT&CK technique ID in the Capabilities Notes column, used when no clean MBC behavior fits the observed procedure.",
179
+ "objectiveExamples": [
180
+ "Defense Evasion",
181
+ "Discovery",
182
+ "Credential Access",
183
+ "Collection",
184
+ "Command and Control",
185
+ "Impact",
186
+ "Persistence",
187
+ "Anti-Behavioral Analysis",
188
+ "Anti-Static Analysis"
189
+ ],
190
+ "decisionTree": [
191
+ {
192
+ "condition": "A clean, specific MBC behavior fits the observed procedure.",
193
+ "action": "Use the MBC behavior in the MBC Behavior column. Add ATT&CK context in Notes only if it helps the reader."
194
+ },
195
+ {
196
+ "condition": "No clean MBC behavior fits, but a fitting MBC objective (the broader category) exists.",
197
+ "action": "Record the procedure under that MBC objective and cite the relevant ATT&CK technique ID in the Notes column."
198
+ },
199
+ {
200
+ "condition": "There is no MBC home at all.",
201
+ "action": "Place the procedure under the closest MBC objective, cite the ATT&CK technique ID in the Notes column, and mark the note as an ATT&CK gap-fill so the reader sees that row isn't purely MBC."
202
+ }
203
+ ],
204
+ "attribution": "MBC is the primary vocabulary, ATT&CK is the escape hatch, and both are cited with attribution. Don't present either framework's wording as original, and don't drop MBC in favor of ATT&CK just because ATT&CK is more familiar. MBC's gaps are known in mobile collection, desktop data collection, and some Windows privilege-escalation procedures, which is exactly where the escape hatch earns its place.",
205
+ "dataTargetedCue": "When the sample collects or exfiltrates victim data, name what it targets in the Capabilities prose or an Analysis Details note, such as credentials from local stores, session tokens, SMS or two-factor codes, browser-saved passwords, or wallet data. This is what a reader needs to gauge what was taken or put at risk for a stealer or banker sample. Keep stolen victim data out of the Indicators of Compromise table; see `pyramidOfPain.prohibitions`.",
206
+ "examplesNote": "Use synthetic examples when illustrating the model, such as the technique ID T1548.002 for a UAC bypass or T1053.005 for scheduled-task persistence. Don't lift a real sample's mapping from another analyst's report and present it as your own."
207
+ },
208
+ "confidence": {
209
+ "framework": "ICD-203",
210
+ "source": "Office of the Director of National Intelligence, 2 January 2015 (as amended through 2023)",
211
+ "url": "https://www.dni.gov/files/documents/ICD/ICD-203.pdf",
212
+ "primarySourceAccess": "fetched",
213
+ "appliesTo": "Malware family identification. The Malware Family Identification section rates the family call high, moderate, or low. Other sections report what was observed, so they don't carry a separate confidence column.",
214
+ "levelsNote": "ICD-203 doesn't define a fixed list of confidence levels. It tells analysts to express confidence based on the logic and evidentiary base behind a judgment. The three-level vocabulary below is the IC-common usage the report adopts, with descriptions written for the family-identification call.",
215
+ "levels": [
216
+ {
217
+ "level": "high",
218
+ "description": "Strong, corroborated evidence with little ambiguity, such as a precise match to a published YARA rule plus a distinctive code construct shared with known samples of the family."
219
+ },
220
+ {
221
+ "level": "moderate",
222
+ "description": "Plausible, credibly sourced evidence that isn't corroborated enough for high, such as a behavioral pattern and partial string overlap that fit the family without a precise code match."
223
+ },
224
+ {
225
+ "level": "low",
226
+ "description": "Weak or fragmentary evidence that could change with more analysis, such as a single loose string match or a vendor label alone."
227
+ }
228
+ ],
229
+ "noNamedFamilyCase": "Many samples map to no named family. When that's the case, attach the confidence to the characterization method rather than to a family name. Rating the basis (a behavioral profile, a code-overlap cluster, a self-assigned label) high or low is valid and common. 'No named family, but high confidence the sample is a credential stealer based on its observed behavior' is a complete, honest result. Don't invent a family name to fill the row.",
230
+ "confidenceDrivers": {
231
+ "description": "Factors that lower confidence in the family call regardless of how much you observed. More indicators isn't the same as stronger identification.",
232
+ "drivers": [
233
+ {
234
+ "factor": "Single-source dependency",
235
+ "explanation": "Only one sandbox run, one vendor verdict, or one rule match stands behind the call. Lower confidence until an independent basis corroborates it."
236
+ },
237
+ {
238
+ "factor": "Packing or anti-analysis",
239
+ "explanation": "Packing, obfuscation, or anti-analysis defenses limited how much you could observe, so the family-defining code or behavior may be hidden."
240
+ },
241
+ {
242
+ "factor": "Evidence age",
243
+ "explanation": "The sample predates your current tooling or reference set, so a match to an older family signature may miss a more recent lineage."
244
+ },
245
+ {
246
+ "factor": "Behavioral coverage gaps",
247
+ "explanation": "You couldn't trigger a code path that would confirm or rule out the family, so you're judging from what executed rather than the full sample."
248
+ },
249
+ {
250
+ "factor": "Code-reuse ambiguity",
251
+ "explanation": "Shared code can mean a shared author or a shared library, builder, or leaked source. Decide whether the overlap is family lineage or just common tooling before raising confidence."
252
+ }
253
+ ]
254
+ }
255
+ },
256
+ "pyramidOfPain": {
257
+ "author": "David J. Bianco",
258
+ "year": 2013,
259
+ "url": "https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html",
260
+ "primarySourceAccess": "fetched",
261
+ "principle": "Order indicators by cost to the adversary. Higher tiers are more durable because changing them costs the adversary more.",
262
+ "templateAdaptation": {
263
+ "note": "Bianco's model orders indicators by cost to the adversary. The report's IOC table keeps that ordering and lists six observable indicator-type tiers. The Cloud Resources tier is the report's own addition for cloud-native samples, not part of Bianco's original. Pick the most informative indicators per tier and leave a tier's row blank when none apply.",
264
+ "tiers": [
265
+ {
266
+ "tier": 1,
267
+ "name": "Hash Values",
268
+ "scope": "Per-file fingerprints such as SHA-256, an imphash for PE files, and a fuzzy hash like ssdeep or TLSH. Trivial for the adversary to change."
269
+ },
270
+ {
271
+ "tier": 2,
272
+ "name": "IP Addresses",
273
+ "scope": "Easy to rotate."
274
+ },
275
+ {
276
+ "tier": 3,
277
+ "name": "Domain Names",
278
+ "scope": "Slightly harder than IPs since domains need registration and payment."
279
+ },
280
+ {
281
+ "tier": 4,
282
+ "name": "Cloud Resources",
283
+ "scope": "Bucket URIs, IAM roles, cloud function IDs, cloud API endpoints. The report's own addition for cloud-native samples, not one of Bianco's tiers."
284
+ },
285
+ {
286
+ "tier": 5,
287
+ "name": "Network Artifacts",
288
+ "scope": "Patterns the sample leaves on the wire, such as user-agent strings, URI patterns, distinctive HTTP headers, and beaconing patterns."
289
+ },
290
+ {
291
+ "tier": 6,
292
+ "name": "Host Artifacts",
293
+ "scope": "Patterns the sample leaves on endpoints, such as registry keys, mutexes, named pipes, service names, and dropped file paths."
294
+ }
295
+ ]
296
+ },
297
+ "prohibitions": [
298
+ {
299
+ "rule": "No Identities tier. Don't add a tier for stolen credentials, session tokens, two-factor or SMS codes, or wallet data. Those are loot the sample collects from victims, not adversary-controlled indicators of the sample. They belong in the Capabilities section and Analysis Details, where you name what the sample targets. Publishing victim secrets in a shareable IOC feed is both a category error and a sensitivity problem."
300
+ }
301
+ ],
302
+ "optionalFutureTier": {
303
+ "name": "Adversary-Controlled Identifiers (optional, thin evidence)",
304
+ "status": "Not part of the template. Default to omitting it.",
305
+ "rule": "Only a genuinely huntable, adversary-controlled identifier could ever warrant a row, such as an attacker-registered package-publisher account or an OAuth application ID the adversary controls. Victim loot never qualifies. Evidence that this tier is needed is thin, so treat it as a possible future addition, not a recommendation, and when in doubt place such an identifier under Cloud Resources or Host Artifacts with a clear Context note."
306
+ }
307
+ },
308
+ "longReportSections": [
309
+ {
310
+ "section": "Executive Summary",
311
+ "purpose": "A short paragraph stating what the sample is, how it gets in, and what it does. This is the takeaway for a reader who only reads the summary, so write it to stand on its own when it's handed to a non-analyst, such as a manager deciding whether to escalate. When the audience is a specific organization, add organization-specific context, including significance.",
312
+ "applicability": {
313
+ "organizationalReport": "required",
314
+ "researcherNarrative": "required"
315
+ },
316
+ "requiredFields": [
317
+ "executive_summary_paragraph"
318
+ ],
319
+ "commonOmissions": [
320
+ "Summary reads as a feature list ('the sample uses XOR encoding and creates a mutex') instead of stating what the sample is and what it does to a victim.",
321
+ "Summary written only for analysts, so a manager can't act on it without reading the whole report.",
322
+ "Family and confidence left out, so the reader doesn't know how firmly the sample is identified."
323
+ ],
324
+ "clarifyingQuestions": [
325
+ "In one sentence, what is this sample and what does it do?",
326
+ "If a manager read only this paragraph, would they know enough to decide whether to escalate?",
327
+ "What's the family call, and how confident are you in it?"
328
+ ]
329
+ },
330
+ {
331
+ "section": "Sample Snapshot",
332
+ "purpose": "A quick-reference table profiling the sample so a reader can orient in seconds. Each row summarizes a fuller section elsewhere in the report.",
333
+ "applicability": {
334
+ "organizationalReport": "required",
335
+ "researcherNarrative": "situational"
336
+ },
337
+ "requiredFields": [
338
+ "family_name",
339
+ "key_capabilities",
340
+ "target_platform",
341
+ "primary_artifact",
342
+ "infection_vector_summary"
343
+ ],
344
+ "commonOmissions": [
345
+ "Target Platform left blank for an ecosystem sample, so the reader doesn't know whether this is a Windows binary, an npm package, a browser extension, or a mobile app.",
346
+ "Primary Artifact given as a bare hash with no role, so the reader can't tell which component the report centers on.",
347
+ "Snapshot rows that disagree with the fuller sections they summarize."
348
+ ],
349
+ "clarifyingQuestions": [
350
+ "What single artifact does this report center on, and how is it best identified (a SHA-256, or an ecosystem identifier like a package name and version)?",
351
+ "Where does the sample run, an operating system or an ecosystem such as browser extensions or npm packages?",
352
+ "What three or four capabilities most clearly characterize the sample?"
353
+ ],
354
+ "fieldNotes": [
355
+ "Primary Artifact may be an ecosystem identifier rather than a file hash, such as an npm package name and version or a browser-extension marketplace listing. When a file hash isn't the authoritative identifier, use the one the source provides, even an MD5 or SHA-1, and say so."
356
+ ]
357
+ },
358
+ {
359
+ "section": "Malware Family Identification",
360
+ "purpose": "The family you believe the sample belongs to, the evidence behind the call, and your confidence in it. Add rows for alternative possibilities you're weighing. This is the only section that carries a confidence rating, scoped per `confidence`.",
361
+ "applicability": {
362
+ "organizationalReport": "required",
363
+ "researcherNarrative": "recommended"
364
+ },
365
+ "requiredFields": [
366
+ "family_name",
367
+ "family_basis",
368
+ "family_confidence"
369
+ ],
370
+ "fieldNotes": [
371
+ "Basis is the evidence type, such as a YARA rule match, string overlap, code reuse, a behavioral pattern, or a vendor detection name.",
372
+ "Confidence is high, moderate, or low, per `confidence`. When there's no named family, rate the characterization method instead (see `confidence.noNamedFamilyCase`).",
373
+ "Family lineage by code reuse or string overlap stays here. Threat-actor attribution does not; that's a `cti_*` job. Code shared with a known actor's tool is a family-lineage observation, not an attribution claim."
374
+ ],
375
+ "commonOmissions": [
376
+ "Confidence omitted, so the family call reads as settled when it isn't.",
377
+ "A vendor detection name treated as the family conclusion rather than as one basis among several.",
378
+ "Code reuse with a known actor's tool written as an attribution claim instead of a lineage observation."
379
+ ],
380
+ "clarifyingQuestions": [
381
+ "What family do you believe this is, and what evidence supports the call?",
382
+ "How confident are you (high, moderate, or low), and what would raise or lower that?",
383
+ "Is the shared code genuine family lineage, or just a common library, builder, or leaked source?"
384
+ ]
385
+ },
386
+ {
387
+ "section": "Component Inventory",
388
+ "purpose": "Each file or artifact in the sample, one per row, with its role. A single-file sample has one row. The Indicators of Compromise section carries per-component hashes, labeled by role.",
389
+ "applicability": {
390
+ "organizationalReport": "required",
391
+ "researcherNarrative": "situational"
392
+ },
393
+ "requiredFields": [
394
+ "component_role",
395
+ "component_file_name",
396
+ "component_file_type",
397
+ "component_notes"
398
+ ],
399
+ "versionChainGuidance": "When the sample's identity is a version chain rather than a set of files, such as a package that turned malicious in a specific release, record the relevant versions by role, for example the last clean version and the first malicious one. A row may lack a file name or hash, such as an in-memory stage or a package identified only by name and version. Fill what you have and leave the rest blank rather than dropping the row.",
400
+ "fieldNotes": [
401
+ "For a multi-component sample, add a short paragraph or numbered list below the table describing how the components flow into each other, such as a stage 1 dropper that extracts a stage 2 script."
402
+ ],
403
+ "commonOmissions": [
404
+ "A row dropped because it lacked a hash, when an in-memory stage or a named package still belongs in the inventory.",
405
+ "A version-chain sample forced into a file-per-row table, losing the last-clean and first-malicious versions that matter."
406
+ ],
407
+ "clarifyingQuestions": [
408
+ "How many distinct artifacts make up this sample, and what's each one's role?",
409
+ "If the sample is a package or an evolving product, what are the last clean and first malicious versions?"
410
+ ]
411
+ },
412
+ {
413
+ "section": "Runtime Requirements",
414
+ "purpose": "What the sample needs to run. This is the section that best fits ecosystem samples, so use it to capture the affordances a package, extension, or mobile app depends on.",
415
+ "applicability": {
416
+ "organizationalReport": "recommended",
417
+ "researcherNarrative": "situational"
418
+ },
419
+ "requiredFields": [
420
+ "runtime_requirements"
421
+ ],
422
+ "fieldNotes": [
423
+ "For an OS-targeted sample, examples include required DLLs, configuration files, registry keys, network resources, and runtime versions.",
424
+ "For an ecosystem-targeted sample, examples include required permissions, manifest declarations, host-application versions, marketplace identifiers, and abused APIs. A mobile app might declare SMS and accessibility permissions; a browser extension might declare host permissions and a marketplace listing ID; an npm package might require a postinstall script.",
425
+ "Distinguish dependencies the sample bundles from those it expects to find on the target system.",
426
+ "For a native executable, the CPU architecture, endianness, and whether it's statically or dynamically linked are part of what it needs to run. A statically linked big-endian MIPS binary, for example, suggests an embedded or IoT target rather than a desktop."
427
+ ],
428
+ "commonOmissions": [
429
+ "An ecosystem sample's permissions and manifest declarations left out, so the reader can't see what the sample was allowed to do."
430
+ ],
431
+ "clarifyingQuestions": [
432
+ "What does the sample need in place to run, and what does it bring with it versus expect on the target?",
433
+ "For an ecosystem sample, what permissions, manifest declarations, or APIs does it rely on?"
434
+ ]
435
+ },
436
+ {
437
+ "section": "Sources",
438
+ "purpose": "Where the sample and supporting data came from. Records provenance and any chain-of-custody detail.",
439
+ "applicability": {
440
+ "organizationalReport": "recommended",
441
+ "researcherNarrative": "situational"
442
+ },
443
+ "requiredFields": [
444
+ "sample_sources"
445
+ ],
446
+ "fieldNotes": [
447
+ "Sources include internal telemetry, third-party sharing, OSINT, and partner-shared samples. Common OSINT sources include VirusTotal, passive-DNS lookup services, and shared threat-intelligence platforms.",
448
+ "If a source named a threat actor, that context can appear here, but it stays context. Actor attribution itself is a `cti_*` job."
449
+ ],
450
+ "commonOmissions": [
451
+ "First-observed date and provenance left out, so a reader can't judge how current or how trustworthy the sample set is."
452
+ ]
453
+ },
454
+ {
455
+ "section": "Capabilities",
456
+ "purpose": "What the sample does, characterized with the Malware Behavior Catalog. Above the table, write a brief prose summary of the sample's top-level MBC objectives. In the table, pick the behaviors that most clearly characterize the sample. The decision tree for MBC versus ATT&CK lives in `capabilityModel`.",
457
+ "applicability": {
458
+ "organizationalReport": "required",
459
+ "researcherNarrative": "required"
460
+ },
461
+ "capabilityModelRef": true,
462
+ "requiredFields": [
463
+ "capability_objective_summary",
464
+ "mbc_behavior",
465
+ "procedure_observed",
466
+ "capability_notes"
467
+ ],
468
+ "fieldNotes": [
469
+ "Apply `capabilityModel`: a clean MBC behavior wins; with no clean behavior but a fitting objective, record the objective and cite an ATT&CK technique in Notes; with no MBC home, use the closest objective, cite the ATT&CK technique, and mark the note as an ATT&CK gap-fill.",
470
+ "If the sample collects or exfiltrates victim data, name what it targets, per `capabilityModel.dataTargetedCue`. Keep that data out of the IOC table."
471
+ ],
472
+ "commonOmissions": [
473
+ "A flat list of ATT&CK technique IDs with no MBC framing, dropping the malware-analysis vocabulary the section is built on.",
474
+ "Stolen victim data listed as an indicator instead of named as what the sample targets.",
475
+ "No prose summary above the table, so a reader has to reverse-engineer the sample's purpose from individual behaviors."
476
+ ],
477
+ "clarifyingQuestions": [
478
+ "In a sentence or two, what are the sample's main objectives in MBC terms?",
479
+ "For each notable procedure, is there a clean MBC behavior, or do you need an ATT&CK technique ID in Notes?",
480
+ "If the sample steals data, what exactly does it target?"
481
+ ]
482
+ },
483
+ {
484
+ "section": "Indicators of Compromise",
485
+ "purpose": "A table of indicators tiered by the Pyramid of Pain, from lowest to highest cost to the adversary. Pick the most informative indicators per tier and leave a tier blank when none apply. Supply the full set separately, such as a STIX bundle or a MISP event, when a consumer needs to ingest it.",
486
+ "applicability": {
487
+ "organizationalReport": "required",
488
+ "researcherNarrative": "required"
489
+ },
490
+ "requiredFields": [
491
+ "ioc_type",
492
+ "ioc_indicator",
493
+ "ioc_context"
494
+ ],
495
+ "defangRule": "Defang URLs and bracket the dots in domains and IP addresses, such as hxxps://examplebot-c2[.]example[.]com and 192.0.2[.]10, so nothing in the report is clickable or resolvable.",
496
+ "noLootProhibition": "Stolen credentials, tokens, two-factor codes, and wallet data are loot, not indicators. They go in Capabilities and Analysis Details, never in this table. See `pyramidOfPain.prohibitions`.",
497
+ "fieldNotes": [
498
+ "Use the Context column for each indicator's role and any useful detail, such as command-and-control server, drop site, persistence artifact, or exfiltration host. Keep role descriptions consistent with the Capabilities section.",
499
+ "For a multi-component sample, give each component its own Hash Values row and name its role from the Component Inventory in the Context column."
500
+ ],
501
+ "commonOmissions": [
502
+ "Indicators presented as a flat list instead of organized by tier, losing the cost-to-adversary signal.",
503
+ "Context column left empty, so a consumer can't tell what an indicator's role was.",
504
+ "Victim loot placed in the table (see the no-loot rule).",
505
+ "Strings that only matched an indicator pattern, pulled from packed or encrypted bytes, listed as indicators with no evidence the sample uses them."
506
+ ],
507
+ "clarifyingQuestions": [
508
+ "Which tier does each indicator sit at, and what was its role in the sample's activity?",
509
+ "Are you defanging every URL, domain, and IP?",
510
+ "Is anything in the table actually stolen victim data that belongs in Capabilities instead?",
511
+ "Does the sample resolve, contact, drop, or write each indicator, or did it just match a pattern in packed or encrypted bytes?"
512
+ ]
513
+ },
514
+ {
515
+ "section": "Analysis Details",
516
+ "purpose": "The supporting evidence behind the Executive Summary and Capabilities sections. Most readers skim it; analysts validating or building on the work read it closely. Keep a subsection you didn't perform and add a note that it wasn't performed, which usually serves the reader better than removing it.",
517
+ "applicability": {
518
+ "organizationalReport": "required",
519
+ "researcherNarrative": "required"
520
+ },
521
+ "fieldNotes": [
522
+ "For a multi-component sample, organize each subsection by component using subheadings that match the roles in the Component Inventory."
523
+ ],
524
+ "subsections": [
525
+ {
526
+ "name": "Automated Analysis",
527
+ "purpose": "What automated tooling surfaced, such as a sandbox detonation, and which tools were used. These findings may orient the deeper analysis or account for much of it. For a curated list of public sandboxes and services, point to the Free Automated Malware Analysis Sandboxes and Services article rather than naming tools that change over time. When an automated agent or an MCP-driven toolkit produced these findings, name the tool and the analysis depth it ran, so a reader can weigh and reproduce them.",
528
+ "requiredFields": [
529
+ "automated_analysis"
530
+ ]
531
+ },
532
+ {
533
+ "name": "Static Properties Analysis",
534
+ "purpose": "The static properties worth calling out and what each tells you, rather than every field. Property examples include entry point, packing or obfuscation, file or section entropy, codesigning status, key strings, embedded resources, imports and risky API patterns, exports, section hashes, and compile timestamp. Significance explains why each matters, such as high entropy suggesting packing, a PDB path revealing a possible attribution detail, or an imphash matching a known family. If the sample is packed or encrypted, say so and name the packer when you can, then state whether these properties describe the packed form or an unpacked one you produced.",
535
+ "requiredFields": [
536
+ "static_property",
537
+ "static_significance"
538
+ ]
539
+ },
540
+ {
541
+ "name": "Behavioral Analysis",
542
+ "purpose": "What the sample does when executed in a controlled environment, covering file system, registry, process, and network activity, persistence, and privilege escalation. Cite the observation behind each claim.",
543
+ "requiredFields": [
544
+ "behavioral_analysis"
545
+ ]
546
+ },
547
+ {
548
+ "name": "Memory Analysis",
549
+ "purpose": "Findings from memory forensics, such as rogue processes, injected or hollowed code, API hooks, unpacked payloads recovered from memory, and in-memory configuration or strings. Note the capture method and tools.",
550
+ "requiredFields": [
551
+ "memory_analysis"
552
+ ]
553
+ },
554
+ {
555
+ "name": "Code Analysis",
556
+ "purpose": "Code-level findings from static disassembly, decompilation, emulation, and dynamic debugging. Reference instruction addresses or function names so other analysts can replicate the work.",
557
+ "requiredFields": [
558
+ "code_analysis"
559
+ ]
560
+ }
561
+ ],
562
+ "commonOmissions": [
563
+ "A subsection silently dropped instead of kept with a not-performed note, so a reader can't tell whether the analysis was skipped or just turned up nothing.",
564
+ "Claims in Behavioral or Code Analysis without the observation that supports them.",
565
+ "Findings reported without saying whether they came from the packed or the unpacked form, when a packed or encrypted sample makes the two differ."
566
+ ]
567
+ },
568
+ {
569
+ "section": "What We Don't Know",
570
+ "purpose": "What you couldn't resolve, trigger, or verify, and the source or methodology limitations behind those unknowns. Naming the gaps is the discipline that separates mature analysis from confident-sounding guesswork, and it tells the reader when to expect more.",
571
+ "applicability": {
572
+ "organizationalReport": "recommended",
573
+ "researcherNarrative": "recommended"
574
+ },
575
+ "requiredFields": [
576
+ "analysis_gaps"
577
+ ],
578
+ "fieldNotes": [
579
+ "Examples include an inability to detonate in a representative environment, missing command-and-control telemetry, restricted access to the original delivery context, a behavior you couldn't trigger, a destructive-impact you couldn't safely confirm, or version-coverage gaps for an evolving package."
580
+ ],
581
+ "commonOmissions": [
582
+ "Section absent, leaving the reader to assume the analysis is more complete than it is.",
583
+ "Gaps stated abstractly ('limited visibility') instead of specifically ('couldn't trigger the ransomware's file-encryption branch without a live C2 response')."
584
+ ],
585
+ "clarifyingQuestions": [
586
+ "What couldn't you resolve, trigger, or verify?",
587
+ "What evidence would change your read of the sample?"
588
+ ]
589
+ },
590
+ {
591
+ "section": "Infection Vector (Optional)",
592
+ "purpose": "How the sample reached the target, if known, referencing MITRE ATT&CK Initial Access techniques where they apply. Write it as a narrative paragraph or a numbered list.",
593
+ "applicability": {
594
+ "organizationalReport": "situational",
595
+ "researcherNarrative": "situational"
596
+ },
597
+ "triggers": [
598
+ "The delivery path is known well enough to document."
599
+ ],
600
+ "requiredFields": [
601
+ "infection_vector_narrative"
602
+ ],
603
+ "fieldNotes": [
604
+ "Examples include a phishing attachment, a drive-by download, a supply-chain compromise, removable media, and an exploit kit. Note the attack chain that preceded installation when the data shows it. Include the specific distribution URL or source path when known, defanged, such as a direct download link, a watering-hole site, or an app-store listing."
605
+ ],
606
+ "commonOmissions": [
607
+ "Delivery asserted without evidence, when the report only ever observed the sample post-installation."
608
+ ]
609
+ },
610
+ {
611
+ "section": "Detection Engineering (Optional)",
612
+ "purpose": "Detection logic that generalizes beyond the atomic indicators in the IOC section, such as a YARA rule keyed to code or string patterns that catches the family rather than a single hash. Behavioral hunting guidance belongs here too. Include a link to where the rule code is stored.",
613
+ "applicability": {
614
+ "organizationalReport": "situational",
615
+ "researcherNarrative": "situational"
616
+ },
617
+ "triggers": [
618
+ "The author is publishing detection logic or hunting guidance."
619
+ ],
620
+ "requiredFields": [
621
+ "detection_content",
622
+ "detection_notes"
623
+ ],
624
+ "fieldNotes": [
625
+ "Detection Content may be a finished rule (YARA, Sigma, or an EDR rule) or hunting and monitoring guidance, such as the combination of artifacts or activity to watch for. Behavioral hunting guidance is welcome here, not just finished rules.",
626
+ "Sigma and other SIEM or EDR rules are optional, since they depend on the log sources where they run and are often better written by the team that runs those tools. Use the Notes column for log-source dependencies, false-positive characteristics, and per-row context."
627
+ ],
628
+ "commonOmissions": [
629
+ "A single-hash detection that the IOC section already covers, instead of a rule that catches the family."
630
+ ]
631
+ },
632
+ {
633
+ "section": "About this Report",
634
+ "purpose": "The metadata block: title, authorship, publication date, classification, follow-up contact, and a changelog.",
635
+ "applicability": {
636
+ "organizationalReport": "required",
637
+ "researcherNarrative": "recommended"
638
+ },
639
+ "requiredFields": [
640
+ "report_title",
641
+ "authors_and_organization",
642
+ "publication_date",
643
+ "report_classification",
644
+ "follow_up_contact"
645
+ ],
646
+ "situationalFields": [
647
+ {
648
+ "field": "TLP marking at the top of the report",
649
+ "situation": "Apply a TLP marking, or the organization's classification label, before the report is shared, so the sharing restriction is visible before the report is read. Public researcher write-ups are usually TLP:CLEAR or unmarked."
650
+ }
651
+ ],
652
+ "subsections": [
653
+ {
654
+ "name": "Report Changelog",
655
+ "purpose": "Date, author, and change-description rows tracking edits across versions.",
656
+ "requiredFields": [
657
+ "changelog_entries"
658
+ ]
659
+ }
660
+ ],
661
+ "commonOmissions": [
662
+ "No classification or TLP marking on a report that's about to be shared.",
663
+ "Follow-up contact omitted, so a reader with questions has nowhere to go."
664
+ ]
665
+ },
666
+ {
667
+ "section": "Appendix: Analysis Environment",
668
+ "purpose": "The environment the analysis was conducted in, so other analysts can replicate the work. A best-practice entry point even when most sources don't mention it.",
669
+ "applicability": {
670
+ "organizationalReport": "recommended",
671
+ "researcherNarrative": "recommended"
672
+ },
673
+ "requiredFields": [
674
+ "analysis_environment"
675
+ ],
676
+ "fieldNotes": [
677
+ "Cover the analysis distro and version, the sandbox configuration, the network isolation setup, and relevant tool versions. Note any environment-specific assumptions that affect the findings, since they explain why another analyst's results might differ. For a worked walkthrough of assembling a toolkit from free tools, point to the 5 Steps to Building a Malware Analysis Toolkit article rather than enumerating tools that change over time.",
678
+ "If an automated or agentic tool drove the analysis, such as an MCP server orchestrating a toolkit, record the tool, its version, and the analysis depth alongside the distro and isolation setup."
679
+ ],
680
+ "commonOmissions": [
681
+ "Tool versions and isolation setup left out, so a reader can't tell whether a behavior depended on the environment."
682
+ ]
683
+ },
684
+ {
685
+ "section": "Appendix: Analysis Scripts (Optional)",
686
+ "purpose": "The scripts you wrote or used to analyze the sample and reproduce the findings, such as config extractors, deobfuscation or unpacking scripts, and analysis notebooks. Point to where they're stored. Omit the appendix if you won't be sharing scripts.",
687
+ "applicability": {
688
+ "organizationalReport": "situational",
689
+ "researcherNarrative": "recommended"
690
+ },
691
+ "triggers": [
692
+ "The author is sharing reproducibility scripts."
693
+ ],
694
+ "requiredFields": [
695
+ "analysis_scripts_link"
696
+ ],
697
+ "fieldNotes": [
698
+ "Researcher narratives often ship a config extractor or an unpacking script. Link to a repository or a separate file rather than pasting long scripts into the report body."
699
+ ]
700
+ }
701
+ ],
702
+ "requiredFields": [
703
+ "executive_summary_paragraph",
704
+ "family_name",
705
+ "family_basis",
706
+ "family_confidence",
707
+ "key_capabilities",
708
+ "target_platform",
709
+ "primary_artifact",
710
+ "infection_vector_summary",
711
+ "component_role",
712
+ "component_file_name",
713
+ "component_file_type",
714
+ "component_notes",
715
+ "runtime_requirements",
716
+ "sample_sources",
717
+ "capability_objective_summary",
718
+ "mbc_behavior",
719
+ "procedure_observed",
720
+ "capability_notes",
721
+ "ioc_type",
722
+ "ioc_indicator",
723
+ "ioc_context",
724
+ "automated_analysis",
725
+ "static_property",
726
+ "static_significance",
727
+ "behavioral_analysis",
728
+ "memory_analysis",
729
+ "code_analysis",
730
+ "analysis_gaps",
731
+ "infection_vector_narrative",
732
+ "detection_content",
733
+ "detection_notes",
734
+ "report_title",
735
+ "authors_and_organization",
736
+ "publication_date",
737
+ "report_classification",
738
+ "follow_up_contact",
739
+ "changelog_entries",
740
+ "analysis_environment",
741
+ "analysis_scripts_link"
742
+ ],
743
+ "fieldGuidance": {
744
+ "executive_summary_paragraph": {
745
+ "semantic_indicators": [
746
+ "what the sample is",
747
+ "main takeaway",
748
+ "stands alone for a manager"
749
+ ],
750
+ "common_problems": [
751
+ "Reads as a list of techniques instead of what the sample is and does.",
752
+ "Written for analysts only, so a non-analyst can't act on it."
753
+ ],
754
+ "exampleGood": "Examplebot is a Windows credential stealer delivered as a phishing attachment. Once run, it harvests browser-saved passwords and session cookies and sends them to an attacker-controlled server. We identify it as the Examplebot family with high confidence. An infected host should be treated as having exposed any credentials stored in its browsers.",
755
+ "examplePoor": "The sample is a packed PE32 executable that creates a mutex, writes to the Run key, and performs XOR-encoded network communication."
756
+ },
757
+ "family_name": {
758
+ "semantic_indicators": [
759
+ "family",
760
+ "established name",
761
+ "variant"
762
+ ],
763
+ "common_problems": [
764
+ "A vendor detection name treated as the family conclusion rather than as one basis.",
765
+ "An invented family name used to fill the row when the sample maps to no established family."
766
+ ],
767
+ "exampleGood": "Examplebot, the name this stealer is already tracked under, matched by a published YARA rule and a shared C2 protocol seen in prior Examplebot samples.",
768
+ "examplePoor": "Generic.Malware.Detected",
769
+ "examplePoorWhyWrong": "A scanner's generic verdict is a basis to weigh, not a family identification. If no established family fits, say so and rate the characterization method instead."
770
+ },
771
+ "family_confidence": {
772
+ "semantic_indicators": [
773
+ "high / moderate / low",
774
+ "ICD-203",
775
+ "scoped to the family call"
776
+ ],
777
+ "common_problems": [
778
+ "Confidence omitted, so the call reads as settled.",
779
+ "Confidence raised on code reuse that's actually a shared library or builder."
780
+ ],
781
+ "exampleGood": "High. A published YARA rule matches, and the sample shares Examplebot's distinctive XOR-keyed configuration block seen in prior samples.",
782
+ "examplePoor": "Confirmed Examplebot.",
783
+ "examplePoorWhyWrong": "'Confirmed' isn't an ICD-203 level and hides how strong the evidence is. Use high, moderate, or low and name the basis."
784
+ },
785
+ "target_platform": {
786
+ "semantic_indicators": [
787
+ "OS",
788
+ "ecosystem",
789
+ "where it runs"
790
+ ],
791
+ "common_problems": [
792
+ "Left blank for an ecosystem sample, so the reader can't tell what kind of artifact this is."
793
+ ],
794
+ "exampleGood": "Chromium browser extension (Manifest V3), distributed through a web-store listing.",
795
+ "examplePoor": "Windows.",
796
+ "examplePoorWhyWrong": "Fine for a Windows binary, but for a package, extension, or mobile app, name the ecosystem so the reader knows what's at risk."
797
+ },
798
+ "primary_artifact": {
799
+ "semantic_indicators": [
800
+ "the artifact the report centers on",
801
+ "authoritative identifier"
802
+ ],
803
+ "common_problems": [
804
+ "A bare hash with no role, so the reader can't place it.",
805
+ "A file hash forced onto an ecosystem sample whose authoritative identifier is a package name and version."
806
+ ],
807
+ "exampleGood": "Loader (the dropper's role from Component Inventory), SHA-256 0000...synthetic...0000. Or, for a package: example-malicious-pkg@1.4.2 from the public registry.",
808
+ "examplePoor": "abcd1234"
809
+ },
810
+ "mbc_behavior": {
811
+ "semantic_indicators": [
812
+ "MBC behavior",
813
+ "MBC objective",
814
+ "ATT&CK escape hatch"
815
+ ],
816
+ "common_problems": [
817
+ "An ATT&CK technique used where a clean MBC behavior exists.",
818
+ "A procedure with no MBC home left out instead of recorded under the closest objective with an ATT&CK note."
819
+ ],
820
+ "exampleGood": "Credential Access::Credentials from Browser. Notes: harvests saved passwords from Chromium-based browsers. (For a procedure MBC doesn't carry, e.g., scheduled-task persistence, record it under Persistence and note 'ATT&CK gap-fill, T1053.005'.)",
821
+ "examplePoor": "T1555 (credentials from password stores).",
822
+ "examplePoorWhyWrong": "MBC is the primary vocabulary. Lead with the MBC behavior and reserve the ATT&CK technique ID for the Notes column when MBC has no fitting behavior."
823
+ },
824
+ "ioc_type": {
825
+ "semantic_indicators": [
826
+ "Pyramid of Pain tier",
827
+ "indicator type",
828
+ "defanged"
829
+ ],
830
+ "common_problems": [
831
+ "Indicators flattened to a single list instead of organized by tier.",
832
+ "Stolen victim data placed in the table instead of in Capabilities.",
833
+ "Indicators left undefanged."
834
+ ],
835
+ "exampleGood": "Domain Names | examplebot-c2[.]example[.]com | command-and-control server, contacted every 60 seconds.",
836
+ "examplePoor": "https://examplebot-c2.example.com (C2)",
837
+ "examplePoorWhyWrong": "Undefanged and untiered. Bracket the dots, place it in the Domain Names row, and put the role in the Context column."
838
+ },
839
+ "data_targeted": {
840
+ "semantic_indicators": [
841
+ "what the sample steals",
842
+ "loot",
843
+ "Capabilities not IOCs"
844
+ ],
845
+ "common_problems": [
846
+ "Stolen data listed as indicators.",
847
+ "What the sample takes left vague, so a reader can't gauge exposure."
848
+ ],
849
+ "exampleGood": "The sample targets browser-saved credentials, session cookies, and any cryptocurrency wallet files it finds under the user profile.",
850
+ "examplePoor": "Steals sensitive data."
851
+ },
852
+ "analysis_gaps": {
853
+ "semantic_indicators": [
854
+ "what you couldn't resolve",
855
+ "limitation",
856
+ "what would change the read"
857
+ ],
858
+ "common_problems": [
859
+ "Section absent, so the analysis looks more complete than it is.",
860
+ "Gaps stated abstractly instead of naming the specific evidence that's missing."
861
+ ],
862
+ "exampleGood": "We couldn't trigger the sample's second-stage download because the command-and-control server was offline during analysis, so the final payload's capabilities are unconfirmed.",
863
+ "examplePoor": "Some aspects of the sample were not fully analyzed."
864
+ },
865
+ "detection_content": {
866
+ "semantic_indicators": [
867
+ "YARA",
868
+ "Sigma",
869
+ "hunting guidance",
870
+ "generalizes beyond a hash"
871
+ ],
872
+ "common_problems": [
873
+ "A single-hash rule that the IOC section already covers.",
874
+ "A rule pasted in full with no link to where it's maintained."
875
+ ],
876
+ "exampleGood": "A YARA rule keyed to Examplebot's XOR-keyed configuration parsing routine, which catches the family across recompiles. Stored at the link below. Notes: low false-positive risk; matches the config stub, not the packer.",
877
+ "examplePoor": "rule detects SHA-256 0000...synthetic...0000."
878
+ }
879
+ },
880
+ "clarifyingQuestions": {
881
+ "executive_summary_paragraph": [
882
+ "In one or two sentences, what is this sample and what does it do to a victim?",
883
+ "Would a manager who reads only this paragraph know enough to decide whether to escalate?"
884
+ ],
885
+ "family_name": [
886
+ "What family do you believe this is, and what's the strongest evidence for the call?",
887
+ "If no family fits, what behavioral or code-overlap characterization can you stand behind instead?"
888
+ ],
889
+ "family_confidence": [
890
+ "Is the family call high, moderate, or low confidence, and what would move it?",
891
+ "Is the shared code genuine family lineage, or a common library, builder, or leaked source?"
892
+ ],
893
+ "mbc_behavior": [
894
+ "For each notable procedure, is there a clean MBC behavior, or do you need an ATT&CK technique in Notes?",
895
+ "Does any procedure have no MBC home at all, so it needs the closest objective plus an ATT&CK gap-fill note?"
896
+ ],
897
+ "ioc_type": [
898
+ "Which Pyramid of Pain tier does each indicator sit at?",
899
+ "Is anything in the table actually stolen victim data that belongs in Capabilities?"
900
+ ],
901
+ "analysis_gaps": [
902
+ "What couldn't you resolve, trigger, or verify, and why?",
903
+ "What specific evidence would change your read of the sample?"
904
+ ]
905
+ },
906
+ "guidelines": {
907
+ "fiveElementsHandoff": {
908
+ "description": "The Five Elements of cybersecurity writing apply to malware reports: Information (the right substance), Tone (honest and calibrated), Words (clear), Structure (scan-friendly), Look (visually tight). For the elements themselves, call `get_security_writing_guidelines`. This block notes only where malware context shifts how a writer applies them.",
909
+ "notesByElement": {
910
+ "Information": "Separate what you observed from what you inferred. Name the family confidence and the analysis gaps. Put what the sample steals in Capabilities, not in the IOC table.",
911
+ "Tone": "Don't overstate the family call to sound decisive. Rate it high, moderate, or low and name the basis. No fear, uncertainty, and doubt; describe what the sample does and let that carry the weight.",
912
+ "Words": "Use MBC behavior names for capabilities and reserve ATT&CK technique IDs for the Notes escape hatch. Use ICD-203 confidence words (high, moderate, low). Always 'MITRE ATT&CK®' on first reference, 'ATT&CK' thereafter.",
913
+ "Structure": "Lead the Executive Summary with what the sample is and does, written to stand alone. Use tables for Capabilities, the IOC tiers, and Static Properties. Keep a not-performed subsection rather than deleting it.",
914
+ "Look": "Apply the report's classification or TLP marking at the top of every shared copy. Defang every URL, domain, and IP so nothing in the report is clickable or resolvable."
915
+ }
916
+ },
917
+ "malwareSpecificRules": [
918
+ {
919
+ "rule": "Lead with MBC behaviors; reach for an ATT&CK technique ID only when MBC has no fitting behavior, and put it in the Notes column.",
920
+ "explanation": "MBC is the malware-analysis vocabulary the Capabilities section is built on. ATT&CK is the escape hatch for procedures MBC doesn't carry, per `capabilityModel`. Defaulting to ATT&CK because it's familiar drops the malware-specific framing.",
921
+ "example": {
922
+ "bad": "Capabilities: T1547.001 (Registry Run Key), T1055 (Process Injection), T1071 (Application Layer Protocol).",
923
+ "good": "Capabilities: Persistence::Modify Registry (Run key); Defense Evasion::Process Injection. Notes use an ATT&CK technique ID only where MBC has no behavior."
924
+ }
925
+ },
926
+ {
927
+ "rule": "Confidence applies to the family call, high, moderate, or low. Don't attach a likelihood percentage to the analysis.",
928
+ "explanation": "Sample analysis is retrospective. The report rates how firmly the sample is identified, not the probability of a future event. The CTI report's seven-tier likelihood ladder doesn't apply here. See `confidence`."
929
+ },
930
+ {
931
+ "rule": "Stolen victim data is loot, not an indicator. Name it in Capabilities; keep it out of the IOC table.",
932
+ "explanation": "Credentials, tokens, two-factor codes, and wallet data are what the sample takes from victims, not adversary-controlled indicators of the sample. They belong where the reader learns what was put at risk, and publishing them in a shareable IOC feed is a sensitivity problem. See `pyramidOfPain.prohibitions`.",
933
+ "example": {
934
+ "bad": "IOC, Identities tier: victim VPN credentials admin / S3cret! exfiltrated.",
935
+ "good": "Capabilities: the sample harvests VPN credentials from the Windows Credential Manager and exfiltrates them to its C2."
936
+ }
937
+ },
938
+ {
939
+ "rule": "Family lineage stays in the report; threat-actor attribution hands off to the CTI tools.",
940
+ "explanation": "Saying a sample shares code with a known family is a lineage observation the malware report owns. Saying who operates it is attribution, which the `cti_*` tools own. Keep the report about the object, the sample.",
941
+ "example": {
942
+ "bad": "The shared loader code confirms this is the work of the SilentExample espionage group.",
943
+ "good": "The loader reuses Examplebot's configuration-parsing code, placing this sample in the Examplebot lineage. Attribution of the operator is out of scope for this report."
944
+ }
945
+ },
946
+ {
947
+ "rule": "Defang every URL, domain, and IP, and write file and directory names in plain text.",
948
+ "explanation": "Bracket the dots and replace the scheme, such as hxxps://examplebot-c2[.]example[.]com and 192.0.2[.]10, so nothing resolves or is clickable. Filenames and paths read as plain text, not as code."
949
+ },
950
+ {
951
+ "rule": "Keep a subsection you didn't perform, with a note, rather than deleting it.",
952
+ "explanation": "An empty Memory Analysis subsection with 'not performed' tells the reader the analysis was scoped, not that nothing was found. A missing subsection reads as a gap the author didn't notice."
953
+ },
954
+ {
955
+ "rule": "Don't lift another analyst's wording or a vendor report's prose into your report.",
956
+ "explanation": "Learn from other reports, then write your own description of what you observed. Quote and attribute when you genuinely need someone else's words, such as a published rule or a framework definition. Plagiarism risk is real in a field where everyone analyzes the same families."
957
+ }
958
+ ]
959
+ },
960
+ "writingAnalysis": {
961
+ "jargon": {
962
+ "description": "Malware-analysis terms that may need a short definition for a non-analyst reader, such as a manager or a legal reviewer.",
963
+ "terms": [
964
+ {
965
+ "term": "C2",
966
+ "expansion": "Command-and-control (the attacker's remote control point for the malware)"
967
+ },
968
+ {
969
+ "term": "Dropper",
970
+ "expansion": "A component whose job is to deliver and run another payload"
971
+ },
972
+ {
973
+ "term": "Loader",
974
+ "expansion": "A component that loads and runs the next stage, often in memory"
975
+ },
976
+ {
977
+ "term": "Packer",
978
+ "expansion": "Software that compresses or encrypts a sample to hide its code from static analysis"
979
+ },
980
+ {
981
+ "term": "imphash",
982
+ "expansion": "A hash of a PE file's import table, used to group related binaries"
983
+ },
984
+ {
985
+ "term": "IOC",
986
+ "expansion": "Indicator of compromise (technical evidence that a sample was present or active)"
987
+ },
988
+ {
989
+ "term": "RAT",
990
+ "expansion": "Remote access trojan (malware giving an attacker interactive control of a host)"
991
+ },
992
+ {
993
+ "term": "Mutex",
994
+ "expansion": "A named system object malware often uses to avoid running twice on one host"
995
+ },
996
+ {
997
+ "term": "MBC",
998
+ "expansion": "Malware Behavior Catalog (the vocabulary for the Capabilities section)"
999
+ },
1000
+ {
1001
+ "term": "TLSH / ssdeep",
1002
+ "expansion": "Fuzzy hashes that measure similarity between files"
1003
+ }
1004
+ ]
1005
+ },
1006
+ "passiveVoice": {
1007
+ "description": "Passive constructions hide who or what acted. Name the sample or the analyst as the subject.",
1008
+ "examples": [
1009
+ {
1010
+ "bad": "The Run key was modified and a payload was written to disk.",
1011
+ "good": "The loader modified the Run key and wrote the payload to disk."
1012
+ }
1013
+ ]
1014
+ },
1015
+ "vagueTerms": {
1016
+ "description": "Replace vague quantifiers and adjectives with specifics.",
1017
+ "examples": [
1018
+ {
1019
+ "bad": "The sample is highly sophisticated and contacts several servers.",
1020
+ "good": "The sample resolves three hardcoded domains and beacons to the first that responds every 60 seconds."
1021
+ }
1022
+ ]
1023
+ },
1024
+ "sentenceLength": {
1025
+ "description": "Keep sentences short for readability. Malware reports quote long hashes, technique names, and tool names; restructure when a sentence runs long rather than padding it.",
1026
+ "rule": "Aim for under 20 words excluding fixed identifiers like hashes and technique names."
1027
+ },
1028
+ "documentFormatting": {
1029
+ "description": "Use tables for Capabilities (MBC), the IOC tiers, Static Properties, and the Component Inventory. Reserve prose for the Executive Summary, the Capabilities summary, Behavioral and Code Analysis narrative, and What We Don't Know."
1030
+ }
1031
+ },
1032
+ "audienceGuidance": {
1033
+ "principle": "A malware report reaches more than one reader. Layer the technical detail analysts need with an Executive Summary a non-analyst can act on. The summary is the part a manager or other non-analyst reads, so write it to stand on its own.",
1034
+ "audienceTypes": [
1035
+ {
1036
+ "type": "Incident responder",
1037
+ "characteristics": [
1038
+ "Wants the IOCs, the persistence and host artifacts, and what the sample steals, fast.",
1039
+ "Will pivot from this report into containment and recovery."
1040
+ ],
1041
+ "terminologyGuidance": "Lead the IOC and Capabilities sections with what a responder can act on. Hand off the response decisions to the incident response tools."
1042
+ },
1043
+ {
1044
+ "type": "Detection engineer",
1045
+ "characteristics": [
1046
+ "Wants behavior-level detail and detection logic that generalizes beyond a hash.",
1047
+ "Cares about log-source dependencies and false-positive characteristics."
1048
+ ],
1049
+ "terminologyGuidance": "Make the Capabilities and Detection Engineering sections carry their weight. Tie hunting guidance to observable behavior."
1050
+ },
1051
+ {
1052
+ "type": "Fellow analyst or reviewer",
1053
+ "characteristics": [
1054
+ "Reads Analysis Details closely to validate or build on the work.",
1055
+ "Values reproducibility, named tools, and the analysis environment."
1056
+ ],
1057
+ "terminologyGuidance": "Use precise MBC and ATT&CK vocabulary. Reference addresses and function names. Fill the Analysis Environment appendix."
1058
+ },
1059
+ {
1060
+ "type": "Manager or other non-analyst",
1061
+ "characteristics": [
1062
+ "Reads the Executive Summary and little else.",
1063
+ "Needs to know what the sample is, what it puts at risk, and whether to escalate."
1064
+ ],
1065
+ "terminologyGuidance": "Write the Executive Summary to stand alone. Translate behavior into impact. Define a term on first use or avoid it."
1066
+ }
1067
+ ]
1068
+ },
1069
+ "lengthGuidance": {
1070
+ "report": {
1071
+ "typical": "Two to ten pages for a single-sample report; longer for a multi-component sample or a deep code-analysis write-up.",
1072
+ "sectionLengthTargets": {
1073
+ "executiveSummary": "A short paragraph that stands on its own.",
1074
+ "sampleSnapshot": "A compact table.",
1075
+ "capabilities": "A short prose summary plus a focused table; pick the behaviors that characterize the sample rather than every behavior observed.",
1076
+ "analysisDetails": "The longest section; as long as the evidence needs, organized by subsection or by component.",
1077
+ "indicatorsOfCompromise": "A focused table; supply the full set separately as STIX or MISP when needed."
1078
+ }
1079
+ }
1080
+ },
1081
+ "voiceGuidelines": {
1082
+ "description": "A malware-analysis voice that stays precise about what was observed, honest about the family call, and useful to a defender.",
1083
+ "doUse": [
1084
+ "Direct, practical language that names what the sample does.",
1085
+ "'such as' (not 'like') for introducing examples.",
1086
+ "A teaching orientation; explain why a property matters, not just that it's present.",
1087
+ "MBC behavior names for capabilities; ATT&CK technique IDs only in the Notes escape hatch.",
1088
+ "ICD-203 confidence words on the family call.",
1089
+ "Active voice with the sample or the analyst as the subject."
1090
+ ],
1091
+ "avoid": [
1092
+ "Fear, uncertainty, and doubt; describe behavior and let it carry the weight.",
1093
+ "Overstating the family call ('this is definitely Examplebot') instead of rating it and naming the basis.",
1094
+ "Threat-actor attribution dressed up as a code-lineage observation.",
1095
+ "Stolen victim data in the IOC table.",
1096
+ "Undefanged indicators or filenames set in code font."
1097
+ ],
1098
+ "tone": [
1099
+ "Professional and precise.",
1100
+ "Confident about observations, calibrated about identification.",
1101
+ "Useful to the defender who will act on the report."
1102
+ ],
1103
+ "examples": [
1104
+ {
1105
+ "principle": "Rate the family call; don't assert it.",
1106
+ "bad": "This is Examplebot.",
1107
+ "good": "We identify this as Examplebot with high confidence, based on a published YARA match and a shared configuration-parsing routine."
1108
+ },
1109
+ {
1110
+ "principle": "Name what the sample steals in Capabilities, not as an IOC.",
1111
+ "bad": "IOC: stolen credentials admin / S3cret!",
1112
+ "good": "The sample harvests browser-saved credentials and exfiltrates them to its C2."
1113
+ },
1114
+ {
1115
+ "principle": "Specific over vague.",
1116
+ "bad": "The sample talks to several servers.",
1117
+ "good": "The sample beacons to examplebot-c2[.]example[.]com every 60 seconds and falls back to 192.0.2[.]10 if the domain fails to resolve."
1118
+ }
1119
+ ]
1120
+ },
1121
+ "reviewGuidance": {
1122
+ "purpose": "Help the author strengthen the report. The goal is improvement, not judgment of the analyst.",
1123
+ "feedbackStructure": [
1124
+ "Start with what the report does well; identify specific strengths.",
1125
+ "Identify areas for improvement with concrete, actionable suggestions.",
1126
+ "Reference specific sections and quote text when giving feedback.",
1127
+ "Prioritize feedback by impact on the report's usefulness to a defender and on the defensibility of the family call."
1128
+ ],
1129
+ "reviewerMindset": [
1130
+ "You're helping the analyst, not grading them.",
1131
+ "Assume good intent; a gap may reflect a sample that resisted analysis, not carelessness.",
1132
+ "The author may have worked under time pressure, with a packed sample, or without a live command-and-control server.",
1133
+ "Focus on the report's effectiveness for its intended readers."
1134
+ ],
1135
+ "feedbackTone": [
1136
+ "Use collaborative language ('consider', 'you might', 'this could be strengthened by').",
1137
+ "Avoid judgmental phrases ('you failed to', 'this is wrong', 'obviously').",
1138
+ "Frame gaps as opportunities ('naming what you couldn't trigger would make the analysis more defensible')."
1139
+ ]
1140
+ },
1141
+ "crossCuttingCriteria": [
1142
+ {
1143
+ "criterion": "Capabilities use MBC as the primary vocabulary; ATT&CK technique IDs appear only in the Notes escape hatch.",
1144
+ "rule": "Per `capabilityModel`. MBC characterizes malware behavior; ATT&CK fills the gaps MBC doesn't carry."
1145
+ },
1146
+ {
1147
+ "criterion": "The family call carries an ICD-203 confidence level (high, moderate, or low), or, with no named family, the characterization method is rated instead."
1148
+ },
1149
+ {
1150
+ "criterion": "No likelihood percentage or seven-tier ladder is attached to the analysis.",
1151
+ "rule": "Sample analysis is retrospective. Confidence on the family call is the only calibration."
1152
+ },
1153
+ {
1154
+ "criterion": "Stolen victim data appears in Capabilities or Analysis Details, never in the IOC table, and there is no Identities IOC tier."
1155
+ },
1156
+ {
1157
+ "criterion": "Every URL, domain, and IP in the report is defanged."
1158
+ },
1159
+ {
1160
+ "criterion": "Family lineage stays in the report; threat-actor attribution is handed off, not asserted."
1161
+ },
1162
+ {
1163
+ "criterion": "A subsection that wasn't performed is kept with a note rather than deleted."
1164
+ },
1165
+ {
1166
+ "criterion": "MITRE ATT&CK on first reference, ATT&CK thereafter; MBC, ATT&CK, Pyramid of Pain, and ICD-203 are attributed where named."
1167
+ },
1168
+ {
1169
+ "criterion": "The Executive Summary stands on its own for a non-analyst who reads nothing else."
1170
+ }
1171
+ ],
1172
+ "reviewCriteriaSectionMap": {
1173
+ "identification": [
1174
+ "Sample Snapshot",
1175
+ "Malware Family Identification"
1176
+ ],
1177
+ "capabilities": [
1178
+ "Capabilities"
1179
+ ],
1180
+ "indicators": [
1181
+ "Indicators of Compromise"
1182
+ ],
1183
+ "evidence": [
1184
+ "Analysis Details",
1185
+ "What We Don't Know"
1186
+ ],
1187
+ "ecosystem": [
1188
+ "Sample Snapshot",
1189
+ "Component Inventory",
1190
+ "Runtime Requirements"
1191
+ ],
1192
+ "detection": [
1193
+ "Detection Engineering (Optional)"
1194
+ ],
1195
+ "reproducibility": [
1196
+ "Sources",
1197
+ "Appendix: Analysis Environment",
1198
+ "Appendix: Analysis Scripts (Optional)"
1199
+ ],
1200
+ "distribution": [
1201
+ "About this Report"
1202
+ ]
1203
+ },
1204
+ "reviewCriteria": {
1205
+ "identification": [
1206
+ {
1207
+ "criterion": "The family call states a confidence level (high, moderate, or low) following ICD-203, scoped to the family.",
1208
+ "applicability": "all profiles where a family is named"
1209
+ },
1210
+ {
1211
+ "criterion": "With no named family, the report rates the characterization method instead of inventing a family name.",
1212
+ "applicability": "all profiles"
1213
+ },
1214
+ {
1215
+ "criterion": "Basis names the evidence type (YARA match, string overlap, code reuse, behavioral pattern, vendor detection).",
1216
+ "applicability": "all profiles"
1217
+ },
1218
+ {
1219
+ "criterion": "Code reuse with a known actor's tool is written as family lineage, not as threat-actor attribution.",
1220
+ "applicability": "all profiles"
1221
+ }
1222
+ ],
1223
+ "capabilities": [
1224
+ {
1225
+ "criterion": "Capabilities use MBC behaviors as the primary vocabulary.",
1226
+ "applicability": "all profiles"
1227
+ },
1228
+ {
1229
+ "criterion": "An ATT&CK technique ID appears only where MBC has no fitting behavior, in the Notes column, marked as a gap-fill where there's no MBC home.",
1230
+ "applicability": "all profiles"
1231
+ },
1232
+ {
1233
+ "criterion": "For a stealer or banker, the Capabilities prose names what the sample targets or steals.",
1234
+ "applicability": "all profiles where the sample collects victim data"
1235
+ }
1236
+ ],
1237
+ "indicators": [
1238
+ {
1239
+ "criterion": "Indicators are organized by Pyramid of Pain tier, not presented as a flat list.",
1240
+ "applicability": "all profiles with IOCs"
1241
+ },
1242
+ {
1243
+ "criterion": "There is no Identities tier, and stolen victim data is not in the table.",
1244
+ "applicability": "all profiles"
1245
+ },
1246
+ {
1247
+ "criterion": "Every URL, domain, and IP is defanged, and the Context column gives each indicator's role.",
1248
+ "applicability": "all profiles with IOCs"
1249
+ }
1250
+ ],
1251
+ "evidence": [
1252
+ {
1253
+ "criterion": "Claims in Behavioral and Code Analysis are tied to the observation that supports them.",
1254
+ "applicability": "all profiles"
1255
+ },
1256
+ {
1257
+ "criterion": "A subsection that wasn't performed is kept with a note rather than deleted.",
1258
+ "applicability": "organizational-report required; researcher-narrative recommended"
1259
+ },
1260
+ {
1261
+ "criterion": "What We Don't Know names specific, not abstract, gaps.",
1262
+ "applicability": "all profiles"
1263
+ }
1264
+ ],
1265
+ "ecosystem": [
1266
+ {
1267
+ "criterion": "For an ecosystem sample, Target Platform names the ecosystem and Runtime Requirements captures permissions, manifest declarations, or abused APIs.",
1268
+ "applicability": "all profiles where the sample is a package, extension, or mobile app"
1269
+ },
1270
+ {
1271
+ "criterion": "For a version-chain sample, Component Inventory records the relevant versions (such as last clean and first malicious).",
1272
+ "applicability": "all profiles where identity is a version chain"
1273
+ }
1274
+ ],
1275
+ "detection": [
1276
+ {
1277
+ "criterion": "Detection content generalizes beyond a single hash the IOC section already lists, or is clearly framed as hunting guidance.",
1278
+ "applicability": "wherever Detection Engineering is present"
1279
+ }
1280
+ ],
1281
+ "reproducibility": [
1282
+ {
1283
+ "criterion": "Sources records provenance, and the Analysis Environment appendix names the distro, sandbox, isolation, and tool versions.",
1284
+ "applicability": "organizational-report recommended; researcher-narrative recommended"
1285
+ }
1286
+ ],
1287
+ "distribution": [
1288
+ {
1289
+ "criterion": "A TLP or organizational classification marking appears at the top of a report that will be shared.",
1290
+ "applicability": "wherever the report is distributed beyond the author"
1291
+ }
1292
+ ]
1293
+ },
1294
+ "antiPatterns": [
1295
+ {
1296
+ "pattern": "Defaulting to ATT&CK technique IDs for the whole Capabilities section.",
1297
+ "why": "MBC is the malware-analysis vocabulary the section is built on. ATT&CK is the escape hatch for procedures MBC doesn't carry, used in the Notes column. Leading with ATT&CK drops the malware-specific framing."
1298
+ },
1299
+ {
1300
+ "pattern": "Putting stolen victim data (credentials, tokens, two-factor codes, wallet data) in the IOC table, or adding an Identities tier.",
1301
+ "why": "That data is loot the sample collects, not an adversary-controlled indicator of the sample. It belongs in Capabilities and Analysis Details, and publishing it in a shareable IOC feed is a sensitivity problem."
1302
+ },
1303
+ {
1304
+ "pattern": "Attaching a likelihood percentage or a seven-tier probability to the analysis.",
1305
+ "why": "Sample analysis is retrospective. The report rates confidence in the family call, not the probability of a future event. The seven-tier likelihood ladder is a CTI-report tool, not a malware-report one."
1306
+ },
1307
+ {
1308
+ "pattern": "Turning a code-lineage observation into a threat-actor attribution.",
1309
+ "why": "Shared code places a sample in a family lineage. Who operates it is attribution, which the CTI tools own. Keep the malware report about the sample."
1310
+ },
1311
+ {
1312
+ "pattern": "Stating the family call as settled ('this is X') with no confidence level.",
1313
+ "why": "Identification is a judgment with a basis. Rate it high, moderate, or low and name the evidence, so a reader knows how firmly the sample is identified."
1314
+ },
1315
+ {
1316
+ "pattern": "Inventing a family name to fill the row when the sample maps to no named family.",
1317
+ "why": "Many samples have no family. Say so and rate the characterization method (a behavioral profile or a code-overlap cluster) instead of manufacturing a name."
1318
+ },
1319
+ {
1320
+ "pattern": "Presenting indicators as a flat list instead of by Pyramid of Pain tier.",
1321
+ "why": "The tiering carries the cost-to-adversary signal that tells a defender which indicators are durable and which the adversary can change cheaply."
1322
+ },
1323
+ {
1324
+ "pattern": "Leaving indicators undefanged or setting filenames in code font.",
1325
+ "why": "Undefanged URLs, domains, and IPs are clickable or resolvable in a report that will be shared. Filenames read as plain text in this house style, not as code."
1326
+ },
1327
+ {
1328
+ "pattern": "Listing automatically extracted strings as indicators without confirming the sample uses them.",
1329
+ "why": "An IOC extractor run over packed or encrypted bytes returns pattern matches, not indicators. A string earns a row when the sample resolves, contacts, drops, or writes it. Corroborate before the table. An uncorroborated match belongs in Analysis Details, not the IOC table."
1330
+ },
1331
+ {
1332
+ "pattern": "Reporting capabilities or static properties from a packed sample without saying it's packed or which form was analyzed.",
1333
+ "why": "A packed or encrypted sample's imports, strings, and entropy belong to the packer, not the payload. The same property means one thing for the packed form and another once unpacked. Name the packer, say whether unpacking succeeded, and label which form each finding describes."
1334
+ },
1335
+ {
1336
+ "pattern": "Deleting an analysis subsection you didn't perform.",
1337
+ "why": "A kept subsection with a 'not performed' note tells the reader the analysis was scoped. A missing one reads as a gap the author overlooked."
1338
+ },
1339
+ {
1340
+ "pattern": "Dropping an ecosystem sample's permissions and manifest declarations.",
1341
+ "why": "Runtime Requirements is where a reader learns what a package, extension, or mobile app was allowed to do. Omitting it hides the affordances that made the sample dangerous."
1342
+ },
1343
+ {
1344
+ "pattern": "Forcing a version-chain sample into a one-file-per-row Component Inventory.",
1345
+ "why": "When a package turned malicious in a release, the identity is the version chain. Record the relevant versions by role rather than dropping rows that lack a file or hash."
1346
+ },
1347
+ {
1348
+ "pattern": "Writing the Executive Summary only for analysts.",
1349
+ "why": "The summary is the layer a non-analyst reads. Write it to stand on its own, so a manager can decide whether to escalate."
1350
+ },
1351
+ {
1352
+ "pattern": "Reusing another analyst's or a vendor's wording as your own.",
1353
+ "why": "Plagiarism risk is real when everyone analyzes the same families. Learn from other reports, write your own description of what you observed, and quote with attribution when you genuinely need someone else's words."
1354
+ },
1355
+ {
1356
+ "pattern": "Adding a containment, eradication, or recovery playbook to the malware report.",
1357
+ "why": "Response is the incident response template's job. The malware report analyzes the sample and hands the response decision to the `ir_*` tools."
1358
+ }
1359
+ ]
1360
+ };
1361
+ export const ATTRIBUTION = {
1362
+ "template": "Malware Analysis Report Template — Licensed CC BY 4.0 by Lenny Zeltser. https://zeltser.com/malware-analysis-report",
1363
+ "guidelines": "Malware Analysis Writing Guidelines — Copyright (c) 2026 Lenny Zeltser. https://zeltser.com/malware-analysis-report"
1364
+ };
1365
+ export const SOURCE_META = {
1366
+ "sourceVersion": "1.1.0",
1367
+ "sourceDate": "2026-05-29",
1368
+ "guidelinesUrl": "https://zeltser.com/media/docs/malware-analysis-writing-guidelines.yaml",
1369
+ "templateUrl": "https://zeltser.com/media/archive/malware-analysis-report-template.md",
1370
+ "fallbackArticleUrl": "https://zeltser.com/malware-analysis-report"
1371
+ };
1372
+ //# sourceMappingURL=content.generated.js.map