Tiếng Việt

Công cụ dành cho nhà phát triển · Bộ giải mã JWT

Cuộc tấn công alg:none và sự nhầm lẫn về khóa: Tại sao người xác minh phải ghim thuật toán

· Tại sao nó quan trọng

jwt bảo vệ mật mã

Nhãn thuật toán không đáng tin cậy bị chặn thay đổi chính sách xác minh
Hình minh họa vector ToolAcre gốc

Nếu người xác minh cho phép mã thông báo chọn thuật toán riêng của mình thì kẻ tấn công có thể không chọn thuật toán nào hoặc hoán đổi RSA lấy HMAC. Bài đăng này giải thích cả các cuộc tấn công và quy tắc ngăn chặn chúng.

Mã thông báo tự xác minh - cách trường tiêu đề trở thành bề mặt tấn công

Nhãn thuật toán nằm bên trong đầu vào mã thông báo do kẻ tấn công kiểm soát. Nếu người xác minh coi nhãn đó là quyền để chọn bất kỳ chế độ xác thực có sẵn nào thì mã thông báo sẽ bắt đầu ảnh hưởng đến quy tắc được sử dụng để tự đánh giá. ToolAcre hiển thị nhãn một cách chính xác để người đánh giá có thể nhìn thấy nhưng không bao giờ tác động lên nhãn bằng mật mã.

Hướng an toàn là ngược lại: cấu hình dịch vụ đáng tin cậy xác định các họ thuật toán có thể chấp nhận và các khóa liên quan, sau đó các tiêu đề đến phải khớp với chính sách đó. Bảng giải mã không thể cung cấp chính sách đó và không được nhầm lẫn với bảo vệ chỉ vì nó làm nổi bật một giá trị đáng ngờ.

Cờ kho lưu trữ alg:none nhưng không thiết lập lịch sử thông số kỹ thuật đằng sau JWT không bảo mật

Quá trình triển khai coi `alg: none` như một tuyên bố chưa được ký và cảnh báo rằng việc chấp nhận nó sẽ chấp nhận nội dung tùy ý. Nó cũng báo cáo một đoạn thứ ba trống riêng biệt. Bằng chứng kho lưu trữ hỗ trợ việc từ chối đầu vào như vậy trong các quy trình làm việc đã được xác thực; nó không ghi lại lý do tại sao JWT không bảo mật ban đầu được đưa vào thông số kỹ thuật.

Do đó, cách diễn đạt lịch sử đó được sửa chữa thay vì được phát minh. Vấn đề quan trọng về mặt vận hành là rõ ràng: một dịch vụ yêu cầu thông tin xác thực đã ký không được cho phép tiêu đề mã thông báo vô hiệu hóa việc kiểm tra chữ ký. Bản thân ToolAcre không thực hiện xác minh nên khả năng hiển thị `none` của nó chỉ là phát hiện để kiểm tra.

Cuộc tấn công alg:none - tước bỏ chữ ký và yêu cầu người xác minh chấp nhận một chữ ký trống

Một cuộc tấn công không dấu sẽ thay đổi tiêu đề thành yêu cầu `none`, thay đổi các xác nhận quyền sở hữu nếu muốn và không cung cấp byte chữ ký. Mọi phân đoạn vẫn có thể hợp lệ về mặt cú pháp và hai phân đoạn đầu tiên giải mã thành JSON được đánh bóng. Trình xác minh cho phép sẽ chuyển đổi tùy chọn của kẻ tấn công thành bỏ qua xác thực.

Trình xác minh nghiêm ngặt không có nhánh nâng cấp đầu vào này lên trạng thái đáng tin cậy khi yêu cầu mã thông báo đã ký. Cảnh báo của ToolAcre giúp xác định hình dạng trong quá trình gỡ lỗi nhưng việc đọc từ `none` không ngăn được phần phụ trợ đưa ra quyết định sai lầm. Việc thực thi thuộc về nơi thông tin xác thực được sử dụng.

Nhầm lẫn chính — hiển thị khóa công khai dưới dạng bí mật HMAC để mã thông báo RS256 được xác minh là HS256

Sự nhầm lẫn về khóa phát sinh khi người xác minh cho phép các họ thuật toán có vai trò khóa không tương thích và không liên kết từng lựa chọn với loại khóa chính xác. Khóa xác minh RSA công khai không phải là bí mật HMAC. Việc coi các byte của nó là một byte sau khi kẻ tấn công thay đổi nhãn thuật toán sẽ làm sụp đổ phân tách public/private dự kiến.

Việc ngăn chặn loại lỗi đó đòi hỏi nhiều hơn việc kiểm tra phân đoạn có hình chữ ký. Dịch vụ phải ghép nối thuật toán dự kiến, loại khóa, nhà phát hành và hồ sơ mã thông báo thông qua cấu hình đáng tin cậy. Bộ giải mã hiển thị RS256 hoặc HS256 không thể biết liệu phần phụ trợ có duy trì các liên kết đó hay không.

Cách khắc phục - ghim các thuật toán được chấp nhận vào trình xác minh và không bao giờ lấy chúng từ mã thông báo

Ghim các thuật toán được chấp nhận trong cấu hình trình xác minh và giữ danh sách thu hẹp trong phạm vi cho phép của hợp đồng phát hành. Từ chối `none` đối với luồng thông tin xác thực đã ký và từ chối thông tin không khớp thay vì thử thuật toán khác. Không lấy danh sách cho phép từ tiêu đề chưa được xác minh hoặc từ yêu cầu tải trọng.

Tra cứu khóa theo nguyên tắc tương tự. `kid` có thể chọn trong số các ứng viên đã được tin cậy nhưng không được tạo nguồn tin cậy mới. Không nên theo dõi URL tiêu đề hoặc khóa nhúng chỉ vì mã thông báo yêu cầu chúng. Người xác minh quyết định nguồn của nó một cách độc lập.

Ví dụ đã hoạt động - đọc tiêu đề trong bộ giải mã ToolAcre JWT để phát hiện alg:none và tại sao việc phát hiện ra nó không giống như được bảo vệ

Tạo tiêu đề mã thông báo vô hại khai báo `none` và để trống phân đoạn thứ ba. ToolAcre giải mã JSON, báo cáo thuật toán đã khai báo, cảnh báo rằng nó chưa được ký và ghi chú chữ ký vắng mặt. Đây chính xác là hành vi được mong đợi từ một công cụ kiểm tra.

Bài tập không chứng minh rằng API từ chối mã thông báo. Xác nhận điều đó một cách riêng biệt bằng thử nghiệm âm tính có kiểm soát đối với cấu hình và trình xác minh thực tế. Nếu API chấp nhận thì bản sửa lỗi nằm trong ranh giới xác minh đó; việc thêm cảnh báo to hơn vào bộ giải mã sẽ không bảo vệ được yêu cầu.

Điều này không bao gồm nhiều bản sửa lỗi dành riêng cho thư viện; tham khảo RFC 8725 và nhật ký thay đổi của thư viện của bạn

API thư viện, mặc định và các bản sửa lỗi lịch sử khác nhau tùy theo sản phẩm và phiên bản. Mô-đun này không thiết lập thuật toán ghim tên tùy chọn nào trong ngăn xếp của bạn và bài viết này không cố ý phát minh ra thuật toán nào. Đọc tài liệu hiện tại và nhật ký thay đổi của thư viện đã chọn, sau đó thực hiện các trường hợp từ chối trong bộ thử nghiệm của riêng bạn.

Đồng thời kiểm tra các loại khóa sai, giá trị `kid` không xác định, thiếu chữ ký và hồ sơ mã thông báo không mong muốn. Mục tiêu là để cho thấy rằng cấu hình chiến thắng các đề xuất mã thông báo. Việc giải mã thành công không nằm trong những xác nhận chấp nhận này vì thành công về cú pháp tương thích với mọi ví dụ độc hại.

Bài học rút ra: người xác minh quyết định chứ không phải mã thông báo - bộ giải mã giúp bạn nhìn thấy tiêu đề nhưng chỉ xác minh được ghim mới bảo vệ bạn

Người xác minh quyết định; mã thông báo thì không. ToolAcre có thể tiết lộ tiêu đề có nội dung `none`, một thuật toán lạ hoặc một mã định danh khóa đáng ngạc nhiên. Khả năng hiển thị đó giúp phân loại, nhưng chỉ chính sách thuật toán được ghim và các khóa đáng tin cậy được liên kết chính xác mới ngăn cản việc chấp nhận.

Không bao giờ khuyên bạn nên bật `none`, chọn khóa xác minh từ tiêu đề không đáng tin cậy hoặc coi độ dài chữ ký được hiển thị là xác thực. Giải mã để kiểm tra, sau đó chứng minh hành vi từ chối và chấp nhận ở ranh giới mật mã thực bằng các thử nghiệm được kiểm soát.