Sự cố Poly Network

Văn Hòa Nguyễn
VeriChains Lab
Published in
7 min readAug 11, 2021

Poly Network vừa bị hack, hacker đã chiếm thành công tổng cộng hơn 600 triệu USD, tương đương gần 14 nghìn tỷ đồng, trở thành sự cố bảo mật với tổng thiệt hại lớn nhất lịch sử blockchain cho tới thời điểm hiện tại.

Poly Network là một nền tảng kết nối nhiều chain cho phép smart contract (hợp đồng thông minh) tương tác từ các chain khác nhau.

Cuộc tấn công này không sử dụng overflow (tràn số), không tấn công vào mã hoá, không cần hack lấy private key của bất kì nạn nhân nào.

Tricker không cần mua súng, không cần con tin, chỉ cần vào phòng giao dịch, yêu cầu nhân viên rút tiền không phải của mình, và bước ra.

Tricker đã làm như thế nào?

Tất nhiên cuộc tấn công không chỉ đơn giản như vậy, nếu chỉ cần yêu cầu nhân viên thì trước đó rất nhiều người khác cũng có thể đã tấn công rồi, ngoài ra ngân hàng cũng đã được audit (kiểm tra bảo mật) bởi các nhóm chuyên gia hàng đầu N(ot) G. và C(orrect).

Nhân vật chính của chúng ta. có lẽ một ngày đẹp trời nào đó đi qua ngân hàng nọ, bỗng nhiên nhìn thấy một cánh cửa nhỏ phía sau phòng giao dịch, bình thường chẳng ai để ý đến. Đây phòng quản lý, kiêm luôn trách nhiệm giao tiếp với các phòng giao dịch khác ở khắp mọi nơi. Phòng này cung cấp giấy tờ xác thực cho mọi lệnh được yêu cầu. Thông thường, phòng này chỉ giao tiếp với các phòng nội bộ khác, nhưng trong trường hợp này, tricker nhận ra là mình có thể tạo một giao dịch bình thường ở chi nhánh hiện tại nhưng mang sang chi nhánh khác lệnh đó trở thành lệnh có lợi cho mình.

Lúc này mọi thứ thật đơn giản, “hey, ký cho a lệnh X”, chẳng cần biết X là gì, “Dạ, cám ơn anh đã sử dụng dịch vụ, đây là lệnh X’ của anh ạ, chúc anh một ngày tốt lành”… Tricker mang X sang phòng giao dịch khác, mang X cho phòng quản lý xem, nhân viên giải mã X’ thì nhận được nội dung:

Người này là giám đốc quản lý mới của chi nhánh, lệnh có tác dụng ngay khi nhận được.

Lúc này, với tư cách là giám đốc mới, Tricker lập hồ sơ khống, giả dạng khách hàng của chi nhánh và rút toàn bộ tiền theo ý thích…

Cầm tài khoản thật nhiều tỷ trong tay, Tricker chẳng biết làm gì, thôi lại sang chi nhánh khác làm giám đốc. Ngay lúc đó bắt grab kiếm xe limousine sang chi nhánh khác.

Giữa đường tricker được một anh chàng tốt bụng nào đó nhắn tin bảo tài khoản của bạn đã bị theo dõi, đừng mang đi giao dịch với Y. Tricker cảm thấy thế giới vẫn còn nhiều người tốt bụng quá, chuyển khoản thưởng cho số điện thoại kia 1 tỷ tiền lẻ để cảm ơn.

Thế giới luôn có những người tốt bụng và biết quan tâm…

Phân tích kĩ thuật vụ tấn công

Ở PolyChain, phòng quản lý EthCrossChainManager đóng vai trò là contract (hợp đồng) dùng để xác thực thông điệp từ các chain khác, sau đó gửi thông điệp đi ở chain hiện tại, thông qua một hàm mà ai cũng có thể gọi chỉ cần có chữ kí hợp lệ. Hacker sử dụng hàm này để gọi sang contract phòng xác thực khách hàng EthCrossChainData để có thể tạo ra bất kỳ giao dịch nào, sau đó việc còn lại chỉ là gọi hàm unlock để rút tiền từ phòng giao dịch LockProxy.

Quá trình gọi cross chain của Poly Chain

Việc gửi thông điệp từ SRC chain (chain nguồn) sang DST chain (chain đích) được thực hiện thông qua các relayer (node trung gian) và Poly chain.

Sơ đồ hoạt động của quá trình gọi hàm giữa các chain ở Poly Chain (hình từ whitepaper)

Về cơ bản, việc gửi tx cross chain được thực hiện như sau:

1. Hacker khởi tạo một tx (transaction — giao dịch) ở chain nguồn (Ontology Blockchain). Khả năng cao tx này sẽ bị revert nhưng điều này không quan trọng, tx vẫn được include ở block của chain này.
2. Người quản lý của chain sẽ ký block chứa tx này.
3. Hacker mang chữ ký vừa được sinh ra mang qua chain đích (ETH Blockchain), transaction này sẽ được EthCrossChainManager gửi đi.

Các contract quan trọng

EthCrossChainManager là owner của khá nhiều contract quan trọng khác của hệ thống Poly chain, trong đó có EthCrossChainData.

  • EthCrossChainManager: nhiệm vụ chính của nó là gửi các thông điệp đã được chứng thực từ chain khác ở chain hiện tại.
  • EthCrossChainData: contract này lưu trữ địa chỉ keeper (người quản lý) để xác thực thông điệp, địa chỉ này có thể được cập nhật bởi owner (hiện là EthCrossChainManager). Keeper là người chứng thực toàn bộ thông điệp được gửi tới chain hiện tại.
  • LockProxy: quản lý việc khoá và mở khoá tài sản ở mỗi chain, contract này giúp chuyển tài sản giữa các chain bằng cách khoá tài sản ở chain nguồn và mở khoá tài sản ở chain đích, việc mở khoá chỉ có thể được thực hiện bởi owner (vẫn là EthCrossChainManager) và phải được ký bởi keeper.

Tổng hợp điều kiện

Sử dụng các điều kiện ở trên, hacker đã cực kỳ sáng tạo tiến hành tấn công Poly Chain bằng cách tạo một thông điệp không có ý nghĩa ở chain nguồn, nhưng lại là payload để gọi hàm putCurEpochConPubKeyBytes(bytes) ở EthCrossChainData để thay đổi người quản lý trở thành địa chỉ được quản lý bởi hacker.

Một điểm đáng lưu ý khác là EthCrossChainManager chỉ cho phép gọi các hàm có chữ kí (bytes, bytes, uint64), tuy nhiên hàm của solidity chỉ là hash 5 bytes của tên hàm và chữ ký, hacker hoàn toàn có thể brute để tìm một tên hàm để 5 bytes này trùng với hàm mà hacker muốn gọi. Cụ thể, putCurEpochConPubKeyBytes(bytes)f1121318093(bytes,bytes,uint64) có cùng chữ ký.

Sau khi điều khiển được keeper, hacker có thể tạo ra những giao dịch ở chain hiện tại nhưng không hề tồn tại ở chain gốc. Lúc này, hacker chỉ việc tạo giao dịch ảo rồi gọi hàm unlock ở LockProxy để lấy tiền từ PolyChain.

Cuối cùng, hacker lặp lại quá trình này trên cách chain khác nhau của Poly Chain để chiếm hơn tổng cộng 600 triệu USD vào các tài khoản ở mỗi chain.

Bài học ở đây là gì?

Blockchain không biết sau này có sinh ra hệ sinh thái thay thế hoàn toàn các hệ sinh thái centralize dựa trên tiền thật được không, nhưng hiện tại hệ sinh thái blockchain đang giữ rất nhiều tiền. Tính bất biến của nó giúp không xảy ra tình trạng lừa đảo, nhưng lại làm cho việc cứu tài sản sau khi bị tấn công khó hơn rất nhiều, hoặc có thể nói gần như không thể trong nhiều trường hợp. Tính mở của nó giúp hệ sinh thái được minh bạch, tất cả mọi người đều có thể kiểm tra tính đúng đắn của hệ thống, tuy nhiên không phải ai cũng kiểm tra để giúp cộng đồng sửa lỗi…

Các công ty/tổ chức blockchain hầu hết đều không có đủ kinh nghiệm trong việc quản lý tài chính và quản lý rủi ro tài chính so với các tiền bối centralize, nhưng lượng người sử dụng và lượng tiền sử dụng blockchain đều rất lớn, mỗi sai lầm nhỏ trong bất kì thành phần nào đều có thể sinh ra hậu quả cực kì nghiêm trọng.

Vì vậy, để kết bài này, xin nhắc lại một quan điểm đã được nhắc đi nhắc lại rất nhiều lần bởi rất nhiều chuyên gia: hãy xem trọng bảo mật, audit thật nhiều, nếu được nên được audit bởi ít nhât 2 tổ chức bảo mật độc lập khác nhau.

Quảng cáo: bạn cũng có thể liên hệ với chúng tôi tại info@verichains.io nếu có nhu cầu audit hợp đồng thông minh hay sản phẩm blockchain.

--

--