Skip to content

Delay-Only Procedure Policies Can Permanently Brick multisig_smart Procedures #3780

Description

@onurinanc

set_procedure_policy accepts a policy with immediate_threshold = 0 and delayed_threshold > 0 (a delay-only policy) without rejecting it. enforce_procedure_policy always evaluates policies in immediate mode, and compute_proc_policy_contribution panics whenever a procedure carries a policy configured only for the opposite mode. As a result, any procedure assigned a delay-only policy becomes permanently uncallable starting with the next transaction. Because set_procedure_policy is itself subject to policy evaluation and is the only procedure that writes the policy map, targeting set_procedure_policy with a delay-only policy leaves no way to correct it afterward. The same combination can also be baked into an account's initial storage through the public with_proc_policies and with_delay_threshold constructors, since deployment-time validation there checks only for duplicate roots and threshold bounds.

The delayed execution path is not implemented, so a delay-only policy has no working use today. Reaching this state requires the signing quorum to configure an unsupported combination, and that same quorum already has simpler ways to render the account unusable, such as rotating its own auth keys to something nobody controls. This is a self-inflicted misconfiguration of an incomplete feature rather than an exploit with an adversary on the other side.

Consider rejecting delay-only policies until delayed execution is implemented, requiring delayed_threshold == 0 whenever immediate_threshold == 0 in both the on-chain setter and the Rust constructors, and adding a regression test that exercises a policy update targeting set_procedure_policy itself.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions