
Mô phỏng giao dịch: một giao dịch sẽ làm gì trước khi bạn ký
Địa chỉ đúng. Số tiền đúng. Bạn đã kiểm cả hai. Vậy mà giao dịch vẫn không phải thứ bạn nghĩ.
Đây không phải giả định. Đó là hình dạng thông thường của phần lớn các vụ mất tiền trong crypto có liên quan tới một người cẩn thận. Không ai dụ họ gửi tiền cho người lạ. Họ phê duyệt một thứ mà mọi phần nhìn thấy được đều đúng, còn hậu quả thì nằm hoàn toàn ở chỗ khác — trong một hạn mức chi tiêu token, trong một lệnh gọi hợp đồng, trong một ký tự của một địa chỉ họ đã nhìn cả trăm lần.
Mô phỏng là nỗ lực khép lại khoảng cách đó: cho bạn thấy tác động của một giao dịch thay vì nội dung của nó, trước khi chữ ký của bạn biến nó thành thật.
Khoảng cách giữa điều bạn định làm và điều bạn đang ký
Một giao dịch không phải một câu. Nó là các byte.
Khi những byte ấy là một khoản chuyển đơn giản, khoảng cách giữa điều chúng nói và điều chúng làm là nhỏ: một địa chỉ, một số tiền, một khoản phí. Khi chúng là một lệnh gọi hợp đồng, khoảng cách có thể khổng lồ. approve trông như một sự cho phép. Nó là một quyền thường trực để địa chỉ khác dịch chuyển token của bạn, và theo chuẩn ERC-20 không có gì trong lệnh gọi buộc phải giới hạn bao nhiêu hay trong bao lâu. Một lần phê duyệt duy nhất, ký một lần, có thể bị rút cạn nhiều tháng sau.
Giao diện bạn đang nhìn lúc ký buộc phải dịch những byte ấy thành một câu. Bản dịch đó chính là bề mặt tấn công. Nếu nó do chính kẻ muốn có chữ ký của bạn tạo ra, nó có thể nói bất cứ điều gì.
Một buổi chạy thử, không phải một lời hứa
Mô phỏng nghĩa là chạy giao dịch đối chiếu với trạng thái hiện tại của chuỗi mà không phát nó đi, rồi ghi lại những gì thay đổi.
Trong SSP Enterprise, việc đó diễn ra khi một đề xuất được tạo, trước khi bất kỳ ai ký. Mô phỏng được dựng từ những gì bộ dựng đề xuất tạo ra — người nhận, số tiền, hợp đồng token và dữ liệu gọi mà chính SSP ráp lại — chứ không bao giờ từ hex đã ký thô do một máy khách đưa sang. Nó chạy ở chế độ chỉ đọc. Ba động cơ phủ các họ chuỗi khác nhau:
- Các chuỗi EVM chạy một lệnh gọi chỉ đọc tới một node rồi đọc lại các thay đổi số dư phát sinh và lệnh gọi đã giải mã.
- Các chuỗi UTXO không cần node nào cả. Đầu vào và đầu ra đã biết sẵn, nên trước-và-sau chỉ là số học trên những đồng đã chọn, còn người nhận được phân loại thành tiền thối quay về bạn hay thực sự bên ngoài.
- Solana giải tuần tự hóa giao dịch chưa ký mà bộ dựng tạo ra rồi chạy chính
simulateTransactioncủa mạng, với phần xác minh chữ ký được tắt, sau đó đọc từ kết quả số dư token của kho trước và sau.
Thứ quay về là một bản xem trước: số dư của mỗi tài sản trước đó là bao nhiêu, sau đó sẽ là bao nhiêu, và — trên EVM — lệnh gọi thực sự là gì, được giải mã thành một phương thức cùng các đối số của nó.
Hai điều nó không phải. Nó không phải một bảo đảm: trạng thái chuỗi luôn dịch chuyển, và một mô phỏng chạy vào lúc đề xuất là bức ảnh của chuỗi như nó đã từng khi ấy. Và nó không phải một cánh cổng. Đó mới là nửa thú vị hơn của thiết kế, và ta sẽ quay lại.
Mười bốn điều đáng được nói cho bạn biết
Một bản xem trước chỉ hiện các con số thì vẫn bắt bạn tự phát hiện vấn đề. Vì vậy bản xem trước đi kèm các cảnh báo, và có mười bốn cảnh báo, ở bốn mức nghiêm trọng.
Phê duyệt — hạng mục vét cạn nhiều ví nhất. Một hạn mức vô hạn hoặc không bị chặn trên là nghiêm trọng. Bất kỳ phê duyệt chi tiêu khác không nào cho một địa chỉ không nằm trong danh sách cho phép của bạn là mức cao. Và phê duyệt cho một tài khoản do người sở hữu thay vì một hợp đồng cũng là mức cao, vì hầu như không có lý do chính đáng nào để làm vậy: hợp đồng mới tiêu hạn mức, con người thì không.
Người nhận — một người nhận không có trong danh bạ của tổ chức lẫn danh sách trắng của kho sẽ bị đánh dấu. Một người nhận mà kho của bạn chưa từng gửi tới cũng vậy. Tự thân, không điều nào là sai. Cả hai đều đáng đọc lại lần nữa.
Rủi ro hợp đồng — một hợp đồng đích có mã nguồn chưa được xác minh, một hợp đồng được triển khai trong bảy ngày gần đây, giá trị gốc được gửi tới một hợp đồng nói chung, và bất kỳ địa chỉ nào mà nhà cung cấp gắn cờ là độc hại rõ rệt.
Thực thi — giao dịch bị hoàn ngược trong mô phỏng, nghĩa là nó sẽ thất bại trên chuỗi và phí thì mất trắng. Hoặc dòng tiền ra mô phỏng không khớp với các khoản mà đề xuất tuyên bố: kho mất nhiều hơn, hoặc ít hơn, so với những gì màn hình nói.
Suy giảm — và, được ghi nhãn rõ ràng, trường hợp mô phỏng không chạy nổi. Một node không với tới được sẽ cho ra "không khả dụng", chứ không phải im lặng và cũng không phải một giấy chứng nhận sạch sẽ bịa ra.
Sự phân biệt giữa các mức ấy quan trọng hơn con số tổng. Nghiêm trọng và cao nói về một giao dịch nhiều khả năng không phải thứ nó trông như. Trung bình và thông tin nói về một giao dịch bất thường, mà giao dịch hợp lệ thì thỉnh thoảng vẫn bất thường.
Đầu độc địa chỉ: đòn đánh hạ được cả người cẩn thận
Một cảnh báo xứng đáng có mục riêng, bởi nó nhắm đúng vào thói quen mà hầu hết lời khuyên bảo mật đều khuyến nghị.
Đầu độc địa chỉ diễn ra thế này. Kẻ tấn công gửi vào kho của bạn một giao dịch tí hon hoặc giá trị bằng không, từ một địa chỉ được chế ra để trùng sáu ký tự đầu và bốn ký tự cuối với một địa chỉ bạn vốn đã giao dịch cùng. Không có gì bị trộm. Thậm chí thực sự cũng chẳng có gì được làm. Giao dịch tồn tại để địa chỉ na ná ấy xuất hiện trong lịch sử của bạn.
Về sau — vài ngày sau, khi bạn lại trả tiền cho cùng đối tác — bạn sao địa chỉ từ chính lịch sử giao dịch của mình, như người cẩn thận vẫn làm thay vì gõ lại. Bạn kiểm nó như người cẩn thận vẫn kiểm: vài ký tự đầu, vài ký tự cuối. Cả hai đều khớp. Phần giữa thì không, và phần giữa mới là nơi tiền đi tới.
SSP đối chiếu từng người nhận trong đề xuất với những địa chỉ mà kho của bạn đã biết, dùng đúng phép so tiền tố và hậu tố mà mắt người thực hiện, rồi nêu một cảnh báo nghiêm trọng gọi tên địa chỉ đang bị giả dạng. Cùng phép kiểm ấy chạy theo chiều ngược lại trên lịch sử nhận vào, nên một địa chỉ bị đầu độc được đánh dấu ngay khi nó tới, chứ không chỉ khi bạn sắp dùng nó.
Lý do nên biết đòn này ngay cả khi bạn chẳng bao giờ dùng SSP: thói quen xác minh chặn được mọi đòn tấn công địa chỉ khác chính là thói quen mà đòn này được dựng lên để đánh bại. Hãy so cả địa chỉ, hoặc đừng so gì cả.
Vì sao cảnh báo được tính ở máy chủ — mà vẫn không chặn được gì
Bộ cảnh báo được quyết ở phía máy chủ, lấy danh bạ của tổ chức và danh sách trắng của kho làm nguồn sự thật. Điều đó là có chủ ý: nếu máy khách được quyết định thứ gì tính là đã cho phép, thì một máy khách bị xâm phạm có thể lặng lẽ quyết rằng mọi thứ đều đã cho phép.
Vậy mà không điều nào trong đó có thể chặn một giao dịch. Mô phỏng không bao giờ ràng buộc việc ký hay việc phát. Một nhà cung cấp gặp lỗi, hết thời gian chờ, hoặc không với tới node sẽ trả về "không khả dụng", và đề xuất vẫn ký được trọn vẹn. Toàn bộ phân hệ được cách ly khỏi lỗi để một cú sập trong bản xem trước không bao giờ có thể làm mắc cạn một đề xuất.
Điều đó nghe như một lựa chọn kỳ lạ, nên hãy nói thẳng lý lẽ. Một bản xem trước có thể chặn là một bản xem trước có thể bị khiến phải chặn — bằng cách hạ một node, bằng cách tạo ra một cảnh báo nghiêm trọng giả, bằng bất cứ cách nào trong ngàn cách phần mềm hỏng. Tiền không nhúc nhích được vì một dịch vụ tư vấn đang ốm là tiền bạn đã mất một phần. Ngưỡng trong multisig mới là thứ bảo vệ tiền; mô phỏng ở đó để thông tin cho những con người đang giữ khóa. Điều gì thực sự chặn được một giao dịch là bản dài của lập luận ấy.
Khi máy chủ và thiết bị của bạn bất đồng
Tất cả những gì ở trên là cách đọc của máy chủ. Thiết bị của bạn có cách đọc riêng.

Khi SSP Wallet trình bạn một đề xuất để ký, nó tự giải mã các byte và hiển thị thứ chính nó tìm được — chứ không phải bản tóm tắt của máy chủ. Rồi nó so hai bên. Nếu lệnh gọi đã giải mã của máy chủ hàm ý một tập người nhận khác với tập mà thiết bị suy ra, thiết bị nêu cảnh báo nghiêm trọng về sự lệch pha của riêng nó và hạ bậc bản xem trước của máy chủ về mặt hiển thị.
Bản giải mã của thiết bị mới là bản có thẩm quyền. Phép kiểm cố tình dè dặt: một mô phỏng máy chủ thiếu hoặc đang chờ là một sự suy giảm, không phải một mâu thuẫn, và không bị nêu như mâu thuẫn. Nó cũng chỉ áp dụng cho các chuỗi EVM, nơi máy chủ có tạo ra một lệnh gọi đã giải mã; trên chuỗi UTXO chẳng có gì để so, và bản giải mã của riêng thiết bị đơn giản là đứng một mình.
Đây mới là tính chất đáng mang theo, dù bạn dùng ví nào. Một ý kiến thứ hai chỉ đáng giá khi nó đến từ nơi mà cùng một hành vi xâm phạm ý kiến thứ nhất không thể chạm tới. Hai bản tóm tắt từ cùng một máy chủ chỉ là một bản tóm tắt.
Đọc một dải rủi ro mà không tập thành thói quen phớt lờ nó
Cảnh báo chỉ có tác dụng cho tới khi chúng thành giấy dán tường. Vài thói quen giữ chúng còn hữu ích.
Đọc mức nghiêm trọng trước, chi tiết sau. Nghiêm trọng và cao đáng để dừng lại. Một cảnh báo trung bình hay thông tin ở lần thanh toán đầu cho một nhà cung cấp mới là hệ thống đang chạy đúng, không phải cớ để lo.
Coi mọi cảnh báo về phê duyệt là một điểm dừng hoàn toàn. Chuyển khoản dịch chuyển đúng thứ chúng nói. Phê duyệt trao một quyền sống lâu hơn cả giao dịch. Nếu bạn không định trao một hạn mức thường trực, câu trả lời là không.
Tin thiết bị hơn tin màn hình. Nếu hai bên lệch nhau, chiếc điện thoại trong tay bạn mới là thứ chạy trên phần cứng mà kẻ tấn công đáng lẽ phải xâm phạm riêng.
Đừng coi "không khả dụng" là "ổn cả". Nó nghĩa là chẳng ai kiểm cả. Đó là lý do để chính bạn nhìn kỹ hơn, nhất là với một khoản chi lớn hoặc bất thường.
Mọi thứ ở đây là về khoảnh khắc trước một chữ ký. Về những gì xảy ra sau đó — ai được ký, cần bao nhiêu người, và thao tác nào lại đòi cả hai thiết bị — hãy bắt đầu từ thiết lập kho doanh nghiệp đầu tiên của bạn và thao tác trọng yếu cùng việc ký lại. Còn về các kiểu tấn công mà những cảnh báo này được nắn theo, các cuộc tấn công lừa đảo nhắm vào người dùng crypto bao quát nửa phần con người của vấn đề.


