Là một nền tảng blockchain hiệu suất cao mới nổi, Sui có một số công nghệ tiên tiến và tính độc đáo, đồng thời tập trung vào việc cung cấp trải nghiệm giao dịch nhanh chóng và an toàn cho các tình huống ứng dụng khác nhau. Bạn có thể tìm thấy kiến thức cơ bản về Sui trong Khám phá Sui: Công nghệ và bảo mật hợp đồng đằng sau hiệu suất cao . Khác với các ngôn ngữ lập trình được sử dụng phổ biến khác trong blockchain (chẳng hạn như Solidity), Sui sử dụng ngôn ngữ Move, ngôn ngữ này có thể giải quyết ở một mức độ nhất định các vấn đề về lỗ hổng thường gặp trong Solidity, chẳng hạn như tấn công vào lại, tràn số nguyên , chi tiêu gấp đôi, các cuộc tấn công DoS và sự cố trình biên dịch, nhưng nó không thể ngăn các nhà phát triển đưa lỗi vào mã. Vì vậy, các nhà phát triển cần hiểu và chú ý đến một số chức năng hoặc tính năng độc đáo khi sử dụng chúng để đảm bảo tính bảo mật cho hợp đồng thông minh.
Nhóm bảo mật SlowMist đã tích hợp và tiếp thu các phương pháp phát triển bảo mật được chia sẻ bởi cộng đồng Sui, kết hợp với kinh nghiệm kiểm tra bảo mật của chính họ được tích lũy qua nhiều năm, để đưa ra phần giới thiệu kiểm tra hợp đồng Sui-Move, nhằm giúp các nhà phát triển hiểu rõ hơn về rủi ro bảo mật của Hợp đồng thông minh Sui và Cung cấp các giải pháp thiết thực để giảm thiểu các mối đe dọa bảo mật tiềm ẩn.
Do giới hạn về không gian, bài viết này chỉ liệt kê một phần giới thiệu về kiểm tra hợp đồng Sui-Move. Bạn có thể xem, Fork và Star trên GitHub: https://github.com/slowmist/Sui-MOVE-Smart-Contract-. Kiểm toán-Primer/ blob/main/README_CN.md.
1. Khai báo và hiển thị mô-đun
1.1 Chức năng "public(friend)" ("public(friend)" được thay thế bằng "public(package)" trong phiên bản Sui mới nhất)
Định nghĩa: Được sử dụng để khai báo một hàm để chỉ mô-đun bạn bè được chỉ định mới có thể truy cập được. Điều này cung cấp khả năng kiểm soát truy cập chi tiết hơn, giữa "công khai" và "riêng tư".
Ví dụ:
1.2 chức năng "nhập"
Định nghĩa: Chức năng "entry" là điểm vào của mô-đun và cho phép các cuộc gọi trực tiếp từ bên trong khối giao dịch. Các tham số phải đến từ đầu vào của khối giao dịch và không thể là kết quả của các giao dịch trước đó trong khối hoặc dữ liệu đã sửa đổi. Ngoài ra, chức năng "entry" chỉ có thể trả về các loại có khả năng "thả".
Ví dụ:
Định nghĩa: Chức năng "entry" là điểm vào của mô-đun và cho phép các cuộc gọi trực tiếp từ bên trong khối giao dịch. Các tham số phải đến từ đầu vào của khối giao dịch và không thể là kết quả của các giao dịch trước đó trong khối hoặc dữ liệu đã sửa đổi. Ngoài ra, chức năng "entry" chỉ có thể trả về các loại có khả năng "thả".
Ví dụ:
1.3 chức năng "công khai"
Định nghĩa: các chức năng "công khai" có thể được gọi từ các khối giao dịch và các mô-đun khác, phù hợp cho tương tác bên ngoài. Nó không có các hạn chế tương tự về tham số và giá trị trả về như hàm "entry" và thường được sử dụng để hiển thị chức năng với thế giới bên ngoài.
Ví dụ:
2. Quản lý đối tượng
2.1 Tính duy nhất của đối tượng
Định nghĩa: Mỗi đối tượng Sui có một "objID" duy nhất, đảm bảo tính duy nhất của đối tượng trên chuỗi.
2.2 Đóng gói và giải nén
sự định nghĩa:
- Gói trực tiếp: Sử dụng đối tượng Sui làm trường của đối tượng khác và đối tượng gói phải bị hủy khi mở gói.
- Đóng gói đối tượng: Đối tượng được đóng gói trở thành một phần của đối tượng khác và không còn tồn tại độc lập. ID của đối tượng không thay đổi sau khi giải nén.
2.3 Chiến lược chuyển giao tùy chỉnh
Định nghĩa: Sử dụng "sui::transfer::transfer" để xác định chiến lược chuyển tùy chỉnh. Đối với các đối tượng có khả năng "lưu trữ", bạn có thể tạo chiến lược này thông qua "sui::transfer::public_transfer".
2.4 Thuộc tính của đối tượng
Định nghĩa: Các thuộc tính của một đối tượng Sui bao gồm "sao chép", "thả", "lưu trữ" và "khóa", xác định cách thức hoạt động của đối tượng.
2.5 Kiểm tra quyền đối tượng
- Đối tượng sở hữu địa chỉ
Định nghĩa: Các đối tượng được sở hữu bởi một địa chỉ cụ thể (địa chỉ tài khoản hoặc ID đối tượng). Chỉ chủ sở hữu đối tượng mới có thể truy cập và vận hành các đối tượng này.
- Đối tượng bất biến
Định nghĩa: Các đối tượng bất biến không thể được sửa đổi hoặc chuyển giao và bất kỳ ai cũng có thể truy cập được. Thích hợp cho dữ liệu cần truy cập toàn cầu nhưng không cần sửa đổi.
- Đối tượng được chia sẻ
Định nghĩa: Các đối tượng dùng chung có thể được truy cập và vận hành bởi nhiều người dùng và phù hợp với các tình huống như ứng dụng phi tập trung. Tuy nhiên, do cần sự đồng thuận nên chi phí vận hành cao.
- Đối tượng được bọc
Định nghĩa: Bao bọc một đối tượng là nhúng một đối tượng vào một đối tượng khác. Đối tượng được bao bọc không còn tồn tại độc lập và phải được truy cập thông qua đối tượng bao bọc.
3. Kiểm tra an ninh
3.1 Kiểm tra tràn số
Định nghĩa: Bao bọc một đối tượng là nhúng một đối tượng vào một đối tượng khác. Đối tượng được bao bọc không còn tồn tại độc lập và phải được truy cập thông qua đối tượng bao bọc.
3. Kiểm tra an ninh
3.1 Kiểm tra tràn số
Hợp đồng thông minh của Sui thực hiện kiểm tra tràn số theo mặc định.
3.2 Kiểm tra truy cập lại
Cái gọi là tấn công tái nhập là hành động chèn một cuộc gọi bất ngờ (bên ngoài) vào một giao dịch cuộc gọi hợp đồng thông thường, từ đó thay đổi quy trình cuộc gọi kinh doanh tổng thể và đạt được lợi nhuận bất hợp pháp. Bất cứ khi nào có sự tham gia của các cuộc gọi hợp đồng bên ngoài, đều có thể tiềm ẩn rủi ro tái gia nhập. Chúng ta có thể chia các vấn đề về reentrancy hiện tại thành ba loại: reentrancy đơn chức năng, reentrancy chéo chức năng và reentrancy chéo hợp đồng. Một số tính năng của ngôn ngữ Move cung cấp khả năng bảo vệ tự nhiên chống lại các cuộc tấn công quay trở lại:
- Không có cuộc gọi động nào trong Move và tất cả các cuộc gọi bên ngoài phải được nhập thông qua quá trình sử dụng trước tiên, tức là các cuộc gọi bên ngoài được mong đợi và xác định.
- Không có chuyển mã thông báo gốc nào kích hoạt chức năng Dự phòng.
- Trong Move, mô hình tài nguyên đảm bảo rằng tài nguyên chỉ có thể được truy cập bởi một bối cảnh thực thi duy nhất tại một thời điểm. Điều này có nghĩa là nếu việc thực thi hàm không hoàn thành thì các hàm khác không thể truy cập cùng một tài nguyên cho đến khi quá trình thực thi hoàn tất.
1. Kiểm tra tràn
Lưu ý: Move sẽ thực hiện kiểm tra tràn khi thực hiện các phép toán. Nếu thao tác tràn, giao dịch sẽ thất bại. Nhưng cần lưu ý rằng Move không thực hiện kiểm tra tràn cho các hoạt động bit.
Định vị: Tìm vị trí trong mã nơi các thao tác bit được thực hiện và kiểm tra xem có nguy cơ tràn hay không.
2. Kiểm tra lỗi chính xác số học
Lưu ý: Không có loại dấu phẩy động trong Move. Vì vậy, khi thực hiện các phép tính số học, nếu kết quả phép tính cần biểu diễn bằng số dấu phẩy động thì có thể xảy ra sai sót về độ chính xác. Mặc dù khó tránh khỏi hoàn toàn các lỗi về độ chính xác trong một số trường hợp nhưng tác động của chúng có thể được giảm thiểu thông qua việc tối ưu hóa và thiết kế hợp lý.
Định vị: Xem xét tất cả các phần của mã liên quan đến các phép tính số học, đặc biệt là các phép tính có thể tạo ra lỗi chính xác, đảm bảo rằng các thao tác này sẽ không có tác động tiêu cực đến logic hợp đồng hoặc độ chính xác bằng số, đồng thời đưa ra các đề xuất tối ưu hóa để giảm thiểu lỗi chính xác.
3. Kiểm toán cạnh tranh có điều kiện
Lưu ý: Trình xác thực trong Sui cũng có thể sắp xếp các giao dịch do người dùng gửi nên trong quá trình kiểm tra chúng ta vẫn cần chú ý đến vấn đề thu lợi nhuận từ việc sắp xếp các giao dịch trong cùng một khối.
chức vụ:
- Có bất kỳ sự quản lý dự kiến nào về trạng thái dữ liệu của hợp đồng trước khi hàm được gọi không?
- Liệu có sự quản lý dự kiến đối với trạng thái dữ liệu hợp đồng trong quá trình thực thi chức năng hay không.
- Có dự kiến quản lý trạng thái dữ liệu hợp đồng sau lệnh gọi hàm không?
4. Kiểm tra kiểm soát truy cập
Lưu ý: Một số chức năng chính trong hợp đồng phải được giới hạn ở các cuộc gọi nội bộ, chẳng hạn như các chức năng có thể cập nhật trực tiếp số tiền gửi của người dùng. Nếu các chức năng này vô tình được mở ra thế giới bên ngoài, việc kiểm soát quyền có thể bị bỏ qua, dẫn đến các lỗ hổng bảo mật và thậm chí là tổn thất tài sản. Do đó, quyền truy cập phải được thiết lập nghiêm ngặt để đảm bảo rằng chỉ những vai trò hoặc mô-đun được ủy quyền mới có thể gọi các chức năng này hoặc các chức năng chỉ có thể được sử dụng nội bộ.
Định vị: Bạn cần kiểm tra cài đặt kiểm soát truy cập của tất cả các chức năng, đặc biệt là những chức năng không được tiếp xúc với thế giới bên ngoài, để đảm bảo rằng chúng chỉ có thể được gọi nội bộ. Nếu phát hiện thấy một giao diện chức năng không nên để lộ đã bị lộ thì giao diện đó phải được đánh dấu là có rủi ro cao và phải đưa ra đề xuất khắc phục.
5. Kiểm toán quản lý đối tượng
Lưu ý: Trong Sui, các đối tượng có thể được chuyển đổi thành đối tượng dùng chung (Shared Object), nghĩa là quyền truy cập của đối tượng có thể thay đổi từ riêng tư sang công khai. Vì vậy, tất cả các đối tượng được sử dụng cần phải được xem xét kỹ lưỡng để xác định xem mỗi đối tượng là tĩnh hay dùng chung. Đặc biệt chú ý xem có đối tượng nào bị chuyển đổi nhầm từ đối tượng riêng tư sang đối tượng dùng chung hay không, điều này có thể dẫn đến việc người dùng truy cập trái phép vào các đối tượng này, gây ra những rủi ro bảo mật tiềm ẩn.
Định vị: Sắp xếp và phân tích tất cả các đối tượng liên quan đến mô-đun, kiểm tra loại đối tượng và cài đặt quyền, đồng thời đảm bảo rằng các quyền của đối tượng phù hợp với yêu cầu kinh doanh. Nếu phát hiện ra rằng một đối tượng riêng tư đã bị chuyển đổi nhầm thành đối tượng dùng chung thì đối tượng đó phải được gắn cờ là có nguy cơ tiềm ẩn và đề xuất khắc phục.
6. Kiểm tra mức tiêu thụ token
Định vị: Sắp xếp và phân tích tất cả các đối tượng liên quan đến mô-đun, kiểm tra loại đối tượng và cài đặt quyền, đồng thời đảm bảo rằng các quyền của đối tượng phù hợp với yêu cầu kinh doanh. Nếu phát hiện ra rằng một đối tượng riêng tư đã bị chuyển đổi nhầm thành đối tượng dùng chung thì đối tượng đó phải được gắn cờ là có nguy cơ tiềm ẩn và đề xuất khắc phục.
6. Kiểm tra mức tiêu thụ token
Lưu ý: Mô hình token của Sui khác với mô hình của các chuỗi khác. Sui cho phép các đối tượng giữ mã thông báo và các đối tượng mã thông báo có thể được lồng vào các đối tượng khác và phân chia. Do đó, trong các tình huống liên quan đến việc tiêu thụ token, cần đặc biệt chú ý đến việc quản lý và lưu hành token để tránh các vấn đề về bảo mật hoặc tổn thất không mong muốn.
chức vụ:
- Kiểm tra xem lượng tiêu thụ có chính xác không.
- Kiểm tra xem đối tượng mã thông báo đã được chuyển chính xác chưa.
- Kiểm tra xem việc chia tách và hợp nhất các mã thông báo có hợp lý hay không.
- Kiểm tra sự ràng buộc của mã thông báo với đối tượng.
7. Kiểm tra tấn công flash loan
Lưu ý: Sui's Move còn có cách sử dụng flash loan (Hot Potato). Người dùng có thể vay một số tiền lớn trong một giao dịch và sử dụng số tiền đó theo ý muốn và chỉ cần trả lại số tiền trong giao dịch. Những người dùng độc hại thường sử dụng các khoản vay nhanh để tăng số tiền của mình nhằm thực hiện các cuộc tấn công tài chính lớn như thao túng giá cả.
Định vị: Phân tích xem thuật toán của chính giao thức (phần thưởng, lãi suất, v.v.) và sự phụ thuộc vào máy oracle có hợp lý hay không.
8. Kiểm tra lỗ hổng quyền
Lưu ý: Trong hợp đồng Sui's Move, các lỗ hổng về quyền có liên quan chặt chẽ đến nhu cầu kinh doanh và thiết kế chức năng. Do đó, khi gặp một Mô-đun phức tạp hơn, bạn cần xác nhận quyền gọi của từng phương thức với bên dự án (các quyền ở đây thường đề cập đến. khả năng hiển thị chức năng và quyền gọi chức năng).
chức vụ:
- Kiểm tra và xác nhận khả năng hiển thị và quyền gọi của tất cả các phương thức chức năng. Trong giai đoạn đánh giá dự án, bên dự án phải cung cấp tài liệu thiết kế. Trong quá trình kiểm tra, các quyền được xác nhận dựa trên mô tả trong tài liệu thiết kế.
- Sắp xếp phạm vi quyền của vai trò của nhóm dự án. Nếu quyền của vai trò của nhóm dự án sẽ ảnh hưởng đến tài sản của người dùng thì sẽ có nguy cơ cấp quá nhiều quyền.
- Phân tích loại đối tượng được truyền trong hàm bên ngoài. Nếu đó là một hàm đặc quyền nào đó thì một số đối tượng đặc quyền phải tham gia.
9. Kiểm tra bảo mật nâng cấp hợp đồng
Lưu ý: Trong Move, các mô-đun bên ngoài được nhập thông qua từ khóa use. Cần lưu ý rằng hợp đồng của Sui có thể nâng cấp, nhưng gói hợp đồng đã xuất bản là đối tượng bất biến và không thể rút hoặc sửa đổi sau khi xuất bản. Bản chất của việc nâng cấp hợp đồng là xuất bản lại hợp đồng đã cập nhật tại địa chỉ mới và di chuyển dữ liệu của hợp đồng phiên bản cũ sang hợp đồng mới. Vì vậy, cần đặc biệt chú ý trong quá trình nâng cấp hợp đồng:
- Chức năng "init": Chức năng "init" chỉ được thực thi khi hợp đồng được giải phóng lần đầu tiên và sẽ không được kích hoạt lại khi nâng cấp hợp đồng tiếp theo.
- Nâng cấp hợp đồng sẽ không tự động cập nhật các phần phụ thuộc: Nếu gói hợp đồng phụ thuộc vào gói bên ngoài thì khi gói bên ngoài được nâng cấp, gói hợp đồng sẽ không tự động trỏ đến địa chỉ hợp đồng được nâng cấp. Do đó, bạn cần nâng cấp thủ công gói hợp đồng của mình để chỉ định các phần phụ thuộc mới.
Định vị: Cần tiến hành kiểm tra chi tiết logic di chuyển dữ liệu trong quá trình nâng cấp hợp đồng để đảm bảo hoạt động di chuyển được an toàn và chính xác, đồng thời tránh các vấn đề thiếu dữ liệu quan trọng hoặc dựa vào các bản cập nhật.
10. Kiểm tra bảo mật cuộc gọi bên ngoài
Lưu ý: Tương tự như các mục kiểm tra việc sử dụng mô-đun bên ngoài, vì các lệnh gọi bên ngoài trong Move yêu cầu phải nhập mô-đun bên ngoài trước, nên về lý thuyết, kết quả của các lệnh gọi bên ngoài là điều mà nhà phát triển mong đợi và điều chính cần có là sự ổn định của mô-đun bên ngoài.
Định vị: Cần kiểm tra các thư viện được nhập từ bên ngoài.
11. Kiểm tra giá trị trả về
Lưu ý: Tương tự như các ngôn ngữ hợp đồng thông minh khác, trong hợp đồng Move, cần phải kiểm tra giá trị trả về của một số hàm nhất định. Nếu việc xử lý các giá trị trả về này bị bỏ qua, logic khóa có thể không được thực thi chính xác, điều này có thể dẫn đến các vấn đề bảo mật.
Định vị: Bạn cần kiểm tra giá trị trả về của mọi lệnh gọi hàm trong mã của mình, đặc biệt là những lệnh liên quan đến lệnh gọi bên ngoài hoặc cập nhật trạng thái quan trọng. Nếu giá trị trả về không được xử lý hoặc xác minh, nó có thể dẫn đến hành vi không thể đoán trước và phải được đánh dấu là điểm rủi ro tiềm ẩn.
12. Kiểm tra từ chối dịch vụ
Lưu ý: Các cuộc tấn công từ chối dịch vụ (DoS) có thể do lỗi logic mã, sự cố tương thích hoặc các lỗ hổng bảo mật khác, khiến hợp đồng thông minh không hoạt động bình thường. Những vấn đề như vậy có thể ảnh hưởng đến tính sẵn có của hợp đồng hoặc thậm chí làm tê liệt hoàn toàn hợp đồng.
12. Kiểm tra từ chối dịch vụ
Lưu ý: Các cuộc tấn công từ chối dịch vụ (DoS) có thể do lỗi logic mã, sự cố tương thích hoặc các lỗ hổng bảo mật khác, khiến hợp đồng thông minh không hoạt động bình thường. Những vấn đề như vậy có thể ảnh hưởng đến tính sẵn có của hợp đồng hoặc thậm chí làm tê liệt hoàn toàn hợp đồng.
chức vụ:
- Tập trung vào việc kiểm tra tính mạnh mẽ của logic nghiệp vụ để đảm bảo rằng nó có thể được thực thi bình thường trong nhiều trường hợp khác nhau và hợp đồng sẽ không bị gián đoạn do lỗi hoặc sơ hở.
- Hãy chú ý đến các bộ phận tương tác với các mô-đun bên ngoài và đảm bảo khả năng tương thích của chúng để tránh tình trạng gián đoạn dịch vụ do các vấn đề phụ thuộc bên ngoài.
13. Kiểm toán tối ưu hóa khí
Lưu ý: Giống như Ethereum, Sui cũng có cơ chế Gas và bất kỳ lệnh gọi tập lệnh mô-đun nào cũng sẽ tiêu tốn Gas. Vì vậy, cần tối ưu hóa một số mã dài và có độ phức tạp cao.
chức vụ:
- Nó liên quan đến các cuộc gọi phức tạp để xem liệu chúng có thể được tách rời hay không.
- Nó liên quan đến các cuộc gọi tần số cao để xem liệu hiệu quả thực hiện chức năng nội bộ có thể được tối ưu hóa hay không.
14. Kiểm tra logic thiết kế
Lưu ý: Trọng tâm của việc kiểm tra logic thiết kế là kiểm tra quy trình kinh doanh và việc triển khai mã để xác nhận xem có lỗi thiết kế hoặc sai lệch so với mong đợi hay không. Việc triển khai mã không nhất quán với logic dự kiến có thể dẫn đến hành vi không mong muốn hoặc rủi ro bảo mật.
chức vụ:
- Dựa trên các quyền và phạm vi của các vai trò khác nhau, hãy sắp xếp các đường dẫn gọi có thể có trong quy trình công việc.
- Xác định phạm vi dữ liệu liên quan đến từng quy trình kinh doanh và đảm bảo rằng các hoạt động dữ liệu nhất quán với thiết kế kinh doanh.
- So sánh đường dẫn cuộc gọi thực tế với quy trình kinh doanh dự kiến, đồng thời xác định và phân tích mọi tình huống cuộc gọi có thể dẫn đến kết quả không mong muốn.
15. Những người khác
Nội dung không được phản ánh trong các biểu thức trên.
Đối với các nhà phát triển, việc làm theo các phương pháp hay nhất này có thể cải thiện hiệu quả tính bảo mật của hợp đồng thông minh và giảm thiểu rủi ro bảo mật tiềm ẩn. Hy vọng rằng cách thực hành tốt nhất này có thể giúp nhiều nhà phát triển hơn tạo ra các hợp đồng thông minh an toàn và đáng tin cậy, đồng thời thúc đẩy sự phát triển lành mạnh của công nghệ blockchain.
tham khảo:
[1] https://intro.sui-book.com/
[2] https://docs.sui.io/
[3] https://move-dao.github.io/move-book-zh/introduction.html
Tác giả | Chiến thắng!
Biên tập viên Lisa, Liz
Tất cả bình luận