VDP (Vulnerability Disclosure Policy) + security.txt: Public Location & Wording Templates

Vulnerability Disclosure Policy

The Calm Path to Vulnerability Disclosure

A bug report is either a quiet knock on your door or a flare shot over Twitter, and the difference is often one boring file in one predictable place. If youโ€™re shipping a US SaaS product, a clear Vulnerability Disclosure Policy (VDP) and a standards-aligned security.txt stop security reports from getting lost in support tickets or swallowed by a form that hates URLs.

VDP: A public, human-readable page explaining how to report issues, whatโ€™s in scope, and what “good-faith” testing means.

security.txt: The machine-readable pointer at /.well-known/security.txt that routes researchers to your contact info.

This post gets you to โ€œship it todayโ€ clarity: public locations, plain-English safe harbor, and copy-ready templates you can publish this afternoon. We’re moving past the “contact support” era to make your reporting door obvious, measurable, and boringly reliable.

  • No hero promises
  • No vague scope
  • No accidental legal trapdoors
Fast Answer: Publish a Vulnerability Disclosure Policy (VDP) page and advertise it via security.txt at https://YOURDOMAIN/.well-known/security.txt (the standardized location defined by the IETF). Keep wording crisp: define scope, safe harbor, how to report, what you wonโ€™t accept, response timelines, and coordinated disclosure expectations. Use security.txt to point to your VDP URL and a monitored contact channel so reports land in the right inbox fast.

Vulnerability Disclosure Policy

1) Ship it today: The minimum viable VDP + security.txt

Two assets, two jobs: VDP page (humans) vs security.txt (machines)

Think of your VDP as the lobby sign and your security.txt as the door buzzer. Humans read the VDP. Tools and scanners fetch security.txt automatically. When these two agree, you get fewer โ€œhey I found something???โ€ emails and more reports with steps, impact, and the right target.

I learned this the annoying way: years ago, we had a โ€œContact Supportโ€ link and no VDP. A researcher did the reasonable thing, filed a ticket, and the ticket got auto-closed as โ€œbilling-related.โ€ That bug then went on a tiny tour of the internet. Nobody was malicious. Our process was.

Your โ€œMVPโ€ checklist: contact, scope, safe harbor, timelines, disclosure rules

  • Contact: a monitored channel (email, form, or platform), plus optional PGP key
  • Scope: whatโ€™s in and whatโ€™s out (domains, apps, APIs, test envs)
  • Safe harbor: what you authorize in good faith and whatโ€™s prohibited
  • Timelines: realistic acknowledgement and update cadence
  • Disclosure: coordinated disclosure expectations, without chest-thumping promises
Takeaway: Your VDP and security.txt are a routing system, not a brag wall.
  • Make it easy to contact you fast
  • Make scope measurable, not poetic
  • Make safe harbor specific enough for counsel to sleep

Apply in 60 seconds: Create a shared inbox label called โ€œSECURITY-REPORTSโ€ and route security@ into it with alerts.

The hidden win: fewer Twitter DMs, more actionable reports

A public, standard location reduces chaos. Researchers (and their tooling) can quickly find: โ€œWho do I contact, and what are the rules?โ€ When that answer is obvious, people behave better. Not always, but more often. Thatโ€™s worth a small afternoon of work.


2) Public location first: Where security.txt must live (and why)

The canonical path: /.well-known/security.txt (standard)

The IETF standard for security.txt (RFC 9116) defines a โ€œwell-knownโ€ location: https://YOURDOMAIN/.well-known/security.txt. That predictability is the whole point. Tools donโ€™t want to guess your URL structure. They want to fetch one file and move on.

Root fallback: /security.txt as legacy compatibility, not the star

Some older guidance and validators still check /security.txt. If you want belt-and-suspenders compatibility, you can serve both. But treat the well-known location as canonical. (If you only do one, do the standardized one.)

If both exist: which one โ€œwinsโ€ (spoiler: well-known)

In practice, scanners and modern tooling prefer the well-known location because itโ€™s the standard. Your best move is to keep content identical in both places if you publish both, and avoid confusing redirects or mismatched contacts.

Small operator note: donโ€™t let marketing own these URLs. I once watched a VDP link get โ€œrebrandedโ€ into a campaign landing page with a cookie banner that blocked the content. The researcher wasnโ€™t impressed. Neither was the incident postmortem.


3) Wording that works: A VDP structure readers wonโ€™t misinterpret

Open with intent: โ€œWe welcome good-faith reportsโ€ (and define โ€œgood-faithโ€)

Start with what you want: reports that help you fix issues. Then define โ€œgood faithโ€ in operational terms. If you donโ€™t define it, people will. And they will screenshot your vagueness like it owes them money.

Good-faith usually means: you avoid privacy violations, you minimize disruption, you donโ€™t extort, you report promptly, and you follow scope rules.

Define scope like a map: domains, apps, APIs, repos, and exclusions

Scope is where most โ€œlegal chaosโ€ is born. Write it like a deployment inventory. If itโ€™s in scope, list it. If itโ€™s out of scope, list it. If you donโ€™t know, say how a researcher can ask.

  • In scope: app.yourdomain.com, api.yourdomain.com, iOS/Android app, public docs site
  • Explicitly out of scope: third-party hosted marketing site builder pages, employee personal devices, physical offices
  • Conditional scope: staging environments (only if explicitly listed, and only if non-production data)

Promise what you can keep: acknowledgements, updates, and resolution windows

Resist the temptation to write heroic SLAs you canโ€™t maintain. A simple, honest cadence beats a fast lie. Example: โ€œWe aim to acknowledge within X business days and provide status updates every Y days for in-scope reports.โ€ Thatโ€™s realistic and sets expectations without handcuffing you. If you want a clean way to align โ€œpolicy promisesโ€ with โ€œoperational reality,โ€ borrow the structure from a vulnerability remediation SLA and keep your timelines measurable.

Takeaway: The best VDPs read like an operating manual, not a courtroom speech.
  • Define scope with assets, not vibes
  • Define โ€œgood faithโ€ with behaviors
  • Define timelines you can actually meet

Apply in 60 seconds: Replace any โ€œwe willโ€ promises with โ€œwe aim to,โ€ unless you truly mean โ€œwill.โ€


Vulnerability Disclosure Policy

4) Safe harbor clarity: The paragraph that prevents panic (and lawyers)

What safe harbor usually covers: authorized testing boundaries + good-faith expectations

Safe harbor is your โ€œwe wonโ€™t punish the helpful peopleโ€ clause, within boundaries. In the US, many organizations adapt language aligned with government guidance on coordinated vulnerability disclosure and vulnerability disclosure policies, including CISAโ€™s VDP template. The goal: encourage responsible reports while clearly prohibiting harm. If your team is still formalizing how security work fits into the business, pairing this with a lightweight security testing strategy keeps policy, testing, and triage from drifting apart.

What you still prohibit: extortion, social engineering, privacy violations, disruption

This is where you get specific. You can welcome research while still banning the stuff that wrecks lives or uptime:

  • Extortion or ransom demands
  • Social engineering of employees or contractors
  • Accessing, modifying, or exfiltrating user data beyond whatโ€™s necessary to prove impact
  • Denial-of-service testing or heavy automated scanning that degrades service

โ€œHereโ€™s what no one tells youโ€ฆโ€ safe harbor fails when scope is fuzzy (make it measurable)

If scope is vague, safe harbor becomes a misunderstanding factory. A researcher thinks theyโ€™re โ€œhelpingโ€ on anything under your brand. Your counsel reads it as โ€œwe authorized weird stuff.โ€ Make the boundary measurable: domains, IP ranges (if you must), apps, and exact behaviors that are OK versus not OK.

Short Story: The Bug Report That Almost Turned Into a Lawsuit (120โ€“180 words) โ€ฆ
We once had a partner integration that lived on a separate subdomain. It looked like ours. It wasnโ€™t ours. A researcher found an auth issue and, trying to be helpful, tested it across multiple accounts. Their email started polite, then got anxious: โ€œYour policy says you authorize good-faith research.โ€ Our legal team saw โ€œauthorization,โ€ our ops team saw โ€œunknown access,โ€ and everyoneโ€™s blood pressure got a pay raise.

The researcher wasnโ€™t trying to cause harm. They were trying to prove impact. But our scope section didnโ€™t list the integration subdomain, and our safe harbor didnโ€™t state limits on data access. We resolved it, but the emotional damage was real. The fix wasnโ€™t a better lawyer. The fix was a better sentence: list what you own, list what you donโ€™t, and clearly state boundaries on data access and disruption.


5) Template pack: Copy-ready VDP clauses (modern, plain-English)

Below are copy-ready clauses you can paste into a VDP page. Adjust specifics (domains, timelines, contact) and have counsel review if your org is regulated or you have strict contractual obligations. The goal is clarity, not intimidation. If youโ€™re also reviewing your legal posture around third-party testing, itโ€™s worth skimming penetration test limitation of liability language patterns so your VDP doesnโ€™t accidentally promise what your contracts donโ€™t support.

Intake clause: what to include in a report (steps, impact, PoC, affected assets)

Reporting a vulnerability

Please include enough detail for us to reproduce and verify the issue:

  • Product/feature and affected URL, endpoint, or app version
  • Steps to reproduce (numbered steps preferred)
  • Expected vs actual behavior
  • Impact description (what could an attacker achieve?)
  • Any proof-of-concept code or screenshots (redact sensitive data)

If youโ€™re unsure whether something is in scope, contact us first and weโ€™ll guide you.

Coordinated disclosure clause: timelines, credit, and publication expectations (without overpromising)

Coordinated disclosure

We support coordinated vulnerability disclosure. If your report is in scope and submitted in good faith, we aim to acknowledge receipt within [X business days] and provide status updates at least every [Y days] until resolution or closure. We may request additional information to validate impact.

If you would like public credit, tell us your preferred name/handle. We may list acknowledgements at our discretion after the issue is resolved.

Non-commitment clause: โ€œwe may not respond to out-of-scopeโ€ without sounding hostile

Out of scope

To keep response times fair for everyone, we may not respond to reports that are clearly out of scope, lack reproducible steps, or involve prohibited testing (e.g., denial-of-service, social engineering, or unnecessary access to user data).

Operator note: write like a calm adult. Threatening language doesnโ€™t โ€œscare off bad actors.โ€ It mostly scares off the helpful people and leaves you with the worst kind of silence.


6) security.txt fields: What to include (and what to avoid)

Core fields youโ€™ll actually use: Contact, Policy, Acknowledgments, Encryption, Expires

The RFC defines how security.txt should be structured and which fields can appear. Most SaaS teams only need a handful:

  • Contact: email (mailto:security@yourdomain.com) or a secure form URL
  • Policy: your VDP URL (canonical)
  • Acknowledgments: optional URL for credits
  • Encryption: optional URL to a PGP key
  • Expires: a date so youโ€™re forced to review and keep it fresh

Choose one simple URL, like /vdp or /security, and keep it stable even if your site redesigns. If you must move it, use a clean redirect that doesnโ€™t break tooling (no login walls, no infinite redirects, no โ€œchoose cookies to view policyโ€).

Avoid โ€œbroken windowsโ€: expired dates, dead inboxes, and vague contact routes

Nothing says โ€œwe donโ€™t actually want reportsโ€ like an expired Expires date or a mailbox that bounces. Treat this like an on-call number: it should be boringly reliable. If youโ€™re building the rest of your baseline program, pairing this with a simple security metrics for founders dashboard helps you prove the VDP isnโ€™t just โ€œpolicy theater.โ€

Show me the nerdy details

Formatting basics: security.txt is a plain text file using a simple โ€œField: valueโ€ format. Many fields accept URLs (including mailto:). Tools often fetch /.well-known/security.txt automatically, parse fields, and follow the Policy link for the human-readable VDP. Keep lines clean, avoid HTML, and validate that your server returns it with a normal 200 OK response.

Example security.txt (copy-ready)

Contact: mailto:security@YOURDOMAIN.com
Policy: https://YOURDOMAIN.com/vdp
Acknowledgments: https://YOURDOMAIN.com/security/acknowledgments
Encryption: https://YOURDOMAIN.com/.well-known/pgp-key.txt
Expires: 2026-08-31T23:59:59Z
Preferred-Languages: en
  

Neutral action: After publishing, fetch the file from a clean browser session and confirm the content matches exactly.


7) Common mistakes: The fastest ways to create security debt in public

Mistake: publishing a VDP that invites โ€œanything anywhere anytimeโ€ (unbounded scope)

If your scope reads like โ€œall our stuff forever,โ€ you just authorized chaos. Your researchers will interpret it broadly. Your legal team will interpret it narrowly. Your ops team will interpret it at 2:07 a.m. during an incident. Nobody wins. A practical hedge is to align the VDP scope language with how you already scope security work in security testing strategy docs, so policy and practice donโ€™t quietly contradict each other.

A VDP that starts with โ€œUnauthorized access is prohibited and will be prosecutedโ€ may be technically true, but itโ€™s strategically self-sabotage. Safe harbor language exists so good-faith researchers know you wonโ€™t treat them like criminals for being helpful within clear boundaries.

Mistake: redirects that break tooling or land on generic HTML (validators fail)

Keep /.well-known/security.txt a plain text file. Avoid โ€œsmartโ€ routing that transforms it into an HTML page or a marketing redirect. Tools expect a predictable, parseable response. Your future self also expects that.

Personal scar: I once chased a โ€œmissing security.txtโ€ alert that turned out to be a CDN rule rewriting unknown paths to /index.html. So the file existedโ€ฆ as a homepage. It was the most technically correct wrong thing Iโ€™ve ever seen.


8) Donโ€™t do this: Anti-pattern wording that triggers chaos

โ€œWe will respond in 24 hoursโ€ (unless you truly will)

If you canโ€™t guarantee it on a holiday weekend with two people sick and a board meeting on Monday, donโ€™t promise it. Write a target you can meet. Consistency beats speed theater.

โ€œWe pay bountiesโ€ (if you donโ€™t) and โ€œNo public disclosure everโ€ (unrealistic)

Donโ€™t imply money unless you have a real program. If you want a VDP without payouts, say so plainly. Also, โ€œNo disclosure everโ€ reads like youโ€™re trying to bury problems. Coordinated disclosure is about timing and safety, not permanent silence.

โ€œLetโ€™s be honestโ€ฆโ€ vague promises become screenshots in someoneโ€™s thread

Anything vague will be interpreted in the least charitable way at the worst possible time. Replace โ€œpromptly,โ€ โ€œreasonable,โ€ and โ€œquicklyโ€ with a measured cadence, and keep your scope and prohibitions crisp. If you want a simple way to operationalize โ€œmeasured cadence,โ€ mirror the same cadence logic youโ€™d use when you read a penetration test report: timelines, owners, and concrete next actions beat vibes.

Takeaway: Your future incident response will be limited by your past public wording.
  • Promise targets, not heroics
  • Ban harmful testing explicitly
  • Make ambiguity rare and boring

Apply in 60 seconds: Search your draft for โ€œreasonable,โ€ โ€œprompt,โ€ and โ€œas soon asโ€ and replace each with a concrete cadence or remove it.


9) Who this is for / not for: Fit check before you publish

For: SaaS, startups, agencies, public websites, APIs, and app teams

If you operate anything on the public internet, you benefit. Even if your โ€œproductโ€ is mostly behind login, your perimeter still has marketing pages, docs, auth flows, APIs, and integration endpoints. Bugs donโ€™t care about your org chart. If your surface area includes auth and identity flows, consider pairing the VDP with your core identity narrative, especially SAML SSO for SaaS and how you handle enterprise trust signals.

Not for: organizations needing export-controlled reporting workflows or formal bug bounty ops (yet)

If you handle export-controlled systems, certain government contracts, or strict regulated workflows, you may need a more formal intake mechanism and legal review. You can still publish a VDP, but youโ€™ll want guardrails and potentially a coordinated intake platform.

When you should upgrade: adding a platform, triage SLAs, or third-party coordination

If you start receiving higher volume or higher severity reports, or your enterprise customers ask โ€œwhatโ€™s your vulnerability disclosure process?โ€, thatโ€™s a sign to upgrade: formal triage, severity taxonomy, and a tighter on-call rotation. For many teams, the โ€œupgrade momentโ€ is also when you formalize incident posture, for example by adding an incident response retainer so youโ€™re not improvising under pressure.

Money Block: Eligibility checklist (binary yes/no + one-line next step)

  • Do you run a public web property or API? Yes/No โ†’ If yes, publish VDP + security.txt.
  • Do you have a monitored security contact? Yes/No โ†’ If no, set up security@ first.
  • Can you acknowledge reports within 3โ€“7 business days? Yes/No โ†’ If no, set expectations explicitly.
  • Do you know your in-scope assets? Yes/No โ†’ If no, start with your top 3 domains/apps.
  • Do you prohibit disruption and privacy violations? Yes/No โ†’ If no, add it now.

Neutral action: Circle the first โ€œNoโ€ and fix only that this week.


Put it where people look when theyโ€™re hunting for policy pages: the footer. Make the link text explicit. โ€œSecurityโ€ is fine; โ€œReport a vulnerabilityโ€ is even better. Keep it outside login walls.

Support + Trust Center alignment: donโ€™t bury it behind login

If you have a Trust Center, link the VDP there too. If you have a support portal, add a small โ€œSecurity issue?โ€ callout that routes to the VDP and the security inbox. The fastest way to lose a good report is to force a researcher to create an account, confirm an email, and then fill out a form that rejects URLs.

Internal routing: ticketing + on-call + severity tags (make triage boring, fast)

Make triage boring. Boring is good. Boring means it works. Route inbound reports to a ticketing queue with severity tags and owners. Decide who reads it first, who can pull engineers in, and who writes back to the reporter. If your team is small, the fastest โ€œboring winโ€ is to standardize the queue and then invest in baseline enablement, like 1 hour a month security training so engineers know what โ€œgoodโ€ looks like when a report lands.

Money Block: Decision card (When A vs B; time/cost trade-off)

If youโ€™re small (0โ€“2 security people): Use security@ + ticketing queue + simple VDP. Time: set up in 1โ€“3 hours. Trade-off: more manual triage.

If youโ€™re growing (high volume or enterprise pressure): Add an intake platform or structured form + triage workflow. Time: days to weeks. Trade-off: better routing, less spam, clearer audit trail.

Neutral action: Pick the smallest option that you can keep consistent for 90 days.


FAQ

What is a Vulnerability Disclosure Policy (VDP)?

A VDP is a public page that explains how people should report security vulnerabilities to you, whatโ€™s in scope, what behaviors are authorized in good faith, whatโ€™s prohibited, and what timeline they can expect. Itโ€™s a process contract, written for humans.

Where should security.txt be located on a website?

The standardized location is /.well-known/security.txt on your domain. Some teams also serve /security.txt for legacy compatibility, but the well-known path is the modern, standards-aligned target.

What should a security.txt file contain?

At minimum, a monitored Contact route and a Policy URL pointing to your VDP. Many teams also include Expires to force periodic review, plus optional links for encryption keys and acknowledgements.

Do I need safe harbor language in my VDP?

If you want good-faith researchers to report privately instead of going public, safe harbor language helps. It clarifies what you authorize within scope and what you wonโ€™t pursue legally when the researcher follows the rules. It also clarifies prohibited behaviors (extortion, disruption, privacy violations).

What should be in scope vs out of scope for VDP testing?

In scope should be your owned and operated assets: specific domains, apps, APIs, and repositories. Out of scope commonly includes denial-of-service testing, social engineering, physical security, third-party systems you donโ€™t control, and any access to user data beyond whatโ€™s necessary to prove impact.

Can researchers publicly disclose before a fix is available?

Set expectations for coordinated disclosure: ask for a reasonable window while you investigate and fix, and commit to status updates. Avoid demanding โ€œnever discloseโ€ forever. You want alignment on timing and safety, not a permanence clause that nobody respects.

Should we offer bug bounties or just a VDP?

A VDP alone is enough to start. Bug bounties are a separate commitment (budget, triage capacity, rules). If you canโ€™t reliably triage, paying for more inbound reports can overwhelm you. Start with VDP + routing; add bounty later if it matches your maturity and goals.

How fast should we acknowledge a vulnerability report?

Choose a target you can meet consistently. Many teams pick a few business days for acknowledgement and a weekly update cadence for in-scope reports. The best timeline is the one you wonโ€™t quietly abandon in month two.

How do we handle reports about third-party dependencies?

Say how you handle coordinated disclosure for third-party components: youโ€™ll validate the report, coordinate with the vendor or maintainer when appropriate, and communicate status updates. If youโ€™re part of a larger ecosystem, referencing coordinated vulnerability disclosure practices helps set expectations.

How do we avoid getting spam and low-quality submissions?

Use tight scope, clear โ€œwhat to includeโ€ requirements, and a single canonical contact route. Consider a structured form or platform if volume is high. Most importantly, publish what you will not accept: disruption, social engineering, and vague โ€œsomething seems offโ€ reports with no reproduction steps.


12) Next step: One concrete action you can do in 30 minutes

Publish /vdp (or /security) and add /.well-known/security.txt pointing to it

If you do nothing else today, do this: publish one stable URL for your VDP and make security.txt point to it. The standard exists so researchers donโ€™t have to hunt. Help them help you.

Add a monitored alias (e.g., security@) + triage owner

Name an owner. Not a team. A human. (Teams are wonderful, but teams can also be invisible at 6:40 p.m. on Friday.) Make sure at least two people can access the inbox and ticket queue.

Set Expires so youโ€™re forced to review, not forget

Expires is a small act of humility: โ€œWe will revisit this.โ€ Put a calendar reminder when the date approaches. The best security policies are the ones that stay alive.

Money Block: Mini calculator (inputs โ‰ค3; output 1โ€“2 lines)

Inputs: (1) expected reports/week, (2) average triage minutes/report, (3) available triage hours/week

Output: If (reports ร— minutes) > (hours ร— 60), you must tighten scope or add triage capacity before promising faster timelines.

Neutral action: Pick conservative inputs and set timelines based on the result, not optimism.

Vulnerability Disclosure Policy

Infographic: The โ€œCalm Pathโ€ from Bug to Fix

1) Researcher finds issue

Looks for /.well-known/security.txt

2) security.txt routes them

Contact + Policy link (VDP)

3) VDP sets boundaries

Scope + safe harbor + prohibitions

4) Triage stays boring

Ticket + owner + updates

5) Fix + coordinated disclosure

Resolution, then credit (optional)

Goal: fewer misunderstandings, faster verification, and a paper trail youโ€™ll be glad you have later.

Two final buttons for teams that want official-ish language and coordinated disclosure framing. These are useful references even if you donโ€™t copy them verbatim.


Conclusion

Remember the question from the top: will the next researcher report calmly or post angrily? You canโ€™t control people, but you can control the door you build. A VDP with clear scope and safe harbor, plus a standards-aligned /.well-known/security.txt, turns โ€œrandom inbound chaosโ€ into a boring, fixable queue. And boring, in security, is a compliment.

Your next step in the next 15 minutes: publish a simple /vdp page, create /.well-known/security.txt that points to it, and make sure a real human owns the inbox. Thatโ€™s how you trade legal chaos for operational calm. If you want the rest of your foundations to match this calm, lock down the basics that tend to leak into incidents, like startup secrets management and cloud misconfigurations, so the reports you get are rarer, cleaner, and easier to close.

Last reviewed: 2026-02