Martin's Blog

5. Mass Distribution and Victimology

Chapter 4 explained how SUNBURST encodes a victim’s identity into a DNS name and how the range of the DNS answer issues a go / stand-down / kill directive. This chapter is the evidence for that mechanism, and the answer to “who was actually beaconing.” It moves from the decompiled implant to three bodies of evidence examined for this book: the full installers that carried the backdoor through the legitimate update channel, the passive DNS record of the C2 fabric, and the decoded beacon observations recovered by reversing the DGA.

5.1 Act 4: the backdoor ships in full installers

The first weaponized release (Chapter 3) was a patch, the Hotfix-5 MSP that upgraded a clean 2019.4 install to the backdoored 9083 DLL. Distribution then moved to full installers, the kind a new customer downloads:

# Release DLL build Compile (verified) Delivery
3 Orion Core 2020.2 (RTM) 2020.2.5200.12394 (019085a7…) 2020-04-21 2020.2.5220.27327-CoreInstaller.msi
4 Orion Core 2020.2 Hotfix 1 2020.2.5300.12432 (ce77d116…) 2020-05-11 2020.2.5320.27438-CoreInstaller.msi

Both are full MSIs that ship already weaponized, and, as established in Chapter 4, the backdoor class inside them is byte-for-byte identical to the one in 9083. Same host process hash, same 12–14-day dormancy, same C2 logic; only the surrounding files and version stamps differ. There is one SUNBURST implementation across the three weaponized packages.

What the backdoor rode inside. It is worth seeing the scale of the carrier. The payload CAB in each installer was carved and its file list counted:

Payload CAB File count
2019.4 RTM 1,986
Hotfix-5 MSP (patch) 41
2020.2 RTM 1,930
2020.2 HF1 1,930

Two observations matter:

The implant hid in plain sight, inside a large, signed, expected product, not in some anomalous extra download.

5.2 The channel: a normal update from a trusted CDN

These four installers were not phished or side-loaded. They were pulled from the genuine SolarWinds content delivery network; archived download records contain URLs of the form hxxps://downloads.solarwinds[.]com/.../CoreInstaller.msi. Every step of the delivery was the normal step a customer expected: a signed installer, from the vendor’s own CDN, over the update channel they already trusted. That is the entire supply-chain thesis from Chapter 1, made concrete: there was nothing for the customer to catch at install time.

SolarWinds initially reported an upper bound of up to ~18,000 potentially affected customers based on downloads and later stressed that this included customers that did not install the update or whose servers could not contact C2. Even a confirmed installation would be the top of a funnel, not a hands-on compromise count (Chapter 1). The rest of this chapter examines the subset visible in the available DNS data.

5.3 The C2 fabric, seen in passive DNS

Chapter 4 left the C2 fabric as a mechanism. The dataset analyzed for this book captures the observed fabric: a passive DNS export of 500 A record resolutions for avsvmcloud[.]com (≈ Apr–Dec 2020). Parsed, it yields 445 unique IPs and 268 unique DGA beacon FQDNs. For example:

00all4hqt8ge8f4frl5k.appsync-api.eu-west-1.avsvmcloud.com
q7g7t7be3u1otao4ed1n60t12eu1.appsync-api.eu-west-1.avsvmcloud.com

The left-hand label is the DGA output from Chapter 4, a victim ID + time token + flags, encoded in scrambled base32. The actor’s authoritative infrastructure is visible too:

Host Resolved IP Role
ns1.avsvmcloud[.]com 54.164.147.101 (AWS us-east-1) actor authoritative name server
ns2.avsvmcloud[.]com 3.101.88.204 (AWS us-west-1) actor authoritative name server
avsvmcloud[.]com apex / www Azure + GoDaddy ranges web host; the GoDaddy 50.63.202.x / 184.168.221.x IPs are parking/sinkhole after the December takeover

Hosting the name servers on AWS, with hostnames shaped like appsync-api.<region> (a real AWS service naming pattern), is part of the camouflage: to a casual look, the beacons resemble an application talking to an Amazon API endpoint.

5.4 The key finding: the A record is a directive, not a destination

This is where the passive DNS data directly confirms Chapter 4’s §4.5 claim. SUNBURST does not use the resolved A record as a real address to connect to; it reads the range the IP falls into as a command. Classifying all 445 observed IPs against the implant’s hardcoded nList ranges (the AddressFamilyEx switch from §4.5):

Resolved range → implant behaviour Unique IPs
NetBios → permit HTTP handoff, but only with a non-empty CNAME 127
ImpLinkReportStatus.Truncate → permanent stand-down 294
Ipx → reset to New 1
Atm → stand-down 0
outside all ranges (the infra / sinkhole IPs above) 23

422 of 445 (94.8%) of the responses land inside the malware’s own signalling ranges. This is not coincidence; it is the operator’s name server answering each victim’s DGA query with an IP chosen for its range membership, to issue a directive. The 23 outliers are infrastructure and post-takeover sinkhole IPs, which fall in no signalling range.

The skew is real in the address set, but it is not a victim or target ratio. Unique response IPs are not unique hosts; range sizes and randomized control fields affect address diversity; and a NetBIOS range A record does not open HTTP C2 without a non-empty CNAME. The actual HTTP C2 destinations sit behind those CNAMEs and are not established by this classification based only on A records. The data proves that DNS was a control plane; it does not quantify how many organizations were promoted or stood down.

Killswitch preview. One range matters for Chapter 8: on 2020-12-15 the defenders repointed avsvmcloud[.]com to 20.140.0.1, which falls in 20.140.0.0/15, an ImpLink (stand-down) range. The global killswitch fed that directive to implants still resolving through the initial DNS path; it did not reach hosts already handed off to separate secondary C2.

5.5 Reversing the DGA: who was beaconing

Because the DGA is reversible by anyone who understands CryptoHelper (Chapter 4), the encoded labels can be turned back into victim IDs and, for the Phase-A registration records, into the victim’s AD domain name. The decoder used for this analysis has two modes:

Run against the 268-FQDN capture, it recovers 147 distinct victim IDs and 11 named domains (e.g. nvidia.com, dsh.ca.gov, repsrv.com, fcmat.org, kk.dk, loves.com, vsp.com), several cross-validated by also appearing in the beacon set, all consistent with the community’s December-2020 decodes.

A larger capture. A separate VirusTotal passive DNS export contains 2,841 DGA FQDNs (~10× the first capture, and a near-superset: 255 of the 268 reappear). Decoded with the same method, it yields the main victimology figures used here:

The recovered AD domains read like a cross-section of the global economy and government, and this yields 117 additional decoded AD domain / organization attributions in the observed beacon data versus the original 11 (decoded beaconing, not confirmed compromise, see the caveat below). A representative slice (org attribution from the recovered AD domain string):

The decoder is disciplined about noise: clearly non-victim strings (canthack.this, casino.prv, jarvis.lab, cow.local, malformed-region rows) are excluded as researcher/sinkhole artifacts rather than counted as victims.

Two independent confirmations. A Validin DNS history export containing 1,825 hostnames is a near-subset of the VT capture: 1,782 of its 1,786 beacons already appear in the VT set, so it adds source diversity, not new victims (a different vendor’s telemetry reaching the same conclusion). And a hand-enriched, community-sourced pan-Nordic slice (45 beacon host IDs → ~28 named organizations across Denmark, Sweden, and Norway) names large enterprises and public bodies absent from the VT/Validin captures, Ericsson, Volvo Cars, Skanska, Norges Bank Investment Management, the Danish Tax Administration, and critical infrastructure utilities among them. (Being community-decoded rather than locally derived, it is cited like the CISA reporting; the same observed beacon caveat applies, and it does not revise the headline VT figures.)

5.6 What the numbers do and do not say

This is observed beacon victimology, and the caveat is load-bearing:

A passive DNS resolution is an observation of a beacon, not proof of hands-on compromise. The range-based A records are directives, not destinations. Truncated single-chunk records identify an organization but not the full domain. These figures are a floor on breadth and an upper bound on hands-on counts: they say “this many networks ran the backdoor and phoned the DGA,” not “this many were exploited.”

With that caveat, the analyzed dataset yields 1,624 beacon userIDs and 164 recovered domains (128 clean, 54 cross-validated), a meaningful, independently derived sample of the potentially affected population, but not the whole. It independently demonstrates broad beaconing and the DNS control mechanism, while leaving the promotion ratio unresolved. Public reporting establishes that only a much smaller subset received hands-on follow-on activity. Those selected victims, the ones that received a “proceed” CNAME and a second stage, are the subject of Chapter 6.

Sources & evidence

↑ Revisiting the SolarWinds Compromise