บั๊กใน Anubis Web Firewall ทำให้เกิดการปฏิเสธแบบสุ่มบนอุปกรณ์ที่มี CPU แกนคี่

ทีมชุมชน BigGo
บั๊กใน Anubis Web Firewall ทำให้เกิดการปฏิเสธแบบสุ่มบนอุปกรณ์ที่มี CPU แกนคี่

โค้ด JavaScript เพียงบรรทัดเดียวใน Anubis web application firewall ได้ก่อให้เกิดข้อผิดพลาดการตอบสนองที่ไม่ถูกต้องอย่างลึกลับสำหรับผู้ใช้ที่มีอุปกรณ์ที่มี CPU แกนจำนวนคี่ บั๊กนี้ซึ่งส่งผลกระทบต่อสมาร์ทโฟนยอดนิยมอย่าง Google Pixel 8 Pro และ Samsung Galaxy S24+ เน้นให้เห็นว่าการมองข้ามในการเขียนโค้ดแม้เพียงเล็กน้อยก็สามารถสร้างความหงุดหงิดให้กับผู้ใช้ได้อย่างกว้างขวาง

Anubis เป็น web firewall ที่ใช้ proof-of-work challenges เพื่อยืนยันว่าผู้เยี่ยมชมเว็บไซต์เป็นเบราว์เซอร์จริงแทนที่จะเป็นบอทอัตโนมัติ ระบบนี้ทำให้ไคลเอนต์ต้องแก้ปริศนาการเข้ารหัสโดยใช้ CPU หลายแกนเพื่อจำกัดอัตราการเชื่อมต่อและบล็อก scrapers อย่างไรก็ตาม สมมติฐานของนักพัฒนาที่ว่าอุปกรณ์ทั้งหมดมี CPU แกนจำนวนคู่ได้นำไปสู่ปัญหาที่ไม่คาดคิด

อุปกรณ์ที่ทดสอบโดยนักพัฒนา Anubis (ทั้งหมดมีจำนวนคอร์เป็นเลขคู่):

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

คณิตศาสตร์เบื้องหลังความวุ่นวาย

โค้ดที่มีปัญหาได้หารจำนวนแกน CPU ด้วยสองเพื่อกำหนดจำนวน worker threads ที่จะสร้าง: threads = Math.max(navigator.hardwareConcurrency / 2, 1); บนอุปกรณ์ที่มีจำนวนแกนคี่ สิ่งนี้ได้สร้างจำนวน thread เป็นเศษส่วน ตอนอย่างเช่น Pixel 8 Pro ที่มี 9 แกนส่งผลให้ได้ 4.5 threads ทำให้ระบบ proof-of-work บางครั้งสร้างโซลูชันที่มี decimal nonces ซึ่งเซิร์ฟเวอร์จะปฏิเสธว่าไม่ถูกต้อง

การอภิปรายในชุมชนเผยให้เห็นว่าผู้ใช้หลายคนได้ประสบกับความล้มเหลวแบบสุ่มเหล่านี้โดยไม่เข้าใจสาเหตุ ผู้ใช้ Samsung Galaxy S24+ คนหนึ่งกล่าวว่าการเรียกดูไซต์เทคโนโลยีบนมือถือได้กลายเป็นเรื่องที่น่าทุกข์ใจในช่วงหลายเดือนที่ผ่านมา โดยที่ Anubis challenges มักล้มเหลวหรือทำงานได้ไม่ดี

การแก้ไขโค้ด:

  • ก่อน: threads = Math.max(navigator.hardwareConcurrency / 2, 1);
  • หลัง: threads = Math.trunc(Math.max(navigator.hardwareConcurrency / 2, 1));
  • ผลลัพธ์: Pixel 8 Pro ตอนนี้ใช้ 4 workers แทนที่จะเป็น 4.5 workers

การออกแบบ CPU สมัยใหม่ทำลายสมมติฐานเก่า

บั๊กนี้เปิดเผยให้เห็นว่าสถาปัตยกรรมโปรเซสเซอร์มือถือได้พัฒนาไปเกินกว่าความคาดหวังแบบดั้งเดิม Pixel 8 Pro ใช้การออกแบบแกนสามระดับด้วยแกน Cortex X3 ประสิทธิภาพสูงหนึ่งแกน แกน Cortex A715 ประสิทธิภาพปานกลางสี่แกน และแกน Cortex A510 ประสิทธิภาพสูงสี่แกน รวมเป็นเก้าแกน การออกแบบแบบไม่สมมาตรนี้ช่วยเพิ่มประสิทธิภาพแบตเตอรี่และประสิทธิภาพ แต่ทำลายสมมติฐานที่ว่าโปรเซสเซอร์มีจำนวนแกนคู่เสมอ

สมาชิกชุมชนชี้ให้เห็นว่าโปรเซสเซอร์แกนคี่ไม่ใช่เรื่องใหม่โดยสิ้นเชิง AMD เคยขายชิป Phenom X3 สามแกนเมื่อหลายปีก่อน และแม้แต่เกมคอนโซลอย่าง Xbox 360 และ Wii U ก็ใช้โปรเซสเซอร์สามแกน อย่างไรก็ตาม CPU เดสก์ท็อปและแล็ปท็อปส่วนใหญ่ใช้ simultaneous multithreading (SMT) ที่เพิ่มจำนวนแกนที่ปรากฏเป็นสองเท่า ซ่อนจำนวนคี่ที่อยู่เบื้องหลัง

สถาปัตยกรรม CPU ของ Google Pixel 8 Pro:

  • ประสิทธิภาพสูง: 1x 3 GHz Cortex X3 core
  • ประสิทธิภาพปานกลาง: 4x 2.45 GHz Cortex A715 cores
  • ประสิทธิภาพประหยัดพลังงาน: 4x 2.15 GHz Cortex A510 cores
  • รวม: 9 cores

การแก้ไขง่ายๆ และคำถามที่ใหญ่กว่า

นักพัฒนาแก้ไขปัญหาเฉพาะหน้าโดยเพิ่ม Math.trunc() เพื่อลบส่วนทศนิยม: threads = Math.trunc(Math.max(navigator.hardwareConcurrency / 2, 1)); สิ่งนี้ทำให้มั่นใจว่า Pixel 8 Pro ตอนนี้ใช้ 4 workers แทน 4.5 ป้องกันปัญหา decimal nonce

อย่างไรก็ตาม เหตุการณ์นี้ได้จุดประกายการถกเถียงที่กว้างขึ้นเกี่ยวกับระบบ proof-of-work สำหรับการตรวจจับบอท นักวิจารณ์โต้แย้งว่าความท้าทายเหล่านี้กำหนดต้นทุนการคำนวณเดียวกันให้กับผู้ใช้ที่ถูกต้องและ scrapers โดยไม่มีความไม่สมมาตรที่แท้จริงให้ใช้ประโยชน์ ดังที่สมาชิกชุมชนคนหนึ่งกล่าวว่า scrapers ที่ซับซ้อนสามารถปรับตัวเพื่อเอาชนะอุปสรรคดังกล่าวได้อย่างง่ายดาย ในขณะที่ภาระหลักตกอยู่กับผู้ใช้จริงที่มีอุปกรณ์ช้ากว่า

คุณกำลังกำหนดต้นทุนเดียวกันให้กับผู้ใช้ที่ถูกต้องและ scrapers เศรษฐศาสตร์ของขนาดหมายความว่าต้นทุนส่วนเพิ่มสำหรับคู่ต่อสู้ของคุณต่ำกว่าผู้ใช้จริงของคุณอย่างมีนัยสำคัญ

นักพัฒนาตอนนี้กำลังพิจารณาแนวทางทางเลือกอย่าง Proof of React challenges ที่ต้องการการดำเนินการ JavaScript framework เฉพาะแทนที่จะเป็นพลังการคำนวณดิบ พวกเขายังกำลังสำรวจข้อความข้อผิดพลาดที่เข้ารหัสเพื่อช่วยผู้ใช้และผู้ดูแลระบบในการดีบักปัญหาในอนาคตได้ดีขึ้น

บั๊กนี้เป็นเครื่องเตือนใจว่าแม้แต่นักพัฒนาที่มีประสบการณ์ก็สามารถสร้างสมมติฐานที่ไม่ถูกต้องเกี่ยวกับฮาร์ดแวร์ เมื่อการออกแบบ CPU กลายเป็นเรื่องที่หลากหลายและซับซ้อนมากขึ้น โดยเฉพาะในอุปกรณ์มือถือ ซอฟต์แวร์จำเป็นต้องปรับตัวเพื่อจัดการกับความแปรปรวนเหล่านี้อย่างสง่างาม

อ้างอิง: Sometimes CPU cores are odd