Report privately through Report a vulnerability on this repository. Do not open a public issue for anything exploitable.
Expect an acknowledgement within a few working days. If you hear nothing within a week, assume that the report went astray and send it again.
This tool reads chain state. It never signs, it never sends a transaction, and it holds no keys. The interesting attack surface is therefore not funds. It is what the tool tells you.
In scope, and taken seriously:
- Anything that makes the graph lie. A path where EDG records a transport failure as a revert. A truncated crawl that scores complete. A frontier presented as a terminal. An input that fabricates an edge that does not exist. To be wrong quietly is the worst failure mode of this project. See the honesty invariants in CONTRIBUTING.md.
- Cache poisoning. Reads are block-pinned and cache entries are never invalidated, so anything that writes an incorrect entry is permanent for that block. EDG can cache positively-confirmed contract-level outcomes only.
- Code execution or SSRF through a crafted address, RPC response, or API payload.
- Credential leakage, and chiefly an RPC URL with an embedded key that reaches evidence, logs, or a saved graph.
Out of scope:
- Rate limiting or downtime of a third-party RPC endpoint or index API.
- The optional Postgres layer that runs with its documented local-dev defaults
(
edg/edg). Do not expose that layer to a network. - A crawl of an address that is itself malicious. Contracts are untrusted input by definition here. That is the threat model, and not a vulnerability.
- No
.envfiles. Configuration is environment variables only.Settingssetsenv_file=Nonedeliberately, so a stray.envcannot be read. - An RPC URL usually contains a key. Treat saved graphs and logs accordingly before you share them.
- Probing calls every selector that a contract dispatches on. That is a lot of load for a public endpoint. Use your own node for anything sustained.