Lỗi Web Firewall Anubis Gây Ra Từ Chối Ngẫu Nhiên Trên Thiết Bị Có Số Lõi CPU Lẻ

Nhóm Cộng đồng BigGo
Lỗi Web Firewall Anubis Gây Ra Từ Chối Ngẫu Nhiên Trên Thiết Bị Có Số Lõi CPU Lẻ

Một dòng mã JavaScript duy nhất trong tường lửa ứng dụng web Anubis đã gây ra các lỗi phản hồi không hợp lệ bí ẩn cho người dùng có thiết bị với số lõi CPU lẻ. Lỗi này, ảnh hưởng đến các smartphone phổ biến như Google Pixel 8 Pro và Samsung Galaxy S24+, làm nổi bật cách mà ngay cả những sơ suất nhỏ nhất trong lập trình cũng có thể tạo ra sự bực bội rộng rãi cho người dùng.

Anubis là một tường lửa web sử dụng các thử thách proof-of-work để xác minh rằng khách truy cập trang web là trình duyệt thật chứ không phải bot tự động. Hệ thống yêu cầu client giải các câu đố mật mã sử dụng nhiều lõi CPU để giới hạn tốc độ kết nối và chặn các scraper. Tuy nhiên, giả định của nhà phát triển rằng tất cả thiết bị đều có số lõi chẵn đã dẫn đến một vấn đề bất ngờ.

Các thiết bị được kiểm tra bởi nhà phát triển Anubis (Tất cả đều có số lõi chẵn):

  • MacBook Pro M3/M4 Max : 16 lõi
  • AMD Ryzen 9 7950x3D : 32 lõi
  • Google Pixel 9a : 8 lõi
  • iPhone 15 Pro Max : 6 lõi
  • iPad Pro ( M1 ): 8 lõi
  • Steam Deck : 8 lõi
  • Core i5 10600 : 12 lõi
  • ROG Ally : 16 lõi

Toán Học Đằng Sau Sự Hỗn Loạn

Đoạn mã có vấn đề đã chia số lõi CPU cho hai để xác định số worker thread cần tạo: threads = Math.max(navigator.hardwareConcurrency / 2, 1);. Trên các thiết bị có số lõi lẻ, điều này tạo ra số thread phân số. Ví dụ, 9 lõi của Pixel 8 Pro dẫn đến 4.5 thread, khiến hệ thống proof-of-work đôi khi tạo ra các giải pháp với nonce thập phân mà server sẽ từ chối là không hợp lệ.

Cuộc thảo luận cộng đồng tiết lộ rằng nhiều người dùng đã trải qua những lỗi ngẫu nhiên này mà không hiểu nguyên nhân. Một người dùng Samsung Galaxy S24+ lưu ý rằng việc duyệt web các trang công nghệ trên di động đã trở nên khổ sở trong những tháng gần đây, với các thử thách Anubis thường xuyên thất bại hoặc chạy kém.

Sửa lỗi code:

  • Trước: threads = Math.max(navigator.hardwareConcurrency / 2, 1);
  • Sau: threads = Math.trunc(Math.max(navigator.hardwareConcurrency / 2, 1));
  • Kết quả: Pixel 8 Pro hiện sử dụng 4 worker thay vì 4.5 worker

Thiết Kế CPU Hiện Đại Phá Vỡ Các Giả Định Cũ

Lỗi này đã phơi bày cách kiến trúc bộ xử lý di động đã phát triển vượt ra ngoài các kỳ vọng truyền thống. Pixel 8 Pro sử dụng thiết kế lõi ba tầng với một lõi hiệu suất cao Cortex X3, bốn lõi hiệu suất trung bình Cortex A715, và bốn lõi tiết kiệm năng lượng cao Cortex A510, tổng cộng chín lõi. Thiết kế bất đối xứng này tối ưu hóa tuổi thọ pin và hiệu suất nhưng phá vỡ giả định rằng bộ xử lý luôn có số lõi chẵn.

Các thành viên cộng đồng chỉ ra rằng bộ xử lý có số lõi lẻ không hoàn toàn mới. AMD đã bán chip ba lõi Phenom X3 nhiều năm trước, và ngay cả các console game như Xbox 360 và Wii U cũng sử dụng bộ xử lý ba lõi. Tuy nhiên, hầu hết CPU desktop và laptop sử dụng simultaneous multithreading (SMT) nhân đôi số lõi biểu kiến, che giấu các con số lẻ bên dưới.

Kiến trúc CPU Google Pixel 8 Pro :

  • Hiệu suất cao: 1x nhân Cortex X3 3 GHz
  • Hiệu suất trung bình: 4x nhân Cortex A715 2.45 GHz
  • Hiệu suất tiết kiệm: 4x nhân Cortex A510 2.15 GHz
  • Tổng cộng: 9 nhân

Bản Sửa Lỗi Đơn Giản Và Những Câu Hỏi Lớn Hơn

Nhà phát triển đã sửa vấn đề tức thì bằng cách thêm Math.trunc() để loại bỏ phần thập phân: threads = Math.trunc(Math.max(navigator.hardwareConcurrency / 2, 1));. Điều này đảm bảo Pixel 8 Pro bây giờ sử dụng 4 worker thay vì 4.5, ngăn chặn vấn đề nonce thập phân.

Tuy nhiên, sự cố này đã khơi mào các cuộc tranh luận rộng hơn về hệ thống proof-of-work để phát hiện bot. Các nhà phê bình cho rằng những thử thách này áp đặt cùng chi phí tính toán lên người dùng hợp pháp và scraper, không có sự bất đối xứng thực sự nào để khai thác. Như một thành viên cộng đồng lưu ý, các scraper tinh vi có thể dễ dàng thích ứng để vượt qua những rào cản như vậy, trong khi gánh nặng chính rơi vào người dùng thật với thiết bị chậm hơn.

Bạn đang áp đặt chính xác cùng chi phí lên người dùng hợp pháp như bạn đang làm với scraper. Tính kinh tế theo quy mô có nghĩa là chi phí biên cho đối thủ của bạn thực sự thấp hơn đáng kể so với người dùng thật của bạn.

Nhà phát triển hiện đang xem xét các phương pháp thay thế như thử thách Proof of React yêu cầu thực thi framework JavaScript cụ thể thay vì sức mạnh tính toán thô. Họ cũng đang khám phá các thông báo lỗi được mã hóa để giúp người dùng và quản trị viên debug tốt hơn các vấn đề trong tương lai.

Lỗi này phục vụ như một lời nhắc nhở rằng ngay cả các nhà phát triển có kinh nghiệm cũng có thể đưa ra các giả định không chính xác về phần cứng. Khi thiết kế CPU trở nên đa dạng và phức tạp hơn, đặc biệt là trong các thiết bị di động, phần mềm cần thích ứng để xử lý những biến thể này một cách uyển chuyển.

Tham khảo: Sometimes CPU cores are odd