Skip to main content 首页 创作者 undermybelt hermes-skills malw-fami-rltn-malp
malw-fami-rltn-malp Use the Malpedia platform and API to research malware family relationships, track variant evolution, link families to threat actors, and integrate YARA rules for detection across malware lineages.
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Undermybelt/hermes-skills --skill malw-fami-rltn-malp命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... 同仓库更多 Skills Use when retiring old logic, collapsing duplicate owners, removing fallbacks, or touching schema, persistence, or source-of-truth boundaries while deciding whether to delete old paths, retain compatibility, or stop for confirmation.
Use when defining new features, product behavior, UI/component design, architecture choices, contract changes, or ambiguous medium/high-complexity work before implementation.
Use when the user asks for caveman mode, fewer tokens, brief responses, compressed communication, or otherwise explicitly requests a much shorter answer.
name malw-fami-rltn-malp description Use the Malpedia platform and API to research malware family relationships, track variant evolution, link families to threat actors, and integrate YARA rules for detection across malware lineages. domain cybersecurity subdomain threat-intelligence tags ["malpedia","malware-family","yara","threat-actor","malware-tracking","threat-intelligence","variant-analysis","malware-intelligence"] version 1.0 author mahipal license Apache-2.0 nist_csf ["ID.RA-01","ID.RA-05","DE.CM-01","DE.AE-02"]
Analyzing Malware Family Relationships with Malpedia
Overview
Malpedia is a collaborative platform maintained by Fraunhofer FKIE that catalogs malware families with their aliases, YARA rules, threat actor associations, and reference reports. With over 2,600 malware families documented, it serves as the definitive resource for understanding malware lineages, tracking variant evolution, and linking malware to specific threat groups. This skill covers querying the Malpedia API, mapping malware family relationships, extracting YARA rules for detection, and building intelligence on malware ecosystems used by adversaries.
When to Use
When investigating security incidents that require analyzing malware family relationships with malpedia
When building detection rules or threat hunting queries for this domain
When SOC analysts need structured procedures for this analysis type
When validating security monitoring coverage for related attack techniques
Prerequisites
Python 3.9+ with requests, yara-python, stix2 libraries
Malpedia API key (register at https://malpedia.caad.fkie.fraunhofer.de/ )
Understanding of malware classification and naming conventions
Familiarity with YARA rule syntax for detection
Access to malware samples for validation (optional)
Key Concepts
Malpedia Data Model
Malpedia organizes malware into Families (e.g., "win.cobalt_strike"), each containing: aliases (vendor-specific names like "Beacon", "CobaltStrike"), YARA rules (community and vendor-contributed), actor associations (threat groups using the family), reference reports (CTI reports documenting the family), and sample hashes (representative samples for each variant).
Malware Family Naming
Malpedia uses the format platform.family_name (e.g., win.emotet, elf.mirai, apk.flubot). Platforms include win (Windows), elf (Linux), apk (Android), osx (macOS), and py (Python). This standardized naming resolves the "many names" problem where different vendors assign different names to the same malware.
Family Relationships
Malware families have relationships including: parent-child (code reuse, forks), loader-payload (Emotet loads TrickBot loads Ryuk), shared authorship (same threat actor develops multiple tools), and infrastructure sharing (common C2 frameworks).
Workflow
Step 1: Query Malpedia API for Malware Families
requests
json
collections defaultdict
:
BASE_URL =
( ):
.headers = { : }
( ):
resp = requests.get( ,
headers= .headers, timeout= )
resp.status_code == :
families = resp.json()
( )
families
{}
( ):
resp = requests.get( ,
headers= .headers, timeout= )
resp.status_code == :
info = resp.json()
( )
( )
( )
( )
info
( )
( ):
resp = requests.get( ,
headers= .headers, timeout= )
resp.status_code == :
rules = resp.json()
rule_count = ( (v) v rules.values()) (rules, )
( )
rules
{}
( ):
resp = requests.get( ,
headers= .headers, timeout= )
resp.status_code == :
data = resp.json()
families = data.get( , {})
( )
data
{}
( ):
all_families = .get_family_list()
matches = {
name: info name, info all_families.items()
keyword.lower() name.lower()
keyword.lower() (info.get( , [])).lower()
}
( )
matches
client = MalpediaClient( )
families = client.get_family_list()
emotet_info = client.get_family_info( )
import
import
from
import
class
MalpediaClient
"https://malpedia.caad.fkie.fraunhofer.de/api"
def
__init__
self, api_key
self
"Authorization"
f"apitoken {api_key} "
def
get_family_list
self
"""Get list of all malware families."""
f"{self.BASE_URL} /list/families"
self
30
if
200
print
f"[+] Malpedia: {len (families)} malware families"
return
return
def
get_family_info
self, family_name
"""Get detailed information about a malware family."""
f"{self.BASE_URL} /get/family/{family_name} "
self
30
if
200
print
f"[+] Family: {family_name} "
print
f" Aliases: {info.get('alt_names' , [])} "
print
f" Actors: {[a.get('value' , '' ) for a in info.get('attribution' , [])]} "
print
f" URLs: {len (info.get('urls' , []))} references"
return
print
f"[-] Family not found: {family_name} "
return
None
def
get_family_yara
self, family_name
"""Get YARA rules for a malware family."""
f"{self.BASE_URL} /get/yara/{family_name} "
self
30
if
200
sum
len
for
in
if
isinstance
dict
else
0
print
f"[+] YARA rules for {family_name} : {rule_count} rules"
return
return
def
get_actor_families
self, actor_name
"""Get malware families associated with a threat actor."""
f"{self.BASE_URL} /get/actor/{actor_name} "
self
30
if
200
"families"
print
f"[+] {actor_name} : {len (families)} malware families"
return
return
def
search_families
self, keyword
"""Search families by keyword."""
self
for
in
if
in
or
in
str
"alt_names"
print
f"[+] Search '{keyword} ': {len (matches)} matches"
return
"YOUR_MALPEDIA_API_KEY"
"win.emotet"
Step 2: Map Malware Family Relationships class MalwareFamilyMapper :
def __init__ (self, malpedia_client ):
self .client = malpedia_client
self .relationship_graph = defaultdict(list )
def map_actor_ecosystem (self, actor_name ):
"""Map the malware ecosystem used by a threat actor."""
actor_data = self .client.get_actor_families(actor_name)
families = actor_data.get("families" , {})
ecosystem = {
"actor" : actor_name,
"families" : [],
"family_count" : len (families),
}
for family_name in families:
info = self .client.get_family_info(family_name)
if info:
ecosystem["families" ].append({
"name" : family_name,
"aliases" : info.get("alt_names" , []),
"description" : info.get("description" , "" )[:200 ],
"shared_actors" : [
a.get("value" , "" )
for a in info.get("attribution" , [])
],
"reference_count" : len (info.get("urls" , [])),
})
print (f"\n=== {actor_name} Malware Ecosystem ===" )
for fam in ecosystem["families" ]:
shared = [a for a in fam["shared_actors" ] if a != actor_name]
print (f" {fam['name' ]} " )
print (f" Aliases: {fam['aliases' ][:5 ]} " )
if shared:
print (f" Also used by: {shared} " )
return ecosystem
def find_shared_tooling (self, actor_names ):
"""Find malware families shared between threat actors."""
actor_families = {}
for actor in actor_names:
data = self .client.get_actor_families(actor)
actor_families[actor] = set (data.get("families" , {}).keys())
shared = {}
for i, actor1 in enumerate (actor_names):
for actor2 in actor_names[i+1 :]:
common = actor_families[actor1] & actor_families[actor2]
if common:
shared[f"{actor1} <-> {actor2} " ] = sorted (common)
print (f"\n=== Shared Tooling Analysis ===" )
for pair, families in shared.items():
print (f" {pair} : {len (families)} shared families" )
for f in families[:5 ]:
print (f" - {f} " )
return shared
def build_loader_payload_chain (self, family_name ):
"""Build the loader-payload delivery chain for a family."""
info = self .client.get_family_info(family_name)
if not info:
return {}
chain = {
"family" : family_name,
"description" : info.get("description" , "" ),
"known_loaders" : [],
"known_payloads" : [],
}
known_chains = {
"win.emotet" : {"loaders" : ["email/macro" ], "payloads" : ["win.trickbot" , "win.qakbot" , "win.cobalt_strike" ]},
"win.trickbot" : {"loaders" : ["win.emotet" ], "payloads" : ["win.ryuk" , "win.conti" , "win.cobalt_strike" ]},
"win.qakbot" : {"loaders" : ["email/macro" , "win.emotet" ], "payloads" : ["win.cobalt_strike" , "win.blackbasta" ]},
"win.cobalt_strike" : {"loaders" : ["win.emotet" , "win.trickbot" , "win.qakbot" ], "payloads" : ["ransomware" ]},
}
if family_name in known_chains:
chain["known_loaders" ] = known_chains[family_name]["loaders" ]
chain["known_payloads" ] = known_chains[family_name]["payloads" ]
return chain
mapper = MalwareFamilyMapper(client)
ecosystem = mapper.map_actor_ecosystem("Wizard Spider" )
shared = mapper.find_shared_tooling(["Wizard Spider" , "FIN7" , "Lazarus Group" ])
chain = mapper.build_loader_payload_chain("win.emotet" )
Step 3: Extract and Compile YARA Rules def compile_yara_ruleset (client, family_names, output_file="malware_yara_rules.yar" ):
"""Compile YARA rules for multiple malware families."""
all_rules = []
for family in family_names:
yara_data = client.get_family_yara(family)
if isinstance (yara_data, dict ):
for source, rules in yara_data.items():
if isinstance (rules, list ):
for rule in rules:
all_rules.append(f"// Source: {source} - Family: {family} \n{rule} " )
elif isinstance (rules, str ):
all_rules.append(f"// Source: {source} - Family: {family} \n{rules} " )
with open (output_file, "w" ) as f:
f.write(f"// Malpedia YARA Rules - {len (all_rules)} rules\n" )
f.write(f"// Families: {', ' .join(family_names)} \n\n" )
for rule in all_rules:
f.write(rule + "\n\n" )
print (f"[+] Compiled {len (all_rules)} YARA rules to {output_file} " )
return all_rules
compile_yara_ruleset(client, ["win.emotet" , "win.trickbot" , "win.cobalt_strike" ])
Validation Criteria
Malpedia API queried successfully for malware families
Family information retrieved with aliases, actors, and references
Actor-family relationships mapped correctly
Shared tooling between actors identified
YARA rules extracted and compiled for detection
Loader-payload chains documented for threat intelligence
References