Vì sao "API đối tác" không phải một biên giới tin cậy
Mọi developer đều validate input từ người dùng. Rất ít người validate response từ một API bên ngoài — và API10 tồn tại vì lý do đó.
Lý do bỏ qua nghe hợp lý: "đó là API của đối tác, chúng ta có hợp đồng". Nhưng hợp đồng không phải một biện pháp kỹ thuật, và có bốn cách response đó trở nên độc hại mà không cần đối tác của bạn có ý xấu:
| Cách | Ví dụ |
|---|---|
| Đối tác bị xâm nhập | Chính bài m6-challenge — pipeline của họ, không phải ý định của họ |
| MITM trên đường tới đối tác | Bài tls-and-transport, dòng => true |
| SSRF của chính bạn | Bạn tưởng đang gọi đối tác, thật ra đang gọi chỗ kẻ tấn công chọn |
| Đối tác đổi hợp đồng | Không độc hại, nhưng cùng hệ quả: response không như bạn giả định |
Hàng thứ ba là hàng đáng chú ý nhất vì nó nối module này lại với nhau: nếu bạn có SSRF thì mọi giả định về "response từ đối tác" trở thành giả định về "response từ kẻ tấn công". Hai lỗ hổng nhân nhau chứ không cộng nhau.
Năm giả định thường được đặt và thường sai:
| Giả định | Hỏng thế nào |
|---|---|
| Response là JSON hợp lệ | HTML của một trang lỗi, hoặc một Content-Type khác |
| Kích thước hợp lý | 4 GB response làm cạn bộ nhớ tiến trình |
| Trả về trong vài giây | Response nhỏ giọt vô hạn giữ kết nối và luồng của bạn |
| Trường có kiểu như tài liệu | "amount": "1e999", "id": null ở chỗ bắt buộc |
| Chuỗi trong response an toàn để hiển thị | Nó đi vào innerHTML và trở thành XSS |
Hàng thứ ba đáng nói riêng vì nó không phải một lỗi dữ liệu mà là một tấn công cạn tài nguyên: một server gửi một byte mỗi 20 giây giữ được một luồng của bạn vô thời hạn, và HttpClient.Timeout mặc định là 100 giây cho toàn bộ request — nhưng nó không giới hạn thời gian đọc body nếu bạn stream nó.
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…