4 điểm bởi GN⁺ 2024-04-16 | 4 bình luận | Chia sẻ qua WhatsApp

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

 
tominam2 2024-04-16

À..

 
kuroneko 2024-04-16

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.

 
dlehals2 2024-04-16

Xem cái này xong là mình cập nhật ngay lên 0.81 luôn hehe

 
GN⁺ 2024-04-16
Ý kiến Hacker News

Dưới đây là phần tóm tắt các bình luận trên Hacker News:

  • Một lỗ hổng đã được phát hiện trong cách PuTTY tạo khóa ECDSA P-521. Khi dùng mô-đun 521 bit thì giá trị k cũ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.
  • Nhiều người đánh giá cao cách công bố lỗ hổng thẳng thắn và rõ ràng của nhà phát triển PuTTY, Simon Tatham. Ông truyền đạt sự việc đúng như bản chất, không bào chữa hay giảm nhẹ.
  • Phần giải thích bối cảnh về việc lỗ hổng được phát hiện như thế nào còn thiếu.
  • Windows mới hiện đã tích hợp sẵn OpenSSH, nên không nhất thiết phải tiếp tục dùng PuTTY nữa. Tuy vậy, vẫn có nhiều người tiếp tục dùng vì thói quen hoặc quán tính.
  • Có lẽ không nhiều người đã chọn kiểu khóa này thay vì dùng thiết lập mặc định.
  • Nếu đang dùng khóa máy chủ P521, có thể sẽ cần thay khóa sau khi nâng cấp client.
  • Có ý kiến cho rằng đáng để cân nhắc chuyển sang EdDSA, vì không cần RNG hay phép toán modulo.
  • Có người muộn màng mới nhận ra cái tên PuTTY bắt nguồn từ "putty", vật liệu dùng để cố định kính cửa sổ.
  • Có người không hiểu vì sao PuTTY lại lấy kết quả băm SHA-512 rồi thực hiện phép modulo theo 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.
  • Có người tò mò về nguyên lý vì sao nếu dùng số có 9 bit cao bằng 0 thay vì số ngẫu nhiên 521 bit, thì sau 60 lần ký chữ ký có thể làm lộ khóa riêng.