SETTINGS
Content language
flag Vietnamese
Vietnamese
flag Vietnamese
Vietnamese
Tiếng việt
flag English
English
English
Channel logo
Coin98 Insights
Save
Copy link

Những nỗ lực sửa lỗi trong smart contract của Lien protocol

Ngày 15/09/2020, có một nhóm làm việc không ngừng nghỉ suốt cả đêm để cứu lấy khối tài sản trị giá 9,6 triệu đô trong một smart contract có nguy cơ bị tấn công bất kỳ lúc nào. Và dưới đây chính là câu chuyện của những con người phi thường đó.
Avatar
Duy Nguyen
Published Oct 16 2020
Updated May 31 2023
19 min read
thumbnail

Ngày 15/09/2020, có một nhóm làm việc không ngừng nghỉ suốt cả đêm để cứu lấy khối tài sản trị giá 9,6 triệu đô trong một smart contract có nguy cơ bị tấn công bất kỳ lúc nào. Và dưới đây chính là câu chuyện của những con người phi thường đó.

Bài dịch từ Samczsun sẽ cung cấp thông tin cho anh em về những lỗi trong Lien protocol và những nỗ lực tuyệt vời của một vài con người đã bỏ rất nhiều công sức để bảo toàn một số tiền lớn mà có thể bị đánh cắp bất kỳ lúc nào.

Lướt qua nốt một vài smart contract, tôi quyết định chuẩn bị thu xếp và nghỉ ngơi sau một ngày dài.

Tất nhiên cũng chẳng mong chờ gì một điều thú vị sẽ xảy ra. Suốt vài tuần qua tôi đã thấy không biết bao nhiêu là các bản nhái yield farming với cùng một câu nói: “Stake token của bạn bằng sản phẩm của chúng tôi và bạn có thể trở thành tỷ phú”. Hầu hết đó chỉ là việc sao chép những dòng code từ những dự án thành công và đã được audit cẩn thận mặc dù có vài dự án được tinh chỉnh một ít, trong số đó một số nhận cái kết quả thảm hại.

Nhưng ở giữa những thứ tạp nham đó vẫn có những dòng code tôi chưa thấy bao giờ. Một contract giữ hơn 25,000 Ether, trị giá hơn 9,6 triệu đô vào thời điểm đó và chắc hẳn sẽ là một ngày công hậu hĩnh cho ai có thể tìm ra lỗi trong thuật toán của họ.

Tôi nhanh chóng nhìn sâu vào những dòng code về nơi mà chỗ Ether đó sẽ được chuyển đi và tìm thấy 2 đối tượng. Một trong số chúng chuyển Ether đến một địa chỉ token hardcode thế nên có thể bỏ qua. Cái còn lại có chức năng burn mà sẽ chuyển Ether đến người gửi.

Sau khi nhìn sâu vào chức năng đó. Tôi phát hiện ra rằng những người đào token miễn phí cho bản thân chịu tổn thất không đáng kể nhưng họ có thể burn những token đó để đổi lấy mọi Ether bên trong contract. Tim tôi bắt đầu đập mạnh, nhận ra mọi thứ nghiêm trọng vượt ngoài sức tưởng tượng của bản thân.

Sau khi nghiên cứu tôi tìm ra được contract mà tôi vừa xem là một phần thuộc protocol của Lien Finance. Thật không may, đội phát triển của họ gồm những người vô danh. IM Platform duy nhất mà họ hỗ trợ liên lạc là Telegram và tôi không chắc các admin trong kênh đó có phải là những nhà phát triển protocol không hay chỉ là những người hỗ trợ của dự án. Vì việc tiết lộ thông tin về lỗi nghiêm trọng đó cho sai người là việc cuối cùng mà tôi muốn làm.

Sau khi tìm kiếm trên website của họ trong một khoảng thời gian. Tôi nhận ra họ đã làm việc với ConsenSys Diligence và Certik cho việc audit. Đây quả là một tin tốt vì cả ConsenSys và Certik chắc đã phải làm việc với những nhà phát triển trong suốt quá trình audit. Tôi nhanh chóng liên lạc với maurelian qua Telegram.

Nhìn đồng hộ chạy không ngừng, tim tôi ngày càng đập nhanh hơn khi vẫn không nhận được phản hồi nào từ manurelian. Thật không may nhưng có vẻ như anh ấy đã ngủ. Thất vọng, tôi gửi một tin nhắn đến kênh Telegram của ETHSecurity.

Chỉ trong vài phút, tôi nhận lại được tin nhắn từ một người đã từng làm việc với tôi trong quá khứ - Alex Wade.

Alex:

Giật mình khi giờ này vẫn còn ai đó “gõ cửa” và thấy dòng tin nhắn từ Sam yêu cầu sự trợ giúp từ Telegram của ETHSec.

Đó quả thật là một đêm dài..

Đã quen Sam từ lâu, biết đây hẳn là việc chẳng lành. Tôi ngay lập tức tìm một kênh mà chúng tôi đã tạo cho Lien vài tháng trước và một địa chỉ email. Có còn hơn không, đưa một lời cảnh báo cho đội ẩn danh này.

Vẫn còn đang ngái ngủ, Sam thì không muốn nói chi tiết bằng tin nhắn và yêu cầu một cuộc gọi từ Zoom. Tôi cố gắng để giữ tập trung và đánh giá mức độ nghiêm trọng của tình huống. 

Năm phút sau, rõ ràng việc sự việc cần một cốc cà phê.

Sam và tôi cùng nhau kiểm tra lại code. Đến thời điểm đó, Sam đã chuẩn bị sẵn một mẫu thử và có thể xác nhận vấn đề trên máy của mình. Cuộc đối thoại nhanh chóng trở thành cuộc thảo luận những phương thức đối phó:

  1. Cố gắng tự giải quyết vấn đề.
  2. Liên lạc với Lien và yêu cầu họ đưa thông tin ra cộng đồng, thúc giục người dùng rút vốn.

Cả hai cách trên đều không phải là một giải pháp tốt. Lựa chọn đầu tiên quá mạo hiểm vì khả năng bị front run là rất cao. Lựa chọn thứ hai cũng rủi ro tương tự, khi thông báo cho cộng đồng sẽ thu hút sự chú ý đến vấn đề và tạo cơ hội cho những kẻ tấn công. Chúng tôi cần một giải pháp thứ ba.

Trích từ một đoạn trong bài viết Ethereum is a Dark Forest, Sam liên lạc đến Scott Bigelow

“ Nếu bạn thấy bản thân ở trong một tình huống như thế này, tôi khuyên bạn hãy liên lạc với Scott Bigelow, một nhà nghiên cứu bảo mật mà đã tìm hiểu về chủ đề này và có sản phẩm mẫu để thực hiện việc mã hóa (obfuscator) tốt hơn”.

Scott:

Sau khi tham gia nỗ lực khôi phục hệ thống trong  Ethereum is a Dark Forest và cuối cùng để thua trước những front-runner, tôi rất chờ mong một trận tái đấu. Tôi đã dành hàng giờ để nghiên cứu về front run và thiết kế một hệ thống đơn giản có vẻ như đủ sức đánh lừa những front-runner thông thường (ít ra là với 200 đô tôi đã thử với hệ thống).

Đã là tối muộn khi Sam liên lạc với tôi cùng cái giọng hồn nhiên: “Thức thêm một vài tiếng nhé”. Tôi nóng lòng để thử nghiệm hệ thống của mình. Kế hoạch sẽ là làm một vài chỉnh sửa, thức thêm một vài tiếng, cảm thấy thành tựu khi đã giúp hoàn trả lại vài nghìn đô cho người dùng và cuối cùng có một giấc ngủ ngon.

Kế hoạch lập tức sụp đổ khi Sam chia sẻ contract cho tôi: ~25000 ETH, trị giá 9,6 triệu đô đang được stake. Cho dù có mong chờ cuộc tái đấu đến mức nào đi chăng nữa, con số 9,6 triệu đô vẫn vượt qua những thứ mà con tim này có thể chịu đựng được.

Trong vài tháng vừa qua, tôi đã cố gắng liên lạc với những thợ đào cho chính mục đích này: Giao dịch được hợp tác bởi các hacker mũ trắng. Nếu như có một lúc nào đó cần kêu gọi một thợ đào để thêm một giao dịch mà không cho các front-runner có cơ hội để đánh cắp chúng thì đó chính là lúc này đây. May mắn thay, Tina và tôi đã làm việc với nhau trong vài tháng qua và đã thành lập nên nhóm này. Có vẻ cơ hội là khá mong manh nhưng đáng để tôi thử: Hãy hợp tác cùng Tina trong nỗ lực giải cứu và bắt tay với một mining pool để thực hiện một giao dịch riêng nào.

Tina:

Vừa chạy trốn khỏi công việc và bỏ lại một đống áp lực phía sau, bây giờ đang thư giãn ở một bãi biển tuyệt đẹp và tận hưởng âm thanh tuyệt mà những con sóng Thái Bình Dương mang lại, tin nhắn Telegram từ Sam kéo tôi về với cái hiện thực u ám: “Quỹ đang trong tình trạng nguy hiểm, có khả năng bị front run”.

Trong suốt vài tuần vừa qua, tôi đã hợp tác với Sam và Scott trong việc nghiên cứu về MEV và có thể đoán trước được họ muốn nhờ tôi điều gì: Một kênh trực tiếp để bảo vệ các giao dịch của hacker mũ trắng (white-hat transaction) khỏi việc bị nhắm tới bởi các “con thú săn mồi tiên tiến” trong cái “khu rừng âm u” này.

Bởi vì đây là một nước đi mạo hiểm đi kèm với việc tiết lộ thông tin với các miner, chúng tôi quyết định đầu tiên phải cố gắng nhận được sự đồng ý từ đội phát triển Lien. Trong khi Alex cố gắng để liên hệ với họ thông qua ConsenSys, chúng tôi cũng thử qua Certik.

Tôi nhận ra rằng phải hơn 4 tiếng nữa mới là giờ thức dậy thông thường của người Mỹ, dẫu vậy thời gian không chờ một ai. Không biết thông tin gì nhiều ngoài việc CertiK từng làm việc với một vài dự án Châu Á, tôi cố gắng liên lạc với đội CertiK Trung Quốc để lợi dụng việc chênh lệch múi giờ.

Tôi nhắn vào hai nhóm Wechat “DeFi the World” và “Yellow Hats”. Bốn người liên lạc với DM của tôi trong vòn 30 phút, sau khi xác nhận rằng Wechat ID mà tôi kết nối chính xác là của Zhaozhong Ni, CTO của Certik. Tôi được thêm vào nhóm Wechat với 5 thành viên của đội Certik, tuy nhiên lúc này tôi vẫn chưa tiết lộ về dự án cũng như các điểm yếu dễ bị tấn công của nó. Để giảm thiểu tối đa nguy hiểm tiềm tàng cũng như rủi ro khi tiết lộ thông tin, tôi chỉ có thể mời một thành viên của Certik vào nhóm whitehat của mình. Sau khi vượt qua bước xác minh cuối cùng thông qua email chính thức. Georgios Delkos, trưởng nhóm kỹ sư ở Certik tham gia vào cuộc gọi của nhóm tôi.

Với sự trợ giúp của Georgios, Alex có thể nhanh chóng liên lạc được với đội của Lien và xác minh danh tính của họ. Chúng tôi cập nhật nhanh chóng tình hình và hỏi liệu họ có chấp nhận để chúng tôi làm việc trực tiếp với mining pool để cứu lấy số quỹ rất dễ bị tấn công đó không. Sau một vài sự cân nhắc, đội của Lien đồng ý rằng rủi ro của việc trực tiếp giải cứu chỗ quỹ đấy hoặc cảnh báo cho cộng đồng là quá cao và đồng ý cho chúng tôi thực hiện phương pháp của mình.

Bây giờ việc cần làm là tìm ra một mining pool mà đã có sẵn nền tảng và sẽ sẵn sàng hợp tác với chúng tôi càng sớm càng tốt. Đâu sẽ là mining pool thích hợp ? Ai sẽ là người có khả năng đóng góp ý kiến kỹ thuật để có thể giúp chúng tôi chạy đua với thời gian ?

Cái tên SparkPool hiện lên trong đầu tôi, như tôi biết họ đang thực hiện một dự án nền tảng gọi là Taichi Network có khả năng dễ dàng mang đến những thứ mà chúng tôi cần. Tôi quyết định liên lạc với Shaoping Zhang, Co-founder của SparkPool, người đã giúp tôi nghiên cứu ở sự kiện mempool trong quá khứ.

Nửa tiếng sau, Shaoping hồi đáp:

“Một quỹ trị giá 10 triệu đô đang gặp nguy hiểm. Samczsun đang ở đầu dây”. Tôi cố gắng nói về sự việc mà không để lộ một thông tin đặc biệt nào.

“Hai người lại giải cứu thế giới à? Có cần sự trợ giúp từ mining pool của bọn tôi không?” Thấy câu nói đùa và lời đề nghị giúp đỡ từ Shaoping tôi cảm thấy một chút bất ngờ và thật nhẹ nhõm. Sau khi xác minh email gốc, Shaoping hiện lên ở phòng Zoom với sự giúp đỡ của các nhà phát triển SparkPool.

Shaoping:

Sau bữa trưa, chuẩn bị chợp mắt một chút, tôi nhận được tin nhắn từ Tina : “SparkPool đã bao giờ trợ giúp các whitehat transaction chưa?” Lúc đầu tôi bị nhầm lẫn whitehat với whitelisting một giao dịch (Vì phát âm của chúng giống nhau trong tiếng Trung).

Chưa có một hacker mũ trắng nào liên hệ với chúng tôi trước đó và tôi cũng không hiểu lắm nghĩa của whitehat transaction là gì. Sau khi Tina giải thích cho tôi một cách chi tiết, tôi nhận ra cái họ cần là một dịch vụ giao dịch riêng tư. Ví dụ như một hacker mũ trắng muốn thực hiện một vài giao dịch để cứu một DeFi contract, nhưng để phòng tránh trường hợp họ bị front-run, họ cần một minning pool để thêm giao dịch mà không cần phải chia sẻ chúng lên mạng lưới.

Chúng tôi đã phát triển tính năng “giao dịch riêng tư” trên Taichi Network, tuy nhiên vẫn đang trong giai đoạn phát triển và chưa được thử nghiệm. Tôi nói yêu cầu của họ với đội phát triển của mình và nhấn mạnh tính khẩn cấp của vấn đề: “Tính năng giao dịch riêng này của chúng ta cần phải sẵn sàng đi vào hoạt động trong vài tiếng nữa”. Đội phát triển nói họ sẽ cố gắng hết sức để hoàn thành kịp giờ và ngay lập tức bắt tay vào công việc. Chúng tôi hoàn thành xong tính năng đó trong hai giờ và dành một phần thời gian để sửa chữa lỗi.

Sau khi chạy thử nghiệm hoàn tất, chúng tôi gửi endpoint whitehat.taichi.network cho Scott Bigelow để anh ta có thể thực hiện việc gửi giao dịch của mình.

Scott:

Trong khi SparkPool làm việc để gửi cho chúng tôi một whitehat API hoàn toàn mới, Sam và tôi lập trình nốt để tạo ra 4 giao dịch được ký tuần tự. Thực hiện những giao dịch này theo thứ tự giúp không phải rút trực tiếp ~25,000 ETH, mà sẽ chuyển 30,000 SBT+LBT token (những token giả) đến đội của Lien. Cho phép họ có thể thực hiện giao dịch cuối cùng để chuyển những token này về ETH. Bằng cách chuyển một lượng vô hạn những đồng SBT+LBT có thể đào được đến Lien thay cho ETH, chúng tôi sử dụng nhiều giao dịch hơn nhằm che mắt việc tấn công này khỏi những front-runner thông thường và tôi cũng tránh có một khoản thu nhập trị giá 9,6 triệu đô, cho dù chỉ là ý nghĩ trong giây lát.

Sau khi đã tạo xong 4 giao dịch được ký, Sam và tôi dành một thời gian dài xác minh các biến thể của chúng sử dụng rất nhiều công cụ mô phỏng giao dịch theo nhiều phương thức khác nhau. Cả 4 giao dịch, có tổng dung lượng nhỏ hơn 1.5KB, đã sẵn sàng để đánh cắp 9.6 triệu đô giá trị tài sản, miễn là không có ai ngoài SparkPool có thể thấy chúng cho đến khi mọi việc đã hoàn thành.

Tôi thử endpoint của SparkPool với một giao dịch không giá trị và nó hoạt động hệt như cách chúng tôi mong muốn: Giao dịch không được thấy trên mempool, sau đó đột nhiên xuất hiện như một phần của các block trong SparkPool! Nó giống như xem nước lập tức kết thành đá mà không có giai đoạn hóa rắn vậy.

Sau khi điều chỉnh tập lệnh giao dịch để cung cấp giao dịch trực tiếp cho endpoint mới của SparkPool, giờ phút ấy đã đến. Tôi ngập ngừng trong chốc lát, nhưng kệ đi đó đã là tất cả những gì chúng tôi có thể làm rồi. Chúng tôi có thể sẽ mất 9.6 triệu đô, nhưng bây giờ ít ra cũng sẽ không còn điều gì để hối tiếc nữa. Tôi bấn nút “run” ở trên IntelliJ. Không biết do đâu nhưng tôi mong chờ việc này sẽ tốn một chút thời gian, như kiểu các node sẽ hiểu được sức nặng của vấn đề hiện tại và cẩn thận để giải quyết một cách một cách hoàn hảo nhất vậy. Nhưng mà không, các giao dịch được gửi chỉ trong vài mili giây.

Tất cả mọi người trong cuộc gọi bắt đầu tải lại màn hình của Etherscan liên tục, không biết đội phát triển của Etherscan có thấy lưu lượng truy cập tăng đột biến trong 3 phút này không. Bởi vì chỉ có SparkPool có các giao dịch và chỉ có một tỉ lệ hash rate của SparkPool đang góp sức vào hành động này nên bây giờ việc duy nhất chúng tôi có thể làm chỉ là chờ đợi và chờ đợi. Mỗi block xuất hiện từ các miner khác như đang cười khẩy chúng tôi, 15 block trước khi giao dịch của chúng tôi hiện lên dài như cả thế kỷ, nhưng cuối cùng thông báo giao dịch thành công cũng hiện lên: “Mined” và không bị từ chối.

Chúng tôi cười và thở ra nhẹ nhõm mỗi khi những khối block được nối tiếp trên block của chúng tôi và nỗi lo về việc thất bại ngày càng ít đi, Đội của Lien bây giờ đã ở vị thế có đủ token SBT+LBT để thanh lý toàn bộ hệ thống và Sam bắt đầu thực hiện giai đoạn cuối của cuộc giải cứu.

Sam:

Bây giờ chúng tôi đã chuyển thành công lượng token cho đội Lien và không có dấu hiệu của việc bị front-run, bị can thiệp hay những vấn đề khác, chúng tôi nhanh chóng thông báo cho họ về tin tốt này. Họ xác nhận đã nhận được lượng token và sẽ ngay lập tức thực hiện giao dịch để rút toàn bộ số ETH có trong contract. Một lúc sau, một lệnh pending xuất hiện trên Etherscan.

Nhìn vào biểu tượng đang xoay tròn, hồi tưởng lại về những việc đã xảy ra trong thời gian qua để có thể đến được lúc này. Thứ mà bắt đầu chỉ từ việc nhìn lướt qua một vài contract và kết thúc bằng một căn phòng tập hợp các chuyên gia từ mọi nơi trên thế giới.

Nếu không có Alex và Georgios, chúng tôi sẽ không thể liên lạc được với đội phát triển của Lien. Nếu không có Scott, chúng tôi sẽ phải tìm cách giải cứu số quỹ trong vô vọng. Nếu không có Tina, chúng tôi sẽ không có khả năng để kết nối với CertiK và SparkPool. Và nếu không có SparkPool, chúng tôi đã thất bại trong việc lặp lại lịch sử mà Dan đã viết vào tuần trước.

Trong đêm thứ ba muộn đó, một nhóm người tình cờ chung tay với nhau cho một mục tiêu chung và làm việc không biết mệt mỏi để cố giải cứu khối tài sản trị giá 9.6 triệu đô và trả lại cho những người chủ chính đáng của nó. Tất cả mọi nỗ lực trong suốt hơn 7 tiếng đồng hồ để đi đến lệnh pending này và cái biểu tượng đang quay tròn trước mắt tôi.

Khi biểu tượng xoay tròn đó cuối cùng cũng trở thành dấu ✅ màu xanh, những tiếng thở và vẻ nhẹ nhõm hiện rõ trên gương mặt từng người.

Chúng tôi đã thành công trốn khỏi khu rừng tăm tối đó.

Bài viết này để nói lên công sức của rất nhiều con người. Chân thành cảm ơn Alex Wade, Scott Bigelow, Tina Zhen, Georgios Delkos và SparkPool vì đã ở đây khi mọi người cần các bạn nhất, cũng như Alex Obadia và Dan Robinson đã đánh giá và nhận xét về bài viết trên.

RELEVANT SERIES