Chương 1: Tổng quan về khóa luận. e Chương 2: Dưa ra cơ sở lý thuyết và các nghiên cứu có liên quan. e Chương 3: Giới thiệu về phương pháp và mô hình dùng để phát hiện lỗ hồng trong Smart Contracts. e Chương 4: Thực hiện và đánh giá thí nghiệm.
e Chương 5: Rút ra kết luận và định hướng phát triển tiếp theo cho đề tài. CƠ SỞ LÝ THUYET Chương 2 sẽ giới thiệu lý thuyết cơ bản cho nghiên cứu này, bao gồm: Ethereum, Smart Contract, ngôn ngữ lập trình Solidity, các lỗ hổng tồn tại trong Smart Contract, mô hình dùng Deep Learning để phát hiện 16 hong va cơ chế attention. Nền tảng Ethereum Ethereum áp dụng công nghệ Blockchain, là một hệ thống điện toán phân tán, để thực hiện Smart Contract. Có nghĩa là các điều khoản trong Contract sẽ tự động được thực thi khi moi điều kiện được đặt trước đó đã được thoả mãn, không cho phép bất kì sự tác động nào từ bên ngoài.number - 04: NUMBER 1))%totalBets + 1; 05: SUB 06: BLOCKHASH Hình 2.1: Mối tương quan giữa sourcecode, opcode va bytecode của Smart Con- tract Smart Contract sẽ được triển khai trong môi trường của Ethereum Virtual Machine (EVM), hay còn được biết đến như máy ảo Ethereum.
Có thể hiểu đơn giản là EVM hoạt động giống như một trung gian để thực thi các Smart Contract trên mạng Ethereum. Source code ban đầu được viết bằng ngôn ngữ ĩ cấp cao (solidity). Tuy nhiên, con người tạo ra một số lượng biến tự định nghĩa trong mã nguồn (ví dụ như có thể đặt là address _ to hoặc address _ receiver) làm cho việc phân tích Smart Contract có thé không phù hợp. Có thể biên dịch source code thành opcode để EVM thực thi nó.
EVM sử dụng các opcode để thực thi những nhiệm vụ khác nhau. Có khoảng 140 opcode khác nhau giúp nâng cao EVM trở nên hoàn chỉnh, cho phép nó đánh giá mọi thứ, cụ thể là stop và các phép tính toán số học, phép so sánh, logic, sha3, thông tin biến environment, block, stack, memory, storage, luồng hoạt động,. EVM định nghĩa các lệnh opcodes bằng các con số, với mỗi số nhất định nó sẽ gắn liền với một opcode. Các opcode này được mã hóa thành mã bytecode để xác định mức độ bảo mật thích hợp.
EVM thống trị phần bên trong của Pthereum blockchain và cũng bao gồm danh sách chỉ tiết về trạng thái để bắt đầu giao dich. Bytecode thường là các mã số nhỏ gọn, chứa các câu lệnh cho máy tính ở dang nhị phan, mỗi lệnh là một opcode.1 thể hiện mối tương quan giữa source code, opcode và bytecode của Smart Contract 2. Solidity Solidity là một ngôn ngữ lập trình với cú pháp va cấu trúc mã tương tự như Javascript và C, được dùng để tao contract - một thành phần quan trọng để tạo block cho ứng dụng Ethereum trên EVM (Ethereum Virtual Machine). Solidity được xây dựng xoay quanh một khái niệm chính: contract.
Cơ bản thì contract giống như class trong lập trình tạo ra các đối tượng (OOP), với các biến trang thái (state variables) và chức năng (functions). Các khái niệm contract trừu tượng (contract có ít nhất một chức năng chưa được thực hiện) va interface (gồm các chữ ký của các tác vu) cũng giống như trong OOP. Smart Contract Smart Contract - hợp đồng thong minh, là những chương trình thực thi trên blockchain. Chúng giống như những hợp đồng số được điều chỉnh bởi một tập quy tắc rõ ràng.
Tập quy tắc đó được định nghĩa bởi mã máy tính mà tất cả các node trong mạng phải sao chép và tuân theo. Thực chat thi smart Contract chỉ là một đoạn mã (code) thực thi trên hệ thống phân tan (blockchain), nó có thể tạo ra các giao thức không cần quyền truy cập (permissionless). Trên Ethereum, Smart Contract đảm nhận việc thực hiện và quản lý các hoạt động xảy ra trên blockchin khi các người dùng (address) tương tác. Smart Contract sẽ được thực thi trong môi trường của Ethereum Virtual Machine (EVM), hay còn gọi là máy ảo Ethereum.
Don giản, EVM hoạt động như một trung gian trong việc thực thi Smart Contract trên mạng Ethereum.2 cho thấy mỗi nút Ethereum được trang bị mot EVM riêng, giúp dam bảo tính an toàn dữ liệu và phan tấn của mạng. EVM hỗ trợ thực thi và gọi các Smart Contract. EVM có kích thước stack đơn giản với kích thước stack tối đa là 1024. Do đó, nếu số lượng cuộc gọi vượt quá 1024 thì có thể xảy ra tình trạng tấn công Callstack.
Ethereum Node Ethereum Node Ethereum Node Smart Contracts Complied to 4 vy Ethereum Blockchain Ethereum Node Ethereum Node Hinh 2.2: Phương thúc hoạt động của EVM 2. Các lỗ hổng trong Smart Contract Phần này trình bày một số 16 hổng bảo mật trong các Smart Contract dựa trên Ethereum blockchain. Vì một Smart Contract có thể chứa hàng triệu đô la dưới dạng tiền điện tử nên những lỗ hong này có thể gây ra những ton thất nghiêm trọng. Reentrancy Reentrancy là một lỗ hổng Smart Contract có thể khai thác nổi tiếng xảy ra khi một Smart Contract gọi một Smart Contract và tiếp tục thực hiện sau khi cuộc gọi mới hoàn thành.
Điều này yêu cầu Smart Contract dễ bị tấn công gửi một cuộc gọi bên ngoài (external call), sau đó những kẻ lừa đảo có thể đánh cắp và thực hiện cuộc gọi đệ quy (recursive call) trở lại Smart Contract. Kẻ lừa đảo có thể tạo Smart Contract tại một dia chỉ bên ngoài bằng mã độc và rút tiền từ Smart Contract nếu không cập nhật trạng thái trước khi gửi tiền. Một ví dụ về smart contract tồn tại 16 hỗng này bị tan công này là cuộc tấn công DAO, dẫn đến mat ETH trị giá 150 triệu đô la từ Smart Contract của DAO (tổ chức tự trị phi tập trung). contract EtherStore { bWFonO2w mapping(address => uint) public balances; function deposit() public payable { balances[msg.value; function withdraw() public { uint balance = balances[msg.sender]; maCC¬ require(balance > 0); 12 // Not secure 10 13 (bool transferred, ) = msg.call{value: balance}(""); 14 require(transferred, “Khong the gui Ether"); 15 16 balances [msg.sender] = 0; 17 } 18 19 function getBalance() public view returns (uint) { 20 return address(this).balance; 21 } 22 } 23 24 contract Attack { 25 EtherStore public etherStore; 26 27 28 constructor(address _etherStoreAddress) { 29 etherStore = EtherStore(_etherStoreAddress) ; 30 31 32 fallback() external payable { 33 if (address(etherStore).balance >= 1 ether) f{ 34 etherStore.withdraw(); 35 } 36 } 37 38 function attack() external payable { 39 require(msg.value >= 1 ether); 40 etherStore.deposit{value: 1 ether}(); 41 etherStore.1: Mã nguồn minh hoa lỗ hổng Reentrancy Doan mã nguồn trên mô tả một Smart Contract.
có chứa lỗ hồng Reentrancy (EtherStore) và Smart Contract Attack là hợp đồng thông minh dùng để khai thác lỗ hong Reentrancy.3 mô tả các bước khai thác 16 hong Reentrancy. Khi contract EtherStore được deploy. Gỉa sử contract Attack sau khi deploy sẽ gọi ham deposit() của EtherStore và gửi vào một (ether). Sau đó contract Attack gọi hàm withdraw() để rút tiền đã gửi.
Khi các hợp đồng EtherStore không tiến hành cập nhật số dư của người dùng trước khi thực hiện việc chuyển tiền, người tấn công - attacker có thể liên tiếp gọi hàm withdraw để lấy hết số tiền (ether) trong contract. Bất kể khi nào contract của người tan công - attacker nhận Ether, hợp đồng đó sẽ tự động thực thi ham fallback (chức năng không có tên trong contract, được kích hoạt khi function được gọi không khớp với moi hàm trong contract, hoặc khi gửi các ether tới mà không chứa dữ liệu), nơi mà lại gọi hàm withdraw thêm một lần nữa. Tại điểm này, cuộc tấn công bắt đầu một chu kỳ đệ quy và hợp đồng đó không thể cập nhật số dư của người thực hiện tấn công. Access-control Access control xác định các hạn chế xung quanh đặc quyền và vai trò của người dùng trong một ứng dung.
Access control trong Smart Contract có thể liên quan đến quan trị và logic quan trọng như đúc mã thông báo, bỏ phiếu cho các đề xuất, rút tiền, tạm dừng và nâng cấp hợp đồng, thay đổi quyền sở hữu. e Không xác thực việc sửa đổi - điều quan trọng là cần có xác thực Access control trên các chức năng quan trọng thực hiện các thao tác như sửa đổi chủ sở hữu, chuyển tiền và tokens, tạm dừng và bỏ tạm dừng hợp đồng, v. Không xác thực việc sửa đổi rất có thể sẽ dẫn đến sự thỏa hiệp của hợp 12 EXPLOIT REENTRANCY .===d-=el-========x==m== ee ed es 2. Chuyển tiền eS (call.
Chuyén tiền (call.3: Các bước khai thác lỗ hổng Reentrancy 13 đồng hoặc mất tiền. e Sửa đổi tên (names) không chính xác - Do lỗi của nhà phát triển và lỗi chính tả, có thể xảy ra trường hợp tên của việc sửa đổi hoặc chức năng không chính xác so với dự định. Các tác nhân độc hại cũng có thể khai thác nó để gọi chức năng (function) quan trọng mà không cần có công cụ sửa đổi, điều này dẫn đến mất tiền hoặc sửa đổi quyền sở hữu tùy thuộc vào logic của chức năng. e Các vai trò (roles) bị áp đảo - Việc cho phép người dùng có các vai trò bị áp đảo có thé dẫn đến các lỗ hong bảo mật.
Việc thực hành đặc quyền tối thiểu phải luôn được tuân theo khi gan đặc quyền. Unchecked-calls Unchecked-calls là một loại lỗ hong xảy ra khi giá trị trả về (return value) của cuộc gọi tin nhắn không được kiểm tra. Do đó mà việc thực thi sẽ tiếp tục ngay cả khi Smart Contract được gọi đưa ra một ngoại lệ. Nếu cuộc gọi (call) không thành công ngẫu nhiên hoặc do ké tấn công buộc cuộc gọi không thành công, gây ra hành vi không mong muốn, làm ảnh hưởng đến logic chương trình 1 contract Lotto f{ bCFDoO2eNw3t bool public isPayedDut = false; address public winnerAddress; uint public winningAmount ; function transferToWinner() public { require (!isPayedOut) ; winnerAddress.
balance) ; 14 13 14 } Lỗ hổng xảy ra ở dòng số 8, khi winner nhận một lượng winAmount ether, trong đó lệnh gửi (send) được sử dụng mà không kiểm tra phản hồi. Trong trường hợp một người chiến thắng có giao dịch không thành công (ví dụ như hết gas hoặc hợp đồng cố ý dưa vào ham fallback function) cho phép payedOut được đặt thành true bất kể ether có được gửi hay không. Thì trường hợp này, bất kể ai cũng có thể rút tiền của winner qua hàm withdrawLeftOver 2. Arithmetic Day là một lỗ hong pho biến, nó lưu các dữ liệu bằng định dang nhị phan trong đó, số nhị phân là tập hợp các bit và mỗi bit bằng 0 hoặc 1.
Arithmetic overflow là lỗi xảy ra khi mà có kết quả của một phép toán vượt qua giá trị tối đa mà chương trình có thể lưu trữ.