Disclosure and bounties
How to Publish a Security Disclosure Policy a Whitehat Will Actually Use
A security disclosure policy is the published set of rules that tells a researcher where to send a vulnerability report, what they may test and what happens next. On September 2, 2026, only 3 of the 30 largest DeFi protocols by TVL served a security.txt file, and one of those three met RFC 9116. This guide gives protocol teams the policy wording, the file, the SEAL Safe Harbor steps and the response deadlines, each tied to a published source or to the terms real adopters set.
Key facts
- Canonical file
- /.well-known/security.txt per RFC 9116 (April 2022), served over HTTPS as text/plain; only Contact and Expires are mandatory
- Measured adoption
- 3 of the 30 largest DeFi protocols by TVL serve the file and 1 is RFC-compliant; 1 of 20 reachable DSA member sites serves it (September 2, 2026)
- Safe harbor
- SEAL Whitehat Safe Harbor: on-chain adoption, 72-hour return window, cap at or below the bug bounty, 20+ protocols and 68 billion dollars covered
- Response benchmarks
- Acknowledge within 3 business days and assess within 7 (CISA); fix within 90 days, or 7 when exploited (Project Zero)
- Emergency channel
- SEAL 911 Telegram bot, volunteer-run, 3,300+ tickets and 200+ war rooms since launch
Why disclosure channels fail
The best-documented whitehat rescue in DeFi did not start with a security disclosure policy. When samczsun found a bug exposing about 25,000 ETH in Lien Finance in , he reached the team by pinging a contact at ConsenSys Diligence and then the ETHSecurity Telegram channel, because no direct channel existed. The fix itself had to travel through a private transaction relay so that nobody could front-run it. Six years later, most of the largest protocols still publish no machine-readable route for a report.
We measured it on . For each of the 30 largest protocols by total value locked on DefiLlama, we requested /.well-known/security.txt from the website DefiLlama lists for the protocol. All 30 sites responded. Three served a file: Lido, JustLend and Binance. Only JustLend's file carried the Expires field that RFC 9116 makes mandatory. Curve, outside the top 30, served a file whose Expires date had passed on , so a strict parser treats it as stale. Of the 23 DeFi Security Alliance member firms, three websites did not respond, and one of the remaining 20 publishes the file.
The wider internet looks similar. An IoT Defense scan of 241 million domains in early 2026 found the file on 0.238 percent of them, and 7.3 percent of the files it found had already expired. A separate scan of 623 European software vendors by CRA Incident Drill found that 76 percent had no valid file at the canonical path.
Four failure modes explain most of the misses.
- No channel at all
- The researcher guesses an email address, opens a Discord ticket or asks an auditor for an introduction. Every hop leaks the finding to more people.
- A channel nobody reads
- An expired file, an unattended mailbox or a contact that belongs to the hosting platform. In the IoT Defense scan, 60.3 percent of files pointed to contacts at identifiable platforms rather than at the domain owner.
- No written testing limits
- In , Kraken and CertiK argued in public over whether withdrawing close to 3 million dollars to demonstrate a deposit bug was testing or, in the words of Kraken's chief security officer, extortion. The funds went back within days. The argument happened because proof-of-concept limits were never written down.
- A promise that was never funded
- In , Protos reported that a researcher who disclosed a bug putting about 500 million dollars at risk in Injective through Immunefi was offered 50,000 dollars against an advertised 500,000 dollar maximum, and that even the smaller sum had not been paid. Injective did not respond to Protos before publication.
Vulnerability disclosure policy wording you can adapt
A vulnerability disclosure policy (VDP) is the human-readable half of the system; the file described in the next section only tells a researcher where the policy lives. Start from the public-domain disclose.io terms rather than from a competitor's page, and have counsel review the result. Nothing here is legal advice.
Seven clauses do the work. Adapt the wording and keep the order, which runs from what a researcher settles before testing to what comes up after a report.
- Scope
- List the contracts by address and chain, the repositories by URL and commit, and the front end by domain. Say which of them are in scope. A policy that covers "all our systems" is a policy nobody can rely on.
- Safe harbor
- The disclose.io core terms need four elements: authorization under anti-hacking law such as the CFAA or the Computer Misuse Act, an exemption from anti-circumvention law such as the DMCA, an exemption from your own terms of service during testing, and an acknowledgment that research under the policy is conducted in good faith. A policy that omits the third element leaves its own researchers exposed, because driving a deployed contract from a script usually breaks the front end's terms of use. Name the governing law and the entity granting the authorization as well: a foundation in one jurisdiction and a front end operated from another need the clause to say which law applies.
- Testing rules
- Reproduce on a local fork. Do not change mainnet state, do not move other users' funds, and stop at the smallest proof that demonstrates impact. Write the limit as a number: "a proof of concept must not move more than X in value on a live network" is the sentence Kraken and CertiK were missing.
- Reporting channel
- One encrypted channel first (a secure upload form or a PGP key) and one plain mailbox second. Name the fields a usable report contains: affected contract, chain, commit, impact, reproduction steps on a fork and a wallet for the reward.
- Response commitments
- State the acknowledgment window, the assessment window and the resolution target, using the benchmarks in the table below. A number you can meet beats a number you copied.
- Rewards and identity
- State whether a bounty exists, where it is hosted, which severity rubric applies and at which severity tier the researcher must complete KYC checks. If the program is escrowed on chain, link the vault.
- Coordinated disclosure timeline
- Say when the researcher may publish. The Google Project Zero baseline is 90 days to ship a fix plus 30 days for users to apply it, dropping to 7 days when the bug is already being exploited. A protocol that can pause or upgrade within hours can honestly promise a shorter window.
Publish the policy at a stable URL, link it from the SECURITY.md file of every public repository and from the Policy field of security.txt, and put a revision date on it. The researcher-side view of the same process is covered in how to report a DeFi vulnerability and get paid.
A team with no token, no governance vote and no bounty budget can still ship the minimum: the security.txt from the next section with a role mailbox that two people read, the disclose.io core terms adopted verbatim and a published acknowledgment window of three business days. Add the bounty when there is a funded amount to put behind it, not before. Expect the public channel to bring low-quality reports as well, and budget the triage hours for them.
security.txt fields under RFC 9116, one by one
RFC 9116, published in as an Informational RFC, defines a plain-text file that scanners and people can find at a fixed location. The rules that trip teams up are short. The file must live at /.well-known/security.txt, it must be served over HTTPS as text/plain, and of its eight fields only two are required. When a copy also sits at the site root, the /.well-known/ copy is authoritative.
| Field | Required | What to put | Mistake to avoid |
|---|---|---|---|
| Contact | Yes | One or more URIs in order of preference. Trail of Bits lists a SendSafely upload link first and a mailbox second. | A personal address that leaves with the employee. |
| Expires | Yes | An ISO 8601 timestamp less than a year ahead. Put the renewal in a calendar. | Missing from two of the three top-30 files we found, and already past on Curve's file. |
| Encryption | No | A URI to your PGP key. | The key itself pasted into the field, which the RFC forbids. |
| Canonical | No | The URI of this file, so a signature covers the right location. | The home page instead of the file. |
| Policy | No | The URL of the VDP from the previous section. | Left out, so the file points nowhere for scope or safe harbor. |
| Preferred-Languages | No | Language tags, such as en, zh in JustLend's file. | A single language for a team that reads two. |
| Acknowledgments | No | A page crediting past reporters. | A hall of fame behind a login. |
| Hiring | No | Security job listings. | Marketing pages that are not jobs. |
Binance's file, one of the three we found, carries a Bug Bounty line that is not an RFC 9116 field, so parsers skip it. The RFC also recommends signing the file with an OpenPGP cleartext signature.
Contact: https://example-protocol.org/security/report
Contact: mailto:security@example-protocol.org
Expires: 2027-06-30T00:00:00.000Z
Encryption: https://example-protocol.org/security/pgp-key.txt
Canonical: https://example-protocol.org/.well-known/security.txt
Policy: https://example-protocol.org/security/disclosure-policy
Preferred-Languages: en
Mirror the same contact in SECURITY.md and in the bounty listing. A researcher looks in those three places, in that order, before asking around.
SEAL Safe Harbor adoption steps and trade-offs
The Security Alliance's Whitehat Safe Harbor is a public, unilateral offer from a protocol to any whitehat: intervene during an exploit that is already in progress or imminent, return the funds to the protocol's recovery address within 72 hours and keep a bounty on the published terms. The protocol never needs to know the whitehat in advance.
SEAL states that the framework covers more than 68 billion dollars across more than 20 protocols, including Uniswap, Aave, Pendle, PancakeSwap, Balancer, Silo Finance and zkSync.
Two limits define what it is not.
- It does not cover a whitehat who starts the exploit. Intervention is covered only once an exploit is in progress or imminent.
- The protocol does not vouch for the lawfulness of the whitehat's actions, so criminal exposure stays with the person acting.
Adoption is a governance decision executed on chain.
- Set the bounty percentage and the cap. SEAL advises a cap at or below your existing bug bounty maximum, so that a rescue during an exploit never pays better than a report before it and the two programs cannot be played against each other.
- Choose the identity policy: named with KYC, or anonymous with attestations.
- Publish the asset recovery addresses, the protected contracts and the chains. The recovery address should be governance-controlled rather than a hot wallet, because it will receive everything a rescuer pulls out.
- Pass the vote, then record the adoption from the governance address in the SafeHarborRegistry, deployed through CreateX at the same address on every supported EVM chain (
0x326733493E143b8904716E7A64A9f4fb6A185a2c). The current registry is V3, audited by Cyfrin in . - Link the adoption from the disclosure policy and from security.txt, so the terms are discoverable during an incident and not only in a forum thread.
| Term | Aave | Lido |
|---|---|---|
| Bounty | 10 percent of recovered funds | 10 percent of the recovered amount |
| Cap | 1 million dollars per whitehat and per incident | 2 million dollars per whitehat and per incident |
| Retainable by the whitehat | No | No |
| Identity | Named, with KYC and global sanctions verification | Anonymous, with attestations covering age, sanctions status and 12 months without affiliation to Lido Labs |
| Scope | Recovery addresses on 14 chains | 79 contracts on Ethereum mainnet, recovering to the Aragon Voting contract |
| Decision | Proposal of , Snapshot passed | Proposal of , vote passed |
The identity choice is the real trade-off. A named policy keeps the treasury clear of sanctions risk but excludes researchers who work pseudonymously. An anonymous policy widens the pool and moves the compliance burden into the attestation wording. Both are defensible. Picking one before the incident is what matters.
Triage deadlines and the first 72 hours after a report
Deadlines are the part of a policy a researcher tests first, usually by waiting. Publish numbers you can meet, then meet them. Name the people behind them: two readers of the mailbox, one escalation contact who can pause or upgrade and a rota that covers nights. Reports arrive when the researcher finishes, not when your team starts.
| Stage | Benchmark | Where it comes from |
|---|---|---|
| Acknowledge receipt | 3 business days at most | CISA guidance for US federal agencies under Binding Operational Directive 20-01 |
| Initial assessment | at most | The same CISA guidance |
| Fix available | , or when the bug is being exploited | Google Project Zero disclosure policy |
| Public disclosure | after the fix ships | Google Project Zero disclosure policy |
| Reward paid | The window stated in your bounty terms | Immunefi's rules list missed responsiveness and resolution SLAs as prohibited project behavior |
For a protocol holding user funds, the assessment window is shorter than any of those. This is the sequence that works.
- Acknowledge within hours with a ticket number, even at night. Silence for three months is what the Injective researcher described.
- Reproduce on a fork and classify. Immunefi's Vulnerability Severity Classification System v2.3 defines four levels with separate impact tables for smart contracts, websites and blockchains. Nothing stops a protocol from reusing it as a rubric.
- Decide whether funds are at risk right now. If they are, open a war room and contact SEAL 911 through its Telegram bot. SEAL reports 3,300 tickets handled and 200 war rooms coordinated since launch, but it runs on 31 volunteer responders and does not guarantee capacity, so it complements your channel rather than replacing it.
- Pause, upgrade or mitigate, then verify the fix on a fork before touching mainnet. The hour-by-hour version of this step lives in the first hours after a DeFi exploit.
- Pay the reward inside your stated window and tell the researcher when they may publish.
- Write the post-mortem, naming the root cause and, with consent, the reporter.
Bug bounty economics the platforms leave out
Launch guides from the platforms cover severity tiers and payout ranges well. Three things their launch guides rarely cover decide whether a program ever pays anyone.
KYC and sanctions
On Immunefi, KYC is a program-level choice, and the platform's rules state that a researcher who fails to provide the KYC information needed for a payment may forfeit it. Aave's program shows how to scope the requirement: KYC is discretionary, can include a live video call with a government-issued ID, and is never required for findings rated Medium or Low. The payout tier, not the finding, is what unmasks the researcher.
Whichever tier you pick, write it down. A researcher who learns about KYC after submitting a Critical finding has no good options left.
Funded caps versus advertised caps
An advertised maximum is a marketing number until something backs it. The Bug Bounty Wall of Shame, a leaderboard maintained by whitehats since 2023, listed nearly 2.5 million dollars in allegedly unpaid bounties when CryptoSlate reviewed it in , including a 780,000 dollar payment for an Arbitrum finding that exposed more than 680 million dollars, against a program that advertised 2 million. Hats Finance answers this structurally. The bounty sits in an on-chain vault funded with the project's tokens, a named committee triages submissions, and payouts leave the vault on chain, so anyone can check that the money exists. If you host on a traditional platform instead, publish the funded amount and the treasury address behind it. Whichever host you choose, decide on four criteria: who triages, where the money sits, who runs the KYC check and who arbitrates a dispute.
Aave's Critical tier is an example of terms a researcher can reason about: 10 percent of the funds directly affected, with a 50,000 dollar floor and a 1 million dollar ceiling.
Exclusions that quietly gut a scope
Aave's program is a useful worked example because it is explicit. Testing on mainnet or public testnets is prohibited and all work happens on local forks. Pricing oracles and third-party contracts are out of scope. Rounding and precision issues do not count unless they open a provable new loss-of-funds path. Loss of rewards not yet accrued is not treated as a loss of funds. Each clause is defensible on its own.
Together they mean a researcher who found something real can still be told it is out of scope, so publish your exclusions with a sentence of reasoning each, and add a line asking researchers to report excluded findings anyway. The budget split between a bounty and an audit is a separate decision, covered in audit contest versus private audit.
How auditors check this
A code audit rarely grades the disclosure channel, so ask for it. Before an engagement closes, have the auditor confirm five artifacts.
- A SECURITY.md in every public repository.
- A security.txt whose
Expiresdate is still in the future. - A policy page with scope and safe-harbor wording.
- A live bounty, or a Safe Harbor adoption recorded in the on-chain registry with the recovery addresses published.
- A tested pause or upgrade path, with named owners.
The smart contract audit checklist on this site covers the code-side items the same review should include.
Among DeFi Security Alliance members, Hacken operates the HackenProof bounty platform and can host the program the policy points to. Trail of Bits publishes a security.txt that works as a template, with an encrypted upload link ahead of a mailbox and an Expires date in . On it was also the only one of the 20 reachable member websites serving the file at the canonical path. The absence of the file does not mean the absence of a policy, but it does mean a scanner will not find one.
Where a disclosure policy stops helping
A policy changes the behavior of people who wanted to report. It does not deter anyone else, and Chainalysis counted more than 3.4 billion dollars stolen across the industry in 2025, with the Bybit compromise alone at 1.5 billion. Budget for detection and response as if the policy did not exist.
Safe harbor is narrow. SEAL's agreement covers intervention during an active or imminent exploit and nothing before it, and the US Department of Justice policy of May 2022 on good-faith security research governs federal charging decisions under the CFAA, not civil claims and not other jurisdictions. A researcher who reads your policy as blanket permission has misread it, and your wording should say so.
If your contracts are immutable, the "fix" step in the timeline becomes a migration, and the disclosure window must say how long that takes. When a fix cannot ship inside the window the researcher was promised, say so before the deadline and agree a new date in writing. Project Zero's own policy allows a 14-day grace period for exactly that conversation. Designing the stop button before it is needed is the subject of emergency pause and circuit breakers.
Bugs in an oracle, a bridge or a library you integrate are outside your scope but inside your blast radius. Say who coordinates with the upstream team, and expect that team to have no channel either.
A named-only identity policy at the top tier means a pseudonymous researcher cannot be paid for the finding that matters most. Decide in advance whether the treasury accepts that outcome, or write the anonymous variant with attestations as Lido did. And if the software you ship counts as a product with digital elements in the EU, the Cyber Resilience Act's reporting duties start on through ENISA's Single Reporting Platform, with a 24-hour early warning for an actively exploited vulnerability.
Frequently asked questions
Does SEAL Safe Harbor replace a bug bounty?
No. Safe Harbor applies only once an exploit is in progress or imminent, so it pays for rescues, not for reports. SEAL advises setting its bounty cap at or below the bug bounty cap so that reporting a bug before an attack always pays at least as well as rescuing funds during one. A protocol needs both channels.
Should the security contact be a person or a role mailbox?
A role mailbox that at least two people read, listed first, with an encrypted upload link or PGP key next to it. A personal address stops working when the person leaves, and security.txt files are rarely updated when that happens.
What is the difference between a vulnerability disclosure policy and a bug bounty?
A disclosure policy tells researchers how to report and what protection they have, and it costs staff time rather than money. A bug bounty adds a reward schedule and a severity rubric on top. Publishing a bounty without a policy is the pattern that produces disputes over testing limits and payouts.