Hacker đã cuỗm đi gần $150k của dự án HeroFi

lifebow
VeriChains Lab
Published in
6 min readDec 7, 2021

Cập nhật ngày 08/12/2021, đội ngũ phát triển của HeroFi có liên lạc với chúng tôi, cho biết tình hình khắc phục sự cố đã diễn ra một cách nhanh chóng, kịp thời để bảo vệ tài sản của người dùng. Một số hành động như:

  • Tắt hoàn toàn giao dịch của token ROFI đã bị hack.
  • Triển khai smart contract với token ROFI mới và chuyển trả token mới cho tất cả các nhà đầu tư trước đó.
  • Tạo lại thanh khoản cặp ROFI/BUSD với giá trị $100k và đưa ROFI về mức giá 4$ như trước khi bị hack.
  • Team phát triển quyết định dùng toàn bộ phần phí giao dịch của marketplace ($150k) để thực hiện các lệnh buy back, nhằm tránh việc giảm giá đột ngột của token ROFI mới, tránh thiệt hại cho nhà đầu tư.
  • Đối với các trường hợp thiệt hại do swap sau thời điểm bị hack, team có cơ chế hỗ trợ case by case để đền bù thiệt hại cho nhà đầu tư.

Chúng tôi rất hoan nghênh tinh thần và phản ứng nhanh nhạy của đội ngũ. Chúng ta cần cảnh giác và và luôn tỉnh táo sẵn sàng đối mặt với các khó khăn trong thế giới DeFi. Vì lòng tin của các nhà đầu tư là vô cùng quan trọng.

HeroFi là một trò chơi aRPG của Việt Nam dành cho thiết bị di động. Đây là trò chơi xây dựng trên blockchain, nơi người chơi có thể chơi để kiếm crypto token và tạo ra các “anh hùng” NFT trong trò chơi. Một trong những token chính được sử dụng trong trò chơi đó là ROFI.

Ngày 05/12 vừa qua, giá trị của cặp token ROFI/BUSD trên sàn pancakeswap bị sụt giảm một cách nghiêm trọng nên đội ngũ Verichains Lab đã tiến hành phân tích và phát hiện đây là một cuộc tấn công. Dưới đây là quá trình phân tích, tìm kiếm điểm yếu đã cho phép hacker trục lợi gần $150k USD.

Biểu đồ giá trị cặp ROFI/BUSD trên poocoin trong ngày 4–5/12/2021

Hacker đã mint được 20 Triệu token và bán thành công khoảng 1,14 triệu ROFI token và thu lại được 245.24 BNB (~$142k) và rút ra ngoài thông qua Tornador.Cash, hiện tại ví tại địa chỉ 0x395bc45ae73fe964d0f40ea03371eb55e7b88d2f vẫn đang nắm giữ hơn 19 triệu ROFI token.

Tuy nhiên, đội ngũ phát triển game đã triển khai lại hệ thống smart contracts mới và chuyển toàn bộ các giao dịch qua token ROFI mới. Vậy nên 19 triệu ROFI token còn lại trong ví của hacker sẽ không ảnh hưởng tới thị trường của HEROFI trong tương lai.

Quá trình phân tích

Sau khi nhận thấy giá trị của token ROFI bị sụt giảm nghiêm trọng, mình đã đi tìm các lệnh xả token lớn và phát hiện ra ví 0x395bc45ae73fe964d0f40ea03371eb55e7b88d2f đã bán 1 triệu token và vẫn còn đang giữ hơn 19 triệu ROFI token.

Ví của hacker với hơn 19 triệu ROFI token

Dựa vào các transactions của ví này mình nhận ra, ví này có tương tác với một contract trung gian là 0x3cd6a95ff83cc9c9369015ac921bd8d215b53bed và được HEROFi Smart Contract transfer về hơn 20 triệu ROFI token cả lock và unlock từ địa chỉ 0x00.

Transaction thể hiện ví hacker được nhận hơn 20 triệu ROFI token https://bscscan.com/tx/0x1873b9536b549c41abc9dadf809230e0881fb6c8756e26fd4b85944b1bc67903

Dựa vào mã nguồn public đã được verify của Herofi token tại địa chỉ:

https://bscscan.com/address/0x65f6d9b1e4f4ef843049f5845b71531a5ce231eb#code

Mình có một số thông tin rút ra như sau:

  • Transactions với log được transfer từ địa chỉ 0x00 là kết quả khi contract thực hiện phương thức _mint của contract. Vì không cá nhân nào sở hữu ví có địa chỉ 0x00 cả và mặc định phương thức _mint có log mặc định là transfer từ địa chỉ 0x00.
  • Chỉ ví hoặc contract được cấp quyền AuthorizedUnlockedMintCaller hoặc AuthorizedLockedMintCaller mới có thể gọi luồng tương tác với _mint function.

Ngoài ra dựa vào input của transaction trên mình phát hiện ra một địa chỉ contract khác cũng có các transaction tương tự là contract ở địa chỉ 0x26b35c990bfa92132af75b74e287df9cc76b0c0f.

Contract 0x26b...c0f có một số đặc điểm:

  • Được 8 ví khác gọi tới trực tiếp và các lệnh này sinh ra khoảng 6.38 ROFI token. Tất cả các token được tạo ra này đều được chuyển về ví 0x0e6447a5ae38be266e6f800ba1cb94f4d13b1cea (số token này vẫn được để nguyên trong ví tới thời điểm bài này được viết).
  • Không có đoạn mã kiểm tra tính hợp lệ của người gọi trong function mà 8 ví kể trên gọi.
  • Ví deploy contract này (0x4edaa150040f81d7e4b06dd335126cff3381078d) có liên hệ với ví deploy-owner lúc đó của Herofi smart contract. Chính ví owner đó đã gửi BNB cho ví 0x4e...78d để làm phí deploy contract và ví này cũng đã cấp quyền gọi hàm mint cho contract ta đang đề cập.
Transaction deployer HeroFi contract chuyển BNB cho ví 0x4ed...078d https://bscscan.com/tx/0x64729399815a459391e4850d103d429766e0ec76947af76b54b1b6676f71787a
Transaction deployer-owner HeroFi cấp quyền mintUnlockedToken cho contract 0x26b...c0f https://bscscan.com/tx/0x3817603858cb4ec2a6f5cfd7aa2bfeef43db711d67d1c6f1d1b78452d26e0869
Transaction deployer-owner HeroFi cấp quyền minLockedToken cho contract 0x26b...c0f https://bscscan.com/tx/0xd0f302d605ed3b88cc5186f31254674cb94a5897eee3edd0b00f1cd7e0e2db83

Giả thuyết của cuộc tấn công

Dựa vào các transacsions đã diễn ra ở 2 contract trung gian mà hacker đã tương tác và Herofi contract mình có thể đưa ra hai giả thuyết sau:

Giả thuyết 1.

Đội ngũ phát triển game đã sử dụng ví 0x4e...78d để deploy một contract với tính năng mới trong game và contract chứa lỗ hổng bảo mật đẫn tới bị khai thác vì:

  • Ví deploy-owner HeroFi contract đã transfer BNB cho ví 0x4ed..78d để create contract mới.
  • Ví deploy-owner HeroFi contract cấp quyền MintUnlockToken và MintLockedToken cho contract kể trên với khả năng gọi về contract chính để Mint token mới.
  • Để cẩn thận rằng quyền này hoạt động bình thường owner còn cấp 2 quyền này trước cho ví 0x4ed..78d để test thử 2 lệnh trên, sau đó thu hồi 2 quyền này trên ví cá nhân rồi mới cấp quyền cho contract mới.

Sau khi tạo thành công contract mới và cấp quyền cho contract này thì đội ngũ đã sử dụng 8 ví để vào mint UnlockToken và LockToken. Và chuyển hết số token này về ví 0x0e6...cea.

Hacker đã có thời gian dịch ngược và nhận ra lỗ hổng không kiểm tra người gọi ở contract 0x26b...c0f.

Sau đó gần 2 tiếng hacker đã sử dụng contract trung gian (contract 0x3c...bed) để gọi qua contract nhằm yêu cầu HeroFi smart contract mint thêm hơn 20 triệu ROFI token vào ví của hacker.

Giả thuyết 2.

Hacker đã chiếm được quyền kiểm soát tài khoản owner của HeroFI token contract từ trước.

Việc đơn giản của hacker cần làm là deploy một contract cho phép hacker có thể gọi trực tiếp hoặc gián tiếp qua để mint token cho bản thân mình.

Thêm một vài bước cấp quyền, thu quyền mint ví cá nhân rồi chuyển các quyền này sang contract trung gian.

Tất cả hành động trên sẽ làm người ngoài nhìn vào giống như là đội ngũ phát triển game đã deploy một contract chứa lỗ hổng bảo mật. Và hacker là người nhanh nhạy đã kịp khai thác trong vòng 2 tiếng như giả thuyết 1.

Kết luận

Tất cả, những phán đoán ở phần trên đều là giả thuyết. Mình chỉ xác định được là hacker đã lợi dụng quyền mint ở contract 0x26b...c0f thông qua việc contract này không kiểm tra tính hợp lệ của người gọi.

Tuy nhiên sự thật vẫn là gần $150k của nhà đầu tư đã vào túi của hacker.

Để tránh trường hợp đáng tiếc này ra, đội ngũ phát triển game nên thật sự chú ý đến yếu tố bảo mật trong hệ thống và xuyên suốt quá trình vận hành. Không chỉ riêng các contract triển khai trên mainnet mà cả các thành phần khác trong hệ thỗng cũng nên được audit. Các tài khoản vận hành hệ thống nên bảo vệ một các thật tốt, tránh để các kẻ xấu có cơ hội lợi dụng.

--

--