Which TTPs keep recurring?
Every row is an ATT&CK technique. Every column is a calendar year. A cell's shade tracks how many distinct catalog actors were publicly active that year while carrying that technique in their attributed profile. Read the rows like sparklines: an unbroken line of darker cells is a technique that has stayed in adversary tradecraft across the whole catalog window; a single bright cell is a campaign-specific spike.
Caveat: actor → technique attribution is at the actor level, not the per-event level, so a cell counts actors that have the technique AND were publicly active that year, not events where the technique was named. Filters: top 30 of 33 techniques with 2+ actors.
| technique | Σ | ’14 | ’15 | ’16 | ’17 | ’18 | ’19 | ’20 | ’21 | ’22 | ’23 | ’24 | ’25 | ’26 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| T1486 | 22 | 1 | 1 | 1 | 3 | 1 | 1 | 2 | 3 | 5 | 6 | 12 | 8 | 3 |
| T1059.001 | 16 | 1 | 1 | 1 | 4 | 1 | 1 | 5 | 3 | 7 | 3 | 6 | 4 | 1 |
| T1078 | 16 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 3 | 3 | 2 | 8 | 3 | 2 |
| T1190 | 16 | 0 | 0 | 1 | 1 | 2 | 0 | 0 | 1 | 5 | 2 | 7 | 5 | 0 |
| T1566.001 | 15 | 1 | 1 | 1 | 3 | 3 | 1 | 4 | 2 | 5 | 4 | 5 | 3 | 1 |
| T1490 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 4 | 4 | 7 | 5 | 1 |
| T1133 | 12 | 0 | 0 | 1 | 0 | 2 | 0 | 1 | 1 | 2 | 5 | 6 | 4 | 1 |
| T1567.002 | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 2 | 3 | 7 | 5 | 2 |
| T1071.001 | 11 | 1 | 1 | 1 | 4 | 1 | 0 | 4 | 2 | 4 | 3 | 3 | 5 | 1 |
| T1078.004 | 9 | 0 | 0 | 0 | 1 | 2 | 0 | 1 | 1 | 1 | 3 | 3 | 3 | 0 |
| T1485 | 6 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 4 | 0 | 1 | 2 | 1 |
| T1059.003 | 4 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 0 | 2 | 3 | 0 | 0 |
| T1219 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1 | 1 | 0 |
| T1498 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 3 | 3 | 1 | 0 |
| T1499 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 3 | 3 | 1 | 0 |
| T1041 | 3 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
| T1199 | 3 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
| T1547.001 | 3 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 2 | 2 | 1 | 0 | 1 | 0 |
| T1556 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 2 | 0 |
| T1561.002 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 1 | 0 | 0 |
| T1566.002 | 3 | 0 | 0 | 1 | 0 | 1 | 0 | 2 | 0 | 0 | 1 | 1 | 1 | 0 |
| T0827 | 2 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 2 | 0 |
| T1056.003 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| T1090.003 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 0 |
| T1110.003 | 2 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 |
| T1195.002 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 2 | 0 | 0 | 1 | 0 |
| T1203 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
| T1505.003 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 2 | 0 |
| T1561 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
| T1566.003 | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 |
intensityempty → row peak (intensity normalised per row so a row with a single big year doesn't flatten the rest)