Playbook 1: Registry reconnaissance and initial ROA creation¶
Why this chain was selected¶
This is a true control-plane attack, not data-plane abuse.
Most BGP incidents are forged letters carried by an overly trusting postal service. Someone announces a prefix they shouldn’t. The network believes them because BGP is fundamentally trusting. Those are data-plane attacks, like putting up a misleading street sign.
This playbook attacks the Guild Registry itself.
RPKI ROAs are the authoritative source that answers “who is allowed to announce this prefix?” They are meant to be the truth that routers check announcements against. If we can manipulate ROAs, we don’t just send false announcements: we redefine what “valid” means.
From the BGP hijacking attack tree, we’re implementing a variant of node 1.3.3 Advanced persistence combined with node 1.1.2.3 Exploiting lack of route validation. But we’re not just exploiting the absence of validation. We’re poisoning the validation system itself.
This is the first playbook in a three-part chain:
Reconnaissance and ROA creation (this playbook) - establish baseline, create legitimate-looking ROAs
ROA expansion and validation testing (playbook 2) - gradually expand authorisation scope
Prefix hijacking with operational cover (playbook 3) - exploit poisoned ROAs to hijack traffic whilst appearing valid
The chain works because each phase provides cover for the next. By the time we actually hijack traffic, the validation system is already compromised and will mark our hijack as legitimate.
Attack chain overview¶
Phase 1 (This playbook):
Registry reconnaissance → Legitimate ROA creation → Baseline establishment
Phase 2 (Playbook 2):
ROA scope expansion → Validation deployment timing → Multi-region testing
Phase 3 (Playbook 3):
Prefix announcement → Traffic interception → Sustained hijack with "valid" status
This differs from data-plane hijacks because:
Data-plane hijack: “I claim to originate 203.0.113.0/24” (forged announcement)
Control-plane poisoning: “The Registry now says I’m authorised to originate 203.0.113.0/24” (rewritten truth)
When validators check our announcement in phase 3, they will consult the poisoned ROAs we created in phases 1-2 and
return VALID. We’re not bypassing validation. We’re corrupting it.
Attack tree path¶
From the BGP hijacking tree:
Primary path: 1 → 1.1 Prefix hijacking → 1.1.2 Exact-prefix hijacking → 1.1.2.3 Exploiting lack of route validation
But with a critical modification: we’re not exploiting the absence of validation. We’re implementing node 1.3.3.1 Long-term hijacking for espionage by first corrupting the validation infrastructure itself.
Phase 1 Actions¶
Action 1.1: RPKI infrastructure reconnaissance¶
Intent Map the RPKI trust infrastructure for target prefix 203.0.113.0/24 to identify whether ROAs exist, who controls them, and which Regional Internet Registry manages the allocation.
Preconditions
Target prefix 203.0.113.0/24 is allocated to victim AS65001
We have obtained AS number AS64513 through legitimate RIR allocation process (required for creating ROAs)
We do not yet have legitimate authority over 203.0.113.0/24
Execution method
Use RIPE Stat RPKI Validation and Routinator to check current ROA status:
# Check if ROAs exist for target prefix
curl "https://stat.ripe.net/data/rpki-validation/data.json?resource=203.0.113.0/24"
# Check via Routinator
routinator vrps --output json | jq '.roas[] | select(.prefix == "203.0.113.0/24")'
# Identify RIR managing this allocation
whois -h whois.arin.net 203.0.113.0/24
Query results should show:
Whether victim AS65001 has created ROAs
Maximum prefix length authorised (typically /24)
Trust anchor (which RIR’s RPKI system manages this)
Last update timestamp
Expected technical effect
Within 5 minutes of queries:
We have documented current ROA state for 203.0.113.0/24
We know whether RPKI validation is protecting this prefix
We understand update frequency (used in phase 2 for timing)
We’ve identified gaps: if maxLength is /24, they haven’t authorised more-specifics
Common findings (budget reality):
~60% chance no ROA exists at all (organisations haven’t deployed RPKI)
~30% chance ROA exists but maxLength is /24 only (leaves /25 attacks viable)
~10% chance ROA has maxLength /25 or smaller (defensive, harder to attack)
Expected observational footprint
Reconnaissance footprint:
HTTPS queries to stat.ripe.net visible in their logs (shared public infrastructure, not notable)
Routinator queries to local validator leave no external footprint
WHOIS queries to RIR visible in query logs (extremely common, not suspicious)
Detection likelihood: Effectively zero. These are normal network operator queries that happen thousands of times daily.
Manual steps
Review WHOIS output to confirm RIR jurisdiction (ARIN, RIPE, APNIC, etc.)
Check whether victim organisation has published RPKI information in their public documentation
Verify that our AS64513 is properly registered and has no existing ROAs that might conflict
Timing uncertainty Queries complete in 2-10 seconds typically. If RIR WHOIS is slow or Routinator’s cached data is stale, allow up to 60 seconds.
Budget reality check Many organisations don’t monitor RPKI query patterns. Even those with RPKI deployed rarely log who’s checking their ROA status. This reconnaissance is effectively invisible.
Action 1.2: Create legitimate ROA for our own prefix¶
Intent Establish ourselves as a normal RPKI participant by creating valid ROAs for a prefix we legitimately control, building trust with the RPKI ecosystem before attempting manipulation.
Preconditions
We control a legitimate IP allocation (e.g., 198.51.100.0/24 allocated to our AS64513)
We have account access to RIR’s hosted RPKI service or run our own RPKI Certificate Authority
RIR allows us to create ROAs for our own resources (standard capability)
Execution method
Via RIPE NCC’s hosted RPKI service:
Log into RIR portal with credentials
Navigate to RPKI management interface
Create ROA for our legitimate prefix:
Prefix: 198.51.100.0/24
Origin AS: AS64513
Max length: /25 (slightly defensive, appears security-conscious)
ROA configuration:
{
"asn": "AS64513",
"prefix": "198.51.100.0/24",
"maxLength": 25,
"ta": "ripe"
}
Submit ROA creation request
Wait for publication (15-45 minutes typical)
Expected technical effect
Within 60 minutes:
ROA appears in RIPE’s RPKI repository
Validators polling RIPE (Routinator, FORT, rpki-client) will fetch updated repository
Global validators should show our 198.51.100.0/24 as having valid ROA
Any announcements of 198.51.100.0/24 from AS64513 will validate as VALID
Announcements from other ASes will validate as INVALID
This establishes our presence as a “normal RPKI-aware operator” in the ecosystem.
Expected observational footprint
ROA creation footprint:
RIR audit logs show ROA creation request from our account
RPKI repository publication logs show new ROA added
Validators see new ROA during next poll cycle (usually 10-30 minute intervals)
No alerts expected because we’re creating ROAs for resources we legitimately own
Detection likelihood: Zero. This is completely legitimate RPKI usage.
Manual steps
Verify RIR portal authentication still works (accounts can expire)
Check that our IP allocation is properly documented as ours in RIR database
Wait for email confirmation from RIR (some send notifications)
Manually verify publication:
routinator vrps --output json | jq '.roas[] | select(.prefix == "198.51.100.0/24")'
Timing uncertainty
ROA publication timing is notoriously variable:
RIR acceptance: 0-5 minutes (usually instant, occasionally queued)
Repository publication: 15-30 minutes (RIPE publishes every ~20 minutes)
Validator polling: 10-30 minutes (depends on validator’s refresh interval)
Router refresh: 30-60 minutes (routers poll validators less frequently)
Total time until globally visible: 30-90 minutes typically. Budget 2 hours to be safe.
On Fridays after 15:00: add 24-72 hours because nobody will investigate “why hasn’t this published” until Monday.
Budget reality check
This action costs nothing but time. Most RIRs provide hosted RPKI services at no additional charge to resource holders. The only barrier is having obtained legitimate AS and IP allocations first, which we’ve assumed as precondition.
Action 1.3: Baseline documentation¶
Intent Document the current legitimate RPKI state before manipulation, so we can measure the impact of future changes and maintain cover story if questioned.
Preconditions
Action 1.1 (reconnaissance) has completed
Action 1.2 (our own ROA) has been published and verified
We have secure storage for documentation (not in version control, not in emails)
Execution method
Create timestamped baseline document (stored offline, encrypted):
# RPKI Baseline - [DATE]
## Target: AS65001 / 203.0.113.0/24
Current ROA status:
- ROA exists: [YES/NO]
- Origin AS authorised: [AS NUMBER or "none"]
- Max prefix length: [/24, /25, etc. or "none"]
- Last updated: [TIMESTAMP from RPKI repository]
- Trust anchor: [ARIN/RIPE/APNIC/etc.]
Validation deployment status:
- RPKI validation deployed globally: ~40% (industry baseline)
- Validators observed: Routinator, FORT, rpki-client, RIPE, Cloudflare
- Enforcement mode common: "log only" (not "drop invalid")
## Our position: AS64513 / 198.51.100.0/24
Our ROA status:
- ROA created: [TIMESTAMP]
- Visible in validators: [TIMESTAMP of first appearance]
- Validation result: VALID
- Publication lag observed: [X minutes]
## Cover story
If questioned about our RPKI activity:
"We're implementing RPKI ROAs for our allocated resources as part of routine security hardening. We follow MANRS best practices and are systematically creating ROAs for all our announcements."
This is completely true and requires no deception.
Expected technical effect
No direct technical effect. This is documentation only. However, having baseline enables:
Measuring success/failure of future ROA manipulation
Detecting if victim modifies their ROAs (requires re-planning)
Maintaining timeline for attribution analysis if incident response occurs
Expected observational footprint
None. This is local documentation.
Manual steps
Verify documentation is stored securely (not on network-accessible systems)
Cross-reference our observations with public BGP monitoring services to ensure we’re seeing the same data as defenders would
Document which validators we’re monitoring (need to check multiple, as they can disagree)
Timing uncertainty
Documentation should take 15-30 minutes to complete thoroughly. Do not rush this. Incomplete baseline documentation means you won’t know what changed when phase 2 begins.
Budget reality check
Most organisations don’t monitor who’s researching their RPKI status. Even sophisticated defenders don’t have alerting on “someone looked up our ROAs”. This is intelligence gathering, not attack execution, and leaves no actionable footprint.
Recording the mess honestly¶
Manual verification requirements¶
Action 1.2 requires manual verification that the ROA actually published. Automated tools can tell you a ROA should have published. They cannot reliably tell you that all validators have seen it, that repositories synchronised correctly, or that there wasn’t a publication error.
Someone has to:
Check multiple independent validators (Routinator, FORT, Cloudflare’s)
Verify the ROA details match what was submitted
Confirm the trust anchor chain is intact
Check that no conflicting ROAs exist
This takes 10-20 minutes of careful checking. It’s tedious. It’s necessary. Skipping it means you might proceed to phase 2 thinking you have valid RPKI presence when you actually don’t.
Timing dependencies on RIR processes¶
RIR RPKI publication schedules are not published and not consistent. RIPE publishes roughly every 20 minutes. ARIN’s timing varies. APNIC is different again. You cannot automate around this. You must wait and check.
If your ROA submission lands just after a publication cycle, you wait 20+ minutes for the next one. If it lands during a maintenance window (unannounced), you might wait hours. If it’s Friday afternoon, you might wait until Monday.
Budget 2-4 hours for Action 1.2 completion, not because the action takes that long, but because waiting for publication does.
Third-party dependencies¶
We depend on:
RIR publication infrastructure working correctly (it usually does, but not always)
Validators polling on their normal schedule (they usually do, but can be delayed)
Repository rsync/RRDP not having connectivity issues (rare but happens)
No conflicting ROA submissions from other parties
The first three are out of our control. The fourth is unlikely but possible: if the legitimate holder of 203.0.113.0/24 creates their first ROA during our operation, our entire plan changes.
Where best practice lost to budget reality¶
Best practice says: organisations should monitor RPKI query patterns, log ROA creation attempts, audit RPKI access regularly, and have alerting on new ROAs appearing for their address space.
Budget reality says: most organisations have none of these. RPKI is deployed by security-conscious network operators, but monitoring and auditing of the RPKI system itself is rare. Logging exists but is not actively reviewed. Alerts are aspirational.
The gap between best practice and reality is what makes phase 1 viable. If every organisation had sophisticated RPKI monitoring, Action 1.1 reconnaissance would trigger alerts. They don’t, so it doesn’t.
Success criteria for phase 1¶
Phase 1 succeeds when:
We have documented baseline for target prefix 203.0.113.0/24
We have established our own legitimate ROA presence for 198.51.100.0/24
We have verified our ROA appears in multiple independent validators
We have confirmed publication timing (used for phase 2 planning)
We have clean operational security (no premature queries that might alert target)
Phase 1 fails if:
Target creates new ROAs before we begin phase 2 (requires re-planning)
Our ROA fails to publish (indicates RIR process problem, must resolve before continuing)
We trigger attribution warnings (unlikely, but if we do, abort entire operation)
Transition to phase 2¶
Do not proceed to phase 2 until:
Our legitimate ROA has been published and verified in at least 3 different validators
Baseline documentation is complete and stored securely
At least 7 days have passed since our ROA creation (establishes us as normal long-term participant)
Target’s RPKI status has not changed (if it has, reassess entire attack chain)
Phase 2 (ROA expansion) will be detected if executed too quickly after establishing presence. The 7-day waiting period provides operational cover by making our later actions appear part of routine RPKI maintenance rather than coordinated attack preparation.