Docs / Personal security & OPSEC

Myth vs reality · Threat intelligence

Personal security & OPSEC

Is this email phishing? A triage walkthrough.

By Abhimanyu Gupta, Founder & Principal Operator

On this page

Phishing is decided in the first three minutes, by four questions asked in order. The message is either asking for something that bypasses a process, or it is not. The domain in the From line either authorised it, or it did not. The links either go where their text says, or they do not. The attachment either is what it claims, or it is not. This is how to answer all four from the message itself, without clicking anything, uploading anything, or waiting for someone else to look.

Read with a purpose. Get the original message, read the authentication result the receiving server recorded, and treat a technical pass as proof of an address, not of a sender.

At a glance

The question
Is this message really from who it says, and is the thing it wants me to do safe
What proves the sender
A DMARC pass recorded by the server that took delivery, not a familiar name or logo
What proves nothing
The display name, the brand in a link, a padlock, a reply that quotes your own words
Evidence to gather
Original headers, the link as copied not clicked, the attachment's hash
Time this takes
Three minutes for most messages, once you know where to look

The first three minutes

Most phishing is caught by the same four questions, asked in the same order. The order matters, because each one is cheaper than the last and any of them can end the investigation.

  1. Does the message ask for something that bypasses a normal process? Payment details changing, an urgent approval, a login on a link rather than a site you navigate to yourself.
  2. Do the headers show the domain in the From line actually authorised this message?
  3. Does every link point where its text says it points?
  4. Is the attachment the kind of file it claims to be?

None of these needs a sandbox, a subscription or a ticket. They need the original message, which is the one thing people tend to destroy first by forwarding it.

Do not forward it to ask. Forwarding rewrites the headers, so the evidence that would answer question two is replaced by evidence about your own mail server. Send it as an attachment, or use your client's "report phishing" button, which preserves the original. If you have already forwarded it, ask the recipient for the message they received rather than the one you sent.

What the headers prove, and what they do not

Three mechanisms sit behind every modern claim about who sent a message, and they answer different questions.

MechanismWhat it checksWhat it cannot tell you
SPFWhether the sending server is one the envelope domain publishes as allowedAnything about the address a person sees in their client
DKIMWhether the message carries a valid signature from a domain, unaltered since signingWhether that domain is the one in the From line
DMARCWhether an SPF or DKIM pass belongs to the domain in the visible From lineWhether the sender is honest, only whether they are who they claim

That last column is the part people get wrong. SPF and DKIM operate on domains a recipient never sees. DMARC is the mechanism that ties one of those passes back to the address on screen, which is why a message can pass SPF and still be a forgery of the name you trust: the envelope and the visible From are simply different domains.

The verdicts appear in an Authentication-Results header. Reading them is straightforward once you know where they come from, and there is one trap.

Anyone can write that header. A sender is free to put an Authentication-Results line in their own message saying everything passed. Only the copy added by the server that actually took delivery counts, which you identify by matching its name against the by host on the newest Received line. If a message carries two of them, that is itself worth noticing.

Our email header analyzer does this matching, rebuilds the delivery path in order, and says in one line whether the message is consistent. It runs in the browser, so the headers of a message about your own company do not travel to a third party to answer the question.

The sender line is two different things

An address in a mail header is a display name followed by the real address in angle brackets, and the display name is arbitrary text. That is not a flaw, it is the format working as specified, and it means a message can legitimately display as anything at all.

From, as written in the headers
From: "accounts@bigbank.example" <billing@sender-example.net>

A mail client shows the part in quotes. The message came from the part in brackets. Most clients on a phone show only the display name, which is why this still works after thirty years.

Two more places the same trick appears:

  • Reply-To. The message can display one address and send your reply to another. This is how invoice fraud keeps a conversation going from an address the victim never checks.
  • A quoted display name containing an address. Some readers take the first address they find. Read the last one in angle brackets, which is the one that actually sent.

Copy the link address rather than clicking it. Then read the host from right to left, because only the rightmost two labels decide who owns it.

Three links, one of them real
https://login.microsoftonline.com/common/oauth2/authorize
https://login.microsoftonline.com.secure-verify.example/auth
https://www.microsoft.com@collector.example/signin

The first is Microsoft. The second belongs to whoever registered secure-verify.example, who chose the rest to be read left to right. The third goes to collector.example, because a browser discards everything before an @ in the host, and always has.

Two further shapes are worth knowing:

  • A link carrying a link. A parameter such as next= or redirect_uri= holding another URL turns a real service into a doorway. The message genuinely starts at a domain you trust and does not end there.
  • Characters that are not the ones they look like. A Cyrillic small letter a is a different character from a Latin a and renders identically. Domains built from them are stored as xn-- names and displayed as the pretty form, which is the entire reason they are registered.

Our link checker takes a link apart, decodes the punycode so both forms are visible, finds the URL inside the parameter, and hands back a defanged copy for the ticket. It never fetches the link, which matters: a preview service that visits the page tells the sender their message was opened.

The attachment

A file name is a label. The first bytes of a file are what an operating system actually acts on, and the two disagree more often in phishing than anywhere else.

  • A file whose first two bytes are MZ is a Windows executable, whatever the name says. The same goes for %PDF, PK for anything zip based, and the rest of the short list of magic numbers.
  • Windows hides known extensions by default, so invoice.pdf.exe is displayed as invoice.pdf, with a matching icon if the sender bothered.
  • An archive with one file inside is not a compression decision. It is a way past a filter that inspects attachments.

Think before uploading it. Sending a suspicious file to a public scanning service publishes it to everyone with an account there, including the sender, who learns their message reached someone who investigates. If the file carries your company's data, that is a second incident. Hashing it locally and searching the hash answers the same question without the file leaving your machine. Our file hasher does it in the browser.

Three messages, three verdicts

The examples below are synthetic, written for this guide.

A forgery

DMARC fails at the receiving server. The display name is an address at a bank, the real sender is a different domain, Reply-To is a third. A link reads as the bank and points at a domain registered last week. Nothing here needs a fourth opinion: the sender is not who the message says, and that is decided.

A real message that looks wrong

SPF fails, DKIM passes, DMARC passes. The delivery path shows a mailing list in the middle. That is the normal outcome when a message is forwarded: the forwarder becomes the sending server, so SPF breaks, while the signature survives because the content did not change. A DMARC pass on a DKIM signature from the right domain is a pass.

A forgery that authenticates perfectly

Everything passes, because the attacker registered their own domain, published their own records and signed their own mail. Authentication proves the address is genuinely theirs. It says nothing about whether the name attached to it is one you have ever dealt with. This is the case that catches experienced people, and the only answer is the first question in this guide: what is the message asking for, and does the answer belong to a process you already have?

If someone already clicked

Speed matters more than certainty here, and the order is worth agreeing before you need it.

  1. Credentials first. If anything was typed into a page, change that password and end the sessions it protects. Resetting the password without revoking sessions leaves a signed-in attacker signed in.
  2. Check for what came after. A new mail rule that forwards or deletes messages is the usual first act after an account takeover, because it hides the conversations that follow.
  3. Collect the indicators once. Pull the addresses, domains, URLs and hashes out of the message and the logs in one pass, defanged, so they can be circulated without anyone clicking them. Our indicator extractor does that in the browser.
  4. Tell the people who received it too. A phishing message is rarely sent to one person, and the second recipient is usually the one who acts on it.

Making the next one harder

Triage is the part after prevention failed. Three changes move the most:

  • Publish DMARC at enforcement. A domain at p=reject cannot be forged in the simple way, which removes the most convincing kind of message. Getting there means publishing SPF and DKIM first, reading a fortnight of reports, fixing the senders you had forgotten and only then tightening. Our SPF and DMARC tool reads what you have and writes what you need.
  • Use phishing-resistant authentication where it counts. A code from an app is still something a person can be talked into typing into the wrong page. A hardware key or a passkey is bound to the site it was registered with, and cannot be handed to a lookalike.
  • Make reporting easier than deciding. If the cost of asking is a raised eyebrow, people stop asking. The organisations that catch these early are the ones where forwarding a suspicious message to the right place takes one click and no explanation.

The short version. Get the original message. Read the authentication result the receiving server recorded, not the one the sender wrote. Read the host of a link from right to left. Trust the first bytes of a file over its name. And remember that a message can pass every technical check and still be a fraud, because passing proves the address is genuinely the sender's, not that the sender is genuine.

References & further reading

  1. P. Resnick, Ed., RFC 5322: Internet Message Format. Defines the header fields, including the display name and address form that makes a From line two separate claims.
  2. S. Kitterman, RFC 7208: Sender Policy Framework (SPF) for Authorizing Use of Domains in Email. The authorisation mechanism, including the ten DNS lookup limit that quietly disables long records.
  3. D. Crocker, T. Hansen, M. Kucherawy, Eds., RFC 6376: DomainKeys Identified Mail (DKIM) Signatures. How a signature binds a message to a signing domain, which is not necessarily the domain a reader sees.
  4. M. Kucherawy, E. Zwicky, Eds., RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC). The alignment rules that connect an SPF or DKIM pass to the visible From address, and the reporting that makes enforcement possible.
  5. A. Costello, RFC 3492: Punycode. The encoding behind xn-- domain names, and therefore behind the lookalike domains that render identically to the ones they imitate.
  6. National Cyber Security Centre, Phishing attacks: defending your organisation. Layered guidance aimed at making reporting easy and reducing the consequences of a click rather than relying on people to spot every message.
  7. Cybersecurity and Infrastructure Security Agency, Recognize and Report Phishing. Public guidance on the behavioural signals, written for people who are not security specialists.
All guides Forensia

Want this tested on you?

Reading about it is one thing. Seeing it proven on your own systems is another.