Bạn cho kẻ tấn công mượn vị trí mạng của mình
SSRF xảy ra khi ứng dụng của bạn nhận một URL từ người dùng rồi tự đi gọi URL đó. Điều làm nó nghiêm trọng không phải việc gọi mà là vị trí mạng mà lời gọi xuất phát từ đó: kẻ tấn công không tới được 10.0.0.5 hay 169.254.169.254, nhưng server của bạn thì tới được — nên họ mượn tay bạn.
Ba mục tiêu, xếp theo mức thiệt hại trong môi trường cloud:
| Mục tiêu | Cái lấy được |
|---|---|
Metadata endpoint (169.254.169.254) | Credential tạm của instance role — tức là quyền của cả role đó |
| Dịch vụ nội bộ không xác thực | Redis, Elasticsearch, một admin API "chỉ nội bộ nên không cần auth" |
| Quét mạng nội bộ | Bản đồ mạng, qua chênh lệch thời gian phản hồi hoặc mã lỗi |
Và giờ là phần quan trọng nhất của bài: blocklist không hoạt động. Danh sách chặn 127.0.0.1, localhost, 10.*, 192.168.* trông đầy đủ và nó thất bại theo ít nhất bảy cách khác nhau:
| Biến thể | Ví dụ |
|---|---|
| Thập phân | http://2130706433/ = 127.0.0.1 |
| Bát phân | http://0177.0.0.1/ |
| Thập lục phân | http://0x7f000001/ |
| IPv6 và dạng ánh xạ | http://[::1]/, http://[::ffff:127.0.0.1]/ |
| Ngắn gọn | http://127.1/, http://0/ |
| DNS trỏ về nội bộ | http://internal.attacker.tld/ → A record 10.0.0.5 |
| Redirect | URL công khai trả 302 tới 169.254.169.254 |
Bảy dòng đó là bảy lần bạn phải nhớ thêm một trường hợp, và lần thứ tám là lỗ hổng. Đây chính là lý do bản vá phải là allowlist: bạn liệt kê những gì được phép, và mọi biến thể sáng tạo đều không nằm trong danh sách đó.
Hai dòng cuối bảng đáng nói riêng, vì chúng vượt qua cả allowlist viết ngây thơ:
- DNS rebinding: bạn resolve hostname, thấy nó hợp lệ, rồi
HttpClientresolve lần thứ hai lúc kết nối — và lần đó DNS trả về một IP khác. Kiểm và dùng là hai thời điểm khác nhau. - Redirect: bạn kiểm URL đầu tiên, nó hợp lệ, rồi server trả
302vàHttpClientđi theo tới một chỗ bạn chưa bao giờ kiểm.
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…