vault.disclose.io

Documentation

How diovault works, explained for everyone involved. A disclose.io project.

Experimental alpha: use synthetic reports only. Contract identity, v2 extension authorization, and strongly consistent Worker state remain launch blockers.

What is diovault?

diovault is an open-source experiment in holding vulnerability-disclosure deadlines with cryptography rather than goodwill. The hard deadline cannot be moved once a packet is committed, and a packet that remains retrievable becomes independently decryptable after its hard-deadline drand round.

It does this using timelock encryption: data is encrypted such that it can only be decrypted after a specific point in the future. Automatic publication additionally depends on packet availability and the publishing service.

The core primitive: Anyone with a valid, durably available packet can decrypt it after the hard-deadline round. The alpha does not yet offer production guarantees for storage, publication, identity, or extensions.

How It Works

1
Encrypt
AES-256-GCM

Report encrypted with a symmetric key, then wrapped per-recipient using X25519 key exchange.

2
Timelock
drand tlock

Content timelocked to the hard deadline. Content key separately timelocked to the recommended deadline for the auto-publish worker.

3
Store
IPFS + Arweave

Encrypted packet always retained locally, and replicated to IPFS and Arweave when storage is configured.

4
Register
Base L2

Optional: content hash and participant identities can be recorded on-chain, creating a tamper-evident audit trail.

5
Wait
drand beacon

Embargo period. Authorized parties decrypt with private keys. The drand beacon counts down.

6
Disclose
Auto-publish

Worker attempts publication at the recommended deadline. After the hard deadline, a retrievable packet can be decrypted independently.

For Security Researchers

You've found a vulnerability and want a deadline mechanism that does not depend solely on continued cooperation. The current alpha is for synthetic evaluation, not real reports.

How to Use It

1

Install and initialize. Generate your keypair — this is your identity in the system.

vault init

Your public key is what you share with vendors. Your secret key stays local.

2

Write up the vulnerability as you normally would — a markdown file with description, steps to reproduce, impact, and proof of concept.

3

Submit to the vault. This encrypts your report, timelocks it, and writes an encrypted copy to your local vault. If IPFS/Arweave credentials are configured it also replicates there — check the submit output, which reports each leg. Set both a recommended deadline (when you intend to publish) and a hard deadline (the absolute backstop).

vault submit \
  --file vulnerability.md \
  --deadline 90d \
  --hard-deadline 180d \
  --recipient vendor-security:<their_pubkey>

The hard deadline is the point of no return: it cannot be moved once the packet is committed. Extension of the recommended deadline is a planned feature and is not available in the current release.

4

Contact the vendor. Share your public key. Work with them normally during the embargo period. Both of you can decrypt the report anytime using your private keys.

5

Arm the dead man's switch (optional but recommended). This registers your disclosure with the auto-publish service at vault.disclose.io.

vault watch <id> --worker-url https://vault.disclose.io --api-key <API_KEY>

The Worker will attempt publication even if you are offline; this remains dependent on Worker and storage availability.

6

Check status anytime. See the state of all your disclosures, days remaining, and on-chain activity.

vault status
vault status <id>
7

At the recommended deadline, the worker attempts to publish at vault.disclose.io/disclosure/<id>. After the hard deadline, anyone who can retrieve the packet can decrypt it independently.

If Things Go Wrong

Adversary Scenarios

Vendor goes silent? Key release still happens at the deadline round, and no party can revoke it. Their silence is the audit record.

Vendor sends legal threat? A legal threat cannot reach the timelock. What it can reach is packet availability — so confirm your packet actually replicated, and keep your own copy.

You're arrested or silenced? The Worker attempts publication without you. That is an operational service, not a guarantee: it depends on the Worker running and on at least one copy of the packet remaining retrievable.

Vendor needs more time? The alpha can record an extension request on-chain, but safe v2 Worker re-keying is disabled until the new contract and authorization protocol ship. Details in FAQ.

Choosing Your Deadlines

Set the recommended deadline to when you intend to publish assuming normal coordination. Set the hard deadline to the latest date you’d be comfortable with this going public automatically, even if you’re completely unreachable.

Deadline Guidance
Vulnerability TypeRecommendedHardExtension Window
Web app (XSS, SQLi)90d120d30d
Infrastructure / API90d150d60d
Medical device / safety-critical120d270d150d
Multi-vendor coordination90d180d90d
Abandoned / no-contact vendor45d90d45d

Need to Add a Coordinator?

If the vendor is unresponsive and you want to escalate to CERT/CC or another coordinator:

vault add-party <id> --pubkey <coordinator_pubkey>

They can now decrypt and help coordinate. The timelock is unaffected.

For Vendors

A security researcher has reported a vulnerability in your product through diovault. Here's what that means and what you need to do.

What This Means

The researcher has encrypted their vulnerability report and set disclosure deadlines. The hard-deadline packet becomes decryptable after its drand round if the packet remains retrievable.

Important: The disclosure has both a recommended deadline and a hard deadline. Plan against the hard deadline. Extension of the recommended deadline is a planned feature that is not available in the current release, so do not assume you can buy time. The hard deadline cannot be moved by anyone, including the researcher. How extensions are meant to work.

What You Need to Do

1

Generate your keypair (if you haven't already) and share your public key with the researcher.

vault init
2

Decrypt the report using your private key to read the vulnerability details.

vault decrypt <disclosure_id>
3

Acknowledge receipt on-chain to create a public record that you received the report.

vault ack <disclosure_id>
4

Fix the vulnerability before the deadline. Coordinate with the researcher as needed. Request a CVE.

5

If you need more time, request an extension. The submitter has 7 days to approve.

# Vendor requests extension
vault extend <disclosure_id> --deadline 14d

# Submitter records approval on-chain
vault extend <disclosure_id> --approve

The alpha intentionally does not replace the Worker key timelock. Production extensions require the planned signed v2 protocol.

How the Audit Trail Protects You

For Coordinators (CERT/CC, etc.)

You've been added to a diovault disclosure as a coordinator. This means a researcher has escalated — typically because a vendor is unresponsive.

Your Role

Multi-Vendor Coordination

When a vulnerability affects multiple vendors, you can link disclosures to track dependencies:

# Mark that disclosure B depends on A being fixed first
vault link <id_B> --depends-on <id_A>

# Check existing relationships
vault link <id>

Links are coordination signals, not cryptographic constraints. Each timelock still fires independently.

What You Can't Do

You cannot change the hard-deadline encryption of an already distributed packet. Packet availability and automatic publication are separate operational concerns. Your role is to help coordinate a good outcome before the deadline.

This is the intended future state. The alpha still has operational and authorization dependencies that must be removed or made explicit before real use.

For the Public

You're looking at a published vulnerability disclosure on vault.disclose.io. Here's what happened:

  1. A security researcher found a vulnerability in a product or service.
  2. They encrypted the details and set disclosure deadlines (a recommended deadline and a hard backstop).
  3. The vendor was notified and given time to fix the issue.
  4. After the deadline, the Worker retrieved, decrypted, verified, and published the report.

How to Verify a Disclosure

Every published disclosure includes:

You can decrypt and verify any disclosure independently after the deadline:

# Decrypt a published disclosure
vault disclose <disclosure_id>

# Verify packet integrity (content hash, timelock status)
vault verify <disclosure_id>

# View the full on-chain audit trail
vault audit <disclosure_id>

What "Timelock Expired" Means

The report was encrypted to a specific point in the future using the drand distributed randomness beacon. When that point arrived, the drand network (operated by Cloudflare, Protocol Labs, EPFL, and 15+ other organizations) produced a cryptographic signature that served as the decryption key. No single party controlled this process.

Frequently Asked Questions

Can the researcher change the vulnerability details after submission?
No. The content is hashed (SHA-256) at submission time and the hash is stored on-chain. Any modification would produce a different hash. The content that was submitted is exactly the content that gets disclosed.
Can a court order stop disclosure?

No absolute claim is appropriate in the alpha. Resistance depends on successful packet replication, continued retrieval, drand availability, and possession of the packet location. The current CLI treats IPFS and Arweave uploads as optional.

What if the researcher is wrong about the vulnerability?
The system holds the timeline, not the validity of the report. If the researcher submits an invalid or inaccurate report, the key still releases at the deadline and the report can be decrypted by anyone holding the packet. If on-chain registration was used, the audit trail will show whether the vendor responded and disputed the findings. Researchers should use the vault responsibly — an accountable record works both ways.
Can the deadline be extended?

Not safely in the alpha. Extension requests and approvals can be recorded on-chain, but replacement of the Worker’s recommended-deadline key timelock is disabled.

How it works: At submission, the researcher sets two deadlines. The recommended deadline is when they intend to publish. The hard deadline is the absolute backstop. Content is timelocked to the hard deadline inside the packet, and that commitment cannot be altered afterwards. A separate timelock of the content key is sent to the auto-publish worker at the recommended deadline.

The future protocol will require defined participant signatures, an on-chain approval event over the replacement timelock hash and nonce, and strongly consistent per-disclosure state before accepting that replacement.

The hard-deadline encryption in a distributed packet is immutable. The production protocol must prove packet replication and authorize extensions without allowing a replacement of this hard commitment.

Target property: an authorized extension may move only the recommended deadline and can never exceed the packet’s hard deadline.

What is drand?
drand (distributed randomness) is a network operated by the League of Entropy — organizations including Cloudflare, Protocol Labs, EPFL (Swiss Federal Institute of Technology), University of Chile, Kudelski Security, and others. It produces verifiable random numbers (beacon rounds) every 3 seconds. diovault uses these rounds as timelock triggers: data is encrypted such that only the beacon's signature for a future round can decrypt it.
What does the dead man's switch do?

The auto-publish worker at vault.disclose.io runs every 60 seconds. In v2 mode, it tries two paths: first, it attempts to decrypt the content key from the recommended-deadline timelock stored in its private KV. If that succeeds, it decrypts the content, verifies the hash, and publishes.

If the worker is offline or compromised, the hard-deadline timelock still releases on schedule — the beacon does not depend on the worker. At that point the full plaintext is decryptable by anyone who can obtain the packet. That last clause is the honest limit of the two-layer design: the timelock reliably yields a key, never a document. If no replica was confirmed at submission, the researcher's local copy is the only one, and a disclosure that nobody can retrieve does not become public no matter how correctly the beacon fires.

How much does it cost?
About $0.07 per disclosure. Base L2 transactions cost ~$0.01, Arweave permanent storage costs ~$0.05, and IPFS pinning and drand beacon queries are free. There are no tokens, DAOs, or governance overhead.
Is this open source?
Yes. Everything is Apache-2.0 licensed. The smart contract, CLI, worker, and web UI are all open source. The repository will be published at github.com/disclose when the project launches publicly.
What if the drand network stops?
drand is a threshold network run by the League of Entropy (~20 independent organizations); a halt requires enough of them to stop at once to break the threshold, which has not happened. If it did, the failure is closed, not open: keys are never released, content stays encrypted, and no disclosure occurs. Temporary disruption is recoverable, since rounds are produced retroactively. Two likelier risks than a network halt: a chain retirement (drand has already migrated chains once, and packets are bound to a specific chain hash), and a dependency on the specific HTTP relay this service queries, which can fail while the beacon itself is healthy.