Tôi còn nhớ rõ cái ngày tháng 11 năm 2013, khi cơn sốt Bitcoin đầu tiên lan đến Việt Nam. Lúc đó, tôi đang làm việc tại một công ty bảo mật mạng nhỏ ở Seoul, nhưng trái tim tôi đã hướng về Sài Gòn. Một người bạn cũ, từng là kỹ sư tại Vietcombank, gọi điện cho tôi với giọng hoảng loạn: “Hương ơi, hệ thống thanh toán Bitcoin của tụi mình bị tấn công mất rồi!”
Đó là một hệ thống nhỏ, do một nhóm các nhà phát triển trẻ tuổi ở TP. Hồ Chí Minh xây dựng. Họ muốn tạo ra một cầu nối thanh toán xuyên biên giới giữa Việt Nam và Hàn Quốc, sử dụng Bitcoin như một loại tiền tệ trung gian. Ý tưởng thì rất tốt, nhưng bảo mật của họ lại thảm họa. Họ lưu trữ private key trên máy chủ web, và dùng một thư viện mã nguồn mở cũ kỹ cho ký giao dịch.
Vụ tấn công xảy ra vào lúc 2 giờ sáng giờ Việt Nam. Kẻ tấn công đã khai thác một lỗ hổng SQL injection trên trang web của họ, lấy được quyền truy cập vào cơ sở dữ liệu. Từ đó, hắn ta dễ dàng đọc được các private key được lưu trữ dưới dạng plaintext. Trong vòng 30 phút, hắn đã chuyển đi 50 Bitcoin (lúc đó trị giá khoảng 30.000 USD, một số tiền rất lớn với startup Việt Nam thời đó).
Sau vụ việc, tôi đã phân tích mã nguồn của hệ thống cho bạn tôi. Tôi phát hiện ra một lỗi nghiêm trọng hơn: họ đã tự implement thuật toán ký ECDSA từ đầu, và làm sai cách tạo số ngẫu nhiên k (nonce). Thay vì dùng một nguồn entropy mạnh, họ chỉ dùng hàm rand() của PHP với seed là thời gian hệ thống. Điều này có nghĩa là bất kỳ ai biết thời điểm tạo giao dịch đều có thể tái tạo lại nonce, và từ đó tính ra private key từ chữ ký.
Tôi giải thích điều này cho họ: "Nếu không phải vụ SQL injection, thì sau này cũng sẽ có người khác làm điều tương tự. Lỗi nonce lặp lại là một vấn đề kinh điển trong ECDSA, mà các bạn đã mắc phải vì không đọc tài liệu kỹ." Họ nhìn tôi với ánh mắt vừa ngưỡng mộ vừa thất vọng.
Vụ tấn công này đã để lại một bài học lớn cho cộng đồng blockchain non trẻ của Việt Nam thời điểm đó. Nó cho thấy rằng, trong thế giới tiền số, "tự làm" không phải lúc nào cũng tốt. Các giải pháp bảo mật tiêu chuẩn, như dùng thư viện ký đã được kiểm chứng, hay lưu trữ private key trong môi trường offline, là không thể thiếu.
Sau vụ việc, tôi đã giúp họ viết lại toàn bộ hệ thống từ đầu. Lần này, chúng tôi dùng thư viện ký chuẩn của Bitcoin core, và private key được lưu trữ trên một máy tính offline hoàn toàn, chỉ kết nối với mạng thông qua QR code. Hệ thống mới vận hành ổn định được thêm 2 năm nữa, trước khi bị đóng cửa vì thị trường Bitcoin lao dốc vào năm 2015.
Bài học rút ra: Sự an toàn của một hệ thống blockchain không chỉ nằm ở công nghệ, mà còn ở kỷ luật của đội ngũ phát triển. Một lỗi nhỏ trong implementation, như cách tạo nonce, có thể dẫn đến hậu quả khôn lường. Và trên hết, đừng bao giờ lưu trữ private key trên máy chủ web. Đó là một sai lầm chết người.