Cùng một lỗi, hai kết cục: Telestai, Ravencoin và điều một nhánh rẽ thừa hưởng

·7 phút đọc·Bởi SSP Editorial Team
Ảnh bìa SSP Academy: Telestai, Ravencoin và điều một nhánh rẽ thừa hưởng

Cùng một lỗi, hai kết cục: Telestai, Ravencoin và điều một nhánh rẽ thừa hưởng

Hôm qua chúng tôi viết về lỗi đồng thuận của Ravencoin — một trường nHeight không được kiểm tra trong tiêu đề khối, cho phép giả mạo bằng chứng công việc, cùng cuộc tổ chức lại chuỗi sâu ba ngày cần có để gỡ bỏ nó.

Câu chuyện ấy có nửa sau, và nửa sau mới là phần hữu ích hơn. Một chuỗi khác mang đúng lỗi ấy ở đúng chỗ ấy. Nó chưa bao giờ bị khai thác.

Khác biệt giữa hai kết cục đáng để hiểu, bởi đó không phải khác biệt nằm ở mã nguồn.

Telestai thừa hưởng khiếm khuyết, vì các nhánh rẽ vốn vậy

Telestai là một nhánh rẽ của Ravencoin. Mã nguồn của nó bắt nguồn từ Ravencoin, đi qua Meowcoin — ghi chú phát hành của Telestai Core 3.0.1 vẫn liệt kê một hạng mục «dọn sạch mã nguồn Meowcoin» trong phần dọn dẹp, cho thấy dòng dõi ấy mới hiện diện trong cây mã nguồn gần đến mức nào.

Việc kiểm tra tiêu đề của Ravencoin không đối chiếu giá trị nHeight được khai báo với vị trí thật của khối trong chuỗi. Meowcoin cũng không. Telestai cũng không. Không ai đưa lỗi ấy vào Telestai; nó đến cùng với mọi thứ khác, theo đúng cái cách một nhánh rẽ thừa hưởng cả những phần mã nguồn không ai nhìn tới lẫn những phần có người nhìn.

Đây là cơ chế chẳng có gì hào nhoáng, qua đó một khiếm khuyết duy nhất trở thành vấn đề của nhiều chuỗi. Nhánh rẽ không phải bản sao trôi dần tới độc lập. Chúng là bản sao mang theo toàn bộ lịch sử giả định của gốc — trong trường hợp này, gồm cả giả định rằng ai đó đã kiểm tra trường ấy rồi.

Telestai đã làm gì với hai ngày báo trước

Vụ khai thác của Ravencoin được công bố ngày 11 tháng 8 năm 2026. Telestai Core 2.1.8 phát hành ngày 13 tháng 8, tiêu đề nói thẳng: «Security: KAWPOW nHeight bind».

Ghi chú phát hành không rào đón:

Bản phát hành này sửa một vấn đề đồng thuận/DoS của KAWPOW, trong đó trường tiêu đề nHeight (dùng để chọn kỷ nguyên ethash) không được ràng buộc với chuỗi. Cùng lớp lỗi này đã bị khai thác trên mạng chính của Ravencoin. Các nút Telestai chạy phiên bản cũ vẫn phơi nhiễm cho tới khi nâng cấp.

Bản vá tự nó có nhiều lớp, và chính sự phân lớp mới là phần thú vị:

  • Một giới hạn kỷ nguyên tuyệt đối được áp dụng ngay lập tức, trước khi có bất kỳ phép băm bằng chứng công việc nào diễn ra.
  • Ràng buộc nghiêm ngặt height == prev + 1 kích hoạt ở khối 1.100.000 — theo kiểu nhánh rẽ mềm, không viết lại lịch sử.
  • Bằng chứng công việc chỉ được tính sau khi đã tìm ra khối cha và xác minh độ cao, điều này bịt một lối làm cạn bộ nhớ, nơi một nút có thể bị dụ làm công việc tốn kém trên một tiêu đề lẽ ra phải bị từ chối ngay.
  • Cùng những phép kiểm tra ấy áp dụng trong ConnectBlock và VerifyDB, để một nút đang lập chỉ mục lại cơ sở dữ liệu không lặng lẽ chấp nhận lại những gì luật mới cấm.

Mạng chính ở khoảng độ cao 1.057.000 khi 2.1.8 xuất hiện. Mốc thi hành được đặt ở 1.100.000. Khoảng cách ấy — chừng 43.000 khối — là có chủ ý: đủ đường băng để các sàn, nhóm đào, trình duyệt chuỗi và người vận hành nút nâng cấp trước khi luật bật lên, và không nhiều tới mức để cửa sổ mở vô thời hạn.

Telestai cũng ghi nhận nguồn. Ghi chú trỏ tới 2miners/Ravencoin, nhánh rvn-nheight-fix — chính bản vá ra đời từ sự cố Ravencoin — và cảm ơn những nhà nghiên cứu đã ghi chép bản sửa đầy đủ hơn cho khâu chấp nhận tiêu đề. Thuốc chữa đi theo đúng con đường mà con lỗi đã đi.

Hai kết cục, đặt cạnh nhau

Hai chuỗi. Một di sản mã nguồn. Một khiếm khuyết tiềm ẩn y hệt.

Của Ravencoin bị kẻ tấn công tìm ra trước. Kết quả là bốn ngày khối giả trước khi công bố, các sàn ngừng nạp rút, giá rớt khoảng 20%, và một cuộc tổ chức lại ba ngày để gỡ nhánh nhiễm độc.

Của Telestai được tìm ra bằng cách đọc báo cáo sự cố của người khác. Kết quả là bản vá hai ngày sau đó, một mốc kích hoạt đặt dư dả, và — vì chẳng có lịch sử không hợp lệ nào phải gỡ — không hề có tổ chức lại. Không gì bị đảo ngược, bởi chẳng có gì cần đảo.

Toàn bộ khác biệt là ở đó. Không phải mã nguồn tốt hơn. Không phải lỗi khác. Chỉ là ai nhận ra trước, và những người bảo trì chuỗi hành động nhanh đến đâu dựa trên tuần lễ tồi tệ của kẻ khác.

Rồi Telestai đổi hẳn thuật toán

Sáu ngày sau bản vá bảo mật, Telestai phát hành Core 3.0.0, tách nhánh tại khối 1.150.000 — quãng 16 tháng 10 năm 2026 — sang Meraki, thuật toán bằng chứng công việc của riêng họ. Meraki vẫn là bà con của KAWPOW (một dẫn xuất Ethash pha hương ProgPoW, và phần mềm đào khởi đầu như một nhánh rẽ của kawpowminer), được giới thiệu là tốn ít điện hơn và với tới được bằng card đồ họa khiêm tốn.

Cần cẩn thận với quan hệ nhân quả ở đây, bởi vạch một đường thẳng thì rất hấp dẫn mà đường ấy lại không thẳng. Meraki đã chạy từ trước tháng Tám: các bản dựng chạy thử trên mạng thử nghiệm cho 3.0.0 được công bố ngày 13 và 14 tháng 8, đúng những ngày ra bản vá bảo mật, và đó không phải lịch trình ai đó ráp lại trong bốn mươi tám giờ. Việc đổi thuật toán là phần việc đã hoạch định, tình cờ hạ cánh cạnh một sự cố, chứ không phải phản ứng với nó.

Danh sách phát hành còn chứa một bài học nhỏ về những phần chẳng hào nhoáng của việc bảo trì một chuỗi. Giữa bản vá bảo mật và cuộc tách nhánh, Telestai phát hành 2.1.9 vì một lý do chẳng liên quan gì tới đồng thuận: 2.1.8 được dựng trên một Berkeley DB mới hơn, và mở một tệp wallet.dat cũ bằng nó có thể viết lại nhật ký ví tới mức các phần mềm cũ hơn không còn đọc nổi tệp. Thế là họ dựng lại trên Berkeley DB 4.8 rồi phát hành lần nữa. Một bản phát hành bảo mật chẳng ích gì mấy nếu việc nâng cấp lên nó đặt tệp ví của người dùng vào rủi ro.

Vì sao điều này quan trọng vượt ra ngoài hai chuỗi nhỏ

Phần lớn người đọc bài này không nắm giữ RVN lẫn TLS. Thứ khái quát hóa được là cái khuôn mẫu.

Các chuỗi rẽ nhánh dùng chung một bề mặt lỗi, và gần như không ai theo dõi nó. Litecoin, Dogecoin, Bitcoin Cash, Ravencoin, Zcash cùng hàng chục chuỗi khác đều bắt nguồn từ Bitcoin Core, và mỗi chuỗi mang một điểm phân kỳ, sau điểm ấy các bản sửa từ thượng nguồn thôi tự động chảy về. Một lỗ hổng công bố ở một chuỗi là câu hỏi còn để ngỏ cho mọi chuỗi nằm dưới cùng dòng mã — và nhánh rẽ càng trôi xa thì chỉ riêng việc biết bản sửa có áp dụng được hay không đã tốn công đến đâu. Telestai trả lời câu hỏi ấy trong hai ngày. Không phải nhánh rẽ nào cũng có người mà đó là việc của họ.

«Chưa ai khai thác» không đồng nghĩa với «nó không có ở đó». Phần mềm nút của Telestai đã dễ tổn thương suốt cả quãng đời của nó. Lỗi ấy thật suốt thời gian đó; chỉ có sự chú ý là mới. Những chuỗi chưa bao giờ nhận được báo cáo sự cố từ một chuỗi anh em thì không biết được theo con đường này.

Một bản sửa tới trước vụ khai thác gần như chẳng tốn gì. Cũng bản sửa ấy tới sau thì tốn một cuộc tổ chức lại. Phần việc kỹ thuật trong Telestai 2.1.8 và trong cuộc tách nhánh cứng của Ravencoin đại thể là cùng một bản vá. Khác nhau là mọi thứ xung quanh: có lịch sử không hợp lệ phải bỏ đi hay không, các sàn có phải dừng hay không, các xác nhận của người dùng có nghĩa lý gì trong ba ngày hay không.

Đây cũng là lối lập luận đằng sau các bản dựng tái lập được và việc soi xét phụ thuộc: hầu hết những gì bảo vệ bạn đều nằm ở thượng nguồn của mọi thứ bạn có thể thấy từ trong một chiếc ví, và được duy trì bởi những người đang để mắt thay cho bạn.

Điều này có nghĩa gì trong SSP

Trên thực tế: với bạn chẳng có gì thay đổi.

SSP hỗ trợ Ravencoin, và nút của chúng tôi chạy 4.8.0 trên chuỗi đã phục hồi — trong bài hôm qua chúng tôi đã đối chiếu giá trị băm của các khối ở hai phía cuộc tổ chức lại với chuỗi tham chiếu. SSP không hỗ trợ Telestai, nên trong ví bạn không có số dư Telestai nào để phải lo.

Chúng tôi viết về một chuỗi mình không hỗ trợ vì câu chuyện ấy minh họa gọn ghẽ một điều mà chúng tôi thì có coi trọng. Vận hành hạ tầng nút nghĩa là theo dõi công việc bảo mật ở thượng nguồn cho mọi chuỗi mình mang theo, kể cả những chuỗi có mã nguồn chung tổ tiên. Giá trị của việc đó hoàn toàn vô hình khi nó vận hành trơn tru: một nút đã vá trông y hệt một nút chưa vá, cho tới đúng cái ngày nó không còn thế.

Tháng Tám của Telestai chính là hình dạng của điều đó nhìn từ bên trong: một người bảo trì đọc về vụ khai thác của kẻ khác, nhận ra hình dạng ấy trong cây mã nguồn của mình, rồi phát hành. Không sự cố, không tổ chức lại, không thông báo nào mà người bên ngoài sẽ nhớ. Chỉ là một con số phiên bản nhích lên.

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

Bài viết liên quan