Azul: Building a Malware Knowledge Base That Scales to Hundreds of Millions of Samples
Hook
Most malware analysis platforms treat samples like fire-and-forget tickets. Azul treats them like living datasets that get smarter every time you improve your detection logic.
Context
The malware analysis workflow has always been bifurcated: automated triage systems like Cuckoo and Assemblyline handle the initial "is this malicious?" question at scale, while deep reverse engineering remains stubbornly manual. Between these extremes lies a critical gap—systematic analysis of confirmed malware at volume. When you're managing millions of samples from a national incident response program, you need to track malware families, identify campaign infrastructure, and extract configuration data across entire datasets. You can't manually reverse engineer everything, but simple hash-based deduplication isn't enough either.
Azul, developed by the Australian Signals Directorate's Australian Cyber Security Centre, attacks this problem head-on. It's not a sandbox (it doesn't detonate samples) and it's not a triage system (it assumes samples are already confirmed malicious). Instead, it's a knowledge base that codifies reverse engineering workflows into plugins, runs them across massive sample repositories, and crucially—re-runs them as your detection logic evolves. The vision is evergreen analysis: every sample automatically benefits from new analytical capabilities you develop months or years later.
Technical Insight
Azul's architecture centers on three core components: a Kubernetes-native storage layer, a plugin execution framework, and a continuous re-analysis engine. The storage layer treats malware samples as immutable objects with versioned analysis results. When you upload a sample, Azul computes its SHA256 hash and stores both the binary and metadata in a content-addressed system. Analysis results from plugins are stored separately, timestamped, and associated with specific plugin versions.
The plugin framework is where Azul's power emerges. Plugins are containerized analysis tasks that implement a simple interface: receive a sample, return structured results. A plugin might extract PE imports, identify Cobalt Strike configurations, cluster samples by code similarity, or build relationship graphs between samples sharing infrastructure. Here's a conceptual example of what a plugin interface looks like:
from azul.plugin import AnalysisPlugin
from typing import Dict, Any
class ConfigExtractor(AnalysisPlugin):
name = "malware_config_extractor"
version = "1.2.0"
def analyze(self, sample: bytes, metadata: Dict) -> Dict[str, Any]:
"""Extract C2 configurations from known malware families."""
results = {
"c2_servers": [],
"encryption_keys": [],
"campaign_id": None
}
# Family-specific extraction logic
if self.detect_emotet(sample):
results["c2_servers"] = self.extract_emotet_c2(sample)
results["campaign_id"] = self.extract_emotet_campaign(sample)
elif self.detect_qakbot(sample):
results["c2_servers"] = self.extract_qakbot_c2(sample)
results["encryption_keys"] = self.extract_qakbot_keys(sample)
return results
def should_reanalyze(self, previous_version: str) -> bool:
"""Determine if samples need re-analysis with this version."""
# Re-run on all samples if we added new family support
return version_added_families(previous_version, self.version)
The continuous re-analysis engine is Azul's secret weapon. Traditional analysis platforms run plugins once per sample and cache results forever. Azul maintains a matrix of samples × plugin versions and automatically schedules re-analysis when plugins are updated. If you improve your Cobalt Strike configuration extractor to handle a new obfuscation technique, Azul automatically re-processes your entire sample repository with the updated plugin. This transforms malware analysis from a point-in-time snapshot to a continuously improving knowledge base.
Kubernetes provides the orchestration backbone. Analysis jobs are scheduled as Kubernetes Jobs, with resource limits and priority queues ensuring critical samples (newly submitted, high-priority campaigns) get processed before historical re-analysis. Horizontal pod autoscaling allows Azul to burst to hundreds of parallel analysis workers when the queue grows, then scale back down during quiet periods. The storage layer can integrate with S3-compatible object stores, allowing cost-effective storage of hundreds of millions of samples.
The data model enables powerful analytics. Because analysis results are structured and versioned, you can query across the entire repository: "Show me all samples from the past year with Cobalt Strike Team Server configurations pointing to infrastructure in this IP range" or "Graph the evolution of a malware family's obfuscation techniques over time based on static analysis results." This transforms a sample repository from a simple archive into an analytical database that answers strategic threat intelligence questions.
Gotcha
Azul's operational complexity is substantial. You need a production Kubernetes cluster, object storage infrastructure, and the expertise to run both at scale. The repository documentation assumes familiarity with Kubernetes concepts like StatefulSets, PersistentVolumes, and Ingress controllers. For small teams or organizations doing ad-hoc analysis, this is massive overhead. You'll spend more time managing infrastructure than analyzing malware.
The plugin ecosystem appears sparse, likely because Azul is relatively young and targets a specialized audience. Unlike mature platforms with dozens of community-contributed analyzers, you'll need to write most plugins yourself. This means codifying your organization's specific analytical workflows—which is powerful if you have that expertise in-house, but a significant barrier if you're hoping for turnkey analysis capabilities. The repository also lacks pre-built sample ingestion pipelines for common malware sources (email attachments, web downloads, honeypot captures), so integration work is required to feed samples into the system.
Verdict
Use if: You're operating at government, large enterprise, or research institution scale with tens of thousands to millions of malware samples annually; you have Kubernetes infrastructure and expertise already; your team includes reverse engineers who can codify their analysis workflows into plugins; you need to track malware family evolution over months or years; or you're building a national-level CERT/CSIRT capability. Azul's continuous re-analysis model and analytical database approach justify the operational complexity at this scale. Skip if: You're doing ad-hoc malware analysis, working with fewer than thousands of samples annually, lack Kubernetes expertise or infrastructure, need integrated sandboxing and triage (use Assemblyline or CAPE instead), want a turnkey solution with minimal customization, or primarily need malware sharing capabilities rather than deep analysis (MISP is simpler). For most teams, Azul's operational burden outweighs its benefits unless you're specifically solving the large-scale knowledge base problem.