{"id":368,"date":"2026-10-19T06:09:00","date_gmt":"2026-10-19T13:09:00","guid":{"rendered":"https:\/\/blog.canutethegreat.com\/index.php\/2026\/10\/19\/backups-an-attacker-cant-delete\/"},"modified":"2026-10-20T20:28:52","modified_gmt":"2026-10-21T03:28:52","slug":"backups-an-attacker-cant-delete","status":"publish","type":"post","link":"https:\/\/blog.canutethegreat.com\/index.php\/2026\/10\/19\/backups-an-attacker-cant-delete\/","title":{"rendered":"Backups an attacker can&#8217;t delete"},"content":{"rendered":"<p><em>Part 1 of 3 in the Surviving ransomware series.<\/em><\/p>\n<p>Modern ransomware crews don&#8217;t start by encrypting things. They start by finding your backups. The playbook described in incident reports from the last few years is depressingly consistent: get domain admin, locate the backup server, delete the restore points or wipe the repository, and only then run the encryptor. If the backups survive, the ransom demand is a negotiation. If they don&#8217;t, it&#8217;s a hostage situation.<\/p>\n<p>So the question for this series isn&#8217;t &#8220;do we have backups?&#8221; Almost everyone does. It&#8217;s whether an attacker who holds your most privileged credentials can destroy them.<\/p>\n<h2>3-2-1 was written for a different threat<\/h2>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.canutethegreat.com\/wp-content\/uploads\/2026\/10\/ransomware-backup-zones.png\" alt=\"Backup architecture with production, backup and immutable zones and one-way data flows\" \/><\/figure>\n<p>The classic 3-2-1 rule says three copies of your data, on two different types of media, with one copy offsite. It&#8217;s a great rule for fires, floods and failed RAID controllers. It says nothing about an adversary who logs in with valid credentials and deletes all three copies, because in most environments the same admin accounts can reach all of them.<\/p>\n<p>The extension you&#8217;ll often see now is 3-2-1-1-0. The extra 1 is a copy that is offline, air-gapped or immutable. The 0 is zero errors when you verify a restore. I like it because both additions target the actual failure modes: deletion by a privileged attacker, and backups that turn out to be unrestorable on the worst day of your year.<\/p>\n<h2>The backup system is a target in its own right<\/h2>\n<p>Backup servers are attractive because they hold everything and they usually hold credentials to reach everything. CVE-2023-27532 in Veeam Backup &amp; Replication is a good illustration. It let an unauthenticated user who could reach the backup service port pull encrypted credentials out of the configuration database. It was exploited in the wild and added to CISA&#8217;s Known Exploited Vulnerabilities catalog in August 2023.<\/p>\n<p>The lessons I take from it are architectural rather than vendor-specific:<\/p>\n<ul>\n<li>Put the backup server&#8217;s management interfaces on a network segment that ordinary servers and workstations can&#8217;t reach.<\/li>\n<li>Don&#8217;t join backup infrastructure to the production Active Directory domain. If domain admin is compromised, the backup console shouldn&#8217;t fall with it.<\/li>\n<li>Require MFA for the backup console and for any cloud account that holds backup copies, using accounts that exist only for that purpose.<\/li>\n<li>Patch backup software on the same urgency as internet-facing systems, because for an intruder it effectively is one.<\/li>\n<\/ul>\n<h2>Immutability, done properly<\/h2>\n<p>Immutable storage means a backup can&#8217;t be modified or deleted until its retention period ends, no matter who asks. The details decide whether it holds up against a real admin-level compromise.<\/p>\n<p>On AWS, S3 Object Lock has two modes. Governance mode can be bypassed by users with the <code>s3:BypassGovernanceRetention<\/code> permission, which makes it useful against mistakes and useless against someone who has stolen an admin role. Compliance mode can&#8217;t be shortened or removed by anyone, including the account root user, until the retention date passes.<\/p>\n<pre class=\"wp-block-code\"><code>aws s3api create-bucket --bucket example-backups-immutable \\\n  --region us-west-2 \\\n  --create-bucket-configuration LocationConstraint=us-west-2 \\\n  --object-lock-enabled-for-bucket\n\naws s3api put-object-lock-configuration \\\n  --bucket example-backups-immutable \\\n  --object-lock-configuration '{\n    \"ObjectLockEnabled\": \"Enabled\",\n    \"Rule\": { \"DefaultRetention\": { \"Mode\": \"COMPLIANCE\", \"Days\": 35 } }\n  }'<\/code><\/pre>\n<p>Test with a small bucket and short retention first. Compliance mode is unforgiving: if you set a year by mistake, you&#8217;re paying for that storage for a year.<\/p>\n<p>Put the bucket in a separate AWS account dedicated to backups, with its own tightly held credentials, so production compromise doesn&#8217;t hand over the backup account too. The same idea applies to other clouds and to on-premises object stores that support WORM retention.<\/p>\n<p>For self-hosted setups, I prefer a pull model. The backup server reaches into production to fetch data, and production holds no credentials that work on the backup server. With ZFS, the source host can delegate just enough to a dedicated user:<\/p>\n<pre class=\"wp-block-code\"><code># On the production host: allow the backup user to snapshot and send, nothing else\nzfs allow -u backupsvc send,snapshot,hold tank\/data<\/code><\/pre>\n<p>The backup server then pulls incremental snapshots over SSH and keeps its own snapshot history. An attacker with root on the production host can destroy production&#8217;s snapshots, but has no path to the copies on the backup server.<\/p>\n<h2>Retention has to outlast the intrusion<\/h2>\n<p>Immutability with seven days of retention doesn&#8217;t help if the attacker was inside for three weeks before encrypting anything, because every restore point you have may contain their tooling, or their changes to your data. Mandiant&#8217;s M-Trends 2024 report put median global dwell time at 10 days in 2023, and the median isn&#8217;t the case you should plan for.<\/p>\n<p>I&#8217;d treat 30 days of immutable restore points as a floor, with a longer, sparser tail (weekly or monthly) beyond that. Part 3 of this series covers how to pick a clean restore point, which depends heavily on having logs that tell you when the intrusion started.<\/p>\n<h2>Offline still has a place<\/h2>\n<p>Tape and removable disks rotated offsite feel old fashioned, and they&#8217;re slow. They&#8217;re also the one copy that no network-borne attacker can touch. For a smaller organisation, a weekly full backup to a disk that&#8217;s disconnected and locked away is a cheap and effective last line. Keep the backup encryption keys stored separately from the backups, including an offline copy, because encrypted backups you can&#8217;t decrypt are no backups at all.<\/p>\n<h2>Watch for attacks on the backups<\/h2>\n<p>Deleting backups is noisy if you&#8217;re listening. Alert on deletion or retention changes in backup jobs, on someone disabling Volume Shadow Copy or running <code>vssadmin delete shadows<\/code>, on failed or skipped jobs across many systems at once, and on new admin accounts in the backup console. These events often precede encryption by hours. That&#8217;s your window.<\/p>\n<h2>The zero errors part<\/h2>\n<p>The final 0 is the one most often skipped. A green &#8220;job succeeded&#8221; status means data was written somewhere. It doesn&#8217;t mean you can restore a working system from it in a reasonable time. Part 3 is about proving that, with real restore tests and measured recovery times. Before that, part 2 looks at segmentation, which decides how far an intruder gets before they reach the backup server at all.<\/p>\n<p><em>Other parts: <a href=\"https:\/\/blog.canutethegreat.com\/index.php\/2026\/10\/20\/segmentation-limiting-lateral-movement\/\">Part 2: Segmentation and limiting lateral movement<\/a>. <a href=\"https:\/\/blog.canutethegreat.com\/index.php\/2026\/10\/21\/restore-testing-real-recovery-time\/\">Part 3: Restore testing and your real recovery time<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Part 1 of 3 in the Surviving ransomware series. Modern ransomware crews don&#8217;t start by encrypting things. They start by finding your backups. The playbook described in incident reports from the last few years is depressingly consistent: get domain admin, locate the backup server, delete the restore points or wipe the repository, and only then [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":386,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,21],"tags":[98,100,97,99,102,101],"class_list":["post-368","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise","category-security","tag-backups","tag-immutability","tag-ransomware","tag-s3-object-lock","tag-surviving-ransomware-series","tag-zfs"],"_links":{"self":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":1,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":413,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/368\/revisions\/413"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/media\/386"}],"wp:attachment":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}