Skip to content

Commit 5ed52d1

Browse files
committed
[CCTPE-2158] Resolve security vulnerabilities in dependencies (circlefin#73)
### Summary This PR addresses 9 critical security vulnerabilities by updating vulnerable dependencies. ### Changes - JavaScript deps (docs/): Updated web3 `v1.8.1` -> `v4.16.0` and related packages - Python deps: Updated protobuf v3.20.2 → v6.32.0, web3 v5.30.0 → v6.20.3, cytoolz v0.12.0 → v0.12.3 - Code fix: Updated Web3 import syntax for v4 compatibility in docs/index.js - CI fix: Added .licenseignore to bypass license scanning for essential security packages ### Vulnerabilities Fixed - VULN-5014 (sha.js), VULN-5008 (cipher-base), VULN-4580 (form-data) - VULN-4115/4114 (pbkdf2), VULN-3960 (protobuf - fully resolved), VULN-3661 (base-x) - VULN-2119 (path-to-regexp), VULN-2014 (body-parser) ### Testing - [x] Security audits: 0 vulnerabilities - [x] Linter, docs sample script, anvil scripts: All working ### Notes - [x] Ready for public repo sync after merge
1 parent 1a2dcac commit 5ed52d1

File tree

8 files changed

+1530
-7197
lines changed

8 files changed

+1530
-7197
lines changed

.licenseignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pkg:npm/web3@4.16.0
2+
pkg:npm/@ethereumjs/rlp@5.0.2
3+
pkg:pypi/cytoolz@0.12.3
4+
pkg:pypi/protobuf@6.32.0

anvil/crosschainTransferIT.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,26 @@
1818

1919
from typing import List, Dict
2020
from web3 import Web3
21+
from eth_account import Account
2122
import solcx
2223
import unittest
2324
import time
2425

2526
# All addresses are automatically generated by anvil at startup
2627
addresses = {
27-
"attester": Web3.toChecksumAddress("0xbcd4042de499d14e55001ccbb24a551f3b954096"),
28-
"eth_usdc_master_minter": Web3.toChecksumAddress("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"),
29-
"eth_message_transmitter_deployer": Web3.toChecksumAddress("0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc"),
30-
"eth_token_messenger_deployer": Web3.toChecksumAddress("0x90f79bf6eb2c4f870365e785982e1f101e93b906"),
31-
"eth_token_minter_deployer": Web3.toChecksumAddress("0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"),
32-
"eth_token_messenger_user": Web3.toChecksumAddress("0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f"),
33-
"eth_token_controller": Web3.toChecksumAddress("0x71be63f3384f5fb98995898a86b02fb2426c5788"),
34-
"avax_usdc_master_minter": Web3.toChecksumAddress("0x70997970c51812dc3a010c7d01b50e0d17dc79c8"),
35-
"avax_message_transmitter_deployer": Web3.toChecksumAddress("0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc"),
36-
"avax_token_messenger_deployer": Web3.toChecksumAddress("0x976ea74026e726554db657fa54763abd0c3a0aa9"),
37-
"avax_token_minter_deployer": Web3.toChecksumAddress("0x14dc79964da2c08b23698b3d3cc7ca32193d9955"),
38-
"avax_token_messenger_user": Web3.toChecksumAddress("0xa0ee7a142d267c1f36714e4a8f75612f20a79720"),
39-
"avax_token_controller": Web3.toChecksumAddress("0xfabb0ac9d68b0b445fb7357272ff202c5651694a"),
28+
"attester": Web3.to_checksum_address("0xbcd4042de499d14e55001ccbb24a551f3b954096"),
29+
"eth_usdc_master_minter": Web3.to_checksum_address("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"),
30+
"eth_message_transmitter_deployer": Web3.to_checksum_address("0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc"),
31+
"eth_token_messenger_deployer": Web3.to_checksum_address("0x90f79bf6eb2c4f870365e785982e1f101e93b906"),
32+
"eth_token_minter_deployer": Web3.to_checksum_address("0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"),
33+
"eth_token_messenger_user": Web3.to_checksum_address("0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f"),
34+
"eth_token_controller": Web3.to_checksum_address("0x71be63f3384f5fb98995898a86b02fb2426c5788"),
35+
"avax_usdc_master_minter": Web3.to_checksum_address("0x70997970c51812dc3a010c7d01b50e0d17dc79c8"),
36+
"avax_message_transmitter_deployer": Web3.to_checksum_address("0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc"),
37+
"avax_token_messenger_deployer": Web3.to_checksum_address("0x976ea74026e726554db657fa54763abd0c3a0aa9"),
38+
"avax_token_minter_deployer": Web3.to_checksum_address("0x14dc79964da2c08b23698b3d3cc7ca32193d9955"),
39+
"avax_token_messenger_user": Web3.to_checksum_address("0xa0ee7a142d267c1f36714e4a8f75612f20a79720"),
40+
"avax_token_controller": Web3.to_checksum_address("0xfabb0ac9d68b0b445fb7357272ff202c5651694a"),
4041
}
4142

4243
# All keys correspond with the addresses generated by anvil at startup
@@ -157,7 +158,7 @@ def to_32byte_hex(self, address):
157158
"""
158159
Converts a hex address to its zero-padded 32-byte representation.
159160
"""
160-
return Web3.toHex(Web3.toBytes(hexstr=address).rjust(32, b'\0'))
161+
return Web3.to_hex(Web3.to_bytes(hexstr=address).rjust(32, b'\0'))
161162

162163
def confirm_transaction(self, tx_hash, timeout=30):
163164
"""
@@ -178,7 +179,7 @@ def confirm_transaction(self, tx_hash, timeout=30):
178179
def setUp(self):
179180
# Connect to node
180181
self.w3 = Web3(Web3.HTTPProvider('http://0.0.0.0:8545'))
181-
assert self.w3.isConnected()
182+
assert self.w3.is_connected()
182183

183184
# Deploy and initialize USDC on ETH
184185
self.eth_usdc = self.deploy_contract_from_source('lib/centre-tokens.git/contracts/v2/FiatTokenV2_1.sol', 'FiatTokenV2_1', '0.6.12')
@@ -193,7 +194,7 @@ def setUp(self):
193194
addresses["eth_usdc_master_minter"]
194195
), "eth_usdc_master_minter")
195196
self.send_transaction(self.eth_usdc.functions.initializeV2("USDC"), "eth_usdc_master_minter")
196-
self.send_transaction(self.eth_usdc.functions.initializeV2_1(Web3.toChecksumAddress("0xb794f5ea0ba39494ce839613fffba74279579268")), "eth_usdc_master_minter")
197+
self.send_transaction(self.eth_usdc.functions.initializeV2_1(Web3.to_checksum_address("0xb794f5ea0ba39494ce839613fffba74279579268")), "eth_usdc_master_minter")
197198

198199
# Deploy and initialize USDC on AVAX
199200
self.avax_usdc = self.deploy_contract_from_source('lib/centre-tokens.git/contracts/v2/FiatTokenV2_1.sol', 'FiatTokenV2_1', '0.6.12')
@@ -208,7 +209,7 @@ def setUp(self):
208209
addresses["avax_usdc_master_minter"]
209210
), "avax_usdc_master_minter")
210211
self.send_transaction(self.avax_usdc.functions.initializeV2("USDC"), "avax_usdc_master_minter")
211-
self.send_transaction(self.avax_usdc.functions.initializeV2_1(Web3.toChecksumAddress("0xb794f5ea0ba39494ce839613fffba74279579268")), "avax_usdc_master_minter")
212+
self.send_transaction(self.avax_usdc.functions.initializeV2_1(Web3.to_checksum_address("0xb794f5ea0ba39494ce839613fffba74279579268")), "avax_usdc_master_minter")
212213

213214
# Deploy and construct required token messenger contracts for ETH
214215
self.eth_message = self.deploy_contract_from_source('src/messages/Message.sol', 'Message')
@@ -274,9 +275,10 @@ def test_crosschain_transfer(self):
274275
self.verify_balances(100, 0)
275276

276277
# parse MessageSent event emitted by avax_message_transmitter
277-
avax_message_sent_filter = self.avax_message_transmitter.events.MessageSent.createFilter(fromBlock="0x0")
278+
avax_message_sent_filter = self.avax_message_transmitter.events.MessageSent.create_filter(fromBlock="0x0")
278279
avax_message_bytes = avax_message_sent_filter.get_new_entries()[0]['args']['message']
279-
avax_signed_message_bytes = self.w3.eth.account.signHash(Web3.keccak(avax_message_bytes), keys["attester"]).signature
280+
attester_account = Account.from_key(keys["attester"])
281+
avax_signed_message_bytes = attester_account.signHash(Web3.keccak(avax_message_bytes)).signature
280282

281283
# receiveMessage with eth_message_transmitter to eth_token_messenger_user
282284
self.send_transaction(self.eth_message_transmitter.functions.receiveMessage(avax_message_bytes, avax_signed_message_bytes), "eth_token_messenger_user")
@@ -290,9 +292,9 @@ def test_crosschain_transfer(self):
290292
self.verify_balances(100, 0)
291293

292294
# parse MessageSent event emitted by eth_message_transmitter
293-
eth_message_sent_filter = self.eth_message_transmitter.events.MessageSent.createFilter(fromBlock="0x0")
295+
eth_message_sent_filter = self.eth_message_transmitter.events.MessageSent.create_filter(fromBlock="0x0")
294296
eth_message_bytes = eth_message_sent_filter.get_new_entries()[0]['args']['message']
295-
eth_signed_message_bytes = self.w3.eth.account.signHash(Web3.keccak(eth_message_bytes), keys["attester"]).signature
297+
eth_signed_message_bytes = attester_account.signHash(Web3.keccak(eth_message_bytes)).signature
296298

297299
# receiveMessage with avax_message_transmitter to avax_token_messenger_user
298300
self.send_transaction(self.avax_message_transmitter.functions.receiveMessage(eth_message_bytes, eth_signed_message_bytes), "avax_token_messenger_user")

anvil/crosschainTransferITV2.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import List, Dict
22
from web3 import Web3
3+
from eth_account import Account
34
import solcx
45
import unittest
56
import time
@@ -174,16 +175,17 @@ def update_and_sign_emitted_message(self, message_bytes):
174175
fee_executed_index_start : fee_executed_index_start + fee_executed_length
175176
] = fee_executed.to_bytes(32, "big")
176177
signable_bytes = bytes(mutable_message_bytes)
177-
signed_bytes = self.w3.eth.account.signHash(
178-
Web3.keccak(signable_bytes), keys["attester"]
178+
attester_account = Account.from_key(keys["attester"])
179+
signed_bytes = attester_account.signHash(
180+
Web3.keccak(signable_bytes)
179181
).signature
180182
return signable_bytes, signed_bytes
181183

182184
def to_32byte_hex(self, address):
183185
"""
184186
Converts a hex address to its zero-padded 32-byte representation.
185187
"""
186-
return Web3.toHex(Web3.toBytes(hexstr=address).rjust(32, b"\0"))
188+
return Web3.to_hex(Web3.to_bytes(hexstr=address).rjust(32, b"\0"))
187189

188190
def confirm_transaction(self, tx_hash, timeout=30):
189191
"""
@@ -206,7 +208,7 @@ def confirm_transaction(self, tx_hash, timeout=30):
206208
def setUp(self):
207209
# Connect to node
208210
self.w3 = Web3(Web3.HTTPProvider("http://0.0.0.0:8545"))
209-
assert self.w3.isConnected()
211+
assert self.w3.is_connected()
210212

211213
# Deploy and initialize USDC on ETH
212214
self.eth_usdc = self.deploy_contract_from_source(
@@ -232,7 +234,7 @@ def setUp(self):
232234
)
233235
self.send_transaction(
234236
self.eth_usdc.functions.initializeV2_1(
235-
Web3.toChecksumAddress("0xb794f5ea0ba39494ce839613fffba74279579268")
237+
Web3.to_checksum_address("0xb794f5ea0ba39494ce839613fffba74279579268")
236238
),
237239
"eth_usdc_master_minter",
238240
)
@@ -261,7 +263,7 @@ def setUp(self):
261263
)
262264
self.send_transaction(
263265
self.avax_usdc.functions.initializeV2_1(
264-
Web3.toChecksumAddress("0xb794f5ea0ba39494ce839613fffba74279579268")
266+
Web3.to_checksum_address("0xb794f5ea0ba39494ce839613fffba74279579268")
265267
),
266268
"avax_usdc_master_minter",
267269
)
@@ -554,7 +556,7 @@ def test_crosschain_transfer(self):
554556

555557
# parse MessageSent event emitted by avax_message_transmitter
556558
avax_message_sent_filter = (
557-
self.avax_message_transmitter.events.MessageSent.createFilter(
559+
self.avax_message_transmitter.events.MessageSent.create_filter(
558560
fromBlock="0x0"
559561
)
560562
)
@@ -600,7 +602,7 @@ def test_crosschain_transfer(self):
600602

601603
# parse MessageSent event emitted by eth_message_transmitter
602604
eth_message_sent_filter = (
603-
self.eth_message_transmitter.events.MessageSent.createFilter(
605+
self.eth_message_transmitter.events.MessageSent.create_filter(
604606
fromBlock="0x0"
605607
)
606608
)

docs/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
require("dotenv").config();
2-
const Web3 = require('web3')
2+
const { Web3 } = require('web3')
33

44
const tokenMessengerAbi = require('./abis/cctp/TokenMessenger.json');
55
const messageAbi = require('./abis/cctp/Message.json');

0 commit comments

Comments
 (0)