Hook
Khi tôi dùng mật mã để mở khóa vụ ICO lừa đảo năm 2017, tôi học được rằng kẻ tấn công không cần thông minh; chúng chỉ cần kiên nhẫn. Sáng nay, Galaxy Research công bố một báo cáo khiến tôi nhớ lại bài học đó một cách cay đắng: hơn 7.300 ví Coldcard đã bị rút sạch, tổng thiệt hại vượt 130 triệu USD. Không phải phishing. Không phải mật khẩu yếu. Không phải người dùng ký giao dịch độc hại. Mà vì một lỗi firmware nhỏ ở tầng tạo seed: chiếc ví lạnh được cộng đồng Bitcoin tôn sùng nhất đã âm thầm dùng một bộ sinh số giả ngẫu nhiên, hay PRNG, để tạo ra các khóa riêng tư chỉ có 40 đến 72 bit entropy. Khi tôi đọc chi tiết này, tôi không khỏi rùng mình, không phải vì hacker tinh vi, mà vì lỗ hổng này quá tầm thường đến mức nó có thể nằm trong bất kỳ sản phẩm hardware wallet nào.
Context
Để hiểu vì sao sự kiện này quan trọng, phải hiểu Coldcard đang đứng ở đâu trong hệ sinh thái tiền mã hóa. Coinkite, công ty Canada đằng sau Coldcard, xây dựng thương hiệu trên sự khắc khổ và cực đoan. Coldcard là một hardware wallet thiết kế tối giản, không Bluetooth, không kết nối không dây, tất cả đều phải thao tác tay. Những người nắm Bitcoin lâu năm, những người coi self-custody là tín điều, thường chọn Coldcard thay vì Ledger hay Trezor. Họ chấp nhận sự bất tiện để đổi lấy một tiêu chuẩn bảo mật cao hơn. Hôm nay, tiêu chuẩn đó vỡ vụn.
Khi một sản phẩm như vậy sụp đổ, sự sụp đổ không chỉ nằm ở mã nguồn; nó chạm vào triết lý của toàn bộ phong trào tự lưu trữ. Nếu một công ty bán chữ paranoid, một công ty dạy người dùng cách cô lập tiền khỏi internet, cũng có thể tạo khóa với nguồn ngẫu nhiên yếu, thì niềm tin vào toàn bộ lớp hạ tầng ví lạnh cần phải được viết lại.
Core
Trước hết, nhìn vào con số. Galaxy Research ghi nhận 73 nạn nhân báo cáo. Hơn 7.300 ví non-empty được cho là có thể bị ảnh hưởng. Tổng thiệt hại ước tính hơn 130 triệu USD. Số attacker đã lên tới 15 và vẫn tăng. Nói cách khác, một vụ rò rỉ entropy đã trở thành một chiến dịch khai thác quy mô mở, với nhiều đội tham gia. Họ không cần xin phép ai, không cần tài trợ, và không cần thông tin nội bộ. Họ chỉ cần quét chuỗi.
Điều khiến tôi khó chịu nhất: root cause không nằm ở secure element, mà nằm ở phần mềm chạy phía trên nó. Coldcard dùng firmware dựa trên MicroPython. Khi tạo seed, firmware phải lấy entropy từ bộ tạo số ngẫu nhiên thực sự, thường gọi là TRNG, của chip bảo mật. Nhưng trong một nhánh lỗi, firmware đã quay sang dùng PRNG của thư viện MicroPython. Hệ quả: không gian khóa bị thu hẹp từ 2 mũ 128 xuống 2 mũ 40 trên Mk2 và Mk3, và tối đa 2 mũ 72 trên Mk4. Con số này là thảm họa.
Hãy tưởng tượng 2 mũ 40 là khoảng một nghìn tỷ. Nghe có vẻ lớn, nhưng trong đồ thị tấn công hiện đại, một nghìn tỷ phép thử là một bài tập cuối tuần với GPU, hoặc vài giờ với một máy chủ đám mây. Còn 2 mũ 72 là khoảng 4,7 tỷ tỷ; lớn hơn nhiều, nhưng vẫn nằm trong tầm của một tổ chức hoặc một nhóm attacker phối hợp. Đối với một hardware wallet, ngưỡng an toàn phải là 128 bit hoặc hơn. Khi thiết bị tạo seed bằng PRNG yếu, mật mã bị hạ xuống thành mật khẩu ngắn.
Dựa trên kinh nghiệm audit của tôi, mỗi lần một sản phẩm bảo mật có nhánh fallback phần mềm, tôi đều lập tức xếp nó vào danh sách nghi ngờ. Fallback là nơi các giả định bảo mật chết. Với Coldcard, fallback đã khiến một thiết bị được thiết kế để chống lại những kẻ tấn công có nguồn lực lớn trở thành mục tiêu của bất kỳ ai có chút kỹ năng.
Quy trình tấn công không cần phá khóa, không cần đo điện áp, không cần can thiệp vật lý. Bước một, kẻ tấn công tải về danh sách các địa chỉ Bitcoin có số dư. Bước hai, họ sinh lần lượt các seed ứng viên trong không gian 40-bit. Bước ba, họ dẫn xuất địa chỉ theo BIP39 và BIP32, rồi so sánh với danh sách trên. Nếu trùng hợp, họ rút tiền. Bước bốn, họ lặp lại. Vì Bitcoin là một sổ cái công khai, toàn bộ dữ liệu cần thiết đều miễn phí. Vì các seed yếu đều có trong một không gian hữu hạn, việc tìm kiếm có thể song song hóa hoàn hảo. Không có gì ngăn cản một người dùng bình thường làm điều này.
Khi tôi dùng mật mã để mở khóa vụ ICO lừa đảo, tôi từng phải viết một công cụ brute-force để chứng minh một smart contract yếu đến mức nào. Bài học tôi mang theo suốt tám năm làm biên tập viên: entropy thấp không phải là một chi tiết; nó là thứ duy nhất tách biệt chuyện không thể bị hack và chuyện bị hack trong tích tắc.
Coinkite đã không chối bỏ. Thay vào đó, họ thừa nhận lỗi, công khai xin lỗi và phát hành hotfix cho tất cả các dòng sản phẩm bị ảnh hưởng: Mk2, Mk3 và Mk4. Đồng sáng lập Rodolfo Novak đã đích thân lên tiếng. Họ cũng gửi cảnh báo rằng mối đe dọa vẫn đang hoạt động. Đây là cách xử lý khủng hoảng chuẩn mực về mặt quan hệ công chúng. Nhưng xử lý khủng hoảng không sửa được mật mã.
Phần dễ gây hiểu lầm nhất nằm ở cụm từ hotfix. Nhiều người dùng có thể nghĩ rằng chỉ cần cập nhật firmware là mọi thứ trở lại bình thường. Không. Coinkite nói rõ: cập nhật firmware không thể sửa chữa seed đã được tạo bởi firmware cũ. Nếu bạn đã tạo một seed bằng bản firmware lỗi, seed đó mãi mãi nằm trong không gian entropy nhỏ. Không có bản vá nào có thể thêm entropy vào một seed đã tồn tại. Cách duy nhất là tạo seed mới trên một thiết bị đã được cập nhật, rồi chuyển toàn bộ tiền sang địa chỉ mới. Nếu bạn chưa chuyển, bạn vẫn đang ngồi trên một quả bom.
Vụ việc này không chỉ là một lỗi của Coinkite. Nó đặt dấu hỏi lên toàn bộ ngành hardware wallet. Ví lạnh được bán với lời hứa bảo vệ chống hack từ xa, chống phần mềm độc hại, chống cả việc máy tính bị xâm nhập. Nhưng nếu chính quá trình tạo khóa lại dựa trên một PRNG yếu, thì mọi lời hứa khác trở nên vô nghĩa. Bạn có thể xây một bức tường thành dày mười mét, nhưng nếu chiếc chìa khóa chỉ có sáu ký tự, thì bức tường chỉ là đồ trang trí.
Ở góc độ thị trường, 130 triệu USD là một con số đáng chú ý nhưng không đủ để làm rung chuyển Bitcoin. Vào thời điểm các báo cáo được công bố, 90 phần trăm số BTC bị đánh cắp vẫn ở trong tay hacker. Điều đó có nghĩa là áp lực bán chưa xuất hiện. Nhưng nó cũng có nghĩa là hacker đang nắm một lựa chọn bán, một vị thế chờ thanh khoản tốt hơn, hoặc chờ các kênh rửa tiền sẵn sàng. Trong mọi trường hợp, các sàn giao dịch nên theo dõi các địa chỉ đã được dán nhãn.
Những đối thủ như Ledger, Trezor hay Blockstream Jade có thể hưởng lợi từ làn sóng rời bỏ Coldcard. Nhưng họ không nên vội ăn mừng. Niềm tin của người dùng vào toàn bộ khái niệm ví lạnh đã bị xói mòn. Một khi công chúng phát hiện ra rằng một thương hiệu được coi là khắc khổ nhất cũng có thể dùng PRNG yếu, họ sẽ bắt đầu đặt câu hỏi về những thương hiệu còn lại. Câu hỏi đúng không phải là Coldcard có an toàn không; câu hỏi đúng là làm sao để người dùng tự kiểm chứng được nguồn entropy trước khi đưa tiền vào.
Một chi tiết quan trọng khác: multisig không phải là lá chắn trước entropy yếu. Nếu tất cả các khóa trong một ví multisig đều được tạo trên cùng một loại thiết bị bị lỗi entropy, thì kẻ tấn công không cần phá 2 trong 3 khóa; chúng chỉ cần quét toàn bộ không gian seed nhỏ của từng thiết bị. Tương tự, passphrase BIP39 cũng không cứu được seed yếu. Passphrase chỉ thêm một lớp bảo mật nếu seed có đủ entropy. Nếu seed chỉ có 40 bit, passphrase dù dài cũng không thể mở rộng không gian khóa; nó chỉ khiến quá trình brute-force phải thử thêm một giá trị, nhưng tổng không gian vẫn nằm trong tầm kiểm soát của kẻ tấn công. Đây là một hiểu lầm chết người.
Báo cáo dựa trên số liệu từ 73 nạn nhân tự báo cáo. Những người nắm giữ Bitcoin lâu năm thường không kê khai tài sản. Họ có thể không biết mình bị ảnh hưởng, hoặc không muốn thừa nhận. Vì vậy, con số 7.300 ví non-empty có thể là phần nổi của tảng băng. Có nhiều ví được tạo bằng Coldcard Mk2 hoặc Mk3 từ 2019 đến 2021, đã chuyển tiền đi nhưng seed vẫn nằm trong không gian entropy yếu. Nếu họ nạp tiền vào đó lần nữa, họ sẽ bị cuốn vào vòng xoáy. Vụ việc không kết thúc ngay khi bản vá được phát hành; nó kết thúc khi tất cả seed yếu trên toàn thế giới bị vô hiệu hóa.
Các cơ quan thực thi pháp luật ở nhiều quốc gia đã vào cuộc, và nạn nhân được khuyến khích trình báo. Về mặt pháp lý, đây là hành vi trộm cắp tài sản, dù tài sản là một chuỗi chữ ký số. Nếu hacker cố gắng đưa tiền vào các sàn giao dịch có KYC, dòng tiền có thể bị đóng băng. Nhưng nếu họ dùng coinjoin, chuỗi hoán đổi nguyên tử hoặc các cầu nối xuyên chuỗi, khả năng truy vết sẽ giảm mạnh. Vụ việc cũng có thể khiến các nhà quản lý siết chặt tiêu chuẩn an toàn cho thiết bị lưu trữ tài sản số, từ quy trình kiểm tra entropy đến nghĩa vụ công bố báo cáo bảo mật.
Tuy nhiên, vẫn còn nhiều điểm mù. Chúng ta chưa biết chính xác dòng firmware nào, từ phiên bản nào, bắt đầu rơi vào nhánh PRNG. Chúng ta chưa biết liệu lỗi này có liên quan đến một chuỗi thao tác khởi tạo cụ thể hay không. Chúng ta cũng chưa biết liệu hotfix có thực sự ngăn chặn mọi fallback tương tự hay không. Nếu không có một cuộc audit độc lập, lời xin lỗi của Coinkite vẫn chỉ là lời nói.
Contrarian
Bây giờ đến phần tôi muốn nói riêng: Đây không phải một vụ hack ví lạnh. Đây là một vụ tự bắn vào chân mình của cả ngành bảo mật. Coinkite chỉ là cái tên bị bắt quả tang. Trong nhiều năm, cộng đồng tiền mã hóa đã dán nhãn self-custody lên mọi thứ, như thể chỉ cần không giao khóa cho sàn là mọi chuyện sẽ ổn. Nhưng tự lưu trữ không phải một biểu tượng; nó là một chuỗi các quyết định kỹ thuật. Nếu một quyết định sai, toàn bộ chuỗi sụp đổ.
Thị trường tăng giá càng làm cho vấn đề trở nên mù mờ. Khi giá tăng, người ta mua hardware wallet theo phong trào, tin vào khẩu hiệu air-gapped, open-source, secure element. Họ không đọc mã nguồn. Họ không kiểm tra xem random generator được gọi từ đâu. Họ không hỏi nhà sản xuất rằng liệu có một nhánh fallback phần mềm nào có thể hạ entropy xuống 40 bit. Trong khi đó, các nhà nghiên cứu như Galaxy chỉ cần nhìn vào một dòng code là cảnh báo. Đó là khoảng cách giữa marketing và mật mã.
Kẻ tấn công trong vụ này không phải thiên tài. Họ là những kẻ cơ hội biết đọc báo cáo bảo mật. Khi một lỗ hổng entropy được công bố, bất kỳ ai có kỹ năng lập trình cơ bản đều có thể tham gia. Số 15 attacker chỉ là bước khởi đầu. Nếu hôm nay có 15, tuần sau có thể là 50, tháng sau có thể là hàng trăm bot tự động quét chuỗi. Vì vậy, nói rằng chỉ có 73 nạn nhân báo cáo là một cách nhìn thiển cận. Con số thực tế có thể cao hơn nhiều, và nó sẽ tiếp tục tăng theo thời gian khi những người dùng cũ mở thiết bị của họ ra.
Hầu hết các chương trình đánh giá bảo mật hardware wallet tập trung vào việc trích xuất khóa từ thiết bị sau khi nó bị đánh cắp, hay thao túng giao dịch, hoặc tấn công kênh phụ. Hiếm khi họ kiểm tra phân phối thống kê của những seed mà firmware tạo ra trong điều kiện bình thường. Vì entropy yếu không gây ra lỗi nhìn thấy được, nó có thể tồn tại trong nhiều năm mà không bị phát hiện. Coldcard là lời cảnh tỉnh: cần phải kiểm tra từng nhánh khởi tạo, đặc biệt là nhánh fallback.
Khi tôi dùng mật mã để mở khóa vụ ICO lừa đảo, tôi nhận ra rằng các lỗ hổng nghiêm trọng nhất không bao giờ nằm ở những thuật toán phức tạp; chúng nằm ở những lối tắt đầy thiện chí. Một nhà phát triển có thể nghĩ rằng chỉ cần gọi hàm random là đủ, rằng xác suất trùng lặp là rất thấp. Nhưng mật mã không xây trên cảm giác; mật mã xây trên số bit bất định thực sự. Khi số bit đó tụt xuống dưới 80, bạn không còn ở trong lãnh thổ bảo mật; bạn đang ở trong lãnh thổ xổ số.
Takeaway
Nếu bạn đang dùng Coldcard, đừng chỉ cập nhật firmware rồi tiếp tục cuộc sống. Hãy tạo một seed mới bằng firmware đã vá. Hãy chuyển toàn bộ BTC từ địa chỉ cũ sang địa chỉ mới. Hãy đánh dấu seed cũ là đã chết. Nếu bạn không làm điều đó, bạn đang trả tiền để giữ một quả bom trong két sắt.
Trong dài hạn, hãy hỏi nhà sản xuất của bạn: nguồn entropy được lấy từ đâu? Có báo cáo audit độc lập cho quá trình tạo seed không? Có cơ chế nào để thiết bị từ chối hoạt động nếu TRNG bị lỗi không? Nếu họ không trả lời, hãy coi đó là câu trả lời.
Không có bảo mật tuyệt đối. Chỉ có entropy đủ lớn và bằng chứng rằng entropy đó không thể bị bỏ qua. Phần còn lại là marketing. Và trong một thị trường tăng giá, marketing luôn nói to hơn mật mã, cho đến khi một quả bom 130 triệu USD phát nổ ngay giữa cộng đồng tự lưu trữ.


