
Khi tính ngẫu nhiên hỏng: lỗi entropy của Coldcard và điều hai thiết bị thay đổi
Cuối tháng Bảy 2026, những kẻ tấn công bắt đầu rút cạn bitcoin khỏi hàng nghìn chiếc ví cứng chẳng làm gì sai. Chủ nhân của chúng đã làm theo lời khuyên. Họ mua một thiết bị chuyên để ký, giữ hạt giống ngoại tuyến, chưa bao giờ gõ nó vào một trang web nào. Không điều nào có ý nghĩa cả, bởi hạt giống mà những thiết bị ấy sinh ra chưa bao giờ ngẫu nhiên như vẻ ngoài của nó.
Khoảng 1.816 BTC rời hơn 5.200 địa chỉ qua bốn đợt. Nó trở thành vụ khai thác ví cứng lớn nhất trong năm.
Bài này không phải một vòng ăn mừng. Lỗi liên quan thuộc loại có thể xảy ra với gần như bất kỳ chiếc ví nào, kể cả ví của chúng tôi, và câu hỏi thú vị không phải ai đã phát hành nó, mà kiến trúc của một chiếc ví làm gì khi điều đó xảy ra.
Thực sự đã sai ở đâu
Một commit duy nhất, vào tháng Ba 2021.
Thiết kế của Coldcard yêu cầu hạt giống được sinh ra từ một bộ sinh số ngẫu nhiên phần cứng — một con chip chuyên dụng lấy entropy từ các quá trình vật lý. Đó là cách làm đúng. Nhưng một thay đổi trong firmware 4.0.1 đã chuyển việc sinh hạt giống qua một bộ sinh giả ngẫu nhiên bằng phần mềm, gieo từ các hằng số công khai được viết cứng trong mã.
Một PRNG là tất định theo định nghĩa. Với cùng một giá trị khởi đầu, nó luôn cho ra cùng một dãy. Vậy nên một hạt giống sinh theo cách ấy không phải con số không ai đoán nổi — nó là con số rút từ một tập đủ nhỏ để dò hết, dùng những hằng số vốn nằm sẵn trong firmware đã công bố suốt thời gian đó.
Các thiết bị vẫn cư xử bình thường. Chúng hiển thị hai mươi tư từ, người ta chép lại, chúng dẫn xuất địa chỉ đúng, ký những giao dịch hợp lệ. Không chiếc ví nào có màn hình cho bạn biết bao nhiêu entropy đã đi vào hạt giống của bạn. Mọi người dùng bị ảnh hưởng đều cầm một thiết bị trông và hoạt động y hệt một thiết bị lành lặn, trong tới năm năm.
Cửa sổ trải từ firmware 4.0.1 tháng Ba 2021 tới 4.1.9 tháng Bảy 2026. Cập nhật firmware sửa việc sinh hạt giống từ đó về sau và chẳng làm gì cho những hạt giống đã tạo: các khóa ấy vốn đã yếu, và không bản cập nhật nào thêm ngược lại được tính ngẫu nhiên cho một con số đã ghi lên tấm thẻ trong két sắt của ai đó. Người bị ảnh hưởng phải sinh hạt giống mới và chuyển tiền đi.
Vì sao tính ngẫu nhiên yếu là mất trắng trong im lặng
Đáng để nói cho chính xác vì sao lớp lỗi này nặng đến vậy, bởi nó không trực giác.
Một hạt giống BIP-39 24 từ đại diện cho 256 bit entropy. Đoán ra một cái không chỉ khó, nó là bất khả tưởng tượng: không có máy tính nào, hiện tại hay tương lai, dò cạn được không gian ấy. Đây là nền móng mà toàn bộ mô hình tự lưu ký đứng trên: khóa của bạn an toàn bởi nó là một trong một số lượng khả năng lớn đến mức không hình dung nổi.
Bảo đảm ấy không phải một tính chất của những từ. Nó là tính chất của quá trình đã chọn ra chúng. Hai mươi tư từ rút từ một bộ sinh yếu trông y hệt hai mươi tư từ rút từ một bộ sinh mạnh. Chúng qua mọi tổng kiểm, cho ra địa chỉ hợp lệ, và khôi phục hoàn hảo trên bất kỳ ví nào. Khác biệt duy nhất là người khác cũng có thể tới được chúng.
Nên thất bại này vô hình từ bên trong, và nó trọn vẹn. Không phải "kẻ tấn công có thể trộm của bạn nếu bạn mắc lỗi" — chẳng có lỗi nào để tránh, chẳng có đường dẫn lừa đảo nào để từ chối, chẳng có hộp thoại xác nhận nào để đọc kỹ. Tiền có thể bị lấy khi kẻ tấn công thấy tiện, và dấu hiệu đầu tiên rằng có gì đó sai là nó đã biến mất.
Điều hai thiết bị thay đổi

Đây là phần quan trọng về mặt kiến trúc, và tôi muốn nói nó cho chính xác thay vì bằng ngôn ngữ quảng cáo.
SSP là một multisig 2-of-2. Tiền nằm ở một địa chỉ do hai khóa độc lập, sinh ra trên hai thiết bị độc lập kiểm soát — một trong tiện ích trình duyệt, một trong ứng dụng di động SSP Key — và một giao dịch đòi cả hai chữ ký. Dàn xếp hai-trên-hai là toàn bộ nền tảng của chiếc ví.
Giờ hãy đặt kịch bản Coldcard vào cấu trúc ấy. Giả sử việc sinh hạt giống của tiện ích có cùng khiếm khuyết, và kẻ tấn công dẫn xuất được trọn vẹn khóa trình duyệt của bạn.
Hắn vẫn không tiêu được gì. Hắn nắm một trong hai chữ ký cần có. Địa chỉ không nhả tiền cho một khóa, dù là khóa của ai và có được bằng cách nào. Muốn dịch chuyển số coin của bạn, hắn còn phải phá thêm, một cách độc lập và đồng thời, chiếc khóa trên điện thoại bạn — một ứng dụng khác, một hệ điều hành khác, một nguồn entropy khác, sinh ra ở một thời điểm khác.
Đó là khác biệt mang tính cấu trúc. Trong một chiếc ví một khóa, hạt giống yếu là mất trắng. Trong một 2-of-2, hạt giống yếu là một vấn đề nghiêm trọng nhưng tự nó chưa phải một mất mát.
Lời dè dặt, nói thẳng ra
Sẽ dễ nếu dừng ở đây và để bạn kết luận rằng SSP miễn nhiễm với chuyện này. Không phải vậy, và giả vờ ngược lại giữa lúc sự cố của người khác đang diễn ra thì đúng là thời điểm sai nhất.
Cả hai ứng dụng SSP dùng cùng một bản cài đặt BIP-39 — @scure/bip39, ghim cùng một phiên bản ở cả hai. Một khiếm khuyết trong chính thư viện ấy sẽ chạm tới cả hai khóa. Sự độc lập mà SSP cho bạn là thật nhưng cụ thể: hai hạt giống riêng, sinh ở những thời điểm khác nhau trên những thiết bị khác nhau, lấy entropy từ những nguồn hệ điều hành khác nhau — Web Crypto của trình duyệt ở một bên, CSPRNG của nền tảng di động ở bên kia. Đó không phải sự độc lập của hai nền mã hoàn toàn không liên quan.
Cái nó mua được là sự bảo vệ trước đúng kiểu hỏng đã thực sự xảy ra ở Coldcard: một lỗi cài đặt riêng của thiết bị trong cách một sản phẩm sinh hạt giống. Nó sẽ không bảo vệ trước một khiếm khuyết trong nguyên thủy mật mã dùng chung nằm dưới cả hai.
Đó là một tuyên bố yếu hơn hẳn "chuyện này không thể xảy ra với chúng tôi", và nó là tuyên bố đúng. Ai bảo bạn rằng ví của họ miễn nhiễm tuyệt đối với hỏng hóc entropy là đang nói với bạn về quảng cáo của họ, không phải về kiến trúc của họ.
Rút ra điều gì
Nếu bạn có một chiếc Coldcard trong cửa sổ firmware ấy, giả định an toàn duy nhất là hạt giống đã bị lộ, dù tiền đã dịch chuyển hay chưa. Hãy sinh hạt giống mới trên firmware đã vá và chuyển sang. Một thiết bị chưa bị rút cạn không phải một thiết bị an toàn.
Nếu bạn dùng bất kỳ ví một khóa nào, đó là rủi ro bạn đang mang, và nên ý thức về nó hơn là lo lắng. Ví cứng vẫn tốt hơn rất nhiều so với các lựa chọn khác với phần lớn mọi người. Bài học không phải là chúng tệ; bài học là một khóa duy nhất là một điểm hỏng duy nhất, và mọi phần trong lịch sử của chiếc khóa ấy — kể cả khoảnh khắc nó ra đời, nhiều năm trước, trong một firmware bạn chưa đọc — đều thuộc mô hình mối đe dọa của bạn.
Và nói chung, hãy ưu tiên những kiến trúc mà một thứ hỏng thôi thì chưa đủ. Nguyên tắc ấy là lý do SSP đòi hai thiết bị, lý do một số thao tác đòi ký lại ngay cả khi bạn đã xác thực, và lý do điều gì thực sự chặn được một giao dịch là câu hỏi đáng đặt ra cho bất cứ chiếc ví nào bạn tin cậy. Câu trả lời không bao giờ nên là "một bí mật, và hy vọng rằng nó đã được sinh ra tử tế".
Để so sánh rộng hơn các lựa chọn và điều mỗi lựa chọn thực sự bảo vệ, so sánh các lựa chọn tự lưu ký bàn về những đánh đổi.


