Notes / Findings
Source: data/finding_2026-09-25-aave-v3-pool-risk-admin-discovery.md in the repository, rendered here without changes. Source file
2026-09-25. Continues the broad-review round 2 roadmap item 4 (extend the role-sweep pattern that already found 2 real bugs on Radiant and Aave V3 Monad). score_aave_v3_pool -- $14.77B TVL, this oracle's single largest tracked target by TVL -- had checked isEmergencyAdmin on exactly two hardcoded addresses (the DAO executor, PROTOCOL_GUARDIAN) since it was written, with no mechanism to discover a role holder added later. score_aave_v3_horizon_pool already closed this exact gap (GitHub backlog item "limite de Horizon") on the much smaller Horizon instance, after 3 real defects found and fixed by adversarial (maker-checker) review. Applied here for the first time on the main pool, reusing _replay_role_holders() and the hasRole-confirmation pattern UNCHANGED -- not re-derived from scratch.
eth_getCode (Tenderly gateway; ethereum-rpc.publicnode.com returns 403 on historical state this far back): block 16,291,117 (2022-12-29), not looked up from memory or an indexer.aave-dao/aave-permissions-book (out/ETHEREUM-V3.md) for naming:Manual AGRSPendleDiscountRateAgentGho Core Direct MinterCore GHO Aave StewardEModeCategoryAgent3 of 5 read owner() = the same governance Executor directly (revocable by governance, matching Aave's own "Risk Steward" design: "bounded, revocable delegated authority... within fixed cooldowns and a maximum change allowed per update", per aave-dao/aave-v3-risk-stewards). The other 2 (PendleDiscountRateAgent, EModeCategoryAgent) don't expose a plain owner() -- gated some other way, not opened this pass.
not scored already applies elsewhere).RISK_ADMIN can change market parameters (collateral config, borrowing, caps) -- a DIFFERENT class of risk from adminKeyScore/multisigScore/timelockScore (root-authority/fund concentration), the same boundary this project already draws around Chaos Labs/Gauntlet-style market-parameter risk (see today's competitor research: neither evaluates admin-key concentration, and this project deliberately doesn't score their kind of risk either). Same treatment score_aave_v3_horizon_pool already gives its own RISK_ADMIN holders -- consistent, not a new exception.
adminKeyScore/multisigScore/timelockScore/compositeScore are unchanged (78/100/55/78, live-verified before and after). Purely additive: two new disclosed findings in notes -- confirmation that no undisclosed POOL_ADMIN/EMERGENCY_ADMIN holder exists, and the 5 named RISK_ADMIN holders. Off-chain notes only; nothing pushed.
5 new unit tests (scripts/lib/tests/test_ethereum_l1_scorers.py::TestScoreAaveV3PoolRoleDiscovery): clean replay names every known RISK_ADMIN holder, an extra POOL_ADMIN/EMERGENCY_ADMIN holder confirmed via hasRole is disclosed, an UNCONFIRMED candidate is dropped as a phantom (not reported as real -- the exact failure mode 3 real Horizon defects came from), an unnamed RISK_ADMIN holder is flagged for manual review, a failed replay is disclosed honestly and doesn't crash or move the score. Full suite (6 test directories, 2349 tests) green. Live dry-run (DRY=1 ONLY="l1" bash scripts/repush_all_oracles.sh) confirms the target still encodes correctly.
Not an audit, not investment advice. All notes ยท Back to the dashboard.