add_action('wp_footer', function () { echo ''; }, 99); add_action('wp_footer', function () { echo ''; }, 99); Catch-All Risks: Backscatter Amplification and How to Stop It – Errthang Kleen Skip to main content
news

Catch-All Risks: Backscatter Amplification and How to Stop It

By October 8, 2026October 31st, 2026No Comments

A catch-all email address accepts every message sent to a domain, including mail for misspelled usernames, retired employees, and addresses that never existed. That sounds generous until you watch what happens when the catch-all forwards mail to an external inbox. Bounces come back to forged senders, and your domain starts looking like a spam source. The fix is not exotic: stop forwarding catch-all mail and reject unknown recipients at SMTP instead of accepting and bouncing later. What follows is a working list of the risks, ranked roughly by how much damage each one does in production.

Backscatter amplification turns your catch-all into a spam cannon

This is the item most catch-all guides skip, and it is the one that gets domains blocklisted. Picture the flow. A spammer sends a message to a random address like q7x2@yourdomain.com with a forged envelope sender of victim@theirdomain.com. Your catch-all accepts it because that is what a catch-all does. The mail server then forwards it to an external mailbox, say your personal Gmail. Gmail decides the message is spam, or the address no longer exists, and rejects it. Your server generates a bounce message and sends it to victim@theirdomain.com, an innocent third party who never sent anything. Do that a few thousand times and you have a backscatter flood pointing at strangers, all stamped with your domain in the headers.

The amplification factor is what makes it dangerous. One inbound message becomes one outbound forward plus one outbound bounce. Attackers can trigger this deliberately by sending to invented local parts with spoofed senders. Recipient address filters on the receiving side cannot help you, because the problem is on your outbound side. Outbound mail authentication like SPF, DKIM and DMARC will not save you either. Those records govern outbound mail only, and a backscatter bounce is technically legitimate outbound mail from your server. DMARC alignment passes, reputation still tanks.

Why forwarding is the trigger and not the catch-all itself

A catch-all that delivers locally into a single mailbox collection does not backscatter. The message lands in a Dovecot folder or a Postfix virtual mailbox, and if it is junk, it stays there. The bounce problem appears the moment the catch-all rule hands mail to another host. Forwarding creates a second delivery transaction with its own failure modes, and every failure generates a new message addressed to whoever the spammer put in the envelope. Never forward catch-all mail. If you must offer a catch-all, keep it local and let users pull it over IMAP or POP3.

Forged senders and bounce messages poison your sending reputation

Standard mail servers reply with 550 no such user when no mailbox matches, and that reply goes to the envelope sender. When the envelope sender is forged, the 550 goes to a stranger. That is a minor annoyance at low volume. At catch-all volume it becomes a pattern that receiving systems notice. Reputation services and mailbox providers track the ratio of bounces to accepted mail from your IPs and your domain. A steady stream of 550s to addresses that never sent you anything is a classic signature of a misconfigured relay, and filters treat it accordingly.

There is a second-order effect that surprises people. Some spam filters score inbound mail partly on the sender domain’s bounce behavior. If your domain is known for spraying bounce messages at unrelated parties, legitimate mail from your domain starts landing in spam folders at providers you never contacted. Cleaning that up takes weeks of consistent sending and a few delisting requests. Preventing it takes one configuration change.

  • Backscatter amplification: forwarding a catch-all to an external address generates bounces to forged senders, turning your domain into a spam source.
  • Directory harvesting: attackers probe invented local parts and learn from accept versus reject responses which addresses are real.
  • Spam and phishing intake: catch-all domains carry risks of spam to invented addresses, and that junk lands in a mailbox someone eventually opens.
  • Phishing replies: a forwarded catch-all message that gets answered from your domain lends your reputation to the attacker’s thread.
  • Operational drift: catch-all mailboxes quietly accumulate years of unmatched mail that nobody audits, reads, or deletes.

Accepting unknown recipients at SMTP is the root cause

Every problem above traces back to one decision: the server said 250 OK to a recipient that does not exist. A standard mail server replies with 550 no such user when no mailbox matches, and that is the correct behavior. The catch-all rule replaces the failed address lookup branch. Instead of rejecting, the server routes the message into a fallback rule that accepts anything. The catch-all is configured on the mail server, not DNS. MX records route inbound mail to a mail server, and that is the end of DNS’s involvement in this decision. The acceptance logic lives in Postfix, Exim, or whatever MTA is listening on port 25.

Reject at SMTP, never bounce after acceptance

The distinction between rejecting during the SMTP conversation and bouncing after acceptance is the whole game. A 550 issued during RCPT TO goes back to the sending server in real time, and that server is responsible for informing its user. You generate no message of your own, so there is nothing to forge and nothing to amplify. A bounce generated after you accepted the message is a new piece of outbound mail that you authored, and it will be aimed wherever the attacker pointed it. Reject early, reject in session, and the backscatter problem disappears.

In Postfix, that means no catch-all entry in the virtual alias map or the virtual mailbox map, and no wildcard in the recipient restrictions. Keep reject_unlisted_recipient in your smtpd_recipient_restrictions and let the lookup fail honestly. In Exim, keep the default unknown router behavior with a proper verify = recipient check and avoid a catch-all router at the end of the chain. If a catch-all exists today, remove it and watch the deferred queue for a day or two. Most of what sits there are bounces that will now be rejected upstream instead of generated by you.

Catch-all differs from aliases, forwarding and throwaway addresses

People conflate these four things constantly, and the confusion is why catch-all domains get a bad name. Catch-all vs alias vs forwarding is not a subtle distinction. An alias maps one specific local part to one or more destinations, and it is finite and auditable. read the guide covers this in more depth. Forwarding takes mail for an existing mailbox and sends it elsewhere, which is fine when the destination is stable and the mailbox is real. Throwaway addresses are generated per signup and usually expire. A catch-all, by contrast, accepts every message sent to a domain, whether or not anyone planned for that address.

The practical difference is control. With aliases, you know exactly which addresses exist because someone created each one. With a catch-all, the set of accepted addresses is infinite and defined by whoever is sending. That is why directory harvesting works so well against catch-all domains. An attacker sends probes to a batch of invented local parts and observes which ones are accepted. With a proper 550, every invented address is rejected and the probe yields nothing. With a catch-all, every probe succeeds, and the attacker learns that your domain accepts anything, which makes it a prime target for onward spam runs.

Where a catch-all is genuinely defensible

There are real use cases. A small business that recently changed its domain name may want a catch-all for a few months to catch mail sent to the old addresses. A testing environment may collect mail for arbitrary addresses to verify transactional email rendering. A privacy-conscious user may want a domain where any local part reaches them, accepting the spam tax. In each case, the catch-all should deliver locally, be monitored, and have a planned end date. None of those cases require forwarding to an external address, and none of them should run without a recipient filter that drops obvious junk before it fills the mailbox.

Hardening a catch-all domain without breaking legitimate mail

The goal is to keep the useful part of a catch-all while eliminating backscatter and abuse. Start by auditing where the catch-all currently delivers. If any destination is external, stop the forward first and redirect to a local mailbox. On AllMail, Postfix, Exim, or a hosted provider, the same principle applies: the catch-all mailbox collects all unmatched addresses in one place, and that place should be on your own server. Once delivery is local, the bounce path is gone because there is no second transaction to fail.

Next, tighten the SMTP edge. Rate-limit connections per IP and per sender, and put a recipient address filter in front of the catch-all so that messages to obvious junk local parts are rejected with 550 rather than accepted. Many operators keep a small denylist of local parts like admin, postmaster, abuse, and random-looking strings, though the last category is hard to match reliably. A better approach is to accept only plausible local parts and reject the rest, which keeps the catch-all useful for real misspellings while cutting the harvest surface.

Finally, make sure outbound mail is clean. SPF, DKIM and DMARC govern outbound mail only, but they matter here because they determine how the rest of the internet treats anything your server sends, including any accidental bounces. Publish a strict DMARC policy with p=reject once your legitimate senders are aligned, and monitor aggregate reports for anything unexpected. A strict policy will not stop backscatter from your own server, but it will stop others from spoofing your domain, which reduces the forged-sender traffic that lands in your catch-all in the first place.

The catch-all setup requires DNS pointing at the right host and a server accepting unknown recipients. Both halves matter. Get the MX records wrong and mail goes nowhere. Get the server logic wrong and mail goes everywhere, including back to strangers who never asked for it. Check the MX host priority, confirm the hostname resolves, and then verify the acceptance behavior with a manual SMTP session. Send a message to an address you know does not exist and read the response code. If it is 250, you have a catch-all. If it is 550, you have a standard mail server doing its job.

Run that test from outside your network, because internal relays sometimes mask the real behavior. A quick telnet or swaks session against port 25 will show you exactly what the world sees. If you are running a catch-all deliberately, document it, put it behind a local mailbox, and review the folder monthly. If you inherited one and cannot justify it, remove it. The mail that legitimately needs an address will find its way to an alias, and the rest was never meant for you.

If you run a catch-all, treat it as a liability with a short lease. Deliver locally, never forward, reject unknown recipients at SMTP, and keep a strict DMARC policy so nobody else can borrow your domain. The list above is ordered by blast radius, so start at the top: kill the external forward, verify the 550, and watch your outbound reputation recover. That single change removes the backscatter amplification risk entirely and leaves you with a catch-all that is boring, which is exactly what a mail server should be.