Stack under attack: what we learned about handling DDoS attacks

Bài tóm tắt Stack Overflow 2022 3. Quy mô lớn Độ khó: Trung bình

Stack Overflow · 2022 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

Trong vài tháng trước 5/2022, Stack Overflow liên tục bị DDoS theo hai kiểu: tầng ứng dụng nhắm vào API, và dồn lưu lượng nhắm vào site chính. Đến lúc viết bài, nhiều đợt chỉ còn thấy trong log và dashboard.

Thay đổi chính

  • Tấn công tầng ứng dụng:
    • một botnet rất lớn gọi một query rất đắt, đẩy vài server backend lên 100% CPU. Mỗi IP chỉ gửi vài request (có IP chỉ hai), nên rate limit theo IP vô dụng;
    • đội viết bộ lọc theo dấu hiệu của request; lúc đầu chặn quá tay, sau tinh chỉnh dần;
    • kẻ tấn công đổi sang trang user với số trang cực lớn và tăng dần số trang để tránh bị chặn, cùng khai thác một điểm yếu ở chỗ khác. Lại thêm bộ lọc.
  • Tấn công dồn lưu lượng:
    • botnet gửi rất nhiều POST tới /questions/ (có dấu / cuối, URL site không dùng) nên chặn cả path; kẻ tấn công bỏ dấu / rồi quay lại;
    • đổi cách: gom IP botnet và chặn ở CDN (Fastly), traffic không tới được server. Lần tấn công thứ ba bị chặn ngay;
    • kẻ tấn công chuyển sang mỗi lần chỉ bật vừa đủ bot, chặn đợt này thì đợt khác tới. Đội viết script đọc log traffic, tự đưa IP có hành vi đặc trưng vào blocklist, nên mỗi đợt phản ứng nhanh hơn.
    • Có lúc chặn cả exit node Tor vì chiếm phần lớn traffic tấn công; user hợp lệ phản đối nên phải lên Meta giải thích.
  • Khuyến nghị theo bài:
    • API: bắt mọi lời gọi xác thực (hoặc giới hạn chặt hơn cho ẩn danh), giới hạn lượng dữ liệu mỗi lời gọi (phân trang, chỉ tải phần đang hiển thị), rate limit mọi API, lọc traffic xấu trước khi tới app (HAProxy), giữ log dễ truy vấn;
    • lưu lượng: chặn URL lạ (dấu / thừa, POST tới path không có), chặn IP độc hại dù có chút traffic hợp lệ đi chung ("chặn một ít traffic tốt vẫn hơn sập với mọi người"), tự động hoá blocklist, dùng tarpit để làm chậm botnet.

Vì sao

Theo bài: DDoS đi kèm với thành công trên Internet. Bị tấn công liên tục cho thấy rõ thao tác nào lặp lại để tự động hoá, và chỗ nào monitoring còn thiếu (tấn công tầng ứng dụng có dấu hiệu sớm mà trước đó không có alert).

Bài học cho SWE

  • Endpoint đắt mà ai cũng gọi được là bề mặt tấn công; giới hạn kích thước trang và độ sâu phân trang là phòng thủ chứ không chỉ là UX.
  • Rate limit theo IP không đủ trước botnet phân tán; cần lọc theo dấu hiệu của request, và chặn càng xa app (CDN) càng tốt.
  • Sau sự cố: tự động hoá thao tác lặp lại, viết runbook cho phần chưa tự động được, và đưa việc thông báo cho user vào runbook.
  • Log HTTP dễ truy vấn (ở Stack Overflow là log HAProxy trong SQL, xem Stack Overflow 2018) là thứ giúp tìm ra mẫu tấn công.

Liên quan