Anubis thực sự chặn ai?
(fzakaria.com)- Anubis, công cụ yêu cầu Proof-of-Work trước khi cho phép truy cập HTTP, trên thực tế lại áp đặt chi phí dai dẳng lớn hơn lên người dùng bình thường, thiết bị cấu hình thấp và các client không hỗ trợ JavaScript hơn là các AI scraper
- anubis-fetch do LLM tạo ra có thể tự giải bài toán Proof-of-Work, chạy Chromium khi cần, và mô phỏng dấu vân tay TLS/JA3 của Chrome để vượt qua cả chặn thủ công của Cloudflare
- Scraper có thể cache và tái sử dụng cookie đã được cấp để phân bổ chi phí qua nhiều yêu cầu, trong khi con người phải chấp nhận chờ vài giây và tiêu hao pin mỗi lần truy cập
- Độ khó mặc định 4 yêu cầu trung bình 65.536 lần băm; bản triển khai Go native mất khoảng 1,3ms, JavaScript trên trình duyệt mất khoảng 130ms, nhưng thời gian chờ mà người dùng thực sự cảm nhận vào khoảng 1–5 giây
- Nếu giả định thời gian cảm nhận là 2 giây và năng lượng 20J cho mỗi lần, thì 1 triệu thử thách mỗi ngày sẽ tiêu tốn khoảng 23 người-năm·2MWh mỗi năm, còn 100 triệu mỗi ngày sẽ tiêu tốn khoảng 2.300 người-năm·200MWh
AI đã vượt qua Anubis
- Trong lúc thực hiện bản vá để hỗ trợ
$ORIGINtrongPT_INTERPcủa trình thông dịch thông qua bpf củabinfmt_misctrong nhân Linux, tác giả đã yêu cầu LLM đọc chuỗi thảo luận trên mailing list của nhân Linux - lore.kernel.org khi đó đã triển khai Anubis, một proxy HTTP yêu cầu Proof-of-Work trước khi cho phép truy cập tài nguyên
- LLM đã tạo ra anubis-fetch để xử lý hạn chế này
- Trước tiên, nó giải Proof-of-Work theo cách native; nếu thất bại thì truy cập URL bằng Chromium
- Nó dùng
reqđể mô phỏng dấu vân tay TLS/JA3 của Chrome thật, nhờ đó vượt qua cả chặn thủ công của Cloudflare anubis-fetch <URL>xuất HTML ra standard output, còn tùy chọn--textxuất văn bản thuần dễ đọc
- AI và bot mà Anubis nhắm tới có thể dễ dàng vượt qua chỉ bằng cách bổ sung một lần hỗ trợ Proof-of-Work
- Sau khi giải thử thách, scraper có thể cache và tái sử dụng cookie nhận được để phân bổ chi phí qua nhiều yêu cầu
- Ngược lại, con người phải chờ spinner và tiêu hao pin mỗi lần truy cập, và không thể chia sẻ chi phí này với người dùng khác
- Thiết bị cấu hình thấp và smartphone càng chịu gánh nặng lớn hơn, còn các công cụ không dùng JavaScript như w3m·lynx·trình đọc màn hình·trình đọc RSS thì không thể truy cập
- Một cơ chế nhằm chặn AI lại dễ dàng bị AI vượt qua, trong khi tiếp tục áp đặt gánh nặng lũy thoái lên con người và web mở
Chi phí thời gian và năng lượng do Proof-of-Work tạo ra
- Độ khó
dlà số ký tự hexa số 0 ở đầu mà giá trị băm phải có, và lượng công việc kỳ vọng cho mỗi lần giải làW = 16^dlần băm- Độ khó 4, giá trị mặc định phổ biến, yêu cầu 65.536 lần băm
- Bản triển khai Go native khoảng 50 MH/s: khoảng 1,3ms
- JavaScript trên trình duyệt khoảng 0,5 MH/s: khoảng 130ms
- Thời gian cảm nhận, bao gồm tải trang, chạy worker và tải lại: khoảng 1–5 giây
- Độ khó 5 yêu cầu 1.048.576 lần băm
- Bản triển khai Go native: khoảng 20ms
- JavaScript trên trình duyệt: khoảng 2 giây
- Thời gian cảm nhận: khoảng 5–15 giây
- Độ khó 4, giá trị mặc định phổ biến, yêu cầu 65.536 lần băm
- Giả sử số lần giải thử thách Anubis mỗi ngày trên toàn thế giới là
C, thời gian cảm nhận mỗi lần làt = 2초, và năng lượng thiết bị gồm màn hình và CPU làE = 20J- Thời gian của con người trong một năm được tính bằng
C × t × 365 / 3.15×10⁷ - Năng lượng hằng năm được tính bằng
C × E × 365 / 3.6×10⁶kWh
- Thời gian của con người trong một năm được tính bằng
- Theo các giả định này, chi phí hằng năm như sau
- 1 triệu lần mỗi ngày: khoảng 23 người-năm, khoảng 2MWh
- 10 triệu lần mỗi ngày: khoảng 230 người-năm, khoảng 20MWh
- 100 triệu lần mỗi ngày: khoảng 2.300 người-năm, khoảng 200MWh
- Mọi con số đều chỉ là ước tính gần đúng; bot farm và công cụ AI tiêu thụ năng lượng lớn hơn nhiều bậc độ lớn, nên đây không phải phép tính nhằm lập luận về vấn đề môi trường
- Với robot, thời gian không phải ràng buộc, nhưng thời gian của con người là hữu hạn; vì vậy người dùng đang phải collectively dành một lượng thời gian đáng kể để chờ truy cập website, điều vốn không tồn tại trước kỷ nguyên AI
1 bình luận
Các ý kiến trên Lobste.rs
Khó đồng ý với nhận định rằng đối tượng mà Anubis nhắm tới có thể dễ dàng vô hiệu hóa nó. Mục tiêu chính của Anubis không phải là các LLM agent hay chương trình được tạo bằng vibe coding, mà là chặn các trình thu thập web kiểu vét cạn mà các công ty LLM sử dụng.
Có cách обход và cũng có thể tận dụng agent hoặc LLM, nhưng phần lớn scraper rất đơn giản, và người vận hành cũng không muốn mất công обход một số ít trang đã áp dụng Anubis. Mục đích đúng hơn là nâng chi phí обход lên một chút để khiến việc thu thập không còn đáng làm.
Tuy nhiên, với mục đích này thì Anubis đã được thiết kế quá mức. Chỉ cần bắt bấm một nút rồi cấp cookie truy cập cũng có thể đạt cùng hiệu quả bảo vệ; tôi đã thử triển khai trên Apache và thấy nó hoạt động đủ tốt mà không cần proof-of-work phức tạp.
Các công cụ scraping hiện đại mà tôi cũng dùng trong công việc khai phá dữ liệu đủ tốt để vượt qua gần như mọi chướng ngại, và Anubis cũng có thể bị обход dễ dàng.
Một số cấu hình rất đặc biệt có thể lọt qua, nhưng mục tiêu là chặn đối thủ lười biếng chứ không phải đối thủ ác ý.
Anubis không lọc bot, mà giới hạn tốc độ yêu cầu của client.
Anubis giống một biện pháp phòng thủ chống tấn công từ chối dịch vụ hơn là chặn truy cập của AI agent, và trên thực tế cũng khó phân biệt rồi chặn AI agent.
Nhưng nó cũng chặn luôn những người dùng như tôi, người truy cập một trang lạ trên thiết bị di động và tắt JavaScript.
Nhìn vào kết quả vận hành thực tế thì khó đồng ý với kết luận của bài viết. Tôi phục vụ website homelab qua proxy công khai fly.io và chuyển tiếp Tailscale, và các scraper, trong đó có Facebook, đã gây ra khoảng 20 USD phí băng thông mỗi tháng.
Sau khi áp dụng Anubis cho proxy, tôi quay lại được mức miễn phí. Việc có thể bị обход nếu người ta thật sự muốn cũng không sao; chỉ cần chặn phần lớn lưu lượng thu thập hàng loạt từ một số ít chủ thể xấu phớt lờ robots.txt là đủ.
Với các hoạt động scraping tận dụng botnet trên thiết bị cấu hình thấp như smart TV, proof-of-work của Anubis có vẻ có thể trở thành trở ngại thực sự. Vấn đề này cũng được đề cập đôi chút ở https://lobste.rs/s/kpaxih/update_on_scraper_situation
Phần khiến tôi bận tâm nhất ở Anubis là xung đột với web mở. Website của tôi chủ yếu được tiêu thụ qua RSS feed; nếu bảo vệ RSS bằng Anubis thì feed không hoạt động, còn nếu không bảo vệ thì toàn bộ nội dung bị phơi ra cho scraper ở dạng dễ đọc bằng máy.
Những rào cản proof-of-work như thế về cơ bản khó tương thích với web mở hay IndieWeb mà chúng ta từng hướng tới.
Thái độ không tôn trọng lựa chọn của người khác thể hiện rất rõ.
Điều khó chịu nhất là việc này trông như hành vi rõ ràng vi phạm các luật như CFAA, vậy mà họ lại che giấu danh tính giống các dịch vụ DDoS phạm pháp khác.
Thật nực cười khi kỳ vọng một công ty có toàn bộ mô hình kinh doanh dựa vào việc đánh cắp thành quả của người khác và “rửa” mã nguồn mở sẽ tuân thủ pháp luật.
Anubis thường không chặn Dillo, nhưng tùy cấu hình trang mà cũng có thể bị chặn, và điều đó cổ xúy bầu không khí rằng nếu không có JavaScript thì không đáng tồn tại, rất phiền phức: https://paste.rs/jNgwd.png
Tôi đang cân nhắc liệu có thể thu thập và quản lý danh sách mọi IP nằm trong proxy dân cư rồi chặn trong một khoảng thời gian hay không; ipset có thể chịu được quy mô này. Nhìn log thì bot không tải các tài nguyên khác như CSS hay hình ảnh, nhưng lại duyệt qua mọi file trong mọi commit của kho Dillo, nên tương đối dễ nhận diện.
Trên từng trang, dù chỉ thấy một yêu cầu từ mỗi IP, cùng IP đó rất có khả năng đang tải nhiều trang khác, nên có thể chặn các IP bị báo cáo nhiều lần. Không nên chỉ đơn giản cắt kết nối, mà nên chuyển hướng sang một trang hướng dẫn ở cổng riêng để cho biết lý do bị chặn và cách khắc phục.
Làm vậy cũng giảm động cơ cài backdoor reverse proxy vào tiện ích trình duyệt hoặc ứng dụng điện thoại, vì người dùng sẽ bắt đầu thực sự bị chặn.
Thật đáng tiếc khi phải dựa vào hệ thống uy tín IP, nhưng tôi không thấy nhiều biện pháp đối phó hiệu quả khác. Thiết bị dễ tổn thương, dù máy chủ chỉ huy-điều khiển của botnet bị gỡ bỏ, vẫn có thể lại bị kẻ tấn công tiếp theo chiếm và đưa vào botnet mới.
Trong bài có câu “tất nhiên tôi đang làm việc này với sự trợ giúp của LLM”, vậy tôi thắc mắc vì sao lại không gắn thẻ vibe coding.
vibecodingđã bị pushcx gỡ bỏ.