- สคริปต์ที่ทำให้ ขั้นตอนยืนยันอายุของหลายแพลตฟอร์มผ่านเป็นผู้ใหญ่อัตโนมัติ
- หาก วางโค้ดแล้วรันในคอนโซลของ Discord ระบบจะส่งคำขอ API ไปยัง
/age-verification/verify โดยอัตโนมัติ และย้ายไปยังหน้าการยืนยันเสร็จสิ้น
- บน แพลตฟอร์มอื่นอย่าง Twitch, Kick, Snapchat ก็สามารถยืนยันด้วยวิธีเดียวกันได้โดยกรอก URL ของ QR code
- เครื่องมือนี้อาศัยช่องโหว่ของ โครงสร้างการประมวลผลข้อมูลใบหน้าของระบบ k-id เพื่อสร้างเมทาดาทาที่ดูถูกต้องตามกฎหมายได้แม้ไม่มีใบหน้าจริง
- เป็นวิธีที่ คัดลอกการเข้ารหัส AES-GCM และโครงสร้างข้อมูลที่คาดเดาได้ เพื่อให้ผ่านขั้นตอนตรวจสอบ โดยสร้างขึ้นตามกระแสการขยายการยืนยันอายุในระดับโลก
ขั้นตอนการยืนยันบน Discord
- เป็นวิธีการคัดลอกและรันสคริปต์เฉพาะใน Developer Console (F12) ของเว็บแอป Discord
- สคริปต์จะดึง webpack module cache ของ Discord ออกมา ค้นหา API client ภายใน แล้วส่งคำขอไปยังเอ็นด์พอยต์
/age-verification/verify
- จากนั้นจะรีไดเรกต์
verification_webview_url ที่ได้จากผลลัพธ์ของคำขอไปยัง age-verifier.kibty.town
- ผู้ใช้เพียง แก้แคปช่าแล้วรอจนกว่าหน้าจะแสดงคำว่า “success” ก็ถือว่ายืนยันเสร็จสิ้น
- ด้วยกระบวนการนี้ บัญชี Discord จะถูก แสดงว่าอยู่ในสถานะยืนยันว่าเป็นผู้ใหญ่แล้ว
วิธีการยืนยันบนแพลตฟอร์มอื่น (Twitch, Kick, Snapchat ฯลฯ)
- ใน หน้าการยืนยันอายุของแต่ละแพลตฟอร์ม ให้เลือกตัวเลือก ‘selfie’ แล้วคัดลอก URL ของ QR code ที่แสดงอยู่
- วาง URL ดังกล่าวลงในช่องกรอกของ
age-verifier.kibty.town แล้ว คลิกปุ่ม ‘verify’
- หลังจากนั้นขั้นตอนการยืนยันจะดำเนินไปโดยอัตโนมัติและแสดงข้อความว่าสำเร็จ
หลักการทำงาน
- ระบบยืนยันอายุ k-id ที่ Discord ใช้งานไม่ได้ส่งวิดีโอใบหน้าไปยังเซิร์ฟเวอร์ แต่ส่งเพียง เมทาดาทาที่เกี่ยวข้องกับใบหน้าและรายละเอียดของกระบวนการ
- ด้วยโครงสร้างนี้ หาก ดัดแปลงและส่งเมทาดาทาให้ดูถูกต้องตามกฎหมาย ก็สามารถผ่านการยืนยันได้โดยไม่ต้องมีใบหน้าจริง
- หลังจากที่เคยมีการเปิดเผย k-id verifier ของ amplitudes มาก่อน พาร์ตเนอร์อย่าง faceassure ก็เพิ่มความเข้มงวดในการตรวจสอบ แต่เครื่องมือนี้ยังเลี่ยงได้ด้วยวิธีใหม่
รายละเอียดทางเทคนิคของขั้นตอน
- ขั้นที่ 1: คัดลอกพารามิเตอร์การเข้ารหัส
- เมื่อนำไปเทียบกับคำขอที่ถูกต้องตามปกติ พบว่ามีพารามิเตอร์
encrypted_payload, auth_tag, timestamp, iv ที่ขาดหายไป
- ใช้การเข้ารหัสแบบ AES-GCM โดยสร้างคีย์จากการนำ
nonce + timestamp + transaction_id ไปอนุพันธ์ด้วย HKDF(SHA-256)
- จากนั้นจึงสร้างพารามิเตอร์ที่ขาดหายไปขึ้นมาโดยจำลองโครงสร้างเดียวกัน
- ขั้นที่ 2: ดัดแปลงข้อมูลการคาดการณ์
- เมื่อคัดลอกการเข้ารหัสได้สมบูรณ์แล้วแต่ยังล้มเหลว จึงพบว่า การตรวจสอบพึ่งพา ‘prediction arrays’ (outputs, primaryOutputs, raws)
- สร้าง
outputs และ primaryOutputs จากข้อมูล raws โดยใช้ z-score เพื่อตัดค่าผิดปกติออก
- นอกจากนี้ยังมีการตรวจสอบเงื่อนไขต่อไปนี้
- ค่า
xScaledShiftAmt, yScaledShiftAmt ต้องเป็นหนึ่งในสองค่าที่กำหนดเท่านั้น
- ชื่อสื่อ (กล้อง) ต้องตรงกับรายการอุปกรณ์จริง
- เวลาที่สถานะเสร็จสมบูรณ์ต้องสอดคล้องกับไทม์ไลน์
- มีการเผยแพร่ โค้ดโอเพนซอร์สที่ทำกระบวนการเหล่านี้ครบถ้วน ไว้แล้ว และทุกคนสามารถตรวจสอบได้
การเปิดเผยและที่มาของการพัฒนา
- ผู้สร้างกล่าวขอบคุณ xyzeva, Dziurwa และ amplitudes ที่เคยทำงานที่เกี่ยวข้องมาก่อน
- มีการอธิบายว่า Discord มีแผน บังคับใช้การยืนยันอายุทั่วโลกอย่างเต็มรูปแบบในเดือนมีนาคม จึงได้ทดลองค้นหาวิธีใหม่ในการเลี่ยงการตรวจสอบนี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
วิธีที่ แข็งแกร่งจริง ๆ คือสร้างสัญญาณวิดีโอเทียมแทนการใช้เว็บแคมจริง
คิดว่าไม่มีแพลตฟอร์มไหนป้องกันสิ่งนี้ได้
ต่อให้แพลตฟอร์มต้องการ อินพุตกล้องที่ปลอมแปลงได้ยาก แบบโทรศัพท์มือถือ ก็แค่วางกล้องไว้หน้าจอความละเอียดสูงก็จบ
เกมแมวจับหนู แบบนี้คงอยู่ได้ไม่นาน
การยืนยันอายุด้วยวิดีโอเซลฟีที่ไม่สมบูรณ์แบบกลับเป็นผลดีกับทุกฝ่าย
คนที่มีสามัญสำนึกไม่ต้องอัปโหลดใบขับขี่หรือพาสปอร์ต และแพลตฟอร์มก็รักษาผู้ใช้ไว้ได้ง่ายขึ้น
เว็บโป๊ก็สร้างบัญชีผู้ใช้เพื่อติดตามและเพิ่มรายได้โฆษณาได้
นักการเมืองก็ประกาศได้ว่า “เราได้นำนโยบายจำกัดอายุมาใช้แล้ว” และผู้ปกครองก็สบายใจว่าลูกไม่ได้ดูสื่อลามก
สุดท้ายแล้วมันคือโครงสร้างที่ ทุกฝ่ายชนะ
วิธีตรวจสอบแบบนี้สุดท้ายก็น่าจะไปในทิศทางนั้น
บางทีหนึ่งในเหตุผลที่ Google ดันแอปเฉพาะบน Play Store ก็คงเพื่อสร้าง ซอฟต์แวร์เชนที่ตรวจสอบได้ แบบนี้
ท้ายที่สุดแล้วมันก็เป็นปัญหาระดับ แค่สับสวิตช์ตัวเดียว
ถ้ามาคู่กับการทำแผนที่ 3D กลเม็ดแบบเอาหน้าจอไปฉายคงใช้ไม่ได้
ปัญหาคือบริการยืนยันอายุแบบของ Discord ไม่ได้พยายามอย่างจริงจัง
ผมแค่จะไม่เล่นเกมนี้และ เลิกใช้แพลตฟอร์มไปเลย
วิธีนี้มีปัญหาอยู่สามข้อ
นี่เป็น ตัวอย่างงานวิศวกรรมย้อนกลับที่ยอดเยี่ยม ซึ่งแสดงให้เห็นว่าการตรวจสอบโดยไม่ละเมิดความเป็นส่วนตัวนั้นยากแค่ไหน
โค้ดถูกเปิดเผยไว้แล้ว ดังนั้นประเด็นเรื่องการรันโค้ดตามอำเภอใจ (#3) จึงไม่เข้าข่าย
ถ้าบริษัทตอบโต้ด้วยวิธีที่ล่วงล้ำกว่าเดิม (#2) ผู้ใช้ก็ย้ายแพลตฟอร์มได้เสมอ
คิดว่าเป็นไอเดียที่ ฉลาดพอตัว
ดูเหมือน Discord จะผ่อนการยืนยันอายุให้เหลือแค่ระดับที่พอจะบอกหน่วยงานกำกับดูแลได้ว่า “เรามีมาตรการปกป้องเด็กอยู่นะ”
แต่ถ้ารัฐบาลเริ่มจับตาจริงจัง วิธีแบบนี้คงอยู่ได้ไม่นาน
ตอนนี้บางประเทศเริ่ม要求 การยืนยันตัวตนชีวมิติที่เข้มงวดยิ่งขึ้น แล้ว และบางบริการก็กำลังย้ายไปใช้การยืนยันผ่านแอปมือถือ
กลเม็ดแบบ JavaScript ล้วน ๆ จะใช้ไม่ได้ผลมากขึ้นเรื่อย ๆ
แนะนำให้ห่อโค้ดไว้ด้วยฟังก์ชันที่เรียกใช้ทันที (IIFE) ตอนรัน
บน macOS Safari มันใช้ไม่ได้ เพราะไม่รองรับ top-level await
ดูข้อมูลที่เกี่ยวข้องได้ที่ caniuse.com/wf-top-level-await
ตอนนี้ตามหลังไปแล้วราว 5 ปี
ลองแล้ว ระบบรีไดเรกต์ไปที่ https://age-verifier.kibty.town/webview?url=null
และขึ้นข้อความ
{"error":"error parsing webview url"}ดูเหมือนว่าบัญชี Discord ของผมกำลังอยู่ในการ ทดสอบ A/B เลยใช้ผู้ให้บริการยืนยันตัวตนเจ้าอื่นชื่อ Persona
ลองค้นหาดูจะเจอข้อมูลเพิ่มเติม
ใช้งานได้จริง
ผมได้รับข้อความจาก Discord ว่า “ถูกจัดว่าเป็นกลุ่มผู้ใหญ่แล้ว”
(เสียงบรรยาย) และในวินาทีนั้นเอง ผมก็ตระหนักว่าบัญชีถูกแฮ็กแล้ว ;)
หวังว่าบัญชีอายุ 11 ปีของผมจะไม่เกิดปัญหา แต่ถ้ามันขอใบหน้าหรือเอกสารยืนยันตัวตน ผมคง ลบบัญชีทิ้ง
ไม่เข้าใจว่าทำไมคนรุ่นใหม่ถึงยัง ยึดติด กับบริการที่เป็นปฏิปักษ์กับตัวเองขนาดนั้น
ความสะดวกของการอยู่บนแพลตฟอร์มที่ไม่ชอบ มันมากกว่าความพยายามในการหาทางเลือกจริงหรือ?
เด็กรุ่นนี้จำนวนมากแทบไม่คุ้นกับเทอร์มินัลหรือแม้แต่แนวคิดเรื่องพาธไฟล์
พวกเขาอาจค้นหาเป็น แต่การตั้งค่าทางเลือกด้วยตัวเองเป็นอีกเรื่องหนึ่ง
ที่สำคัญกว่านั้นคือ แทบไม่มีการรับรู้เลยว่าทางเลือกอาจมีอยู่จริง
แพลตฟอร์มเปิดอย่าง Matrix ยังขาดฟีเจอร์อยู่ และ Discord ก็เป็น ตัวเลือกที่แย่น้อยที่สุด ในตอนนี้
เพื่อน ๆ อยู่ที่นั่น ผมก็เลยอยู่ที่นั่น
ทุกครั้งที่ย้ายแพลตฟอร์ม สมาชิกจะลดลงและชุมชนก็พังทลาย
สิ่งที่ถูกเรียกว่า “ความพยายามเล็กน้อย” จริง ๆ แล้วคือการฆ่าชุมชน
ต่อให้ใช้แพลตฟอร์มอื่น สุดท้ายก็ เหลืออยู่คนเดียว
แทบเป็นไปไม่ได้เลยที่จะทำให้ทุกคนย้ายพร้อมกัน
ผ่านแคปช่าบน Discord ได้แล้ว แต่
มีข้อผิดพลาดว่า
{"error":"failed to execute k-id privately action (status=404)"}ทั้งที่ผมเป็นผู้ใหญ่อย่างชัดเจน ขั้นตอนแบบนี้มัน เหลวไหลสิ้นดี
จะโดนแบนก็ไม่สน
สรุปข่าวที่เกี่ยวข้อง
เกมแมวจับหนู ของการยืนยันอายุดิจิทัลเป็นภาระด้านกฎระเบียบมหาศาล
ถ้าหลบเลี่ยงได้ง่ายขนาดนี้ แพลตฟอร์มก็แค่ติ๊ก ช่องทำตามกฎระเบียบ เท่านั้น
และฐานความเชื่อถือที่แท้จริงก็เปราะบางมาก
แต่บริษัทไม่ชอบ เพราะจะไม่ได้ครอบครอง ข้อมูลผู้ใช้ผู้ใหญ่ที่ผ่านการยืนยันแล้ว
ดูเพิ่มเติมได้ที่ บล็อก Age Assurance Europe ของ Google
จุดประสงค์ของระบบแบบนี้ไม่ใช่การปิดกั้นอย่างสมบูรณ์ แต่คือ เพิ่มแรงเสียดทานเพื่อไม่ให้คนทั่วไปหลบเลี่ยงได้ง่าย ๆ