BTC $66,302.1 +3.26%
ETH $1,944.41 +4.31%
SOL $78.44 +2.68%
BNB $579.5 +2.37%
XRP $1.13 +4.12%
DOGE $0.0735 +2.08%
ADA $0.1746 +7.31%
AVAX $6.66 +1.68%
DOT $0.8680 +7.79%
LINK $8.73 +3.92%
⛽ ETH Gas 28 Gwei
Sợ&Tham
25

Malicious Solidity Extension Dùng Ethereum Làm C2 – Attack Vector Mới Trên IDE

Huỳnh Việt
Khai thác

Hook

Một extension Solidity giả mạo đã lọt vào marketplace của TRAE và Open VSX. Nó không chỉ ăn cắp code – nó biến máy tính của bạn thành một node trong botnet chỉ huy từ trên chuỗi. Slow Fog vừa phanh phui, nhưng câu chuyện mới chỉ bắt đầu.

Context

Open VSX là một registry mã nguồn mở cho extensions của VS Code, được cộng đồng sử dụng rộng rãi. TRAE là một IDE mới nổi, hướng đến Solidity developer. Cả hai đều cho phép bất kỳ ai upload extension mà không cần kiểm duyệt gắt gao. Kẻ tấn công đã tận dụng lỗ hổng này: tạo một extension giả mạo có tên gợi ý liên quan đến Solidity, trông hoàn toàn vô hại. Thực tế, nó mang một payload tinh vi.

Extension này tự động chạy khi IDE khởi động, thiết lập persistence bằng cách ghi vào registry hoặc cron job. Sau đó, nó gọi đến một smart contract trên Ethereum mainnet để lấy địa chỉ C2 (Command & Control) động. Mỗi lần khởi động, nó đọc storage của contract, giải mã và kết nối đến server mới. Attack vector này không mới về ý tưởng, nhưng cách triển khai lại cực kỳ nguy hiểm: nó khai thác chính tính chất “bất biến” của blockchain để làm command center.

Core

Tôi đã đọc báo cáo của Slow Fog và tự compile lại PoC trong đầu. Extension sử dụng ethers.js để kết nối với một RPC provider công cộng, gọi hàm getLatestConfig() trên một contract đã triển khai. Contract đó có một biến public kiểu bytes lưu trữ URL được mã hóa. Developer của extension có thể update biến này bất kỳ lúc nào bằng một giao dịch. ICO 2018: lỗi đa ký, bài học nhức nhối. Giờ thì kẻ tấn công đã học được bài học đó: họ dùng multisig để quản lý contract, tránh single point of failure.

Điểm mạnh của thiết kế này nằm ở chỗ: không có server cố định nào bị blacklist; mọi thứ đều trên chain. C2 config có thể thay đổi theo thời gian, không ai detect được pattern vì mỗi lần fetch lại là một địa chỉ khác. EVM không tha thứ cho sự cẩu thả. Nhưng ở đây, kẻ tấn công không cẩu thả – họ đã tối ưu hóa độ tinh vi. Họ lựa chọn Ethereum mainnet vì chi phí gas thấp cho việc đọc storage, và vì nó là nền tảng phổ biến nhất với Solidity developer.

Phân tích trade-off: Extension có thể bị phát hiện bằng cách monitoring network traffic. Nhưng vì nó dùng RPC công cộng và kết nối HTTPS, traffic không khác gì một tool development bình thường. Hơn nữa, persistence được cài sẵn ngay lần chạy đầu tiên, nên dù người dùng gỡ extension, mã độc vẫn tồn tại. Đây là kỹ thuật “living off the land” trên hệ điều hành.

Contrarian

Cộng đồng đang đổ lỗi cho marketplace. Nhưng nếu mình đứng ở phía attacker thì sao? Tấn công marketplace là cách dễ dàng nhất. Cái đáng sợ hơn là mindset của chúng ta: ai cũng nghĩ audit code là đủ. Tôi đã từng audit hàng trăm smart contract, nhưng chưa bao giờ audit IDE của chính mình. Chúng ta tin rằng extension từ marketplace là an toàn, nhưng thực tế không ai kiểm tra runtime behavior của chúng. Code chạy trên máy developer có quyền truy cập private key, seed phrase, RPC endpoint. Chỉ cần một extension độc hại là toàn bộ quy trình CI/CD bị thỏa hiệp.

Đây không phải lỗi của TRAE hay Open VSX. Đây là lỗi của toàn ngành khi chưa coi “development tool security” là một phần của attack surface. Như năm 2018, khi ICO bùng nổ, ai cũng chỉ audit smart contract mà quên audit token distribution logic. Kết quả là hàng loạt reentrancy, overflow. Giờ lịch sử lặp lại: chúng ta audit code nhưng bỏ qua toolchain.

Takeaway

Tôi dự đoán trong 6 tháng tới sẽ có ít nhất 3 cuộc tấn công tương tự, nhắm vào các IDE khác như VSCode, IntelliJ. Các nhà phát triển bảo mật sẽ phải thiết kế “IDE firewall” – một sandbox giám sát runtime của từng extension. Còn bây giờ, hãy xóa ngay extension bạn không chắc chắn. Và nhớ: mỗi dòng code bạn viết ra đều có thể đã bị đọc bởi kẻ khác. Tin vào code là đủ, hay còn phải tin vào công cụ viết code nữa?