Skip to content

fix(enm): revert disablePod on stale-beacon silent no-op [audit finding 1, HIGH] - #486

Merged
0xpanicError merged 2 commits into
pankaj/feat/non-eigenpod-withdrawal-credentialsfrom
fix/enm-disablepod-silent-noop
Aug 11, 2026
Merged

fix(enm): revert disablePod on stale-beacon silent no-op [audit finding 1, HIGH]#486
0xpanicError merged 2 commits into
pankaj/feat/non-eigenpod-withdrawal-credentialsfrom
fix/enm-disablepod-silent-noop

Conversation

@0xpanicError

@0xpanicError 0xpanicError commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Finding 1 (HIGH) — disablePod silent no-op

EtherFiNodesManager.disablePod calls IEtherFiNode(node).disablePod(), which returns nothing. If the EtherFiNode beacon has not been upgraded yet, the old implementation's empty fallback() swallows the call and returns success — so the manager emits a false PodDisabled while the pod is still live. The runbook's next step (consolidating validators out) would then cut the pod's beacon-chain slashing factor and devalue our claim on the ETH still in it.

Fix

After calling disablePod(), assert the pod actually reports restakingDisabled(); otherwise revert PodNotDisabled. A stale-beacon deployment now fails loudly instead of silently succeeding.

Tests

  • New regression test test_disablePod_revertsWhenPodNotActuallyDisabled (pod stays enabled → reverts PodNotDisabled).
  • Updated test_disabledPod_retirementRoutesThroughTheNodeAsPodOwner to mock restakingDisabled() == true for the happy path.
  • non-eigenpod-credentials suite: 77 passing on mainnet fork.

Evidence

Empirically reproduced on a Tenderly fork carrying real EigenLayer v1.14.0 (rehearsal test T2): pre-fix, disablePod silently succeeds + emits PodDisabled while restakingDisabled stays 0.

Base: pankaj/feat/non-eigenpod-withdrawal-credentials (fix targets code introduced by PR #485).

🤖 Generated with Claude Code


Note

High Risk
Touches irreversible EigenPod retirement on the restaking path; a wrong check could block legitimate retirements or still allow a false success that devalues ETH claims via the beacon slashing factor.

Overview
Fixes a HIGH audit finding where disablePod could silently succeed and emit PodDisabled even though the EigenPod was still live.

If the EtherFiNode beacon is stale, the empty fallback swallows disablePod() and returns success. The manager now asserts the pod exists and reports restakingDisabled() before emitting, otherwise reverts PodNotDisabled. That stops the runbook from consolidating validators out of a still-active pod and cutting the beacon-chain slashing factor.

Adds a regression test for the silent no-op path and updates the happy-path test to mock restakingDisabled() == true.

Reviewed by Cursor Bugbot for commit 7f7fa64. Bugbot is set up for automated code reviews on this repo. Configure here.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

disablePod() returns void, so an un-upgraded EtherFiNode beacon swallows the
call via its empty fallback and returns success without disabling the pod. The
manager then emitted a false PodDisabled, after which consolidating validators
out would cut the pod's beacon-chain slashing factor.

Assert pod.restakingDisabled() after the call so a stale-beacon deployment
reverts PodNotDisabled instead. Adds a regression test; updates the existing
mock-based retirement test to also report restakingDisabled().

Finding 1 (HIGH) from the PR #485 pre-audit review; reproduced on a Tenderly
fork carrying real EigenLayer v1.14.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

Signed-off-by: Yash Saraswat <107622640+0xpanicError@users.noreply.github.com>
@0xpanicError
0xpanicError merged commit d88d52e into pankaj/feat/non-eigenpod-withdrawal-credentials Aug 11, 2026
2 checks passed

@pankajjagtapp pankajjagtapp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants