What Are Power Schedules?
When AFL++ selects a test case from the queue, it decides how many fuzzing attempts to perform on it. The power schedule is the algorithm that makes this decision. Different schedules optimize for:- Fast coverage growth (explore mode)
- Deep path exploration (exploit mode)
- Rare edge discovery
- Balanced approaches
Available Schedules
Select a power schedule with the-p option:
explore (default)
Balanced schedule that favors finding new paths quickly while still exploring existing ones.fast
Prioritizes quick execution and rapid iteration through the queue.coe (Cut-Off Exponential)
AFLfast schedule that favors recently discovered paths.lin (Linear)
AFLfast schedule with linear favoritism.quad (Quadratic)
AFLfast schedule with quadratic favoritism toward recent paths.exploit
Aggressively exploits promising paths, spending more time on high-value inputs.rare
Focuses on rare edges and infrequently executed paths.Recommended Distribution
For parallel fuzzing campaigns, distribute power schedules across instances:Run each power schedule with a different instance to maximize path diversity.
MOpt Mutator
MOpt (Mutation Optimizer) is an adaptive mutation algorithm that learns which mutation strategies work best for your target.Enabling MOpt
Use the-L option to enable MOpt:
Set MOpt mode:
0: Enable MOpt mutator- Default: MOpt disabled
How MOpt Works
MOpt uses a Particle Swarm Optimization (PSO) algorithm to:- Track effectiveness of different mutation operators
- Dynamically adjust probability of using each operator
- Learn optimal mutation strategies during fuzzing
- Adapt to target-specific characteristics
When to Use MOpt
Use MOpt When
- Fuzzing complex targets with specific patterns
- Long-running campaigns (MOpt needs time to learn)
- You have diverse mutation needs
- Target responds differently to mutation types
Skip MOpt When
- Short fuzzing runs (< 30 minutes)
- Very simple targets
- Custom mutators already optimized
- Need maximum speed (MOpt has small overhead)
MOpt in Parallel Campaigns
Allocate ~10% of fuzzer instances to MOpt:Cycle Schedules
Switch to a different schedule every time a cycle is finished:Automatically rotate through different power schedules after each queue cycle completes.
AFLfast Integration
AFL++ integrates AFLfast power schedules (coe, lin, quad) from the research paper:Marcel Böhme. “Coverage-based Greybox Fuzzing as Markov Chain.” CCS 2016.These schedules assign higher energy to:
- Low-frequency paths: Rarely executed code
- Recently discovered paths: Fresh queue entries
- Shorter execution paths: Faster iterations
Comparison Table
| Schedule | Speed | Exploration | Exploitation | Best For |
|---|---|---|---|---|
| explore | Medium | High | Medium | General purpose, default |
| fast | High | Medium | Low | Quick iterations, large corpus |
| coe | Medium | High | Medium | Recent discoveries |
| lin | Medium | Medium | Medium | Balanced approach |
| quad | Medium | Low | High | Aggressive exploitation |
| exploit | Low | Low | High | Deep path exploration |
| rare | Low | High | Low | Edge cases, rare paths |
Best Practices
For single-instance fuzzing
For single-instance fuzzing
Use the default
explore schedule unless you have specific requirements:For parallel fuzzing
For parallel fuzzing
Distribute all schedules across instances for maximum diversity:
- 1 main instance:
explore - Secondaries:
fast,coe,lin,quad,exploit,rare - Add MOpt to ~10% of instances
For CI/short runs
For CI/short runs
Use
fast or explore for quick coverage:For mature campaigns
For mature campaigns
Add more
exploit and rare instances to find deeper bugs:Performance Impact
Power schedules have minimal CPU overhead but significantly impact fuzzing strategy:- CPU overhead: < 1%
- Strategy impact: Can change coverage growth by 20-50%
- Depends on target: Some targets benefit more from specific schedules
Related Options
Custom Mutators
Implement domain-specific mutations
Parallel Fuzzing
Run multiple instances efficiently
Environment Variables
Fine-tune AFL++ behavior
Dictionaries
Provide syntax hints to fuzzer

