Ironvale Foundation
Vulnerability disclosureIronvale Foundation, a registered nonprofit association
Volunteers keeping ironvale-tls, ivpkg and the Anvil build tool alive. Clone it and break it.
- Accepting reports
- No cash reward
- 8 assets in scope
- Launched Jun 2018
- ironvale.example
Read the policy · first response 5 days
Response times
- first response
- 2 days
- triage
- 6 days
- reward
- Credit, never cash
- resolution
- 33 days
Program to date
- Resolved
- 1,409
- Thanked
- 366
Rewards by severity
This program does not pay cash. Severity still drives priority, credit and disclosure timing.
| Severity | CVSS | Reward | Typical findings |
|---|---|---|---|
| Critical | 9.0 – 10.0 | Recognition only | There is no money at any tier. We are a CVE Numbering Authority and will assign within a working day, credit you by the name you choose in the advisory, the release notes and the commit trailer, add you to the hall of fame, and at this tier fund travel to one security conference a year from the grant line reserved for it. |
| High | 7.0 – 8.9 | Recognition only | No money. A CVE, your name in the advisory and the NEWS file, a hall of fame entry, and the heavier shirt rather than the thin one nobody wears twice. |
| Medium | 4.0 – 6.9 | Recognition only | No money. Credit in the changelog and the hall of fame. A CVE where the code path is reachable in a default build, and none where it needs a configuration nobody ships. |
| Low | 0.1 – 3.9 | Recognition only | No money. Thanks in the commit trailer, a hall of fame entry, and stickers posted anywhere on earth, which we mean literally and have now done 612 times. |
In scope
8 assets listed. Anything not on this list is out of scope.
| Asset | Type | Max severity | Reward | Notes |
|---|---|---|---|---|
| git.ironvale.example/ironvale/ironvale-tls | Source code | Critical | No reward | TLS 1.2 and 1.3 plus the certificate path builder. Memory safety and state machine confusion are what we lose sleep over. |
| git.ironvale.example/ironvale/ivpkg | Source code | Critical | No reward | Package manager client. Signature verification, lockfile parsing and archive extraction are where the interesting bugs live. |
| registry.ironvale.example | API | Critical | No reward | Package registry. Publishing authentication, index integrity and the signature chain served to clients. Three modest machines, so no load testing. |
| release.ironvale.example | Domain | Critical | No reward | Release infrastructure: the reproducible build pipeline, artifact hosting and the two-of-three signing service in front of them. |
| git.ironvale.example/ironvale/anvil | Source code | High | No reward | Build tool. Escapes from a build script and cache poisoning that crosses between projects both count. |
| git.ironvale.example/ironvale/ironvale-tls-sys | Source code | High | No reward | Foreign function bindings. Unsound public interfaces that let a safe caller reach undefined behaviour are in scope. |
| git.ironvale.example | Domain | High | No reward | Self-hosted forge. Repository permissions, runner isolation and webhook handling. Prefix test repositories with zz-test-. |
| ironvale-tls 2.6 maintenance branch | Source code | Medium | No reward | Security fixes only, end of life on 31 December 2026. Nothing below a remotely reachable memory-safety bug gets a backport now. |
Out of scope
| Asset | Why |
|---|---|
| docs.ironvale.example | Generated pages on object storage with no application behind them. We know about the headers. |
| forum.ironvale.example | Hosted discussion software we pay for and do not write. The vendor is responsive and we will introduce you. |
| Packages published to the registry by their own authors | We host them, we do not maintain them. Write to the author, and tell us if they go quiet for a fortnight. |
| ironvale-tls 1.x and the original packaging tool | End of life since June 2023. No maintainer, no releases, and we will not open an advisory against either. |
| Downstream forks, vendored copies and distribution patches | Patched trees diverge from ours. Report to the distributor, unless the bug is upstream too, in which case tell us both. |
| Repositories carrying the archived topic | Left in public because deleting history is rude, not because anyone is looking after them. |
Findings that will be closed as informative
- Scanner output listing advisories in transitive dependencies with no reachable call path.
- Memory unsafety asserted in prose, with no crashing input, sanitiser trace or fuzz case attached.
- Absent compiler hardening flags on a target where the tradeoff is documented in the build notes.
- Timing differences measured across the public internet rather than in a local harness.
- Findings that need a debugger attached to the victim process or root on the victim machine.
- Resource exhaustion reached only by running a fuzzer longer than any real input would last.
- Anything in an archived repository, an example directory or the test corpus.
- Machine-generated audits pasted in without a reproduction the sender has run.
- The documentation site's headers, which have now been reported thirty-one times.
Program policy
Program overview
Hello. We are thirteen volunteers and two grant-funded part-timers looking after three pieces of software that far too many people depend on: ironvale-tls, a TLS implementation; ivpkg, a package manager; and Anvil, a build tool. They ship inside operating system base images, phone firmware and a long list of places nobody has ever told us about.
The part everyone asks first, answered first: there is no money. We have never paid for a report and we are not about to start. The foundation lives on roughly 190,000 USD a year in grants and small donations, which covers infrastructure, two part-time salaries and the annual accounts. A bounty line would empty that in a quarter.
What you get instead is a fast and completely public process. We have been a CVE Numbering Authority since September 2024, so the identifier is assigned by us, usually within a working day. Your name goes in the advisory, the release notes and the commit trailer, spelled the way you ask. You go on the hall of fame permanently. Stickers and a shirt go in the post. For a Critical finding there is a travel grant, which has sent four people to a conference so far.
If that is not worth your weekend we understand, and we would rather you knew now than after a fortnight of fuzzing.
Testing rules and expectations
Nearly everything here is source code, so nearly everything happens on your own machine. Clone it, build it, fuzz it, take it apart. You need no permission from us and there is nothing we could revoke.
The exceptions are the three hosted systems: the forge, the registry and the release pipeline. Those are real servers with real state, so tread lightly. Use your own account. Publish test packages under a name beginning zz-test- and delete them when you are finished. Do not push into a namespace that is not yours, even to prove that you can; if you find a way to publish under somebody else's name, screenshot the furthest state you reached and stop there. No load testing. The registry runs on three modest machines and our uptime is a point of pride.
We would rather have a rough report on Tuesday than a polished one next month. A crashing input and a stack trace is a complete report. You owe us no patch, and if you send one anyway we credit you twice.
Proving write access
If you find a way to write, do not prove it by causing damage. Prove it with the smallest change that can be attributed to you and undone in the same minute.
- One or two punctuation characters. Delete a full stop, add a comma. Nothing longer, nothing visible, no payload, no changed number or amount.
- Only on a record you created yourself. Never another user's record, never site content, never anything the public can see.
- Revert within sixty seconds, in the same run, without being asked.
- Capture four states: before, after the change, after the revert, and an independent re-read confirming the revert held.
- If it cannot be reverted, do not change it. Report the write primitive and stop. A row count and a column list already prove database access.
Every request must carry headers that let us separate your traffic from a real attack in our logs:
X-Bug-Bounty: ironvale
X-Research-Account: <the account you submit the report under>
X-Authorisation-Ref: <engagement or report reference>
X-Request-Id: <unique per request>
User-Agent: sentinel-research/<handle> (+<this page>)
scripts/proof_of_write.py performs exactly this sequence, refuses any host
outside the scope above, refuses a diff longer than two characters, always
attempts the revert, and writes a timestamped evidence file. Run it without
--execute first, then attach the evidence to your report.
Safe harbour
You may analyse, reverse engineer, fuzz, decompile and generally dismantle anything we publish, for any reason, for as long as you like. Our licences already allow most of that and this policy confirms the rest.
For the hosted services: stay inside the rules above, tell us what you found, and give us the chance to ship a fix before the world hears about it. Do that and we will never bring a claim. We are a small association with no legal department and no wish to build one. What ends the protection is short and obvious: destroying or taking other people's data, tampering with published artifacts, asking us for money to stay quiet, or handing a working exploit to somebody who plans to use it.
Reward decisions
There is no money to decide about. Severity still matters, because it sets how fast we move and how loudly we tell everyone.
We score with CVSS v3.1 and we argue about it in the open, in the advisory thread, where you can push back. Reachability in a default build counts for more than the vector string. A heap overflow in certificate parsing that any peer can trigger is Critical. The same bug behind a build flag that a dozen known deployments enable is High, and we will say so rather than quietly inflate it.
Duplicates go by the timestamp on the security mailbox. When two arrive in the same week, which happens more often than you would expect, both names go in the advisory.
Disclosure policy
Ninety days from the day we acknowledge your report, or the day the fix ships, whichever arrives first. We have asked for a second extension once in eight years, and we explained what was blocking the fix when we did.
The sequence: acknowledge, reproduce, patch against the maintenance branches, assign the CVE ourselves, notify the distributor pre-notification list under a seven-day embargo, publish the advisory and the signed release together, push the commits to the public tree.
The embargo exists so packagers can build and stage updates. It does not exist so we can manage the story, and when it breaks we do not pretend otherwise. In October 2025 details of a pending advisory turned up on a public list four days early; we published the advisory and the fix three hours later and removed one member from the list. That is the rule, written down before it was needed and followed when it was.
Write up your own findings once the advisory is out and we will link to it. Not before, please, and redact any credential you stumbled across on the hosted services.
Report quality
- The exact commit hash or release tag, with the target triple and compiler version you built with.
- The reproducing input attached as a file rather than pasted as hex.
- A sanitiser trace if you have one. Address, memory and undefined behaviour sanitisers are all welcome.
- Where untrusted data enters and which function it reaches, a sentence each.
- Whether the path is reachable in a default build, and if not, which flag opens it.
- The name you want credited, spelled the way you want it.
- Whether you plan to write it up publicly, so we can plan around your timeline.
Hall of fame
Researchers who have reported valid issues to this program.
| # | Researcher | Country | Reports | Points |
|---|---|---|---|---|
| 1 | asn1goblin | Sweden | 96 | 8,940 |
| 2 | sigsegv_sam | Germany | 84 | 8,115 |
| 3 | tarpit_tilde | Japan | 61 | 7,260 |
| 4 | handshake_hz | Viet Nam | 55 | 6,530 |
| 5 | lockfile_lila | United States | 49 | 5,470 |
| 6 | corrupt_reader | Argentina | 42 | 4,805 |
| 7 | quietfuzz | Kenya | 38 | 4,120 |
| 8 | x509_wren | New Zealand | 22 | 3,390 |
| 9 | oob_marta | Spain | 31 | 2,845 |
| 10 | tarball_tj | Taiwan | 27 | 2,270 |
| 11 | nonce_reuse_ng | Nigeria | 19 | 1,760 |
| 12 | buildscript_bo | Norway | 16 | 1,305 |
| 13 | mx_ninetysix | Portugal | 12 | 940 |
| 14 | symlink_sara | Estonia | 9 | 615 |
| 15 | cachepoison_cy | Chile | 6 | 380 |
Program updates
-
ivpkg 4.0 signature format shipped
The old detached format is accepted until 1 December 2026 and leaves scope that day. Anything you find in the new verifier before then is the most useful thing you could send us.
-
Anvil sandbox rewritten on a different primitive
Build scripts are now confined with the same mechanism the registry builders use. The old confinement is gone, so old escape reports no longer apply and we would love new ones.
-
ivpkg has a new lead maintainer
After six years and 2,100 commits, the founding maintainer of the package manager handed the project over and stayed on as a reviewer. The security contact address and the signing quorum are unchanged.
-
An embargo leaked, so we published early
Details of a pending certificate parsing advisory appeared on a public mailing list four days before the release date. We published the advisory and the fix within three hours and dropped one member from the pre-notification list.
-
Hardware signing tokens, two signatures of three
Release artifacts now need two detached signatures from three maintainers holding hardware tokens. The single key that signed everything until then was revoked the same week.
-
Distributor pre-notification list opened
Packagers who ship our libraries can apply for embargoed advance notice. Two maintainers review each application and every member is named on the list page.
-
We are a CVE Numbering Authority
Assignments for our own projects no longer route through an upstream authority. That removed about eight days from the median advisory timeline and one long email thread from every advisory.
-
Continuous fuzzing on the certificate path builder
Roughly 900 core-hours a week now run against path building and certificate parsing, donated by a member. Four of this year's advisories started in that corpus.
-
The 1.x branch reached end of life
Five years of support ended and the branch left scope with it. Two distributions kept shipping it for another year, which is their decision and not ours to fix.
-
Conference travel grant added for Critical findings
A recurring donation let us set aside a small travel line. It has sent four reporters to a conference of their choosing, and we will say yes until the line runs out.
-
Publishing tokens replaced after a near miss
A maintainer pasted a registry token into a public issue. Nothing was published with it, every token was rotated inside the hour, and tokens are now scoped to a single package.
-
Security policy published
Written on a Sunday afternoon by three of us, after a reporter spent a fortnight trying to work out who to tell about a heap overflow. That should never have been difficult.