Please report security issues privately first. Do not open a public issue for anything that could put funds or names at risk.
Preferred channel: GitHub private vulnerability reporting — the "Report a vulnerability" button on the Security tab of this repository. This creates a private advisory only the maintainers can see.
Please include what the issue is, which file and line, how to reproduce it, and what an attacker gains.
- Acknowledgement: within 3 working days.
- Assessment: within 10 working days, with a severity.
- Credit: we will name you in the release notes unless you prefer otherwise.
We do not currently operate a bug bounty.
This library decides whether a resolver's answer may be trusted, and callers send money on the strength of that verdict. What matters:
- A verdict must be about the question that was asked. A signature covers the answer's own name, so verification that does not compare the answer against the request is not verification at all.
- The pinned resolver key is the authority. The answer's own
signerfield never is. - Nothing may throw on hostile input. A malformed answer is a rejected answer, not a crash in the caller.
Out of scope: the resolver's own correctness (that is what the pinning and the liveness check are for) and key management by the caller.
Version 1.0.0's verifyAnswer() did not bind the answer to the requested name
and did not check the answer's ok field. A correctly signed, unexpired answer
for one name therefore verified against a request for another. Fixed in
1.1.0 — expectName is now required and the function fails closed without
it. See SECURITY-FIXES-v1.1.0.md.