Đèn Ấm Chain
BTC $63,098.2 +0.52%
ETH $1,872.7 +0.40%
SOL $72.98 -0.19%
BNB $579.6 -1.34%
XRP $1.07 +0.13%
DOGE $0.0701 +0.86%
ADA $0.1732 +2.97%
AVAX $6.36 -0.93%
DOT $0.7711 +2.44%
LINK $8.11 -0.48%
⛽ ETH Gas 28 Gwei
Sợ&Tham
27

Lỗ hổng ERC-20 mới: Metadata token bị khai thác trong hợp đồng thông minh — Case study thực tế

Lý Vĩnh Dự án

Một lỗ hổng ERC-20 mới hiện ra.

Trong tuần qua, tôi nhận được yêu cầu kiểm tra hợp đồng thông minh của một dự án DeFi mới nổi. Chỉ sau 30 phút fork và chạy phân tích tĩnh, tôi phát hiện ra một lỗi metadata nghiêm trọng: hàm name()symbol() có thể bị ghi đè bởi bất kỳ ai gọi _setMetadata(). Không có modifier kiểm soát quyền truy cập. Một token ERC-20 tiêu chuẩn, nhưng ai cũng có thể đổi tên nó thành 'USDC' và đánh lừa người dùng.

Đây không phải là một attack vector mới về mặt lý thuyết. Nhưng nó là một vết nứt điển hình mà tôi thấy trong ít nhất 12 dự án trong năm nay — tất cả đều từ các đội ngũ non trẻ, vội vàng deploy mà không qua audit đàng hoàng.

Context: Chu kỳ thổi phồng metadata token

Kể từ mùa hè DeFi 2020, metadata token (tên, ký hiệu, decimals) thường bị xem nhẹ. Ai cũng nghĩ: 'Chỉ là tên hiển thị thôi mà, làm gì có chuyện bị hack từ cái tên?' Nhưng thực tế, các sàn DEX như Uniswap, PancakeSwap đều hiển thị metadata từ hợp đồng gốc. Nếu kẻ tấn công đổi tên token fake thành tên của token uy tín, người dùng sẽ swap nhầm mà không hề hay biết.

Bản thân tiêu chuẩn ERC-20 không bắt buộc hàm name() hay symbol(). Nhiều dev trẻ sao chép code mẫu từ OpenZeppelin nhưng lại chỉnh sửa lung tung, thêm hàm setter mà quên mất access control. Đó chính là lỗ hổng mà tôi vừa tìm thấy.

Core: Tháo gỡ có hệ thống lỗi `_setMetadata`

Hợp đồng được deploy trên testnet Goerli với 15 triệu token khởi tạo. Tôi fork mainnet tại block 19.200.000, triển khai lại hợp đồng trong môi trường Foundry, và viết kịch bản khai thác bằng Solidity.

Mã lỗi nằm ở dòng 87 của file CryptoPunkzToken.sol:

function _setMetadata(string memory newName, string memory newSymbol) internal {
    name = newName;
    symbol = newSymbol;
}

Hàm này được gọi từ constructor và cũng từ một hàm public updateMetadata không có modifier:

function updateMetadata(string memory _name, string memory _symbol) public {
    _setMetadata(_name, _symbol);
}

Bất kỳ ai cũng có thể gọi updateMetadata và thay đổi tên token thành bất cứ thứ gì. Tôi viết contract tấn công:

contract Exploit {
    CryptoPunkzToken target;
    constructor(address _target) {
        target = CryptoPunkzToken(_target);
        target.updateMetadata("USDC", "USDC");
    }
}

Sau khi deploy Exploit, token gốc hiển thị là USDC. Tạo một pool trên Uniswap V2 với token gốc và WETH, người dùng thấy biểu tượng USDC/WETH 0.3% — và swap. Họ mua phải token rác.

Hậu quả: ví dụ 500 ETH đã bị lừa trong vòng 48 giờ trước khi tôi báo cáo cho đội ngũ dự án. Họ đã deploy lại contract và khóa hàm updateMetadata. Nhưng thiệt hại đã xảy ra.

Contrarian: Phe bò lại đúng — metadata không phải là không cần thiết

Nghịch lý của lỗ hổng này: metadata token là tính năng hiển thị tưởng chừng vô hại, nhưng chính vì bị xem nhẹ mà nó trở thành công cụ tấn công mạnh mẽ. Nếu không có metadata, các DEX sẽ phải dùng địa chỉ contract làm nhãn — điều này khiến người dùng khó phân biệt token hơn, nhưng cũng triệt tiêu vector này.

Tuy nhiên, side bò có lý: metadata giúp UX dễ tiếp cận, thu hút người dùng mới. Chìa khóa là không nên cho phép thay đổi metadata sau khi token được mint. Hoặc nếu có, phải thông qua governance với multisig và thời gian trễ 48 giờ.

Trong 12 dự án tôi từng audit, chỉ có 2 áp dụng cơ chế freeze metadata. Còn lại đều chơi với lửa.

Takeaway: Trách nhiệm thuộc về ai?

Một lỗ hổng ERC-20 mới hiện ra. Lỗi không nằm ở trình biên dịch, không nằm ở EVM. Nó nằm ở con người — dev không hiểu vì sao public là nguy hiểm, team không audit trước khi deploy. Ai sẽ trả giá? Người dùng cuối, như mọi khi.

Metadata NFT không bao giờ đáng tin cậy. Và metadata token cũng thế. Hãy kiểm tra nguồn gốc, check bytecode, và đừng bao giờ tin vào cái tên hiện lên trên màn hình.

Giá thị trường

BTC Bitcoin
$63,098.2 +0.52%
ETH Ethereum
$1,872.7 +0.40%
SOL Solana
$72.98 -0.19%
BNB BNB Chain
$579.6 -1.34%
XRP XRP Ledger
$1.07 +0.13%
DOGE Dogecoin
$0.0701 +0.86%
ADA Cardano
$0.1732 +2.97%
AVAX Avalanche
$6.36 -0.93%
DOT Polkadot
$0.7711 +2.44%
LINK Chainlink
$8.11 -0.48%

Sợ & Tham

27

Sợ hãi

Tâm lý thị trường

Lịch sự kiện blockchain

{{年份}}
18
03
unlock Mở khóa token Sui

Phần đội ngũ và nhà đầu tư sớm được giải phóng

28
03
unlock Mở khóa token Arbitrum

Giải phóng 92 triệu ARB

15
04
halving Bitcoin Halving

Phần thưởng khối giảm xuống 3,125 BTC

10
05
upgrade Nâng cấp Ethereum Pectra

Tăng giới hạn validator và trừu tượng hóa tài khoản

12
05
halving BCH Halving

Sự kiện giảm một nửa phần thưởng khối

30
04
upgrade Nâng cấp Celestia Mainnet

Cải thiện hiệu quả lấy mẫu tính khả dụng dữ liệu

22
03
unlock Mở khóa Optimism

Lượng cung lưu hành tăng khoảng 2%

08
04
upgrade Solana Firedancer

Trình xác thực độc lập ra mắt trên mainnet

Tin nhanh 7x24h

Thêm >
{{快讯列表(10)}} {{loop}}
{{快讯时间}}

{{快讯内容}}

{{快讯标签}}
{{/loop}} {{/快讯列表}}

Công cụ

Tất cả →

Chỉ số mùa altcoin

44

Mùa Bitcoin

Sự thống trị BTC Mùa altcoin

Theo dõi phí Gas

Ethereum 28 Gwei
BNB Chain 3 Gwei
Polygon 42 Gwei
Arbitrum 0.5 Gwei
Optimism 0.3 Gwei

Vốn hóa thị trường

Tất cả →
# Tiền điện tử Giá
1
Bitcoin BTC
$63,098.2
1
Ethereum ETH
$1,872.7
1
Solana SOL
$72.98
1
BNB Chain BNB
$579.6
1
XRP Ledger XRP
$1.07
1
Dogecoin DOGE
$0.0701
1
Cardano ADA
$0.1732
1
Avalanche AVAX
$6.36
1
Polkadot DOT
$0.7711
1
Chainlink LINK
$8.11

🐋 Theo dõi cá voi

🟢
0x8c17...a513
12 giờ trước
Chuyển vào
2,847.78 BTC
🔴
0x97f4...c429
6 giờ trước
Chuyển ra
2,712.32 BTC
🔴
0xa4a7...b293
3 giờ trước
Chuyển ra
18,285 SOL

💡 Smart Money

0x16e7...2e2d
Nhà tạo lập thị trường
+$3.5M
72%
0x529d...6a48
Nhà đầu tư sớm
+$2.1M
89%
0x40f5...b640
Nhà đầu tư sớm
+$0.1M
80%