Deprecation Without Deauthorization
- Name: deprecation without deauthorization
- Category: exploit pattern / lifecycle-control failure / deprecated-surface authority retention / residual-authority risk
- Summary: Teams often say a feature, entrypoint, deployment, or whole product is
deprecated,legacy,maintenance-only, orsunset. The dangerous assumption is that this social label meaningfully shrinks technical authority by itself. It does not. If the old path still mints, still sets solvency, still moves custody, still controls admin rights, or still gates withdrawals, then it is not dead; it is merely less watched. Acala preserves thedeprecated reward branch still had stablecoin mint authorityvariant. Holograph preserves thelegacy operator / proxy admin still sat inside the mint-authority boundaryvariant. Sturdy preserves thedeprecated helper entrypoint missed later hardening and still touched solvencyvariant. TempleDAO / STAX preserves theretiring old staking system still certified withdrawable balance in the replacement contractvariant. Aztec Connect and Aztec 2.0 preserve thedeprecated immutable system still custodied withdrawable valuevariant. Moonwell Moonriver preserves thedeprecated deployment still held constitutional authority over real cashvariant. The recurring failure is not just stale code. It is mistaking operational discouragement for actual deauthorization. - What it is:
- A protocol marks some path as deprecated, old, legacy, sunset, paused-in-practice, or no-longer-recommended.
- Users, operators, or developers implicitly downgrade how much security review and monitoring that path receives.
- But the path still retains live economic or constitutional authority: minting, collateral toggles, withdrawals, governance, upgrade rights, settlement, or custody.
- Later hardening, monitoring, or cleanup focuses on the preferred path while the deprecated surface remains callable or still controls real value.
- The exploit comes from that mismatch: the system treats the old surface as authoritative even though the team treats it as conceptually dead.
- Typical preconditions:
- Deprecated code is left reachable behind configuration, permissions that are still broad enough, or immutable contracts that cannot be retired automatically.
- New safeguards are applied only to the main path, leaving legacy entrypoints outside the hardened perimeter.
- Residual deployments keep governance, admin, or treasury rights after user attention and market depth have already decayed.
- Operators rely on convention (
nobody should use this anymore) rather than enforced deauthorization (this can no longer move value or authority). - Cleanup plans remove front-end prominence or documentation support before they remove real authority.
- Monitoring, alerting, and incident response also decay faster than the deprecated surface’s ability to cause damage.
- Common vulnerable surfaces:
- reward or incentive modules that still have mint authority after the feature is considered obsolete
- deprecated lending or collateral-management entrypoints left outside newer validation logic
- sunset deployments whose governor, timelock, oracle admin, or market admin still controls real balances
- immutable rollup, bridge, or vault systems that remain withdrawable long after active product support ends
- half-configured or maintenance-only strategy paths that are still callable from public entrypoints
- migration helpers that still accept a retiring staking, lock, or vault system as authority for creating new redeemable balances or releasing custody
- Failure sequence:
- The protocol socially deprecates a feature, route, or deployment.
- Attention, testing, and operational discipline shift to the preferred replacement.
- The old surface still retains live authority over money, solvency, or governance.
- An attacker finds that the deprecated surface either missed later hardening, can still be steered by configuration, or still protects real cash with weakened monitoring.
- The system honors the old authority exactly as designed, because no technical deauthorization ever happened.
- Operators discover that
deprecatedwas only documentation, not a state transition.
- Variants:
- Deprecated mint branch still live — an old reward, issuance, or accounting path can still create unbacked value, as in Acala.
- Deprecated control plane still speaks for issuance — a legacy operator, proxy, or admin stack is treated as old infrastructure socially but still remains inside the mint-authority boundary, as in Holograph.
- Deprecated helper missed safety retrofit — a lower-profile entrypoint still mutates solvency or authorization state outside newer invariant checks, as in Sturdy.
- Deprecated deployment still governs cash — a sunset chain instance or old governor still controls markets, treasuries, or admin rights, as in Moonwell Moonriver.
- Deprecated migration source still certifies value — a retiring staking, lock, or vault system is still accepted as authoritative proof for creating or refunding redeemable balance in the replacement flow, as in TempleDAO / STAX.
- Deprecated immutable system still custodies value — active development ends, but withdrawable balances remain exposed to latent bugs, as in Aztec Connect.
- Operationally dead, technically live — front ends, docs, and social attention disappear long before the underlying authority surface is removed.
Three retirement-authority promotions reviewers should not collapse
-
A deprecated surface still exists at all
- The old contract, deployment, helper, governor, migration source, withdrawal rail, or operator stack is still reachable enough to do something.
- This is only the reachability question:
some old path is still there.
-
That surviving surface still counts as canonical authority truth for this exact action
- The harder question is whether the system still treats that old path as authoritative for minting, solvency, withdrawal eligibility, governance, settlement, or configuration.
- Many incidents become catastrophic because teams quietly promote
legacy compatibilityintostill canonical certifier of value or authority.
-
That accepted legacy truth still deserves this much live authority right now
- Even if a residual path must survive for compatibility or exits, it should not automatically retain ordinary-speed mint, admin, governance, collateral, or treasury authority.
- This is the authority-budget question:
why does this old path still get to matter this much today?
Healthy retirement review keeps those three promotions separate instead of flattening them into one vague the legacy system was still live story.
- Detection heuristics:
- Inventory every path or deployment described as
deprecated,legacy,sunset,old,maintenance-only,unsupported, ordo not useand ask what exact authority it still has. - Diff new safety checks against the full callable surface; if a mitigation was added function-by-function, assume a legacy sibling may still be exposed.
- Treat configuration-reachable deprecated branches as live production code, especially if they can mint, publish prices, toggle collateral, or release value.
- Ask whether removing front-end visibility or reducing docs support changed any onchain power at all.
- For old deployments, compare residual protected value with current governance depth, liquidity, and monitoring quality.
- For immutable systems, ask whether a product can be
deprecatedwhile still leaving ordinary withdrawals or settlement live for years.
- Inventory every path or deployment described as
- Defenses:
- Turn deprecation into an enforced state transition: revoke mint paths, disable entrypoints, migrate balances, remove admin rights, or quarantine withdrawals behind narrower controls.
- When hardening one vulnerability class, prove coverage across the whole authority surface rather than only the primary UX path.
- Treat deprecated code as high-risk until it is removed, permissioned off, or economically neutered.
- Move residual deployments to a clearly defended custodian or fully unwind their cash and root powers.
- Separate
unsupportedfromstill authoritativein docs and runbooks; if users can still lose money through it, it needs first-class security ownership. - Build explicit decommissioning checklists that remove authority, not just attention; decommissioning-authority-extinguishment-discipline is the positive-design companion for what those runbooks should prove.
- If the old system must survive for withdrawals or settlement, force it into a bounded residual service rather than vague
legacy compatibility; exit-only-residual-surface-discipline is the narrower companion for that case. - Once that residual path exists, publish it as
withdraw only, still monitoredand remove downstream fresh-trust assumptions instead of letting vaguelegacylabeling re-normalize it; exit-only-status-signaling-and-downstream-de-recognition is the communication-side companion for that case. - Then publish one canonical structured residual-status object so routers, collateral engines, dashboards, and governance tooling do not have to infer that treatment from prose; machine-readable-residual-status-publication is the policy-distribution companion for that case.
- Then keep the balances left behind segregated from active TVL, route scoring, and collateral assumptions so residual inventory does not quietly regain production meaning; residual-liquidity-segregation-and-active-tvl-hygiene is the accounting-side companion for that case.
What sound design looks like
- Healthy systems keep three retirement-authority promotions explicit instead of inheriting them from one soft
legacylabel:a deprecated surface still exists,that surviving surface still counts as canonical authority truth for this exact action, andthat accepted legacy truth still deserves this much live authority right nowshould each need their own justification. - Deprecation is a balance-sheet and authority transition, not a documentation update. The old surface either loses the power to mint, govern, settle, configure, or withdraw value, or it is still a production security surface no matter how unfashionable it has become.
- Retirement should narrow authority monotonically:
activecan becomeexit-only,admin-frozen, or fully extinguished, but it should never linger in a socially dead yet technically sovereign middle state. - Residual compatibility paths should be explicit and bounded. If withdrawals or migrations must stay live, the protocol should preserve only that narrow duty, remove every unrelated privilege, and publish the residual status clearly enough that downstream systems stop treating the venue as normal liquidity or collateral support.
- Hardening should follow authority, not traffic. Legacy entrypoints, stale deployments, and obsolete operators deserve first-class review for as long as they can still define money-good truth.
- A decommissioned system should have one accountable owner until the last real power is gone: someone who can explain what the old surface still controls, what monitoring still covers it, and what exact event will count as true retirement.
Failure-prevention checklist
- Maintain a decommissioning inventory that names every deprecated contract, deployment, helper, admin role, reward rail, migration source, and residual balance along with the exact authority each still holds.
- Document the three retirement gates explicitly for each legacy surface:
still reachable at all,still canonical for this action class, andstill allowed this much live authority. If teams cannot answer those separately,deprecatedis doing too much narrative work. - Convert
deprecatedinto an objective state change: disable public entrypoints, revoke minters and admins, zero configuration that can still publish value, and remove old surfaces from downstream solvency and routing assumptions. - Diff every new hardening patch against the full historical callable surface, including legacy siblings and compatibility helpers, before declaring a vulnerability class closed.
- Force residual systems into explicit bounded modes such as
withdraw-only,redeem-only, oradmin-frozen, and make the residual mode machine-readable rather than prose-only. - Move leftover cash, governance rights, proxy-admin rights, oracle setters, and mint authority to a clearly owned successor custodian or extinguish them entirely before reducing monitoring.
- Keep deprecated surfaces inside first-class alerting, code-ownership, and incident-response coverage until their authority is truly gone;
low trafficis not a security downgrade signal. - Treat migrations as authority transfer projects, not UX upgrades: the old system should stop certifying balances, permissions, or collateral truth the moment the replacement starts honoring them.
- Periodically test whether any
legacypath can still mint, withdraw, toggle collateral, set rates, or govern value despite current team beliefs that it is dead.
Audit prompts
- Which paths, deployments, and roles are described internally or publicly as
deprecated,legacy,maintenance-only,old,sunset,exit-only, orunsupported, and what exact authority does each still retain? - For each such surface, can reviewers answer three separate questions: does it still exist at all, does it still count as canonical authority truth for this exact action, and if so why does it still deserve this much live authority?
- When the last major hardening change landed, which legacy siblings, helper functions, migration adapters, or old deployments were explicitly checked for the same bug class?
- Could a deprecated branch still publish any truth that downstream systems honor: balances, exchange rates, reward indexes, withdrawal eligibility, governance authority, bridge release authority, or mint limits?
- Has front-end removal or documentation de-emphasis been mistaken for technical retirement anywhere in the stack?
- If a deprecated deployment still holds assets or admin rights, what defended owner now controls those rights, and what prevents cheap governance or stale admin paths from seizing them?
- Are residual balances and deprecated venues still counted in active TVL, route quality, collateral support, or governance significance even though the team believes they are out of production?
- Which monitoring, alerting, and signer runbooks still cover deprecated authority surfaces, and which ones quietly stopped when attention shifted to the replacement?
- If an attacker used the old path today, would responders clearly recognize it as a live authority incident rather than a confusing
but that system was deprecatedanomaly?
Lessons that should already be standard
-
Deprecatedis not a security control. Authority only shrinks when the system can no longer exercise it. -
The old path still exists,the old path still counts as canonical authority truth, andthe old path still deserves live economic or constitutional budgetare three different claims. -
Removing a UI path or docs page without removing onchain or backend authority usually makes the surface more dangerous, not less, because it becomes both live and under-watched.
-
A migration is incomplete if the retiring system can still certify balances, governance rights, collateral truth, or redeemable claims in the replacement environment.
-
Hardening only the popular path is how legacy siblings become exploit paths.
-
Residual deployments need stronger clarity, not vaguer language: either they are truly dead, or they are still a production security surface with explicit bounded duties.
-
Teams should assume deprecated systems fail at the worst possible moment: after review ownership, operator memory, monitoring quality, and market attention have already decayed.
-
High-signal incidents:
- [[../../../incidents/governance-admin-upgrades/acala-ibtc-ausd-deprecated-dexsaving-reward-rate-misconfiguration-recursive-unbacked-ausd-mint-2022-08-14|Acala iBTC/aUSD deprecated
DexSavingreward-rate misconfiguration / recursive unbacked aUSD mint (2022-08-14)]] — a deprecated rewards branch still had aUSD mint authority, and one mis-setDexSavingRewardRatesparameter turned ordinary LP reward claims into recursive unbacked stable issuance. - 1B HLG mint (2024-06-13) — Holograph’s legacy
v1operator / proxy admin surface was socially obsolete but still technically authoritative enough to sit inside the HLG mint boundary, so retained historical admin access functioned as a live backdoor rather than dead infrastructure. - collateral-toggle bypass (2023-06-12) — Sturdy had already wrapped most paths with
_validateOracle(), but one deprecatedsetUserUseReserveAsCollateral()entrypoint still touched solvency without the new protection. - [[../../../incidents/lending-liquidations/templedao-stax-migratestake-unvalidated-oldstaking-drain-2022-10-11|TempleDAO / STAX
migrateStake()unvalidated oldStaking drain (2022-10-11)]] — STAX’s replacement staking contract treated a retiringoldStakingsystem as if it could still certify new redeemable stake, somigration supportremained a live withdrawal-authority surface instead of a harmless legacy bridge. - [[../../../incidents/proofs-verifiers/aztec-connect-processrollup-numrealtxs-proof-settlement-boundary-drain-2026-06-14|Aztec Connect
processRollup()numRealTxsproof-settlement boundary drain (2026-06-14)]] — Aztec Connect had been deprecated and governance-renounced, but the immutable system still held withdrawable value, so the old proof/settlement flaw remained economically live. - [[../../../incidents/proofs-verifiers/aztec-2-escapehatch-old-data-root-decoupling-unsound-proof-withdrawal-2026-06-17|Aztec 2.0
escapeHatch()old_data_rootdecoupling / unsound proof withdrawal (2026-06-17)]] — Aztec 2.0 had been deprecated even earlier, yet the old escape-hatch verifier and residual operator permissions still controlled real assets long after the codebase had moved on. - Moonwell Moonriver MFAM low-float governance capture attempt (2026-03-24) — a deprecated deployment still controlled about
$1.08Mof market cash and admin rights behind governance cheap enough to buy outright.
- [[../../../incidents/governance-admin-upgrades/acala-ibtc-ausd-deprecated-dexsaving-reward-rate-misconfiguration-recursive-unbacked-ausd-mint-2022-08-14|Acala iBTC/aUSD deprecated
Internal linkages
- Positive-design companion: decommissioning-authority-extinguishment-discipline — use that note when the sharper question is not just
how did deprecation fail?, butwhat should a real retirement runbook have proven before operators stopped treating the old surface as production risk? - Adjacent production-ops companion: operator-experimentation-separation-from-live-balance-sheet-authority — use that note when the sharper question is not only that an old path never lost authority, but that operators were still able to treat a live production setter or deprecated parameter rail like a test harness for mint, reward, or solvency truth.
- Narrower residual-service companion: exit-only-residual-surface-discipline — use that note when the old system still had to survive for withdrawals or settlement, and the sharper design question is how that legacy path should have been narrowed, bounded, and explicitly owned.
- Communication-side residual companion: exit-only-status-signaling-and-downstream-de-recognition — use that note when the residual path is already technically justified and the sharper question becomes how users, routers, dashboards, and governance operators should keep treating it as
withdraw onlyinstead of quietly drifting back into normal-liquidity assumptions. - Policy-distribution residual companion: machine-readable-residual-status-publication — use that note when the residual path is already technically and communicatively justified and the sharper question becomes what exact structured status object downstream systems should consume.
- Alias-propagation residual companion: residual-status-inheritance-across-aliases-and-successors — use that note when the residual path is already technically and communicatively justified and the sharper question becomes how wrappers, route ids, migration helpers, bridge aliases, and successor labels should inherit the same residual treatment.
- Accounting-side residual companion: residual-liquidity-segregation-and-active-tvl-hygiene — use that note when the residual path is already technically and communicatively understood and the sharper question becomes how the balances left behind should stop counting as active TVL, healthy venue depth, or fresh collateral support.
- Governance-side narrower cousin: governance-decay-remnant-authority-capture — use that note when the decisive lesson is specifically that the electorate decayed below the residual governance authority it still defended.
- Launch-side lifecycle cousin: fresh-market initialization failure — both families are about lifecycle boundaries that teams treat operationally instead of encoding technically, but that note is about unsafe activation while this note is about unsafe retirement.
- Migration-side narrower cousin: migration trust-boundary failure — use that note when the sharper question is the exact cutover-authentication bug; stay here when the stronger lesson is that a retiring legacy system never actually lost authority to mint, refund, or authorize withdrawals in the replacement flow.
- Adjacent control-surface reminder: operator-boundary opacity — both patterns punish stale mental models of where authority really lives, but this note is about deprecated surfaces that stayed live rather than hidden operator concentration.
- Best current case studies: acala-ibtc-ausd-deprecated-dexsaving-reward-rate-misconfiguration-recursive-unbacked-ausd-mint-2022-08-14, holograph-v1-operator-contract-residual-admin-backdoor-1b-hlg-mint-2024-06-13, sturdy-finance-balancer-wsteth-weth-read-only-reentrancy-collateral-toggle-bypass-2023-06-12, templedao-stax-migratestake-unvalidated-oldstaking-drain-2022-10-11, aztec-connect-processrollup-numrealtxs-proof-settlement-boundary-drain-2026-06-14, aztec-2-escapehatch-old-data-root-decoupling-unsound-proof-withdrawal-2026-06-17, and moonwell-moonriver-mfam-low-float-governance-capture-attempt-2026-03-24.
Control surface
-
The leverage sits wherever
we do not really use this anymoreis allowed to coexist withthis can still mint, settle, withdraw, reconfigure, or govern real value. -
Deprecated systems fail when security ownership decays faster than authority does.
-
The sharp review split is three-layered:
the old path still exists,the system still treats it as canonical authority truth, andthat accepted truth still inherits live authority budget. -
The real decommissioning question is not whether the team moved on. It is whether the old path can still tell the balance sheet or governance system what reality is.
-
Sources:
- operator-experimentation-separation-from-live-balance-sheet-authority
- exit-only-status-signaling-and-downstream-de-recognition
- machine-readable-residual-status-publication
- residual-status-inheritance-across-aliases-and-successors
- residual-liquidity-segregation-and-active-tvl-hygiene
- https://medium.com/acalanetwork/acala-incident-report-14-08-2022-392089588642
- https://github.com/AcalaNetwork/Acala/pull/2341
- https://sturdyfinance.medium.com/exploit-post-mortem-49261493307a
- https://aztec-labs.com/blog/aztec-connect-incident.html
- https://forum.moonwell.fi/t/governance-notice-unverified-proposal-on-moonriver-mip-r39/2143
- https://forum.moonwell.fi/t/governance-notice-unverified-proposal-on-moonriver-mip-r39/2143.json
-
Last reviewed: 2026-07-31 UTC