Hợp đồng thông minh (Blockchain smart contract) rất khó để vận hành đúng. Khả năng lưu trữ giá trị, tính minh bạch và tính bất biến, là ba thuộc tính chính rất cần thiết để hợp đồng thông minh hoạt động hiệu quả. Tuy nhiên, những thuộc tính này cũng khiến cho nhiều hợp đồng thông minh phát sinh rủi ro bảo mật và là “con mồi” mà nhiều tội phạm mạng nhắm tới. Ngay cả khi các cuộc tấn công có chủ đích không được thực hiện, vẫn có rất nhiều trường hợp liên quan đến việc nguồn tài chính bị giam lại và các công ty bị tổn thất tiền do các lỗi và lỗ hổng bảo mật trong hợp đồng thông minh gây ra.

1. Lỗi integer alrithmatics

Một sự cố thường hay xảy ra là sai số học số nguyên. Các hợp đồng thông minh thường biểu thị các số dưới dạng số nguyên do thiếu sự hỗ trợ của dấu phẩy động. Ngoài ra, đây cũng là trường hợp khá phổ biến trong phần mềm tài chính, việc sử dụng số nguyên để biểu thị giá trị đòi hỏi phải giảm xuống các đơn vị nhỏ, sao cho chính xác nhất. Ví dụ đơn giản là việc biểu thị giá trị bằng xu thay vì đô la, vì ta không thể nào biểu thị 0,5 đô la. Trên thực tế, các hợp đồng thông minh thường làm tròn với tối đa 18 chữ số thập phân do nhiều token hỗ trợ.

Một vấn đề mà các nhà phát triển ngày nay biết khá rõ là thực tế là các số nguyên có thể bị tràn. Giống như bộ đếm quãng đường trên ô tô, khi hệ thống ghi nhận giá trị lớn nhất, bộ đếm sẽ ngay lập tức quay trở lại giá trị ban đầu. Tương tự, thực hiện phép trừ của hai số nguyên không được ký (unsigned integers) 4 và 3 sẽ gây ra tràn dưới, nên kết quả là một số rất lớn. Các nhà phát triển thường nhận thức được lỗ hổng tiềm ẩn này và ngăn chặn nó bằng cách sử dụng thư viện toán học an toàn, chẳng hạn như sản phẩm của công ty Open Zeppelin.

Tuy nhiên, điều mà dường như không được nhà phát triển đánh giá cao đó là số học số nguyên nói chung có thể dẫn đến kết quả thiếu chính xác khi gặp sai sót trong quá trình tính toán. Đặc biệt, thứ tự các thao tác là rất quan trọng. Một trường hợp điển hình là tính toán tỷ lệ phần trăm. Ví dụ: để tính 25%, chúng ta thường chia cho 100 và nhân với 25. Giả sử chúng ta muốn tính 25% của 80 bằng cách sử dụng số nguyên. Biểu thị phép tính này sẽ là 80/100*25 cho ra kết quả sẽ bằng 0, do lỗi làm tròn. Sai lầm đơn giản ở đây là việc thực hiện phép chia trước phép nhân.

Tất nhiên, đây chỉ là một trường hợp rất đơn giản, nhưng lại thường xuyên bị bắt gặp với tần suất đáng báo động.

2. Lỗ hổng giới hạn gas của khối (block gas limit)

Giới hạn gas của khối là cách nền tảng Ethereum sử dụng để đảm bảo các khối không phát triển quá lớn. Đơn giản có nghĩa là lượng gas tối đa trong một khối mà các giao dịch trong khối có thể tiêu thụ. Nói cách khác, nếu một giao dịch tiêu thụ quá nhiều gas, thì giao dịch đó sẽ không bao giờ nằm ​​gọn trong một khối và do đó giao dịch này sẽ không bao giờ được thực hiện.

Điều này có thể tạo ra một lỗ hổng phổ biến: Nếu dữ liệu được lưu trữ trong các mảng có kích thước không cố định và sau đó được truy cập thông qua các vòng lặp trên các mảng này, giao dịch có thể cạn kiệt gas và được hoàn tiền. Điều này xảy ra khi số lượng phần tử trong mảng tăng lên, nhưng thường xảy ra trong sản xuất nhiều hơn trong thử nghiệm. Trên thực tế, dữ liệu thử nghiệm thường nhỏ hơn khiến vấn đề này trở nên nguy hiểm vì các hợp đồng có lỗ hổng này thường vượt qua các bài kiểm thử đơn vị và dường như hoạt động tốt với một số lượng nhỏ người dùng. Tuy nhiên, người dùng thất bại chỉ khi một dự án đạt được động lực và lượng dữ liệu tăng lên. Việc không thể thu hồi lại các khoản tiền thưởng xảy ra nếu các vòng lặp đó được sử dụng để đẩy các khoản thanh toán.

3. Thiếu parameter hoặc precondition checks

Một trong những lỗi lập trình đơn giản nhất mà chúng ta thường mắc phải là không xác thực các đối số của một hàm hoặc quên thực hiện các kiểm tra cần thiết để một hoạt động hợp lệ. Điều này thường bao gồm không kiểm tra địa chỉ không của tham số địa chỉ hoặc, chẳng hạn như không xác minh rằng người dùng có đủ số dư token để tiến hành một giao dịch nhất định. Một ví dụ điển hình khác là việc kiểm soát truy cập, trong đó chỉ một loại người dùng nhất định mới được phép gọi một hàm nhưng việc kiểm tra này không bao giờ được tiến hành.

Những lỗi này thường là kết quả của một quá trình thiết kế cẩu thả. Bạn nên có một bản ghi chi tiết của tất cả các hàm, trong đó nêu rõ các tham số, điều kiện tiên quyết và các hoạt động cần thực hiện. Bám sát vào các mẫu thiết kế thực tiễn tốt nhất, chẳng hạn như Checks Effects Interactions, cũng có thể giúp ngăn chặn được loại lỗ hổng này.

4. Lỗ hổng Frontrunning

Frontrunning có lẽ là một lỗ hổng khó ngăn chặn nhất trong 5 lỗ hổng phổ biến với Smart Contract. Frontrunning có thể được định nghĩa là đặt lệnh mua một giao dịch chưa được xác nhận. Đây là kết quả của đặc tính minh bạch của blockchain. Tất cả các giao dịch chưa được xác nhận sẽ hiển thị trong mempool trước khi chúng được thợ đào đưa vào một khối. Các bên quan tâm có thể chỉ cần theo dõi các giao dịch mà họ thích và đặt lệnh mua giao dịch đó bằng cách trả phí giao dịch cao hơn. Điều này có thể được tự động hóa một cách dễ dàng và đã trở nên khá phổ biến trong các ứng dụng tài chính phi tập trung.

Không dễ để giải quyết vấn đề này, thông thường cần tái cấu trúc hoặc thiết kế lại hợp đồng thông minh để khắc phục.

5. Lỗi logic đơn giản

Một vài vấn đề nói trên là lỗi đặc trưng của hợp đồng thông minh trong khi đó một số lỗi khác là lỗi chung của tất cả các loại lập trình.Tuy nhiên, cho đến nay, loại vấn đề phổ biến nhất là những sai lầm đơn giản về mặt logic của hợp đồng thông minh. Những lỗi này có thể là do lỗi đánh máy, hiểu sai thông số kỹ thuật hoặc do một lỗi lập trình nghiêm trọng hơn. Các lỗi logic có xu hướng có liên quan đến tính bảo mật và chức năng của hợp đồng thông minh.

Tuy nhiên, điểm chung của các lỗi này là chỉ có thể được phát hiện nếu kiểm toán viên hiểu hoàn toàn cơ sở mã và có cái nhìn sâu sắc về chức năng dự kiến của dự án và đặc điểm kỹ thuật của hợp đồng. Chính những loại vấn đề này là lý do khiến việc kiểm toán hợp đồng thông minh mất nhiều thời gian, chi phí không rẻ và đòi hỏi những kiểm toán viên có nhiều kinh nghiệm.

Kết luận

Lập trình hợp đồng thông minh đã trải qua nhiều thay đổi trong vài năm qua. Vô số trường hợp nghiêm trọng xảy ra dẫn đến thất thoát tiền đã khiến các dự án nhận thức được tầm quan trọng của việc bảo mật. Chúng tôi nhận thấy rằng các nhà phát triển đã nhận thức rõ hơn về các lỗ hổng phổ biến và thường xuyên sử dụng các công cụ, chẳng hạn như phân tích mã tĩnh và thực thi tượng trưng để tự động quét mã của họ.

Nếu bạn cần kiểm toán toàn bộ smart contract cho dự án Blockchain của mình, hãy liên hệ với CyStack để tham khảo dịch vụ Smart Contract Audit 2.0 – được kiểm thử bởi các chuyên gia bảo mật có 8 năm kinh nghiệm kiểm thử bảo mật và 3 năm làm việc với các dự án Blockchain trong và ngoài nước.