Đầu độc địa chỉ: cuộc tấn công chỉ cần bạn chép nhầm

·7 phút đọc·Bởi SSP Editorial Team
Ảnh bìa SSP Academy: đầu độc địa chỉ và những địa chỉ tiền mã hóa na ná nhau

Đầu độc địa chỉ: cuộc tấn công chỉ cần bạn chép nhầm

Hầu hết các đòn tấn công nhắm vào người dùng tiền mã hóa đều cần bạn phạm một sai lầm: bấm vào một đường dẫn, gõ cụm từ khôi phục vào một biểu mẫu, phê duyệt thứ bạn chưa đọc. Đầu độc địa chỉ cần ít hơn thế. Nó cần bạn sao chép một địa chỉ từ chính lịch sử giao dịch của mình.

Không mã độc, không trang lừa đảo, không có chữ ký nào phải moi từ bạn. Toàn bộ phần đóng góp của kẻ tấn công là đặt một chuỗi ký tự trông có vẻ hợp lý vào nơi mà sau này bạn sẽ với tay tới.

Nó hoạt động ra sao

Hãy bắt đầu từ thứ khiến điều này khả dĩ: chẳng ai đọc địa chỉ cả. Một địa chỉ Bitcoin hay Ethereum là ba mươi mấy ký tự base58 hoặc thập lục phân chẳng mang nghĩa gì, không có mã kiểm tra nào bạn nhìn bằng mắt mà thẩm định được, và không có lý do nào để nhớ. Nên mọi ví, trình duyệt chuỗi và sàn giao dịch đều rút gọn chúng khi hiển thị — 0x8f3C…9A063 — và mọi người dùng đều học cách kiểm tra hai đầu nhìn thấy được rồi bỏ qua khúc giữa.

Chính thói quen ấy là toàn bộ bề mặt tấn công.

Kẻ tấn công dò cạn để sinh ra địa chỉ cho tới khi có một cái trùng vài ký tự đầu và vài ký tự cuối với địa chỉ bạn thật sự dùng — thường là địa chỉ bạn vừa gửi tiền tới gần đây. Việc này rẻ. Sinh cặp khóa thì nhanh, và khớp chẳng hạn bốn ký tự đầu với bốn ký tự cuối chỉ mất vài giây trên phần cứng bình thường. Không ai bẻ khóa gì cả; họ chỉ gieo xúc xắc cho tới khi một con số trông quen mắt.

Rồi họ đưa địa chỉ ấy vào lịch sử của bạn. Những cách phổ biến:

Rắc bụi. Họ gửi cho bạn một lượng tí xíu — vài satoshi, một phần nhỏ xu của loại mã thông báo nào đó — từ địa chỉ na ná ấy. Đó là giao dịch đến bình thường, nên nó rơi vào lịch sử của bạn như mọi giao dịch khác. Trên các chuỗi UTXO, hạt bụi ấy còn trở thành một đồng tiền tiêu được nằm trong ví bạn, điều sẽ có ý nghĩa về sau.

Chuyển khoản giá trị bằng không. Trên các chuỗi EVM, một lệnh transfer ERC-20 với không mã thông báo vẫn là giao dịch hợp lệ. Kẻ tấn công gửi 0 mã thông báo từ địa chỉ của bạn tới địa chỉ na ná của họ, và một số giao diện vẽ điều đó thành một khoản chi do chính bạn thực hiện. Lịch sử của bạn giờ cho thấy bạn dường như đã gửi tới một địa chỉ mà bạn chưa bao giờ chọn.

Sự kiện giả. Một hợp đồng mã thông báo độc hại có thể phát ra sự kiện Transfer chưa từng xảy ra. Những trình duyệt chuỗi và ví tin vào nhật ký sự kiện sẽ hiển thị nó. Chẳng có gì dịch chuyển; bản ghi ấy đơn giản là một lời nói dối.

Rồi họ đợi. Vài ngày, có khi vài tháng. Đòn này ăn tiền vào lần kế tiếp bạn đi trả cho cùng đối tác ấy, cuộn lịch sử tìm «địa chỉ tôi đã dùng lần trước», rồi chép nhầm dòng. Cả hai đều trông như 0x8f3C…9A063. Bạn kiểm tra hai đầu. Hai đầu khớp.

Vì sao lời khuyên thường gặp không đứng vững

«Luôn kiểm tra lại địa chỉ hai lần» là lời khuyên tiêu chuẩn, và tự nó thất bại, bởi kiểm tra chính là điều mà cuộc tấn công đã lường trước. Bạn kiểm tra. Bạn so sáu ký tự ví hiển thị với sáu ký tự trong trí nhớ, và chúng giống hệt nhau — bởi kẻ tấn công đã làm cho chúng giống hệt.

Việc xác minh chỉ có tác dụng khi thứ bạn đem so là đắt để làm giả. Bốn hay sáu ký tự trùng nhau tốn vài giây. Mười sáu ký tự trùng nhau sẽ tốn hơn cả giá trị món trộm. Toàn bộ trò chơi nằm ở chỗ thói quen của bạn đứng ở đầu nào của đường cong ấy.

Trên các chuỗi UTXO còn có cái bẫy thứ hai. Khoản bụi ấy giờ là một đồng tiền trong ví bạn, và nếu ví của bạn tự động gộp các đầu vào, nó có thể bị quét vào một giao dịch sau này — nối địa chỉ đã rắc bụi với phần còn lại trong số tiền của bạn. Đó là vấn đề riêng tư hơn là trộm cắp, nhưng đó cũng là lý do nên lờ bụi đi thay vì dọn dẹp nó.

Điều gì thực sự bảo vệ

Đừng bao giờ lấy địa chỉ từ lịch sử giao dịch. Đây là thay đổi duy nhất có ý nghĩa. Lịch sử của bạn là bản ghi những gì đã xảy ra, không phải danh sách những người bạn tin — và bất kỳ ai trên đời cũng ghi được vào đó. Hãy lấy địa chỉ từ chính đối tác, qua một kênh mà bạn sẽ nhận ra kẻ mạo danh, hoặc từ một sổ địa chỉ do chính bạn điền vào.

Hãy so địa chỉ trọn vẹn, hoặc so một thứ tóm tắt được cả địa chỉ. Đọc hết bốn mươi hai ký tự là điều phi thực tế. So một identicon — một hình nhỏ sinh ra một cách tất định từ toàn bộ chuỗi — thì không, bởi một địa chỉ na ná khác biệt ở bất cứ đâu trong khúc giữa sẽ cho ra một bức hình khác hẳn. Mắt bạn làm giúp phần việc mà tính kiên nhẫn của bạn sẽ không làm.

Dùng một liên hệ đã lưu. Một địa chỉ bạn đã lưu một lần, từ nguồn bạn đã xác minh một lần, thì về sau không thể bị đầu độc. Sổ địa chỉ sinh ra để làm việc đó, và đó là lý do SSP giữ danh bạ trên thiết bị của bạn chứ không phải trên máy chủ: một danh sách liên hệ chỉ đáng tin khi không ai khác sửa được nó.

Gửi một khoản thử với những lần chuyển lớn hoặc lần đầu. Số nhỏ, xác nhận đã nhận qua kênh khác, rồi gửi phần còn lại. Phí khiến việc này phiền phức, và nó vẫn đúng với khoản thanh toán mà bạn sẽ rất tiếc nếu mất.

Lờ bụi đi. Đừng tiêu, đừng «dọn cho gọn», và hãy cẩn thận với việc gộp tự động nếu bạn quan tâm tới riêng tư.

SSP làm gì với chuyện này

Đầu độc địa chỉ vừa là bài toán hiển thị vừa là bài toán an toàn, nên một phần lời giải nằm ở cách các địa chỉ được vẽ ra.

SSP rút gọn địa chỉ với sáu ký tự đầu và sáu ký tự cuối0x8f3C4b…9A0631 — thay vì ba hay bốn như nhiều giao diện khác. Đó không phải lựa chọn thẩm mỹ. Mỗi ký tự thêm vào lại nhân lên chi phí dò cạn để tạo ra một cái khớp, và mười hai ký tự nhìn thấy được đẩy một bản na ná thuyết phục ra hẳn ngoài tầm với của việc sinh ngẫu hứng.

Khúc giữa bị làm nhạt chứ không bị xóa. Ở dạng mở rộng, ví hiển thị trọn chuỗi với hai đầu in đậm và khúc giữa màu nhạt hơn, để phần mà kẻ tấn công trông cậy vào việc bạn bỏ qua vẫn hiện diện thật sự trên màn hình, thay vì bị thay bằng dấu ba chấm có thể đang giấu bất cứ thứ gì.

Cùng một đoạn mã chạy trong cả hai ứng dụng. splitAddressForDisplay trong SSP Wallet là bản chuyển trực tiếp từ SSP Key, được giữ giống hệt một cách có chủ ý để một địa chỉ trông y như nhau trên trình duyệt và trên điện thoại của bạn. Điều đó quan trọng vì SSP cho bạn xem giao dịch hai lần, trên hai thiết bị — và lần nhìn thứ hai chỉ là một lần kiểm tra thật khi cả hai bề mặt vẽ cùng một thứ theo cùng một cách. Hai kiểu rút gọn khác nhau sẽ để một sai lệch nấp được trong chính chỗ khác biệt ấy.

Trên màn hình phê duyệt của SSP Key, người nhận được hiển thị kèm một identicon sinh ra từ địa chỉ đầy đủ, bên cạnh phần chữ đã rút gọn, và chạm vào đó sẽ mở ra trọn địa chỉ dưới dạng văn bản chọn được. Identicon chính là thứ đánh bại một cú tráo ở khúc giữa: kẻ tấn công có thể khớp các ký tự đầu và cuối của bạn, nhưng không thể khớp một bức hình sinh ra từ mọi ký tự mà không phải giải một bài toán khó hơn nhiều.

Không điều nào trong số đó là bảo đảm. Nếu bạn dán một địa chỉ đã bị đầu độc rồi phê duyệt trên cả hai thiết bị, SSP sẽ ký nó — đó chính là ý nghĩa của việc làm một chiếc ví do bạn kiểm soát chứ không phải một bên giữ hộ luôn hoài nghi quyết định của bạn. Đa chữ ký hai trên hai ngăn người khác tiêu tiền của bạn; nó không ngăn được bạn cố ý trả cho nhầm người. Cũng như mọi cuộc tấn công vận hành bằng cách khiến bạn hành động, việc phòng vệ phải đến trước lúc ký, chứ không phải trong lúc ký.

Bản rút gọn

Đầu độc địa chỉ hiệu quả vì bạn so sáu ký tự thay vì bốn mươi hai, và kẻ tấn công biết là sáu ký tự nào. Cách phòng vệ không phải là cẩn thận hơn — mà là đừng bao giờ lấy địa chỉ từ nơi kẻ tấn công có thể ghi vào, và dùng những công cụ đặt lại trước mắt bạn chính những phần bạn hay bỏ qua.

Chia sẻ bài viết này

Bài viết liên quan