Skip to content

Fix OP_CHECKMULTISIG silently accepting a non-matching signature - #170

Open
ProofTubeProtocol wants to merge 1 commit into
buidl-bitcoin:mainfrom
ProofTubeProtocol:fix-checkmultisig-signature-bypass
Open

ProofTubeProtocol wants to merge 1 commit into
buidl-bitcoin:mainfrom
ProofTubeProtocol:fix-checkmultisig-signature-bypass

Conversation

@ProofTubeProtocol

Copy link
Copy Markdown

Fixes #169
op_checkmultisig's inner loop over remaining pubkeys had no way to detect exhausted every pubkey without a match -- a signature that does not correspond to any provided pubkey was silently treated as optional rather than causing the whole check to fail. A 1-of-1 (or N-of-N) CHECKMULTISIG script would accept any validly-DER-encoded signature regardless of whether it matched the locking pubkey(s) at all, defeating the actual authorization check.

Adds a while/else clause: if the inner loop exhausts every remaining point without hitting break, the signature did not match anything and the whole check now correctly returns False.

The same underlying flaw exists in the reference implementation this is based on -- see jimmysong/programmingbitcoin#270, open and unfixed there too.

Includes a regression test reusing the existing positive tests real transaction fixture, with one signature swapped for a real, validly DER-encoded signature from an unrelated transaction.

op_checkmultisig's inner loop over remaining pubkeys had no way to
detect exhausted every pubkey without a match -- a signature that
does not correspond to any provided pubkey was silently treated as
optional rather than causing the whole check to fail. A 1-of-1 (or
N-of-N) CHECKMULTISIG script would accept any validly-DER-encoded
signature regardless of whether it matched the locking pubkey(s) at
all, defeating the actual authorization check.

Adds a while/else clause: if the inner loop exhausts every remaining
point without hitting break, the signature did not match anything and
the whole check now correctly returns False.

The same underlying flaw exists in the reference implementation this
is based on -- see jimmysong/programmingbitcoin#270, open and unfixed
there too.

Includes a regression test reusing the existing positive tests real
transaction fixture, with one signature swapped for a real, validly
DER-encoded signature from an unrelated transaction.
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.

OP_CHECKMULTISIG silently accepts a signature that matches no pubkey

1 participant