How to Triage a Stranger's Vulnerability Report Safely and Quickly
For teams who receive an unexpected security report by email and need to decide whether it is real, urgent, or a scam. This runbook gives you a practical triage path, exact checks to run, and safe next steps for validating, fixing, and responding without making things worse.
TL;DR — Treat every unsolicited vulnerability email as untrusted until verified, but do not ignore it. The most common outcome is either a real but low-context issue or a scam asking you to click a link; the safest first move is to validate the sender and reproduce the claim yourself in a staging or read-only way before changing anything. Reading time: ~6 min
The scenario
It is a normal Tuesday afternoon and an email lands in your shared inbox with a subject like "Critical vulnerability in your website". The sender says they found a bug, includes a screenshot or a link to "proof," and asks you to reply quickly before they "go public." Your project manager forwards it around, your client is asking whether customer data is at risk, and nobody wants to click the attachment. You need to answer two questions fast: is this real, and what do we do next without turning a weird email into an actual incident?
Symptoms
- An unsolicited email claims your site, app, API, or login page has a "critical," "high severity," or "RCE" (remote code execution) issue.
- The message includes one or more of these:
- A link to a third-party "proof" page.
- An attachment such as
.html,.zip,.js, or a screenshot. - A demand for payment, a deadline, or a threat to publish.
- Technical terms but no exact reproduction steps.
- You may see matching signs in your own systems:
- Web access logs with unusual requests such as:
GET /.env HTTP/1.1
GET /wp-admin/install.php HTTP/1.1
GET /?id=1%27%20OR%201=1-- HTTP/1.1
POST /graphql HTTP/1.1
- Error spikes like
403,404,500, or401around the time mentioned. - Unexpected admin logins, password reset emails, or new API tokens.
- A browser warning or scanner result you can reproduce yourself.
- In many cases, there are no internal signs at all; the only "evidence" is the email itself.
Likely causes
| Cause | How common | Quick check |
|---|---|---|
| Scam or phishing email posing as a security report | Very common | In your mail app, open the message details and inspect the full sender address and links without clicking them |
| Real issue, but poorly reported (missing steps, vague severity) | Common | Open the reported URL in a private/incognito window and try the exact path or action they described |
| Automated scanner found an exposed file, header, or old software version | Common | In your provider dashboard, open access logs for the reported path/time and look for matching requests |
| False positive from a generic scanner | Common | Reproduce with a second source, such as your browser dev tools or a trusted scanner your team already uses |
| Actual account compromise or leaked credential, not just a "bug" | Less common but high risk | In your app/admin dashboard, review recent logins, password resets, and newly created users or tokens |
| Extortion/bug-bounty demand without proof | Less common | Search the email for a working proof of concept (exact URL, payload, affected account, timestamp); if none, treat as unverified |
Step-by-step diagnosis
-
Do the safe email triage first. In your mail app, use View original, Show source, or Message details. Hover over links; do not click them.
- This is your problem if: the visible sender and real sender differ, links point to unrelated domains, or the message pushes you to open an attachment or pay.
- Jump to: Fixes → Scam or phishing email posing as a security report.
-
Look for concrete reproduction steps in the email. You want an exact URL, endpoint, parameter, account type, timestamp, and expected result.
- This is your problem if: the report says things like "your site is vulnerable" but gives no exact path, no payload, and no screenshot you can verify.
- Jump to: Fixes → Extortion/bug-bounty demand without proof.
-
Try to reproduce safely in the browser first. Use a private/incognito window. If they mention a public page, open only that page or path. Do not run JavaScript from the email and do not upload files they sent.
- This is your problem if: you can see the issue yourself, such as a public debug page, directory listing, exposed file, missing login protection, or a reflected error.
- Jump to: Fixes → Real issue, but poorly reported or Fixes → Automated scanner found an exposed file, header, or old software version depending on what you found.
-
Check your logs for the reported path and time. In your hosting or CDN dashboard, open request logs or access logs for the domain. If your provider offers a search box, search the exact path from the report.
- CLI option if you have server access:
grep 'GET /.env\|GET /wp-admin/install.php\|POST /graphql' /var/log/nginx/access.log | tail -n 50
- This is your problem if: you see repeated probes for common files (
/.env,/config.php,/server-status) or obvious injection attempts. - Jump to: Fixes → Automated scanner found an exposed file, header, or old software version.
-
Check for signs of account misuse. In your app admin, identity provider, or cloud dashboard, review recent logins, MFA (multi-factor authentication) changes, password resets, and API tokens.
- Generic places to look: your app's Admin → Users / Audit log, your identity provider's Security → Sign-in logs, and your cloud provider's IAM (identity and access management) → Users / Access keys / Audit logs.
- This is your problem if: you find logins from unknown locations, new admin users, new API keys, or password resets nobody requested.
- Jump to: Fixes → Actual account compromise or leaked credential.
-
Validate with a second source before calling it real. If the report claims a missing security header or exposed version, check it yourself in browser dev tools or with a trusted command.
curl -I https://yourdomain.com/
- This is your problem if: the result clearly matches the claim, for example a missing header, a version banner, or a public file returning
200 OK. - Jump to: the matching fix section.
- If not: go to Fixes → False positive from a generic scanner.
Fixes
Scam or phishing email posing as a security report
Do not click links or open attachments. Move the message into your internal security review flow and preserve a copy of the raw email.
- In your mail app, use View original or Download .eml and save it.
- Report it internally as suspicious.
- If the message targeted shared credentials or admin staff, rotate sensitive passwords and review MFA settings.
If you control your domain email security, check whether the sender passed SPF, DKIM, and DMARC (email anti-spoofing checks) in the message headers.
Verify it worked: the email is preserved for review, nobody clicked the payload, and any exposed credentials have been rotated.
Real issue, but poorly reported
If you can reproduce the issue, write your own clean internal ticket with exact steps, affected URLs, and risk. Then fix the smallest exposed surface first.
Examples:
- Public debug page or stack trace: disable debug mode in your app config.
{
"debug": false
}
- Public directory listing in nginx:
location / {
autoindex off;
}
- Public admin route that should be protected: add authentication at the app or reverse proxy layer.
⚠️ If you are changing auth rules, web server config, or app settings in production, you can lock out real users or cause downtime. Apply in staging first if you have it, or schedule a short maintenance window.
Verify it worked: repeat the exact reproduction steps in a private window and confirm the page now returns the expected result, usually 403, 404, or a login prompt.
Automated scanner found an exposed file, header, or old software version
This is often a real hardening issue even if there is no active breach.
Common remediations:
- Block access to sensitive dotfiles in nginx:
location ~ /\.(?!well-known) {
deny all;
return 404;
}
- Remove version banners where possible.
server_tokens off;
- If a known public file exists, remove it from the web root and redeploy.
- Patch outdated software in your provider dashboard or deployment pipeline.
CLI example for a package-based server:
sudo apt update && sudo apt upgrade -y
Verify it worked:
curl -I https://yourdomain.com/.env
You want 403 Forbidden or 404 Not Found, not 200 OK.
False positive from a generic scanner
Document why it is not reproducible and avoid emergency changes.
- Capture your own evidence:
curl -I https://yourdomain.com/
- Save a screenshot or response showing the claimed issue does not exist.
- Reply once, briefly, asking for exact reproduction steps if you want to continue the conversation.
Suggested reply:
Thanks for the report. We could not reproduce the issue from the details provided. Please send the exact URL, request, affected account type, timestamp, and expected vs actual result.
Verify it worked: your team has a written record of the validation and no production changes were made based on an unverified claim.
Actual account compromise or leaked credential
Treat this as an incident, not a bug report.
⚠️ Rotating credentials and forcing logouts can interrupt live integrations, background jobs, and customer sessions. List affected systems first so you can recover them in order.
Immediate actions:
- Disable or rotate the affected credentials in the relevant dashboard.
- Force password resets for impacted users or admins.
- Revoke unknown API tokens and sessions.
- Review audit logs for actions taken by the suspicious account.
CLI examples where applicable:
# Example: rotate an app secret in an environment file, then redeploy
APP_SECRET=$(openssl rand -hex 32)
echo "$APP_SECRET"
If your app uses environment variables, update them in your hosting dashboard under Environment variables / Secrets, then redeploy.
Verify it worked: suspicious sessions are revoked, new logins require fresh credentials, and no unknown tokens remain active.
Extortion/bug-bounty demand without proof
Do not pay, do not negotiate under time pressure, and do not accept claims without evidence.
- Ask for a minimal safe proof: exact URL, timestamp, affected environment, and a non-destructive reproduction.
- If they claim data access, ask for a harmless sample such as the last 4 characters of a record ID you can verify internally, not full customer data.
- If they refuse and only demand payment, close the loop and keep the email for records.
Suggested reply:
Thanks for reaching out. We take security reports seriously, but we need exact, non-destructive reproduction steps to validate the claim. Please send the affected URL or endpoint, timestamp, request details, and the observed result. Do not send customer data or exploit code that changes data.
Verify it worked: you have either received enough detail to validate safely or you have documented the claim as unverified extortion.
Prevention
- Create a standard intake path for security reports. Publish a simple contact address like
security@yourdomain.comand a short policy page.
Please include: affected URL/endpoint, timestamp, steps to reproduce, expected vs actual result, and a safe proof. Do not send customer data or destructive payloads.
- Turn on request logging for public apps and keep at least 30 days. In your hosting or CDN dashboard, enable access logs and retain them long enough to investigate reports.
- Add a basic hardening check to CI/CD (build and deploy pipeline). For example, fail a deploy if sensitive files are present in the web root.
test ! -f public/.env && test ! -f public/config.php
- Run a trusted external check after deploys. Even a simple header and path check catches common issues.
curl -I https://yourdomain.com/ && curl -I https://yourdomain.com/.env
- Protect admin access with MFA and audit logs. In your identity provider or app admin, require MFA for admins and review sign-in logs weekly.
- Keep a response template ready. Store the two reply templates above in your shared inbox so your team does not improvise under pressure.
This article was written by an AI system and published pending human review. Verify anything you intend to act on.
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI