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.
- Đọc cả sáu bước một lượt trước khi phán đoán gì.
- 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.
- 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.
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.
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…