Lỗ hổng trong quá trình tạo chữ ký bằng khóa riêng ECDSA trên đường cong NIST P521 của công cụ PuTTY
- Tất cả các phiên bản từ PuTTY 0.68 đến 0.80 đều có một lỗ hổng nghiêm trọng trong đoạn mã tạo chữ ký từ khóa riêng ECDSA sử dụng đường cong NIST P521
- Xảy ra khi PuTTY hoặc Pageant tạo chữ ký từ khóa để xác thực với máy chủ SSH
- Lỗ hổng này được gán mã CVE-2024-31497
- Được phát hiện bởi Fabian Bäumer và Marcus Brinkmann của Ruhr University Bochum
Tác động của lỗ hổng
- Tác động của lỗ hổng này là làm lộ khóa riêng
- Nếu kẻ tấn công có vài chục thông điệp đã được ký và khóa công khai, chúng sẽ có đủ thông tin để khôi phục khóa riêng
- Từ đó có thể giả mạo chữ ký như thể là người dùng và đăng nhập vào mọi máy chủ sử dụng khóa đó
- Để có được các chữ ký này, kẻ tấn công chỉ cần tạm thời xâm nhập máy chủ mà khóa dùng để xác thực, hoặc chỉ cần có quyền truy cập ngắn hạn vào bản sao Pageant đang giữ khóa
- Tuy nhiên, các chữ ký này không bị lộ với kẻ nghe lén thụ động trên kết nối SSH
- Nếu đang có loại khóa này, nên thu hồi ngay lập tức
- Cần xóa khóa công khai cũ khỏi mọi tệp OpenSSH
authorized_keys và các tệp tương tự trên những máy chủ SSH khác để chữ ký từ khóa đã bị xâm phạm không còn giá trị
- Sau đó tạo cặp khóa mới để thay thế
Loại khóa bị ảnh hưởng
- Loại khóa duy nhất bị ảnh hưởng là ECDSA 521 bit
- Trên PuTTYgen cho Windows, nếu phần đầu của ô 'Key fingerprint' hiển thị
ecdsa-sha2-nistp521, hoặc khi được nạp vào Pageant trên Windows được mô tả là 'NIST p521', hoặc khóa có ID bắt đầu bằng ecdsa-sha2-nistp521 trong giao thức SSH hoặc trong tệp khóa
- Các kích thước ECDSA khác và các thuật toán khóa khác không bị ảnh hưởng
- Đặc biệt, Ed25519 không bị ảnh hưởng
Chi tiết lỗi
- Mọi hệ thống chữ ký DSA đều phải tạo ra một giá trị ngẫu nhiên trong quá trình ký
- Giá trị này được gọi là
nonce (thuật ngữ mật mã chỉ giá trị chỉ dùng một lần) hoặc bằng chữ cái k
- Đã biết rõ rằng nếu kẻ tấn công đoán được giá trị k đã dùng, hoặc tìm được hai chữ ký được tạo bằng cùng một k, thì chúng có thể lập tức khôi phục khóa riêng
- Vì vậy, việc tạo chữ ký DSA trên hệ thống không có nguồn ngẫu nhiên chất lượng cao là rất rủi ro
- Vì PuTTY được phát triển trên Windows nên ban đầu không hề có bộ sinh số ngẫu nhiên mật mã
- Do đó, PuTTY đã dùng một phương pháp xác định để tạo k thay vì dùng số ngẫu nhiên
- Kỹ thuật cốt lõi là tính một hàm băm bảo mật với đầu vào bao gồm cả thông điệp cần ký và khóa riêng
- Kỹ thuật này hiện đã trở thành chủ đạo, và RFC 6979 mô tả một phương pháp cụ thể, nổi tiếng để thực hiện điều đó
- Tuy nhiên, PuTTY đã làm điều tương tự từ năm 2001 và RFC chỉ được công bố vào năm 2013, nên nó không tuân theo đặc tả đó
Nguyên nhân phát sinh lỗ hổng
- Kỹ thuật của PuTTY hoạt động bằng cách tạo ra hàm băm SHA-512 rồi rút gọn theo modulo q, là bậc của nhóm được dùng trong hệ DSA
- Trong mọi trường hợp ngoài P521, độ lệch phát sinh từ việc giảm một số 512 bit theo modulo q là nhỏ đến mức có thể bỏ qua
- Nhưng với P521, q là 521 bit (tức lớn hơn hoặc bằng 512 bit), nên việc giảm một số 512 bit theo modulo q hoàn toàn không có tác dụng
- Kết quả là thu được giá trị k mà 9 bit cao nhất luôn bằng 0
- Chính độ lệch này khiến tấn công khôi phục khóa trở nên khả thi
Nội dung bản vá lỗ hổng
- Để khắc phục lỗ hổng này, PuTTY đã loại bỏ hoàn toàn hệ thống tạo k cũ cho mọi loại khóa DSA và ECDSA, chuyển sang kỹ thuật RFC 6979
- Các khóa EdDSA như Ed25519 vốn đã dùng hệ thống khác nên không thay đổi
- Tuy nhiên, điều này không làm thay đổi thực tế rằng thông tin về các khóa riêng P521 hiện có đã bị rò rỉ mỗi khi chữ ký được tạo bằng bộ sinh k cũ
Ý kiến của GN⁺
- Đây là lỗ hổng được phát hiện tương đối gần đây, nhưng có vẻ bắt nguồn từ vấn đề của cách làm đã được dùng từ năm 2001. Có thể xem đây là ví dụ cho thấy rủi ro của một cách triển khai tùy biến ngay từ đầu đã không tuân theo tiêu chuẩn.
- Lỗ hổng lần này chỉ ảnh hưởng đến một loại khóa cụ thể, nhưng nếu đã từng sử dụng loại khóa đó thì có thể trở thành vấn đề nghiêm trọng, vì vậy việc thu hồi ngay các khóa bị ảnh hưởng là rất quan trọng.
- Trong các dự án mã nguồn mở, những phần liên quan đến mật mã dường như cần tuân theo tiêu chuẩn và cũng cần được kiểm chứng từ bên ngoài. Đặc biệt, phần tạo số ngẫu nhiên là rất quan trọng nên sẽ an toàn hơn nếu phụ thuộc vào hệ điều hành hoặc thư viện đã được kiểm chứng.
- PuTTY là trình giả lập terminal mã nguồn mở được dùng rộng rãi, hỗ trợ các giao thức SSH, Telnet, Rlogin và được sử dụng thuận tiện nhờ tính năng lưu thông tin kết nối. Có vẻ sẽ cần chủ động phản ứng với các bản vá lỗ hổng trong thời gian tới.
- Trên macOS hoặc Linux, các terminal có thể dùng thay cho PuTTY gồm ứng dụng terminal mặc định hoặc iTerm2. Trên Windows, có thể cân nhắc các lựa chọn thay thế như Windows Terminal, PowerShell, Cmder.
4 bình luận
À..
Có vẻ tôi chưa từng dùng loại khóa này, nhưng trước mắt tôi đã cập nhật rồi.
Xem cái này xong là mình cập nhật ngay lên 0.81 luôn hehe
Ý kiến Hacker News
Dưới đây là phần tóm tắt các bình luận trên Hacker News:
kcũng phải là số ngẫu nhiên 521 bit, nhưng PuTTY chỉ dùng ngẫu nhiên 512 bit nên 9 bit cao bị điền bằng 0. Điều này có thể dẫn tới lộ khóa riêng thông qua đại số tuyến tính.q. Việc cắt đúng số bit cần dùng, hoặc băm riêng thông điệp và khóa riêng rồi kết hợp lại, có vẻ hợp lý hơn.