
CertiK: Trình duyệt blockchain làm thế nào để ngăn chặn bị tấn công DoS?
Tuyển chọn TechFlowTuyển chọn TechFlow

CertiK: Trình duyệt blockchain làm thế nào để ngăn chặn bị tấn công DoS?
Vui lòng nhập thông tin tóm tắt. Trình duyệt blockchain là công cụ tìm kiếm của blockchain, người dùng có thể sử dụng công cụ này để tìm kiếm các thông tin cụ thể trên blockchain.
Khi nhắc đến trình duyệt, chắc chắn những gì hiện lên trong đầu mọi người sẽ là “Baidu một cái, bạn sẽ biết”, “lướt web từ Sogou bắt đầu”...
Những trình duyệt nổi tiếng này, đến mức ngay cả cụ già cũng có thể nói tên được, chính là đại diện của Internet, đồng thời còn là cổng vào Internet.
Tuy nhiên, nếu phải tìm một công nghệ nào đó gắn bó mật thiết với Internet như hình với bóng, thì đó chính là công nghệ blockchain đang phát triển mạnh mẽ ngày nay.
Internet thay đổi cuộc sống, công nghệ blockchain lại thay đổi Internet. Vì vậy, không thể nghi ngờ gì nữa, với tư cách là cổng vào Internet, trình duyệt tất yếu cũng phải có mối liên hệ chặt chẽ với công nghệ blockchain. Từ đó, các trình duyệt blockchain ra đời, trở thành sản phẩm ứng dụng quen thuộc, mang lại sự tiện lợi đáng kể cho người dùng blockchain.
Độ an toàn của trình duyệt blockchain như thế nào?
Trình duyệt blockchain giống như công cụ tìm kiếm dành riêng cho blockchain, người dùng có thể sử dụng công cụ này để tra cứu thông tin cụ thể trên blockchain.
Ví dụ, Etherscan là trình duyệt blockchain dành cho Ethereum. Nhờ Etherscan, người dùng có thể dễ dàng truy cập thông tin về khối, địa chỉ, giao dịch và các hoạt động khác trên mạng lưới Ethereum. Nói cách khác, trình duyệt blockchain giống như một trang web chính thức để tra cứu dữ liệu blockchain.
Trong bối cảnh phần lớn các ứng dụng blockchain hiện nay đều đối mặt với các mối đe dọa an ninh, độ an toàn của trình duyệt blockchain ra sao?
Số điểm tấn công tiềm tàng trên ứng dụng trình duyệt blockchain tương đối ít. Lý do như sau:
Không liên quan đến xác thực hay cấp quyền, do đó sẽ không rò rỉ bất kỳ thông tin cá nhân nào;
Việc sử dụng phổ biến các framework web (như Vue và React) làm giảm khả năng xảy ra lỗi XSS (lỗ hổng script xuyên trang);
Liệu điều này có nghĩa là trình duyệt blockchain không thể bị tấn công?
Hay nói cách khác, dù có bị tấn công thì cũng chẳng sao?
Câu trả lời là: Không
Phân loại các kiểu tấn công vào trình duyệt blockchain
Hãy cùng xem xét trước tiên các kiểu tấn công mà trình duyệt blockchain có thể gặp phải.
Do hầu hết chức năng của trình duyệt blockchain đều liên quan đến việc tìm kiếm dữ liệu từ cơ sở dữ liệu phía sau hoặc truy vấn trực tiếp từ nút blockchain. Khi nói đến chức năng tìm kiếm và truy vấn, thường người ta nghĩ đến hai lỗ hổng tiềm tàng:
Tấn công SQL Injection;
Tấn công DoS (Denial-of-service - từ chối dịch vụ);
Tuy nhiên, khi khảo sát nhiều trình duyệt khác nhau, đội ngũ kỹ thuật CertiK chỉ phát hiện duy nhất một trường hợp SQL injection, trong khi hơn 50% trình duyệt blockchain đối mặt nguy cơ bị tấn công DoS.
Tấn công DoS là gì?
Hãy lấy một ví dụ đơn giản: Một ông lão râu trắng thấy cửa hàng gà rán của chú hề kia ngày càng đông khách, bèn thuê vài tên du côn đến gây rối. Chúng đứng ở quầy gọi món, hỏi lung tung đủ thứ chuyện, nhân viên phục vụ bối rối, mất hai tiếng đồng hồ vẫn không rõ chúng muốn gì, khách hàng đói bụng đợi quá lâu liền bỏ đi. Chưa hết, nếu nhân viên cửa hàng vốn đã nóng tính, bị kích động bởi mâu thuẫn bên ngoài, dẫn đến ẩu đả, khiến cửa hàng tan hoang...
DoS: Viết tắt của Denial of Service (từ chối dịch vụ), hành vi tấn công nhằm ngăn chặn hệ thống phục vụ người dùng hợp pháp.
Trong máy chủ, có một thực tế: Máy khách có thể gửi yêu cầu HTTP mà không tốn chút công sức nào, nhưng máy chủ có thể phải tiêu tốn rất nhiều tài nguyên để xử lý và phản hồi yêu cầu đó. Tấn công DoS ở tầng ứng dụng tận dụng đặc điểm này để tiến hành tấn công.
Nói chung, cuộc chiến giữa tấn công và phòng thủ DoS giống như một cuộc đua về tài nguyên, kết quả cuối cùng phụ thuộc vào bên nào có nhiều tài nguyên hơn. Tuy nhiên, nếu mã nguồn phía sau có lỗi, chỉ một yêu cầu đơn lẻ cũng có thể khiến máy chủ sập hoàn toàn.
Bài viết này sẽ chia sẻ với bạn: Một số ví dụ về tấn công DoS, ảnh hưởng của tấn công DoS và các đề xuất bảo vệ ứng dụng.
Phân tích các ví dụ về tấn công DoS
Có nhiều con đường để tiến hành tấn công DoS vào máy chủ. Nói chung, kẻ tấn công thường chọn mục tiêu:
Tiêu hao toàn bộ tài nguyên CPU và bộ nhớ;
Chiếm dụng toàn bộ kết nối mạng;
Dưới đây là phân tích một số máy chủ có thể bị tấn công DoS, trong đó một số do lỗi lập trình, một số khác do cấu hình sai:
1. API truy cập tài nguyên thiếu giới hạn số lượng
https://fake.sample.com/api/v1/blocks?limit=10
Yêu cầu trên lấy thông tin khối theo số lượng được chỉ định trong tham số "limit". Khi giới hạn đặt là 10, nó sẽ trả về thông tin 10 khối gần nhất. Với số nhỏ, yêu cầu hoạt động bình thường.
Tuy nhiên, phía máy chủ có thể chưa thiết lập giới hạn tối đa cho tham số "limit". Khi đội ngũ kỹ thuật CertiK đặt tham số "limit" thành 9999999 và gửi yêu cầu, yêu cầu này sau một thời gian xử lý dài đã trả về lỗi "504 gateway time-out". Trong lúc máy chủ xử lý yêu cầu này, thời gian phản hồi của các API khác tăng đáng kể.
Con số 9999999 thậm chí còn vượt quá tổng số khối tồn tại trên chuỗi.
Giả sử phía máy chủ cố gắng truy xuất dữ liệu từng khối trong toàn bộ blockchain. Nếu kẻ tấn công gửi hàng loạt yêu cầu với tham số "limit" cực lớn, máy chủ sẽ không thể phản hồi các yêu cầu bình thường, thậm chí có thể sập hoàn toàn.
2. Truy vấn GraphQL lồng ghép
Trong quá trình điều tra, đội ngũ kỹ thuật CertiK đã gặp một số tài nguyên blockchain sử dụng GraphQL. GraphQL là ngôn ngữ truy vấn dành cho API. So với REST API điển hình cần nhiều yêu cầu để lấy nhiều tài nguyên, GraphQL cho phép lấy toàn bộ dữ liệu ứng dụng cần chỉ trong một lần yêu cầu. GraphQL được sử dụng rộng rãi, nhưng nếu không triển khai các biện pháp bảo vệ thích hợp trong quá trình sử dụng, rất dễ tiềm ẩn rủi ro an ninh.
Khi kiểm thử trình duyệt blockchain, đội ngũ kỹ thuật CertiK phát hiện một trình duyệt sử dụng giao diện GraphQL, trong đó hai kiểu dữ liệu được định nghĩa có quan hệ chứa nhau, điều này cho phép người dùng tạo ra truy vấn lồng ghép cực kỳ phức tạp.
Gửi một truy vấn lồng ghép như vậy có thể khiến mức sử dụng CPU trên máy chủ tăng vọt. Thông thường, chỉ vài yêu cầu như vậy đã có thể đẩy mức sử dụng CPU lên trên 100%, khiến máy chủ không thể phản hồi yêu cầu của người dùng bình thường.
Mức sử dụng CPU khi máy chủ xử lý yêu cầu GraphQL như vậy
Hình dưới mô tả ví dụ về truy vấn graphql dạng dos_query:
Ảnh hưởng của yêu cầu GraphQL độc hại này đến máy chủ phụ thuộc vào độ phức tạp của truy vấn và hiệu suất máy chủ. Máy chủ có thể mất rất nhiều thời gian nhưng cuối cùng vẫn phản hồi được, hoặc do mức sử dụng CPU quá cao mà sập hoàn toàn. Nếu bạn muốn tìm hiểu thêm về an ninh GraphQL, hãy truy cập liên kết tham khảo 1 ở cuối bài viết.
3. API RPC Cosmos bị phơi bày trực tiếp
https://fake.cosmos.api.com/txs?message.action=send&limit=100&tx.minheight=1
API Cosmos trên tìm kiếm 100 giao dịch chuyển tiền bắt đầu từ khối 1. Tính đến nay, mạng chính Cosmos đã có 2.712.445 khối. Trong các nút RPC CosmosHub bị phơi bày, chúng tôi không tìm thấy nút nào có thể xử lý yêu cầu này. Máy chủ nhận yêu cầu sau một thời gian sẽ trả về lỗi "502 Bad Gateway", cho thấy yêu cầu thất bại.
Nếu máy chủ RPC của nút nhận hàng trăm yêu cầu tìm kiếm như mô tả trên trong vài giây, tất cả các yêu cầu API sẽ trả về lỗi dưới đây. Một số máy chủ nút có thể tự phục hồi sau lỗi, một số khác phải khởi động lại.

Để giúp bạn đọc hiểu rõ hơn vấn đề trên và minh họa tác động, đội ngũ kỹ thuật CertiK đã thiết lập một nút Cosmos đầy đủ đồng bộ hoàn toàn, rồi sử dụng truy vấn nêu trên để tấn công nút này: “https://fake.cosmos.api.com/txs?message.action=send&limit = 100&tx.minheight = 1”.
Bảng điều khiển mức sử dụng CPU Grafana
Biểu đồ có thể chia thành ba giai đoạn:
Nút đã khởi động và đang chạy, mức sử dụng CPU hệ thống là 35%
Nút chịu tấn công DoS, mức sử dụng CPU hệ thống đạt 97%
Nút sập, không thể cung cấp dữ liệu mới cho Grafana
Biểu đồ cho thấy dưới tác động của tấn công DoS, máy chủ sập chỉ trong vài phút ngắn ngủi. Sau khi sập, không thể kết nối SSH đến máy chủ, buộc người vận hành phải khởi động lại.
4. Bộ xử lý yêu cầu có lỗi
https://fake.sample.com/api/v1?feature=Always_time_out
Đội ngũ kỹ thuật CertiK đã gặp một API cứ tải mãi, một lúc sau thì hiển thị lỗi quá thời gian. Tuy nhiên, gửi nhiều yêu cầu đến máy chủ này không ảnh hưởng đến thời gian phản hồi của các API khác. Phỏng đoán ban đầu là phương pháp xử lý API cụ thể này không chiếm dụng CPU hay bộ nhớ. Vì trình duyệt blockchain này không mã nguồn mở nên không thể biết thông tin về mã nguồn API, cũng không thể xác định chức năng của điểm cuối API này dựa trên tên gọi.
Mặc dù tấn công API này khó có thể khiến máy chủ sập, nhưng kẻ tấn công có thể chiếm dụng toàn bộ kết nối mạng bằng cách gửi nhiều yêu cầu kiểu "luôn treo và quá thời gian", từ đó ngăn người dùng khác truy cập API trên máy chủ này.
Ví dụ, hàm "sleep_to_handle_request" minh họa cách một yêu cầu có thể tiêu tốn rất ít CPU và bộ nhớ, nhưng lại tải rất lâu và chiếm dụng kết nối mạng.
So với ba trường hợp máy chủ sập hoàn toàn hoặc mất rất lâu mới phục hồi, máy chủ trong trường hợp này lập tức phục hồi ngay khi ngừng tấn công.
Ảnh hưởng của tấn công DoS
Khi gặp tấn công DoS, máy chủ dễ bị tổn thương sẽ không thể phản hồi yêu cầu người dùng bình thường. Một số máy chủ có thể phục hồi ngay lập tức hoặc sau một thời gian khi ngừng tấn công, một số khác sẽ sập hoàn toàn và cần khởi động lại.
Việc không thể sử dụng trình duyệt blockchain gây ra nhiều phiền toái lớn cho người dùng, vì họ không thể dễ dàng truy cập thông tin về các hoạt động trên chuỗi. Ngoài ra, trên các chuỗi dựa trên Cosmos, nếu nút bị tấn công DoS, không chỉ trình duyệt blockchain kết nối không thể lấy dữ liệu từ nút đó, người dùng cũng không thể sử dụng API để thực hiện các thao tác như gửi token hay ủy quyền token cho trình xác thực.
Đề xuất
Mọi ứng dụng đều đối mặt với nguy cơ bị tấn công DoS, trên thế giới không tồn tại giải pháp nào hoàn hảo để phòng chống hoàn toàn tấn công DoS. Tuy nhiên, có một số phương pháp có thể tăng chi phí tấn công, khiến kẻ tấn công tiềm tàng khó thực hiện hành vi tấn công, đồng thời giảm xác suất tồn tại lỗ hổng trong ứng dụng trình duyệt blockchain.
Ở đây, đội ngũ kỹ thuật CertiK liệt kê một số đề xuất nhằm giảm thiểu tối đa khả năng ứng dụng bị tấn công:
1. Giới hạn tốc độ (Rate Limiting)
Ngay cả khi API phía sau được triển khai đủ an toàn, kẻ tấn công vẫn có thể tấn công bằng cách gửi lượng lớn yêu cầu đến máy chủ. Do đó, API nên luôn thiết lập giới hạn tốc độ để tạm thời hoặc vĩnh viễn chặn IP độc hại.
Mặc dù giới hạn tốc độ không thể giải quyết hoàn toàn vấn đề, nhưng dễ triển khai, có thể tạo thành tuyến phòng thủ đầu tiên chống lại tấn công DoS.
2. Cải thiện thiết kế và triển khai
Thiết kế chương trình tốt và mã hóa triển khai hiệu quả có thể biểu hiện hiệu suất tốt hơn trong cùng điều kiện phần cứng, hiệu quả này đặc biệt rõ ràng trong các chức năng liên quan đến tìm kiếm cơ sở dữ liệu và xử lý dữ liệu. Tuy nhiên, trước khi xem xét hiệu suất, cần đảm bảo mã nguồn không có lỗi.
Vì vậy, việc đầu tư nhiều thời gian để viết kiểm thử đơn vị trước khi triển khai API vào môi trường sản xuất là rất đáng giá, nhằm đảm bảo chúng hoạt động đúng như mong đợi.
3. Xác thực đầu vào và giới hạn tham số
Nếu không xác thực và giới hạn các biến do người dùng cung cấp, kẻ tấn công có thể lạm dụng API.
Sau khi xác nhận mã nguồn hoạt động như mong đợi, bước tiếp theo là đảm bảo kẻ tấn công không thể lạm dụng API bằng cách đưa vào dữ liệu bất thường. Các yêu cầu như lấy dữ liệu 9.999.999 khối hoặc xử lý truy vấn GraphQL có 1.000 cấp vòng lặp không nên được phép.
Do đó, mọi dữ liệu đầu vào từ người dùng đều phải được coi là không đáng tin cậy, máy chủ cần xác thực dữ liệu trước khi xử lý.
Trong các ví dụ nêu trên, API GraphQL có thể thiết lập giới hạn tối đa về cấp độ để hiệu quả chống lại tấn công DoS do truy vấn vòng lặp, trong khi API lấy dữ liệu khối có thể giới hạn số lượng khối tối đa ở mức hợp lý như 50.
Lập trình viên có thể dựa trên việc triển khai mã nguồn và thiết kế chương trình để đưa ra phương án xác thực và giới hạn đầu vào phù hợp nhất cho chương trình hiện tại.
4. Không phơi bày RPC nút
Không phải mã nguồn của mọi API đều nằm trong tầm kiểm soát của lập trình viên.
Ví dụ, lập trình viên không được khuyến nghị sửa đổi mã nguồn API RPC Cosmos. Hiệu suất một số truy vấn tìm kiếm trong Cosmos SDK không tốt lắm, vậy phải làm sao?
Một giải pháp: Tạo một lớp API bao bọc quanh API RPC Cosmos, đồng thời tạo một cơ sở dữ liệu lưu trữ dữ liệu blockchain, đồng bộ dữ liệu từ nút. API bao bọc bên ngoài được công bố công khai, nhận và xử lý yêu cầu người dùng, sau đó truyền yêu cầu đến RPC Cosmos hoặc tìm kiếm dữ liệu trong cơ sở dữ liệu phía sau. Việc thêm lớp API bên ngoài hiệu quả ngăn người dùng tương tác trực tiếp với API RPC nút. Cơ sở dữ liệu ngăn nút bị nhấn chìm bởi các yêu cầu tìm kiếm, đồng thời lập trình viên có thể tối ưu hóa cơ sở dữ liệu theo cách họ mong muốn.
Trên diễn đàn Cosmos, người dùng “kwunyeung” cũng đề xuất một giải pháp: Sử dụng proxy HTTP (ví dụ Nginx hoặc Caddy) để bảo vệ cổng RPC. Tổng thể, quan điểm được truyền tải là nhất quán: Cổng RPC không thể công khai trực tiếp ra công chúng, đồng thời phải áp dụng các biện pháp bảo vệ.
5. Đáp ứng yêu cầu phần cứng được đề xuất
Ngay cả khi triển khai tất cả các cơ chế phòng thủ nêu trên, người dùng vẫn cần lưu ý đến yêu cầu phần cứng tối thiểu khi vận hành máy chủ API hoặc các nút ổn định như Tendermint (xem liên kết tham khảo 2). Nếu máy chủ gặp khó khăn khi xử lý các yêu cầu do người dùng truy cập website thông thường, quản trị viên cần cân nhắc nâng cấp phần cứng.
Tổng kết
Tấn công DoS có thể khiến các ứng dụng như trình duyệt blockchain rơi vào tình trạng sập, đây là mối đe dọa chết người đối với phần lớn doanh nghiệp.
Đội ngũ kỹ thuật an ninh chuyên nghiệp CertiK có nhiều kinh nghiệm và kiến thức chuyên sâu trong đánh giá lỗ hổng ứng dụng, kiểm toán mã nguồn cho các ngôn ngữ khác nhau như Solidity, RUST và Go, cũng như bảo trì an ninh trên các nền tảng như Ethereum, Cosmos và Substrate.
Đối với các hoạt động liên quan blockchain như trình duyệt blockchain, ví, sàn giao dịch, hợp đồng thông minh, thậm chí cả triển khai giao thức blockchain cơ bản, nếu cần kiểm toán an ninh toàn diện, CertiK với kinh nghiệm thực chiến bảo vệ nhiều năm và công nghệ kiểm chứng hình thức tiên tiến nhất, sẽ là chuyên gia an ninh đáng tin cậy nhất của bạn.
Phụ lục
Đây là một kịch bản mẫu để kiểm tra xem nút Cosmos có dễ bị tấn công DoS hay không. Bằng cách sửa đổi biến "url", có thể kiểm tra các ứng dụng khác nhau.
Vui lòng không chạy kịch bản này trên các ứng dụng chưa được phép.
import requests import threading import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #Sửa đổi url url ="https://fake.cosmos.api/txs?message.action=send&limit=100&tx.minheight=1" def dos_thread(): while(1): response = requests.request("GET", url, verify=False) print(response.text.encode('utf8')) if __name__ == "__main__": for i in range(300): t = threading.Thread(target=dos_thread) t.start()
Liên kết tham khảo:
1. https://www.apollographql.com/blog/securing-your-graphql-api-from-malicious-queries-16130a324a6b/
2. https://github.com/tendermint/tendermint/blob/master/docs/tendermint-core/running-in-production.md#hardware
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News














