New regression testing for CVE-2018-17144, CVE-2012-2459, and CVE-2010-5137.
CVE-2018-17144 and CVE-2012-2459 are only partially tested for regression. - CVE-2018-17144 is not tested for the inflation bug. - CVE-2012-2459 is only tested for the mutated block being rejected, not for the original block being accepted afterwards. This commit fixes that limitation. Also added functional test for CVE-2010-5137.
This commit is contained in:
parent
38bfca6bb2
commit
0c62e3aa73
2 changed files with 88 additions and 7 deletions
|
@ -24,7 +24,24 @@ import abc
|
||||||
from test_framework.messages import CTransaction, CTxIn, CTxOut, COutPoint
|
from test_framework.messages import CTransaction, CTxIn, CTxOut, COutPoint
|
||||||
from test_framework import script as sc
|
from test_framework import script as sc
|
||||||
from test_framework.blocktools import create_tx_with_script, MAX_BLOCK_SIGOPS
|
from test_framework.blocktools import create_tx_with_script, MAX_BLOCK_SIGOPS
|
||||||
|
from test_framework.script import (
|
||||||
|
CScript,
|
||||||
|
OP_CAT,
|
||||||
|
OP_SUBSTR,
|
||||||
|
OP_LEFT,
|
||||||
|
OP_RIGHT,
|
||||||
|
OP_INVERT,
|
||||||
|
OP_AND,
|
||||||
|
OP_OR,
|
||||||
|
OP_XOR,
|
||||||
|
OP_2MUL,
|
||||||
|
OP_2DIV,
|
||||||
|
OP_MUL,
|
||||||
|
OP_DIV,
|
||||||
|
OP_MOD,
|
||||||
|
OP_LSHIFT,
|
||||||
|
OP_RSHIFT
|
||||||
|
)
|
||||||
basic_p2sh = sc.CScript([sc.OP_HASH160, sc.hash160(sc.CScript([sc.OP_0])), sc.OP_EQUAL])
|
basic_p2sh = sc.CScript([sc.OP_HASH160, sc.hash160(sc.CScript([sc.OP_0])), sc.OP_EQUAL])
|
||||||
|
|
||||||
|
|
||||||
|
@ -178,7 +195,44 @@ class TooManySigops(BadTxTemplate):
|
||||||
script_pub_key=lotsa_checksigs,
|
script_pub_key=lotsa_checksigs,
|
||||||
amount=1)
|
amount=1)
|
||||||
|
|
||||||
|
def getDisabledOpcodeTemplate(opcode):
|
||||||
|
""" Creates disabled opcode tx template class"""
|
||||||
|
def get_tx(self):
|
||||||
|
tx = CTransaction()
|
||||||
|
vin = self.valid_txin
|
||||||
|
vin.scriptSig = CScript([opcode])
|
||||||
|
tx.vin.append(vin)
|
||||||
|
tx.vout.append(CTxOut(1, basic_p2sh))
|
||||||
|
tx.calc_sha256()
|
||||||
|
return tx
|
||||||
|
|
||||||
|
return type('DisabledOpcode_' + str(opcode), (BadTxTemplate,), {
|
||||||
|
'reject_reason': "disabled opcode",
|
||||||
|
'expect_disconnect': True,
|
||||||
|
'get_tx': get_tx,
|
||||||
|
'valid_in_block' : True
|
||||||
|
})
|
||||||
|
|
||||||
|
# Disabled opcode tx templates (CVE-2010-5137)
|
||||||
|
DisabledOpcodeTemplates = [getDisabledOpcodeTemplate(opcode) for opcode in [
|
||||||
|
OP_CAT,
|
||||||
|
OP_SUBSTR,
|
||||||
|
OP_LEFT,
|
||||||
|
OP_RIGHT,
|
||||||
|
OP_INVERT,
|
||||||
|
OP_AND,
|
||||||
|
OP_OR,
|
||||||
|
OP_XOR,
|
||||||
|
OP_2MUL,
|
||||||
|
OP_2DIV,
|
||||||
|
OP_MUL,
|
||||||
|
OP_DIV,
|
||||||
|
OP_MOD,
|
||||||
|
OP_LSHIFT,
|
||||||
|
OP_RSHIFT]]
|
||||||
|
|
||||||
|
|
||||||
def iter_all_templates():
|
def iter_all_templates():
|
||||||
"""Iterate through all bad transaction template types."""
|
"""Iterate through all bad transaction template types."""
|
||||||
return BadTxTemplate.__subclasses__()
|
return BadTxTemplate.__subclasses__()
|
||||||
|
|
||||||
|
|
|
@ -85,12 +85,13 @@ class InvalidBlockRequestTest(BitcoinTestFramework):
|
||||||
# Check transactions for duplicate inputs (CVE-2018-17144)
|
# Check transactions for duplicate inputs (CVE-2018-17144)
|
||||||
self.log.info("Test duplicate input block.")
|
self.log.info("Test duplicate input block.")
|
||||||
|
|
||||||
block2_orig.vtx[2].vin.append(block2_orig.vtx[2].vin[0])
|
block2_dup = copy.deepcopy(block2_orig)
|
||||||
block2_orig.vtx[2].rehash()
|
block2_dup.vtx[2].vin.append(block2_dup.vtx[2].vin[0])
|
||||||
block2_orig.hashMerkleRoot = block2_orig.calc_merkle_root()
|
block2_dup.vtx[2].rehash()
|
||||||
block2_orig.rehash()
|
block2_dup.hashMerkleRoot = block2_dup.calc_merkle_root()
|
||||||
block2_orig.solve()
|
block2_dup.rehash()
|
||||||
node.p2p.send_blocks_and_test([block2_orig], node, success=False, reject_reason='bad-txns-inputs-duplicate')
|
block2_dup.solve()
|
||||||
|
node.p2p.send_blocks_and_test([block2_dup], node, success=False, reject_reason='bad-txns-inputs-duplicate')
|
||||||
|
|
||||||
self.log.info("Test very broken block.")
|
self.log.info("Test very broken block.")
|
||||||
|
|
||||||
|
@ -106,5 +107,31 @@ class InvalidBlockRequestTest(BitcoinTestFramework):
|
||||||
node.p2p.send_blocks_and_test([block3], node, success=False, reject_reason='bad-cb-amount')
|
node.p2p.send_blocks_and_test([block3], node, success=False, reject_reason='bad-cb-amount')
|
||||||
|
|
||||||
|
|
||||||
|
# Complete testing of CVE-2012-2459 by sending the original block.
|
||||||
|
# It should be accepted even though it has the same hash as the mutated one.
|
||||||
|
|
||||||
|
self.log.info("Test accepting original block after rejecting its mutated version.")
|
||||||
|
node.p2p.send_blocks_and_test([block2_orig], node, success=True, timeout=5)
|
||||||
|
|
||||||
|
# Update tip info
|
||||||
|
height += 1
|
||||||
|
block_time += 1
|
||||||
|
tip = int(block2_orig.hash, 16)
|
||||||
|
|
||||||
|
# Complete testing of CVE-2018-17144, by checking for the inflation bug.
|
||||||
|
# Create a block that spends the output of a tx in a previous block.
|
||||||
|
block4 = create_block(tip, create_coinbase(height), block_time)
|
||||||
|
tx3 = create_tx_with_script(tx2, 0, script_sig=b'\x51', amount=50 * COIN)
|
||||||
|
|
||||||
|
# Duplicates input
|
||||||
|
tx3.vin.append(tx3.vin[0])
|
||||||
|
tx3.rehash()
|
||||||
|
block4.vtx.append(tx3)
|
||||||
|
block4.hashMerkleRoot = block4.calc_merkle_root()
|
||||||
|
block4.rehash()
|
||||||
|
block4.solve()
|
||||||
|
self.log.info("Test inflation by duplicating input")
|
||||||
|
node.p2p.send_blocks_and_test([block4], node, success=False, reject_reason='bad-txns-inputs-duplicate')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
InvalidBlockRequestTest().main()
|
InvalidBlockRequestTest().main()
|
||||||
|
|
Loading…
Add table
Reference in a new issue