- Bài viết bàn về vấn đề các bot scraper gửi yêu cầu quá mức lên website công khai đến mức hoạt động như DDoS, đồng thời đưa ra một cách tiếp cận mang tính thử nghiệm để lợi dụng ngược lại và khiến chúng lãng phí thời gian
- Tác giả tạo một trình sinh văn bản dựa trên chuỗi Markov để tạo dữ liệu giả trông giống các tệp
.php, nhằm dụ bot độc hại tải chúng xuống
- Sau đó xây dựng máy chủ nội dung tĩnh để trả về ngẫu nhiên các đoạn trong tiểu thuyết Frankenstein, được thiết kế với cấu trúc liên kết khiến crawler lan rộng theo cấp số nhân
- Thêm thuộc tính
noindex, nofollow và bộ đếm số lần yêu cầu vào mọi trang để loại trừ công cụ tìm kiếm bình thường và chỉ bắt các bot vi phạm quy tắc
- Kết quả thử nghiệm khá thú vị, nhưng do rủi ro nhận diện nhầm Googlebot, tác giả không áp dụng vào dịch vụ thực tế mà chỉ giữ như một dự án học tập và thử nghiệm
Vấn đề bot scraper và ý tưởng đối phó
- Scraper vô tình gây ra mức tải cỡ DDoS lên các website nhỏ
- Một số quản trị viên đã hỏi cách tự bảo vệ, nhưng bài viết này tập trung vào “phản công thay vì phòng thủ”
- Sau khi thấy một lập trình viên khác dùng chuỗi Markov để tạo vô hạn dữ liệu giả nhằm đánh lừa bot, tác giả bắt đầu tự thử nghiệm
Trình sinh PHP giả dựa trên chuỗi Markov
- Tác giả triển khai bộ học chuỗi Markov bằng Rust để tạo nội dung trông chân thực từ dữ liệu văn bản tùy ý
- Nhắm vào các bot độc hại tìm những đường dẫn dễ tổn thương như
.env, .aws, .php, tác giả cung cấp mã PHP giả nhìn như thật nhưng vô nghĩa
- Tăng kích thước tệp từ 2KB lên 10MB để buộc bot lãng phí tài nguyên
- Kết quả đầu ra mẫu có dạng mã PHP giả trông khá thuyết phục, trộn lẫn tên hàm WordPress và chú thích
- Mục tiêu là làm bot lãng phí thời gian, tài nguyên, đồng thời khiến kẻ tấn công tốn công tìm kiếm các lỗ hổng không có thật
Thử nghiệm hiệu quả và cung cấp dữ liệu tĩnh
- Khi phục vụ tệp lớn hơn 1MB trên VPS, tác giả gặp độ trễ phản hồi và tải máy chủ tăng lên
- Để giải quyết, tác giả xây dựng một “garbage server” dạng website tĩnh
- Tải toàn bộ tiểu thuyết Frankenstein vào bộ nhớ và trả về ngẫu nhiên 4 đoạn văn cho mỗi yêu cầu
- Thêm 5 liên kết ở cuối mỗi trang để kích thích crawler lan rộng bùng nổ (tăng theo bội số 5)
- Có thể xem kết quả tại https://herm.app/babbler/
Chi tiết thiết kế và cách vận hành
- Cuốn tiểu thuyết được chọn thuộc phạm vi công cộng, và được dùng vì tác giả làm dự án vào mùa Halloween cũng như thấy sự tương đồng giữa AI và Frankenstein
- Mọi trang đều được gắn
noindex,nofollow để chỉ bắt các bot vi phạm quy tắc
- Ở cuối mỗi trang có hiển thị bộ đếm số lần yêu cầu, và bộ đếm này sẽ được đặt lại khi triển khai vì lưu trong bộ nhớ
- Tác giả cũng dựng máy chủ riêng cho các yêu cầu
.php, để trả ngẫu nhiên các tệp PHP thật từ bộ nhớ
- Dự án được tóm gọn bằng câu: “Garbage for the garbage king!”
Rủi ro và giới hạn
- Hệ thống này có rủi ro nhận diện nhầm công cụ tìm kiếm nếu áp dụng vào dịch vụ thực tế
- Nếu Googlebot quét nhầm endpoint, website có thể bị phân loại là trang spam
- Điều này có thể dẫn tới giảm hiển thị trên tìm kiếm hoặc hiện cảnh báo trên Chrome
- Vì vậy, tác giả không khuyến nghị cho các website phụ thuộc vào tìm kiếm, mà chỉ vận hành như dự án thử nghiệm
- Trình babbler cho
.php không phải HTML nên không ảnh hưởng tới Googlebot, chỉ nhắm vào bot độc hại
Kết lại và quan điểm cá nhân
- Để nhử scraper độc hại, tác giả thêm các liên kết ẩn (
rel="nofollow") vào blog
- Nếu VPS vượt giới hạn băng thông, tác giả cân nhắc dùng Cloudflare cache
- Thông qua dự án này, tác giả học thêm về chuỗi Markov và nguyên lý hoạt động của bot, trong một thử nghiệm vừa vui vừa bực bội
- Kết luận là không phải mọi thử nghiệm đều cần thực dụng, đôi khi chỉ để vui thôi cũng đủ
1 bình luận
Ý kiến trên Hacker News
Dù thế giới có thay đổi thì cuối cùng vẫn gặp những vấn đề tương tự
10~15 năm trước tôi từng phải đối phó với các dịch vụ giám sát mạng xã hội. Các thương hiệu lớn trả tiền cho họ để theo dõi cảm xúc trên diễn đàn, và họ tự ý cào dữ liệu từ cộng đồng miễn phí mà tôi vận hành, gây tải cho máy chủ.
Dù tôi chặn bot của họ thì chúng vẫn quay lại với IP và UA khác, nên tôi đã tạo một bộ lọc chèn ngẫu nhiên tên thương hiệu vào bài viết để phá hỏng chất lượng dữ liệu của họ. Sau khi bật biện pháp này, việc scrape đã dừng hẳn chỉ trong hai ngày
Những bot này không thực sự parse file PHP, mà dùng sự tồn tại của chúng để tạo dấu vân tay (fingerprinting) phục vụ dò lỗ hổng. Chúng chỉ nhìn mã phản hồi rồi bỏ qua ngay
Gần đây tôi có nghe về tarpit cho AI và scraper. Cách này là không ngắt kết nối mà gửi vô hạn dữ liệu với tốc độ cực chậm. Công cụ Nepenthes khá thú vị, tôi muốn thử nghiệm
Trước đây trên HN, nếu chặn scraper thì sẽ bị chỉ trích. Lập luận là “tôi truy cập theo cách nào cũng là việc của tôi”
Nếu bạn tự quản lý máy chủ Apache, có thể dùng RewriteEngine để chặn ngay các request PHP
Máy chủ của tôi không có PHP, nên mọi request kiểu này đều là độc hại
Phần lớn scraper mang tính tấn công đều nhắm vào lỗ hổng WordPress. Thứ chúng muốn không phải bản thân file PHP mà là kết quả đầu ra của nó. Kiểu cấu hình này gần giống một honeypot, nhưng nếu bot không thấy thứ nó mong đợi theo kịch bản thì sẽ rời đi
Trước đây tôi từng đăng chiến lược zipbomb lên HN và traffic tăng vọt lên 100 nghìn lượt mỗi ngày. Một VPS giá $6 không thể chịu nổi. Bây giờ tôi chỉ đáp trả bằng zipbomb với những bot hung hãn nhất, còn lại thì trả 403. Chiến lược mới đang phát huy tác dụng, nhưng tôi vẫn phân vân có nên công khai lại không. Tham khảo: bài viết trước
Trước đây tôi chỉ dùng fail2ban, nhưng tôi muốn tạo một biện pháp phòng thủ thú vị hơn
Trong
.htaccess, tôi redirect các đường dẫn đáng ngờ (/.git,/wp-login) sangdecoy.php, rồi ép tải xuống decoy.zip dung lượng 10GB.decoy.phptrông giống như file nhạy cảm được yêu cầu, nhưng thực ra nó stream vô hạn log giả và dữ liệu SQL giả để giữ bot mắc kẹtNhững bot này không cào file PHP, mà đang tìm lỗ hổng framework. Chỉ cần trả về phản hồi ngoài dự đoán là chúng sẽ bỏ cuộc ngay và chuyển sang mục tiêu khác
Đôi khi tôi nghĩ thế này — liệu có thể khiến chúng dùng tài nguyên bị lãng phí đó để đào tiền mã hóa hay không?