The Host's Casebook / The accountant who was impersonated

The accountant who was impersonated

CASEBOOK

7 min read · 1,582 words

A note on authenticity. This is a composite story written by the editors, built from situations that come up again and again. It is not the account of a particular named person or business. Real reader stories go through the submission page and are marked as reader-submitted.

A one-person accounting practice received an angry call from a client who had paid an invoice to a new bank account. The email asking for the change looked like it came from the accountant's domain. It had not.

Her domain had no DMARC record, and her SPF record was permissive. Anyone could send mail with her address in the From line, and many mail systems would accept it.

She published stricter SPF, set up DKIM through her mail provider, and added a DMARC policy that rejects failures. She also began telling clients that bank details never change by email alone, and that a phone call would always confirm. This is a composite, built from the sort of case a support desk sees every few months, and the order of events below is the usual one.

The phone call

The first sign was not a bounce or a warning. It was a client of eleven years ringing on a Thursday morning, polite at first, then not. He had received an email, apparently from the accountant, saying her practice had changed banks and that the next invoice should go to a new sort code and account number. He had paid it the same afternoon. The money was now with someone else.

The email looked right. The display name was hers, the address was hers, the signature block had been copied from an earlier genuine message, and the tone was her usual brisk friendliness. The only odd thing, in hindsight, was that it came at ten past six in the evening, when she normally stopped work at five.

She did what most people do first: she assumed her mailbox had been broken into. She opened the Sent folder and found nothing. No message to that client, nothing odd on the date. That should have been the clue that the mail never passed through her account at all, but at the time it only made her feel more confused, and rather more frightened.

How a forged From line works

Email was designed in an era when the people on the network knew each other. The address you see in the From line of a message is just a header, typed by whoever composed it. Nothing in the original protocol checks that the sender is entitled to use it. A criminal can put your address there from a laptop in a café, and the receiving server has to decide for itself whether to believe it.

Modern checks exist to help the receiver decide. SPF lets a domain publish a list of servers allowed to send for it. DKIM adds a cryptographic signature that proves a message was sent by something holding the domain's private key and was not altered on the way. DMARC ties them together: it says which of those checks must line up with the visible From domain, and what the receiver should do when they do not. Without DMARC, a failing check is a hint, not an instruction, and most receivers lean towards delivering the message.

Attacker's server From: accountant Receiving server checks, then decides Client's inbox looks genuine DNS for the accountant's domain SPF permissive, no DKIM, no DMARC
With nothing in DNS telling the receiver to refuse, a forged From line goes straight through.

What her DNS looked like

Her domain was registered years earlier and the mail was hosted by her web host. The records had been set up once and never looked at again. A quick check from any terminal showed the problem within a minute.

$ dig +short TXT example.com
"v=spf1 +all"

$ dig +short TXT _dmarc.example.com
(nothing returned)

$ dig +short TXT selector1._domainkey.example.com
(nothing returned)

The SPF record ended in +all, which says that every server on the internet is authorised to send for the domain. It is the opposite of what the record is for. Someone had probably added it to get a mailing tool working years ago and left it. There was no DMARC record at all, and no DKIM key published, so her own outgoing mail was not signed either.

Put plainly: there was nothing for a receiver to check, and nothing telling it what to do if a check failed. The forger did not need to be clever. He needed a mail server and her address.

Wrong turns

She spent the first day on the wrong problem. She changed her mailbox password, enabled two-factor sign-in on the webmail, and asked her host whether the account had been accessed from abroad. All good hygiene, none of it relevant. The login log showed only her own address and her own phone.

She also reported the payment to her client's bank, which was the right move and the only one with any chance of recovering money. Banks in the UK can sometimes recall a payment quickly if the fraud is reported the same day, and slowly or not at all after that. Some of it was recovered; the details are not the point here.

The useful step came when a friend forwarded her the original message with full headers. Under Authentication-Results the receiving system had written spf=pass, because her own record allowed everything, and dmarc=none, because no policy existed. The message had been marked as passing. The sending server was in a hosting range she had never heard of, and the Return-Path was a throwaway domain.

The fix, in stages

Switching straight to a reject policy is tempting and risky. If any legitimate source of her mail, such as an invoicing tool or a newsletter service, was not covered by SPF and DKIM, it would start bouncing. So she did it in order.

  1. Replaced the SPF record with one naming only her mail provider, ending in -all. The SPF builder produced the string.
  2. Turned on DKIM signing in her mail provider's control panel and published the key it generated.
  3. Published a DMARC record in monitoring mode, with a reporting address, and read the daily reports for two weeks.
  4. Added her invoicing tool to SPF after the reports showed it sending as her.
  5. Moved the policy to quarantine, then to reject.
example.com.            TXT  "v=spf1 include:_spf.mailhost.example -all"
sel1._domainkey         TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
_dmarc.example.com.     TXT  "v=DMARC1; p=reject; rua=mailto:[email protected]; adkim=s; aspf=s"

The DMARC builder helps with the syntax, and the DNS cheatsheet covers the record types if TXT records are new to you.

Week 0 SPF fixed, DKIM on Week 1 p=none, read reports Week 3 p=quarantine fix stragglers Week 6 p=reject (example timings)
A staged rollout, with example timings, gives the reports time to reveal any legitimate sender you forgot.

What the new policy does and does not do

With a reject policy in place, a receiving server that honours DMARC will refuse a message claiming to be from her domain unless it passes SPF or DKIM with a matching domain. The big mailbox providers do honour it. Smaller or older systems may not, so it reduces the problem sharply without erasing it.

It does not stop lookalike domains. A forger can register examp1e.com or example-accounts.com, publish perfect records for that, and send from it. Her own domain's DMARC has no say over those. That is why the second half of her fix was not technical.

AttackStopped by DMARC reject?What helps instead
Forged From using her exact domainYes, at providers that enforce itSPF, DKIM, DMARC
Lookalike domainNoPhone confirmation, client awareness
Stolen mailbox passwordNoTwo-factor sign-in, login alerts
Compromised client mailboxNoPhone confirmation

The process change

She wrote a short paragraph and added it to her email signature, her engagement letter and her invoice footer: bank details never change by email alone. Any change request is confirmed by a phone call to a number already on file, not one quoted in the message. She also rang her twenty or so regular clients and told them the story, which she found embarrassing and which most of them found reassuring.

Clients tend to respond well to this. A short, specific rule is easier to follow than general advice to be careful, and it gives them a polite way to say no to a stranger who sounds urgent.

A ten-minute check

Three queries tell you most of what you need. Replace the domain with your own.

dig +short TXT example.com | grep spf
dig +short TXT _dmarc.example.com
dig +short TXT YOURSELECTOR._domainkey.example.com

If the first line ends in +all or ?all, or the second returns nothing, you are where she was. Send a message to a mailbox you control at a large provider, open the full headers, and look for spf=pass, dkim=pass and dmarc=pass. The troubleshooting guide has more on reading headers.

Quick answers

Will a reject policy break my own email?

It can, if something sends as you without being listed in SPF or signing with DKIM. That is what the monitoring stage is for. Read the reports before tightening.

Is SPF alone enough?

No. SPF checks the hidden envelope sender, not the From line people read. DMARC is what connects the check to the visible address.

Does this protect my clients if their own account is hacked?

No. A compromised client mailbox can still receive a forged message that passes. Phone confirmation is the defence there.

Can I get the money back?

Report it to the paying bank the same day, and to Action Fraud. Speed matters more than anything else.

Afterwards

Email records that were set up once and never read are a liability, and a permissive SPF record is worse than none. Publish SPF, DKIM and DMARC, move to enforcement in stages, and pair the technical fix with a rule about bank details that clients can remember. None of it is difficult. It has to be done before the phone call rather than after.

PreviousThe bakery whose map listing pointed at a dead pageNextThe school fundraiser that crashed at its best moment

More from The Host's Casebook

Composite case

The tutor who wanted a proper email address

A private tutor had a free webmail address on her business cards and wanted something with her own name. She...

Composite case

The developer and the leaked key

A freelance developer committed a configuration file to a public code repository. It contained the database...

Composite case

The club newsletter that went to spam

A local cycling club had been sending a monthly newsletter from its own domain for years. After switching to...