กลับสู่บล็อก
การท่องเที่ยวความเป็นส่วนตัว

อวดบัตรขึ้นเครื่องแล้วบัญชีหาย: เราวัดการปิดคิวอาร์โค้ดมาแล้ว

เผยแพร่เมื่อ3 min read
แชร์

ตั๋วใบเดียวบอกอะไรได้บ้าง

เริ่มจากกรณีจริงที่มีบันทึกไว้ ไม่ใช่สถานการณ์สมมติ

ไบรอัน เครบส์ นักข่าวสายความมั่นคงไซเบอร์ เขียนบทวิเคราะห์ไว้เมื่อปี 2015 ผู้อ่านคนหนึ่งชื่อคอรีเห็นเพื่อนโพสต์รูปบัตรขึ้นเครื่องลงเฟซบุ๊ก เขาแคปหน้าจอ ขยายส่วนบาร์โค้ด แล้วส่งเข้าเว็บถอดรหัสบาร์โค้ดฟรีบนอินเทอร์เน็ต ไม่กี่วินาทีต่อมาเขาได้ข้อมูลบัญชีสะสมไมล์ของเพื่อนคนนั้นมาอยู่ในมือ

สิ่งที่เกิดขึ้นหลังจากนั้นคือประเด็นสำคัญ คอรีดูเที่ยวบินในอนาคตทั้งหมดของบัญชีนั้นได้ เปลี่ยนที่นั่งของผู้โดยสารที่ออกตั๋วแล้วได้ และยกเลิกเที่ยวบินใดก็ได้ ที่หนักกว่านั้นคือข้อมูลชุดนี้เพียงพอจะผ่านครึ่งแรกของขั้นตอน «ลืมรหัส PIN» ของสายการบิน

เพื่อนคนนั้นแค่โพสต์รูปเที่ยวด้วยความดีใจ

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

ปิดครึ่งเดียวไม่ได้ผล และเราวัดมาแล้วว่าไม่ได้ผลแค่ไหน

นี่คือส่วนที่เราอยากเขียนที่สุด เพราะการปิดผิดวิธีอันตรายกว่าการไม่ปิดเลย คุณจะคิดว่าปลอดภัยแล้วจึงโพสต์ออกไปอย่างสบายใจ

คิวอาร์โค้ดถูกออกแบบให้มีความสามารถแก้ไขข้อผิดพลาดสูงมาก ข้อกำหนดอนุญาตให้เครื่องสแกนกู้ข้อมูลครบถ้วนแม้บล็อกบางส่วนจะเสียหาย เปื้อน หรือถูกบัง ในโลกจริงคุณสมบัตินี้มีประโยชน์มาก (ตั๋วยับหรือพิมพ์เลอะก็ยังสแกนได้) แต่เมื่อเอามาใช้กับความคิดว่า «ปิดครึ่งหนึ่งก็คงพอ» มันกลายเป็นช่องโหว่ทันที

เราจึงลองวัดเอง

ต้องปิดพื้นที่เท่าไรถึงจะสแกนไม่ออกจริง ๆ

วิธีทดสอบทำซ้ำได้ เราใช้ไลบรารี qrcode ของ Python สร้างคิวอาร์โค้ดวอเชอร์จำลอง โดยเนื้อหาเป็นลิงก์แลกสิทธิ์ที่มีรหัสการจองและรหัสยืนยัน สร้างสามใบตามระดับการแก้ไขข้อผิดพลาด M (15 %), Q (25 %) และ H (30 %) จากนั้นทดสอบการปิดสี่แบบในเจ็ดสัดส่วนพื้นที่ แล้วถอดรหัสด้วย QRCodeDetector ของ OpenCV นับว่า «ยังอ่านออก» เฉพาะเมื่อกู้ลิงก์ต้นฉบับได้ครบถ้วน

ผลออกมาแย่กว่าที่คาด

วิธีปิด เริ่มอ่านไม่ออกที่ (M, 15 %) เริ่มอ่านไม่ออกที่ (Q, 25 %) เริ่มอ่านไม่ออกที่ (H, 30 %)
บล็อกทึบตรงกลาง 15 % ของพื้นที่ 20 % ของพื้นที่ 25 % ของพื้นที่
บล็อกทึบมุมขวาล่าง 20 % ของพื้นที่ 25 % ของพื้นที่ 25 % ของพื้นที่
ขีดเส้นแนวนอน 10 % ของพื้นที่ 20 % ของพื้นที่ 20 % ของพื้นที่
โมเสกตรงกลาง 15 % ของพื้นที่ 20 % ของพื้นที่ 25 % ของพื้นที่

วิธีอ่านตาราง: ตัวเลขคือสัดส่วนที่ เริ่ม อ่านไม่ออก ต่ำกว่านั้นยังสแกนได้ทั้งหมด

มีสามข้อค้นพบที่ควรจำ

ข้อแรก ตั๋วที่ใช้ระดับการแก้ไขข้อผิดพลาดสูงยังสแกนได้แม้ถูกปิดไปหนึ่งในห้าของพื้นที่ ที่ระดับ H เมื่อปิด 20 % ทั้งบล็อกกลาง บล็อกมุม และโมเสก กู้ข้อมูลได้หมดทั้งสามวิธี สี่เหลี่ยมที่คุณระบายทับลงไปแล้วดูใหญ่พอสมควรนั้น จริง ๆ แล้วไม่ได้บังอะไรเลย

ข้อสอง โมเสกกับบล็อกทึบให้ผลแทบเหมือนกันทุกประการ นี่ล้มความรู้สึกที่ว่า «เบลอไว้ก็ยังดีกว่าไม่ทำอะไร» ในการทดสอบของเรา เกณฑ์ที่เริ่มอ่านไม่ออกของสองวิธีนี้เท่ากันทั้งสามระดับ การเบลอไม่ได้ปลอดภัยขึ้น แค่ทำให้ดูเหมือนว่าคุณได้จัดการอะไรไปแล้ว

ข้อสาม การขีดเส้นแนวนอนกลับเป็นวิธีที่ได้ผลที่สุดในสี่วิธี ที่ระดับ M แค่เส้นเดียวกินพื้นที่ 10 % ของความสูงก็สแกนไม่ออกแล้ว เหตุผลคือเส้นแนวนอนพาดข้ามความกว้างทั้งหมดของสัญลักษณ์ ทำให้บล็อกข้อมูลที่เสียหายกระจายอยู่หลายส่วนของการเข้ารหัส ขณะที่สี่เหลี่ยมซึ่งกระจุกอยู่จุดเดียวกลับตกอยู่ในขอบเขตที่การแก้ไขข้อผิดพลาดรับมือได้ดีที่สุดพอดี

พูดตรง ๆ ข้อสามขัดกับข้อสรุปที่เราตั้งใจจะเขียนตั้งแต่แรก คำเตือนที่ว่า «ขีดฆ่าบนตั๋วไม่ได้ทำให้ตั๋วเป็นโมฆะ» นั้นถูกต้อง เพราะประโยคนั้นพูดถึงความมีผลของตั๋วและการอ่านข้อมูลได้ แต่ถ้าคำถามคือ «ระบายแบบไหนกันเครื่องสแกนได้ดีกว่า» ข้อมูลชุดนี้ตอบว่าเส้นแนวนอนชนะสี่เหลี่ยม ความต่างแบบนี้รู้ได้จากการวัดจริงเท่านั้น

ปิดตรงไหนสำคัญกว่าปิดมากแค่ไหน

ข้อค้นพบที่ใช้งานได้จริงที่สุดอยู่ในการทดสอบชุดสุดท้าย

สี่เหลี่ยมใหญ่สามมุมของคิวอาร์โค้ดคือรูปแบบระบุตำแหน่ง (finder pattern) เครื่องสแกนใช้มันกำหนดทิศทางและขอบเขต เราปิดมุมบนซ้ายไปหนึ่งจุด ผลคือ ทั้งสามระดับถอดรหัสไม่ได้เลย ทั้งที่ส่วนนั้นกินพื้นที่เพียง 2.0–3.6 % ของภาพทั้งหมด

พูดอีกอย่างคือ ปิด 2 % ในตำแหน่งที่ถูกต้อง ดีกว่าปิด 20 % ในตำแหน่งที่ผิด

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

ในทางปฏิบัติจึงเหลือมาตรฐานเดียว: ปิดสัญลักษณ์ทั้งอันด้วยสีทึบ ให้เลยขอบออกไป ไม่ใช่ปิดมุมเดียว ไม่ใช่ขีดไม่กี่เส้น ไม่ใช่โมเสก ถ้าเครื่องมือไม่เอื้อ อย่างน้อยขอให้ปิดหนึ่งในสามมุมระบุตำแหน่งให้มิด

ปิดไม่สะอาด เท่ากับไม่ได้ปิด

สามชั้นของการรั่วไหลในภาพแคประหว่างเดินทาง

ภาพแคปที่เกิดขึ้นระหว่างเดินทางแบ่งได้เป็นสามชั้น ซึ่งลักษณะความเสี่ยงต่างกันโดยสิ้นเชิง

ชั้น แหล่งที่มาที่พบบ่อย รั่วไหลอะไร กรณีเลวร้ายที่สุด
ชั้นที่ 1: หลักฐานสิทธิ์ที่สแกนได้ วอเชอร์ Klook/KKday บัตรคอนเสิร์ต บัตรขึ้นเครื่อง ตัวหลักฐานสิทธิ์ รหัสการจอง เบาะแสบัญชีสะสมไมล์ ถูกคนอื่นใช้ก่อน บัญชีถูกยึด
ชั้นที่ 2: ข้อมูลระบุตัวตนแบบตัวอักษร ใบยืนยัน Agoda/Booking.com เลขที่การจอง เลขห้อง ชื่อ วันเข้าพัก ที่อยู่ที่พัก โทรแอบอ้างไปที่โรงแรม การหลอกลวงเชิงจิตวิทยา
ชั้นที่ 3: ข้อมูลฝังในไฟล์ภาพ ใช้อีกเครื่องถ่ายหน้าจอ พิกัด GPS ใน EXIF เวลาถ่าย อุปกรณ์ อนุมานตำแหน่งปัจจุบันหรือที่อยู่อาศัย

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

ชั้นที่ 2 ดูเผิน ๆ ไม่มีพิษภัย แต่จริง ๆ เป็นเชื้อเพลิงของการหลอกลวงเชิงจิตวิทยา ชื่อ + วันเข้าพัก + ชื่อโรงแรม เพียงพอให้คนโทรไปที่แผนกต้อนรับโดยอ้างว่าเป็นคุณเพื่อแก้ไขการจอง หรือกลับกันคือแอบอ้างเป็นโรงแรมโทรหาคุณเพื่อขอ «ยืนยันข้อมูลบัตรอีกครั้ง» การหลอกลวงแบบนี้เพิ่มขึ้นมากในช่วงไฮซีซัน

ชั้นที่ 3 ถูกมองข้ามบ่อยที่สุด ภาพแคปหน้าจอมือถือปกติไม่มี GPS แต่ถ้าคุณ ใช้มืออีกเครื่องถ่ายหน้าจอ รูปนั้นจะติดพิกัดขณะถ่ายไปด้วย กรณีนี้พบบ่อยกว่าที่คิด โดยเฉพาะเวลาต้องส่งหน้าจอคอมพิวเตอร์ให้คนอื่นดู

แล้วถ้าอยากให้เพื่อนร่วมทริปดูกำหนดการล่ะ

นี่คือคำถามที่เป็นจริงที่สุด ข้อมูลกำหนดการจำเป็นต้องแชร์อยู่แล้ว เพื่อนร่วมทริปต้องรู้เวลานัดพบ เนื้อหาบัตร และที่อยู่ที่พัก

ลำดับความสำคัญเป็นแบบนี้

ทางเลือกแรกคือใช้ฟังก์ชันแชร์ของแพลตฟอร์มเอง Klook, KKday, Agoda และอีกหลายเจ้ารองรับการแชร์หรือโอนการจองให้ผู้ร่วมเดินทางอยู่แล้ว การไปตามช่องทางทางการทำให้ความมีผลของหลักฐานสิทธิ์อยู่ในการควบคุมของแพลตฟอร์ม และไม่เกิดภาพแคปที่ลอยไปทั่ว

ทางเลือกที่สองคือส่งข้อความ ไม่ส่งภาพ «26/9 เก้าโมงเช้า ประตูหน้า บัตรอยู่กับเรา» — ประโยคนี้มีข้อมูลที่จำเป็นครบและความเสี่ยงเป็นศูนย์

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

ถ้าใช้ lpic.cc จะตั้งรหัสผ่านสำหรับดูตอนอัปโหลดได้ ลิงก์สั้นที่ได้มาต่อให้ถูกส่งต่อ คนที่ไม่มีรหัสผ่านก็เปิดไม่ได้ รหัสผ่านถูกเก็บแบบแฮชด้วย bcrypt ไม่ใช่การเทียบข้อความธรรมดา สำหรับภาพกำหนดการที่ «อยากให้เฉพาะห้าคนนี้ดู» วิธีนี้ควบคุมได้ดีกว่าการโยนเข้ากลุ่มแล้วปล่อยให้ไหลไปเอง

ข้อจำกัดขอบอกไว้ก่อนเช่นกัน: รูปภาพไม่เกิน 8 MB ไฟล์ถูกเก็บ 30 วันนับจากการเปิดดูครั้งล่าสุด และไฟล์ที่อัปโหลดจะถูกปรับให้เหมาะสมอัตโนมัติ ไฟล์ต้นฉบับจึงไม่ถูกเก็บไว้ นอกจากนี้ — รหัสผ่านกันคนที่ไม่ควรเห็นได้ แต่กันคนที่มีสิทธิ์ดูแล้วแคปหน้าจอส่งต่อไม่ได้ กลไกการแชร์ทุกแบบมีเพดานนี้เหมือนกัน อย่าคิดว่ามันแก้ได้ทุกอย่าง

แนวป้องกันสุดท้ายยังคงเป็นประโยคเดิม: หลักฐานสิทธิ์ที่อ่อนไหวจริง ๆ ตั้งแต่แรกก็ไม่ควรกลายเป็นไฟล์ภาพ

คำถามที่พบบ่อย

ถาม 1: โพสต์รูปบัตรขึ้นเครื่องไปนานแล้ว ตอนนี้ลบยังทันไหม

การลบช่วยลดการเปิดเผยต่อจากนี้ แต่สมมติว่าไม่มีใครเก็บไว้ไม่ได้ สิ่งที่สำคัญกว่าคืออีกสองอย่าง: เปลี่ยนรหัสผ่านและคำถามความปลอดภัยของบัญชีสายการบินนั้นทันที และตรวจสอบว่าการจองในอนาคตถูกแก้ไขหรือไม่ ในกรณีของเครบส์ สิ่งแรกที่ผู้โจมตีทำได้คือเปลี่ยนที่นั่งและยกเลิกเที่ยวบิน

ถาม 2: วอเชอร์ Klook ถูกคนอื่นสแกนไปแล้ว ไปถึงหน้างานยังเข้าได้ไหม

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

ถาม 3: เบลอโมเสกทับคิวอาร์โค้ดพอไหม

ไม่พอ และเราวัดมาแล้วว่ามันแทบไม่ได้ดีกว่าเลย ทั้งสามระดับการแก้ไขข้อผิดพลาด เกณฑ์ที่เริ่มอ่านไม่ออกของโมเสกกับบล็อกทึบเท่ากันพอดี ตั๋วระดับสูงต้องปิดถึง 25 % ของพื้นที่จึงจะสแกนไม่ออก ให้ใช้บล็อกสีทึบปิดทั้งบริเวณรหัส หรือดีกว่านั้นคือใช้วัตถุบังตั้งแต่ตอนถ่าย

ถาม 4: ใบยืนยันมีแค่เลขที่การจองกับชื่อ แบบนี้เสี่ยงไหม

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

ถาม 5: แล้วรูปเที่ยวเองล่ะ ต้องจัดการไหม

ความเสี่ยงคนละแบบ ฝั่งรูปประเด็นหลักคือพิกัด GPS ใน EXIF แพลตฟอร์มโซเชียลส่วนใหญ่ลบ EXIF ตอนอัปโหลด แต่การแชร์ผ่านไดรฟ์คลาวด์หรือส่ง «ไฟล์ต้นฉบับ» มักเก็บไว้ครบ วิธีจัดการของแต่ละบริการอยู่ในรายงานตรวจ EXIF รายฟิลด์ของ 8 บริการ

แหล่งอ้างอิง

#คิวอาร์โค้ด#บัตรขึ้นเครื่อง#ความเป็นส่วนตัว#วอเชอร์อิเล็กทรอนิกส์#บัญชีถูกยึด#ข้อมูลรั่วไหล#ทดสอบความปลอดภัย
K

เขียนโดย

Kevin Wu

ที่ปรึกษาด้านความปลอดภัย

ผู้เชี่ยวชาญด้านความเป็นส่วนตัวและความปลอดภัยของข้อมูล