- การอัปเดต MV3 ของ Chrome ได้ลบสิทธิ์
webRequestBlockingออกไปเพื่อทำให้ความสามารถของแอดบล็อกเกอร์แบบเดิมอ่อนลง - ผู้เขียนค้นพบบั๊กในปี 2023 ที่ทำให้สามารถ หลบเลี่ยง
webRequestBlockingได้แม้อยู่ใน สภาพแวดล้อม MV3 - บั๊กนี้เกิดจาก โครงสร้าง JavaScript binding ที่หละหลวม และ โค้ดเก่า ที่ยังคงเหลืออยู่
- ด้วยการปรับแต่ง WebView instance ID เพื่อข้ามการตรวจสอบสิทธิ์ จึงสามารถใช้ความสามารถในการบล็อกได้แม้ในสภาพแวดล้อม MV3
- ปัจจุบันมีการ แพตช์แล้ว และวิธีหลบเลี่ยงนี้ไม่สามารถใช้งานได้อีกต่อไป
MV3 และการเปลี่ยนแปลงของแอดบล็อกเกอร์
- Chrome กำลังทยอยยกเลิก ส่วนขยาย MV2 และเปลี่ยนผ่านไปสู่ MV3 แทน
- MV3 ลบสิทธิ์
webRequestBlockingออกไป ทำให้แอดบล็อกเกอร์ไม่สามารถบล็อกคำขอเครือข่ายแบบไดนามิกด้วยสคริปต์ได้ - แม้จะมีการเพิ่ม API
declarativeNetRequestเข้ามาแทน แต่ก็ไม่รองรับความยืดหยุ่นในระดับเดียวกัน - การเปลี่ยนแปลงนี้ส่งผลให้ประสิทธิภาพของแอดบล็อกเกอร์ลดลงอย่างมาก
ข้อจำกัดของโครงสร้าง JavaScript binding
- แม้แกนหลักของ Chrome จะพัฒนาด้วย C++ แต่ ส่วนขยายทำงานด้วย JavaScript และ API ของส่วนขยายก็เข้าถึงผ่าน JS binding
- จนถึงช่วงปี 2015~2016 มีการแทรกไฟล์ JS (โมดูล extension binding) ลงในเว็บไซต์เพื่อเริ่มต้นและตรวจสอบ API
- วิธีนี้เปราะบางต่อการ override ฟังก์ชัน global และ prototype ของ JS จนทำให้เกิดบั๊ก Universal XSS หลายรายการ
- หลังจากนั้น Google ได้ย้าย binding หลักไปยัง C++ แต่ไฟล์ JS binding บางส่วนยังคงหลงเหลืออยู่
- จนถึงตอนนี้ API บางตัว เช่น
chrome.webRequestก็ยังใช้โครงสร้าง JS binding อยู่
การหลบเลี่ยงด้วยคลาสเหตุการณ์เว็บรีเควสต์
-
ใน MV2 สามารถทำ การบล็อกเว็บรีเควสต์ ได้ด้วยโค้ดด้านล่าง
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
แต่ใน MV3 ตัวเลือก
blockingถูกห้ามใช้ จึงไม่สามารถบล็อกได้ตามปกติ -
อย่างไรก็ตาม สามารถสร้างอ็อบเจ็กต์ event ตามต้องการได้ผ่าน
.constructorของ webRequest event -
ภายในนั้น อ็อบเจ็กต์ event นี้ถูกจัดการโดยคลาส wrapper พิเศษของ JS binding
-
หากระบุ
opt_webViewInstanceIdซึ่งเป็นหนึ่งในพารามิเตอร์ของ constructor ก็จะสามารถข้ามตรรกะการอนุญาตที่สงวนไว้สำหรับ platform app และทะลุการตรวจสอบสิทธิ์ของการบล็อกได้let WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
เดิมถูกออกแบบให้ใช้ได้เฉพาะกับ platform app เท่านั้น แต่เนื่องจากการตรวจสอบ WebView ID ไม่รัดกุม จึงถูกนำไปใช้ในทางที่ผิดกับส่วนขยายทั่วไปได้
ผลลัพธ์และแพตช์ด้านความปลอดภัย
- ช่องโหว่นี้ทำให้สามารถพัฒนาแอดบล็อกเกอร์ที่สมบูรณ์แบบได้จริงแม้อยู่ในสภาพแวดล้อม MV3
- ผู้เขียนได้รายงานบั๊กนี้ต่อ Google ในปี 2023 และมีการแพตช์ใน Chrome 118 โดยเปลี่ยนไปตรวจสอบการครอบครองสิทธิ์ของ WebView อย่างถูกต้อง
- ไม่มีการจ่ายเงินรางวัล เนื่องจากลักษณะของช่องโหว่นี้เป็นการข้ามสิทธิ์เท่านั้น โดยไม่มีการเปิดเผยข้อมูลเพิ่มเติม
- กรณีนี้แสดงให้เห็นว่า การแก้โค้ดเพียงไม่กี่สิบบรรทัดก็สามารถทำให้การอัปเดตความปลอดภัยของบริษัทยักษ์ใหญ่ไร้ผลได้
บทสรุปและข้อมูลอ้างอิง
- บั๊กนี้ถูกแพตช์แล้วและไม่สามารถใช้งานได้อีกต่อไป
- ในทำนองเดียวกัน ยังมีกรณี ช่องโหว่ที่เกี่ยวข้องกับ Chrome extension ที่น่าสนใจ โดยมีเคสที่ได้รับหมายเลข CVE และเงินรางวัล $10,000 จริงด้วย (ดูจากบล็อกโพสต์แยก)
4 ความคิดเห็น
หลังอัปเดตนั้น น่าจะทำให้ผู้ให้บริการ adblock มียอดขายเพิ่มขึ้นอีกด้วย
แอปแบบสแตนด์อโลนที่บล็อกตั้งแต่ระดับเครือข่ายใช้งานได้เฉพาะแบบเสียเงินเท่านั้น เลยน่าจะขายได้ค่อนข้างมาก
ผ่านมาแล้วตั้ง 2 ปี เอาช่องโหว่ที่ตอนนี้ไม่มีความหมายอะไรแล้วมาลง แถมยังต้องพูดด้วยว่าไม่ได้รับเงิน... ส่วนตัวผมว่าไม่ค่อยคูลเท่าไรนะ
แต่ก็คงต้องเขียนอะไรแบบนี้ลงบล็อกเพื่อพิสูจน์คุณค่าของตัวเองสินะ?
พูดจากใจเลยว่าผมเองก็อยากเรียนรู้วิธีคิดแบบนี้ แล้วจะได้เขียนบล็อกเยอะ ๆ บ้าง
ก็ใช้ Firefox ไปเลยครับ/ค่ะ ช่วง 1–2 ปีที่ผ่านมาเร็วขึ้นมาก เลยไม่ได้แย่อะไร
ผม/ฉันใช้ Firefox เป็นหลักมาหลายปี และก็ลองเทียบกับ Chrome เป็นครั้งคราว โดยเฉพาะช่วงหลัง ๆ รู้สึกว่า Firefox ใช้งานได้ดีพอแล้ว
แม้แต่เว็บที่เคยไม่สนใจมาตรฐานเว็บอย่างเว็บของธนาคารเกาหลี ช่วงหลังก็แก้ไขไปเยอะแล้ว ทำให้ส่วนใหญ่ใช้งานบน Firefox ได้ดี
เรื่องการปรับแต่งก็ทำได้ง่ายกว่าใน Firefox มากครับ/ค่ะ
ความคิดเห็นจาก Hacker News
แม้อยากลองใช้ Firefox อยู่บ้าง แต่สิ่งที่ติดขัดที่สุดคือบั๊กการโหลดเว็บไซต์ที่โผล่มาเป็นครั้งคราว และการที่ติดตั้ง PWA (Progressive Web Apps) ไม่ได้ เบราว์เซอร์ Chrome และสายตระกูลเดียวกันรองรับฟีเจอร์นี้มานานแล้ว เลยไม่ค่อยเข้าใจว่าทำไม Firefox ยังไม่ทำสักที ถึงจะหาเอกซ์เทนชันจากบุคคลที่สามได้ (PWAs for Firefox) แต่ก็ไม่ค่อยกล้าใช้ในแง่ความเป็นส่วนตัว
ต่อให้มีวิธีเลี่ยงพฤติกรรมของ Google ได้ ก็คิดว่านั่นไม่ใช่ทิศทางที่ถูกต้อง ถ้าผู้คนไม่เห็นด้วยกับสิ่งที่ Google กำลังทำ วิธีที่ถูกต้องมีแค่อย่างเดียวคือเลิกใช้ Chrome และเบราว์เซอร์ที่อิง Chromium ทั้งหมด สิ่งสำคัญคือต้องกระทบต่อการผูกขาดของ Google และดึงอำนาจในการกำหนดอนาคตของเว็บกลับมา
วิธีเลี่ยงที่แท้จริงคือใช้ Firefox เพราะ uBlock Origin ทำงานได้ดีที่สุดบน Firefox
uBlock Origin works best on Firefox
ก็ยังสงสัยว่า MV3 ปลอดภัยกว่า MV2 จริงหรือเปล่า การเปลี่ยนไปใช้ MV3 ดูไม่ได้ทำให้ความปลอดภัยดีขึ้นอย่างมีนัยสำคัญ
มีความเห็นต่อกรณีที่มีคนค้นพบวิธีเลี่ยง adblocker แล้วไปบอก Google ว่า “เจอแล้วก็รีบไปฟ้อง Google เลยนะ เจ๋งจริง”
OP ไปรายงาน “issue” ที่ไม่ได้เป็นปัญหาสำหรับ Google เลย ทำให้นักพัฒนาแอดออนหมดทางเลี่ยงข้อจำกัดของ MV3 หวังว่ามันจะคุ้มค่า $0 นะ
ตั้งแต่เริ่มใช้ Brave ก็ไม่คิดถึง Chrome เลย
Brave
Stop using Brave browser
สำหรับข้ออ้างที่ว่า "adblocker จำเป็นต้องใช้ webRequestBlocking และ Google ตัดฟีเจอร์นี้ออกอย่างจงใจมากเพราะหารายได้จากโฆษณา" ก็มีความเห็นโต้แย้งว่า "มันไม่จริง ใคร ๆ ก็ใช้ uBlock Origin Lite บน Chrome และ manifest v3 ได้ ประสิทธิภาพก็ดีและแทบไม่รู้สึกต่างจาก uBlock Origin เดิม ทุกอย่างถูกกรองใน C++ เลยเร็วกว่าเยอะ แน่นอนว่ามีข้อจำกัดเรื่องจำนวน rule สูงสุด แต่ตอนนี้ก็ยังรับมือได้ดีพอ"
นอกจากโน้ตบุ๊กที่ใช้ทำงานแล้ว ผมแทบไม่มีเหตุผลต้องใช้ Chrome เลย ปกติก็ใช้ Firefox ต่อเนื่องอยู่แล้ว ถึงอย่างนั้นก็ยังเสียดายที่คงใช้ uBlock Origin ไม่ได้บนการท่องเว็บเพื่อการทำงาน เช่น ค้นข้อมูลหรืออ่านเอกสาร
ถ้าแค่อยากเลี่ยง ก็แค่ติดตั้ง Firefox