SecLab
Authentication & SessionchallengeĐộ khó 4/537 phút

Thử thách: vá một luồng đăng nhập từ đầu tới cuối

Mục tiêu: Sau bài này bạn đọc được một luồng xác thực hoàn chỉnh và tìm ra lỗi ở chỗ hai bước đúng ghép lại thành sai.

V7V6API2:2023A07:2025RFC 9700
Bước 1 / 5 · read3 phút

Mục tiêu

Năm bài trước kiểm từng phần riêng: hash mật khẩu, verify JWT, chọn luồng, vòng đời session, dò tài khoản. Bài này kiểm thứ không bài nào kiểm được: một luồng hoàn chỉnh, nơi mỗi bước đúng và tổ hợp thì sai.

Đây là loại lỗi khó nhất trong xác thực và cũng là loại phổ biến nhất trong hệ thống thật, vì mỗi bước được một người khác viết ở một thời điểm khác, và không ai đọc cả luồng một lượt.

Tình huống. Một ứng dụng web có backend, dùng OIDC với Zitadel làm identity provider. Luồng đăng nhập gồm sáu bước, và có một lỗ hổng nghiêm trọng cùng hai vấn đề nhỏ hơn. Lỗ hổng nghiêm trọng không nằm ở bất kỳ bước đơn lẻ nào.

Việc phải làm.

  1. Đọc cả sáu bước một lượt trước khi phán đoán gì.
  2. Tìm lỗ hổng cho phép chiếm tài khoản — không phải lỗ hổng làm rò rỉ thông tin.
  3. Viết bản vá, và nói rõ nó chặn được biến thể nào và không chặn được biến thể nào.

Gợi ý duy nhất: lỗ hổng nghiêm trọng nằm ở chỗ hai bước tin nhau. Mỗi bước kiểm đúng phần của mình và giả định bước kia đã kiểm phần còn lại.

Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để bình luận

Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.

Đăng kýĐăng nhập

Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.

Đang tải bình luận…