ได้ root shell จากเครื่องรูดบัตรเครดิต
(stefan-gloor.ch)- มีการลองทำรีเวิร์สเอนจิเนียริง เครื่องรูดบัตรเครดิต Worldline Yomani XR เพื่อการวิจัยด้านความปลอดภัย
- ระหว่างการแกะอุปกรณ์ พบว่าฟังก์ชัน ตรวจจับการงัดแงะทางกายภาพ ถูกออกแบบมาอย่างดี แต่มีปัญหาที่ root shell ถูกเปิดเผยผ่านพอร์ตซีเรียลภายนอก ในระดับซอฟต์แวร์
- จากการถอดชิปหน่วยความจำ ดึงเฟิร์มแวร์ และวิเคราะห์ พบโครงสร้างระบบที่ใช้ ลินุกซ์เคอร์เนล 3.6 และคอมโพเนนต์ที่เก่ามากหลายรายการ
- พิสูจน์ได้ว่าสามารถยกระดับเป็นสิทธิ์ root และติดตั้งมัลแวร์ได้ง่ายผ่าน พอร์ตซีเรียลคอนโซล โดยไม่ต้องรื้ออุปกรณ์
- งานสำคัญทั้งหมดที่เกี่ยวข้องกับการชำระเงินและการยืนยันตัวตนทำงานอยู่บน โปรเซสเซอร์ความปลอดภัยแยกต่างหาก จึงมีความเสี่ยงที่ข้อมูลสำคัญจะรั่วไหลจริงไม่มากนัก
ภาพรวมของโครงการ
- โครงการนี้มุ่งเน้นกระบวนการย้อนวิศวกรรม Worldline Yomani XR เพื่อการวิจัยด้านความปลอดภัยของ เครื่องชำระเงิน
- รุ่นนี้ถูกใช้อย่างแพร่หลายทั่วสวิตเซอร์แลนด์ แม้ปัจจุบันจะเลิกผลิตแล้ว แต่ยังคงถูกใช้งานในร้านค้าปลีกขนาดใหญ่และร้านขนาดเล็กจำนวนมาก
การสังเกตเบื้องต้นและการถอดฮาร์ดแวร์
- หลังจากตรวจสอบพื้นฐาน เช่น การสำรวจ UI และการสแกนพอร์ต ก็เริ่มถอดฮาร์ดแวร์
- พบว่ามีการออกแบบด้านความปลอดภัยฮาร์ดแวร์ค่อนข้างสูง ทั้ง PCB หลายแผ่น โครงเครื่องที่ประกอบอย่างดี และโปรเซสเซอร์ Arm แบบดูอัลคอร์ที่ใช้ ASIC แบบคัสตอม
- SoC หลักคือ ASIC เฉพาะทางที่มีโค้ดเนมว่า Samoa II โดยติดตั้งแฟลชและ RAM ภายนอก
การตรวจจับการบุกรุกและการป้องกันการงัดแงะ
- แม้ไม่เปิดโครงเครื่อง ก็สามารถตรวจพบเหตุการณ์บุกรุกได้จากความผิดปกติของ การเชื่อมต่อบอร์ดแบบตรวจจับแรงกด (Zebra strip) หรือเพียงแค่น็อตคลาย
- ระบบตรวจจับยังคงทำงานต่อได้แม้ในสถานการณ์ที่ไฟหลักถูกตัด โดยอาศัยแบตเตอรี่
- บน PCB หลักมี ลายวงจรแบบซิกแซก (trace) และมี แผ่น PCB แบบยืดหยุ่น ที่หุ้มตัวอ่านบัตร ซึ่งหากเสียหายจะถูกตรวจจับว่าเป็นการบุกรุก
- เมื่อลองถอดแล้วประกอบกลับในช่วงสั้น ๆ อุปกรณ์จะแสดงเพียงหน้าจอสีแดง "TAMPER DETECTED" และไม่ตอบสนองต่ออินพุตจากภายนอก
การดึงเฟิร์มแวร์แบบ chip-off
- มีการถอด แฟลชออนบอร์ด ออกด้วยการดีซอลเดอร์ แล้วเชื่อมต่อโดยตรงเพื่อดึงเฟิร์มแวร์
- ข้อมูลไม่ได้ถูกเข้ารหัส แต่พบโครงสร้าง ECC ที่ไม่เหมือนทั่วไป และการจัดวางเมทาดาทาของระบบไฟล์ YAFFS2
- มีการพัฒนาโปรแกรมอ่านระบบไฟล์ขึ้นมาเพื่อดึงรายการไฟล์ทั้งหมด
- ระบบใช้ เคอร์เนล 3.6 ที่อิงกับ Buildroot เวอร์ชันปี 2010 พร้อม uClibc, busybox และไลบรารีเก่าอีกจำนวนมาก
กระบวนการค้นพบ root shell โดยบังเอิญ
- หลังวิเคราะห์เฟิร์มแวร์แล้ว จึงเชื่อมต่อแฟลชกลับเข้าไปและค้นหาสายซีเรียลคอนโซล ก่อนจับสัญญาณด้วยลอจิกอะนาไลเซอร์
- พบ พรอมป์ตล็อกอิน ปรากฏขึ้นพร้อมบันทึกการบูต
- เมื่อพิมพ์ "root" ก็สามารถ เข้าสู่ root shell ได้ทันที โดยไม่ต้องใช้รหัสผ่าน
- ในความเป็นจริง พอร์ตซีเรียลนี้ เข้าถึงได้จากภายนอกทันทีหากเปิดเพียงฝาครอบ
- ผู้โจมตีจึงสามารถเชื่อมต่อได้อย่างรวดเร็วโดยไม่ต้องรื้อเครื่อง และอาจฉีดมัลแวร์เข้าไปได้
ปัญหานี้ร้ายแรงแค่ไหน?
- จากการวิเคราะห์กระบวนการบูตและโครงสร้างระบบ พบว่าลินุกซ์รับผิดชอบเพียงเครือข่าย การอัปเดต และบิสซิเนสลอจิกบางส่วน
- ฟังก์ชันที่เกี่ยวข้องกับความปลอดภัยทั้งหมด เช่น การชำระเงินผ่านบัตร การป้อน PIN และการแสดงผล ถูกจัดการโดย โปรเซสเซอร์ mp1 แยกต่างหาก
- ฝั่งลินุกซ์ (mp2) จะบูตขึ้นมาก่อนเสมอ จากนั้น อิมเมจที่มีการลงลายเซ็นและเข้ารหัส จะถูกโหลดเข้าสู่คอร์ความปลอดภัยโดยบูตโหลดเดอร์แบบปลอดภัย
- ภายในเครื่อง กลไกปกป้องคอร์ความปลอดภัยยังทำงานได้ตามปกติ และ ข้อมูลแกนหลักด้านความปลอดภัยจะไม่รั่วไหลเพราะการเปิดเผย root shell
ไทม์ไลน์การเปิดเผยและการรายงาน
- 14 พฤศจิกายน 2024: ค้นพบ root shell
- 15 พฤศจิกายน 2024: แจ้งผู้ผลิตพร้อมกำหนดเปิดเผยภายใน 90 วัน
- 18 พฤศจิกายน 2024: ได้รับการยืนยันการรับรายงานจากผู้ผลิต
- 1 มิถุนายน 2025: เผยแพร่โครงการ
บทสรุป
- การที่ root shell ถูกเปิดเผยผ่านพอร์ตซีเรียลภายนอก เป็นพื้นผิวการโจมตีที่ไม่จำเป็นอย่างชัดเจน และเป็นความผิดพลาดด้านวิศวกรรม
- อย่างไรก็ตาม ด้วยการออกแบบที่แยกโปรเซสเซอร์ความปลอดภัยออกจากกัน ทำให้ ความเสี่ยงในการรั่วไหลของข้อมูลการชำระเงินจริงค่อนข้างต่ำ
- เป็นไปได้ว่าการอนุญาตให้ล็อกอินเป็น root ถูกใส่มาในเฟิร์มแวร์สำหรับใช้งานจริงโดยไม่ตั้งใจ หรืออาจแตกต่างกันไปตามเวอร์ชัน
- ระหว่างการวิจัย ยังพบบางเครื่องที่ฟังก์ชันล็อกอิน root ถูกปิดใช้งานไปเลย
- ภายในองค์กรอาจรับทราบและแก้ไขปัญหานี้ไปแล้ว
โครงการนี้ให้ผลลัพธ์ที่น่าสนใจหลายอย่าง และยังตอกย้ำถึงคุณค่าของการสำรวจเฟิร์มแวร์เชิงลึกอีกครั้ง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อยากบอกอะไรกับนักพัฒนารุ่นใหม่ว่า นี่แหละคือความหมายของคำว่าแฮ็กเกอร์ใน “Hacker News”, และโพสต์นี้ก็เป็นตัวอย่างที่อธิบายเส้นทางแบบฉบับของแฮ็กเกอร์ได้อย่างเข้าใจง่ายเป็นขั้นเป็นตอน, ถ้าอยากดูกรณีคล้ายกันเพิ่มเติมก็ลองดู Hack-a-day ได้, ผู้เขียนดูเป็นคนที่อยากรู้อยากเห็นและมีพื้นฐานแน่นมาก, โดยแก่นแล้วคือการไล่ดู datasheet ของชิป, ถอดชิ้นส่วนแบบไม่ให้เสียหาย, ถ้าเป็นหน่วยความจำก็เดินสายกลับเข้าไปใหม่, ใช้ไหวพริบและลองผิดลองถูก, คราวหน้าถ้าจะเจาะรูตื้น ๆ ก็อาจลองใช้กล้องรูเข็มเพื่อหลีกเลี่ยงร่องรอยความเสียหาย, และถ้าผู้เขียนสามารถผ่านการตรวจจับการงัดแงะพร้อมทำให้เครื่องกลับมาทำงานปกติได้ด้วยก็คงน่าสนใจมาก
อธิบายว่าคำว่าแฮ็กเกอร์ไม่ได้จำกัดอยู่แค่ความปลอดภัยคอมพิวเตอร์ แต่มีความหมายที่กว้างกว่านั้นมากและมีนิยามเชิงปรัชญาด้วย, อ้างอิง Jargon File ที่ Guy Steele และคนอื่น ๆ รวบรวมไว้เพื่ออธิบายนิยามของแฮ็กเกอร์, เช่น “คนที่สนุกกับการเรียนรู้รายละเอียดของระบบโปรแกรมและขยายขีดจำกัดของมัน”, “คนที่สนุกกับการเขียนโปรแกรมอย่างจริงจัง”, ไปจนถึง “ผู้เชี่ยวชาญที่ชำนาญในโปรแกรมใดโปรแกรมหนึ่ง”, สรุปว่าคำนี้ถูกใช้ได้หลายความหมาย, และคาดว่าตอนที่ PG ตั้งชื่อ Hacker News ก็น่าจะนึกถึงนิยามที่กว้างแบบนี้อยู่, พร้อมเสริมว่าถ้าพูดถึงประวัติของศัพท์แฮ็กเกอร์ก็ต้องเอ่ยถึง The UNIX-HATERS Handbook ด้วย
เห็นด้วยกับประโยคแรกแบบสุด ๆ, ถ้ามี LLM wrapper โผล่มาอีกสักครั้งวันนี้คงเอียนจริง ๆ
มองว่าแค่เว็บไซต์นี้มาจาก VC startup incubator ก็ไม่ได้แปลว่าคำว่า hacking ในที่นี้หมายถึงความปลอดภัยไซเบอร์, น่าจะใกล้กับการแฮ็กแบบสตาร์ตอัปในความหมาย “move fast and break things” มากกว่า คือเขียนโค้ดเร็ว ๆ แล้วลุยแก้ปัญหาไปข้างหน้า
แอบอ่านมานานมากและเพิ่งสร้างบัญชีมาเริ่มคอมเมนต์ไม่นานนี้เอง, ขอยกย่องว่าโพสต์แบบที่มีทั้งข้อมูลและลงมือทำจริงเช่นนี้แหละที่สะท้อนจิตวิญญาณความเป็น ‘แฮ็กเกอร์’ ของ Hacker News
สารภาพว่านี่เป็นครั้งแรกที่กดโหวตให้โพสต์เพราะมันเกี่ยวกับการแฮ็กจริง ๆ, ปกติจะโหวตเฉพาะคอมเมนต์ แต่โพสต์นี้เป็นข้อยกเว้น
แนะนำว่าสามารถใช้ USB card reader ราคา $2 เพื่อจำลองธุรกรรมบัตรเครดิต/เดบิตปลอมได้, สเปกและโปรโตคอลทั้งหมดมีขนาดใหญ่แต่เปิดเผยสาธารณะ ดังนั้นถ้าอ่านเอกสารก็ทำเองได้, แต่ถ้าจะให้ธุรกรรมได้รับอนุมัติจริงก็ต้องส่งข้อมูลไปยังธนาคารผ่านอินเทอร์เน็ต และถ้าทำแบบนั้นเจ้าหน้าที่รัฐ เช่น FBI ก็อาจโผล่มาทันที, ตัว card reader เองแทบไม่มีระบบป้องกันอะไรเลย (ส่วนใหญ่วิ่งบน Linux และใช้รหัสผ่านอ่อนแอ), โดยความปลอดภัยจริง ๆ มาจากสัญญาและข้อกำหนดระหว่างร้านค้ากับธนาคาร
โต้แย้งคำกล่าวที่ว่า card reader ‘ไม่มีระบบป้องกัน’, โดยบอกว่าความจริงแล้วรันได้เฉพาะ signed binary, ไฟล์ซิสเต็มของตัว executable เป็นแบบ read-only, ไฟล์ซิสเต็มข้อมูลก็ตั้ง noexec flag, ปิดการล็อกอิน root, ใช้ busybox แบบตัดความสามารถลง, คีย์จะถูกโหลดจาก secure area ตอนบูต, การใส่ master key ก็ทำได้เฉพาะในโรงงาน, กระบวนการบูตเองก็ปลอดภัยมาก, และถ้าตรวจพบการงัดแงะ ชิปจะล้างตัวเองจนว่างเปล่าทันที, พร้อมแชร์ประสบการณ์ว่าเครื่องราคาถูกที่ไม่ผ่านการรับรองอาจแทบไม่มีความปลอดภัย แต่ถ้าเป็น terminal จริงจากประสบการณ์พัฒนา EMV มันถูกล็อกไว้แทบสมบูรณ์แบบ
ยอมรับว่าส่วนที่บอกว่า ‘กฎระหว่างร้านค้ากับธนาคารคือความปลอดภัยเพียงอย่างเดียว’ นั้นแม่นยำ, จึงมองว่าทฤษฎีสมคบคิดเรื่องคนใช้ portable card reader ไปขโมยเงินจากบัตร contactless นั้นทำได้ยากในทางปฏิบัติ, ต่อให้สร้างธุรกรรมได้จริง ขั้นตอนหลังจากนั้นและการเตรียมตัวก่อนหน้าก็ทำให้การถอนเงินออกมาอย่างปลอดภัยแทบเป็นไปไม่ได้, โดยเฉพาะทุกวันนี้มี push notification ของธุรกรรม จึงน่าจะทำให้ความพยายามก่ออาชญากรรมถูกเปิดโปงได้ง่าย
กังวลมากกว่าว่า card reader จะถูกแฮ็กหน้างานเพื่ออ่านข้อมูล CC ที่ cache ไว้ หรือถูกติดตั้งมัลแวร์แบบดักข้อมูล, และนี่คือเหตุผลว่าทำไมงานวิจัยด้านนี้จึงสำคัญ
อธิบายว่าข้อความที่ว่าต้องส่งธุรกรรมไปยังธนาคารผ่านอินเทอร์เน็ตเพื่อให้อนุมัตินั้นไม่ถูกต้อง, เพราะธนาคารไม่ได้มี open API สำหรับประมวลผลธุรกรรมบัตรอยู่บนอินเทอร์เน็ต
ไม่เห็นด้วยกับคำกล่าวว่าความปลอดภัยของ card reader อ่อนแอ, และอธิบายว่าในเครื่องปลายทางของร้านค้าจริงจะมี secure hardware สำหรับเก็บคีย์ของธนาคารและเครือข่ายการชำระเงินอย่างปลอดภัย, พร้อมเสริมว่าถ้าคีย์เหล่านั้นรั่ว ก็อาจปลอมธุรกรรมที่ดูถูกต้องตามกฎหมายได้
แชร์ประสบการณ์ซื้อ Stripe M2 reader มาใช้ 36 เครื่อง แล้วเสียไป 7 เครื่อง, 2 เครื่องคือแบตเตอรี่ชาร์จไม่เข้า, 1 เครื่องสแกน NFC ไม่ได้, อีก 4 เครื่องขึ้น error ว่า ‘ถูกงัดแงะ’ แล้วตายไปเลย, ภายนอกดูเหมือนอัตราเสียจะรุนแรงมาก แต่ก็ควรดูบริบทอย่างจำนวนวันใช้งานและอายุเครื่องด้วย, และยิ่งรู้สึกว่าหนักกว่าเดิมตรงที่ reader อายุ 1-3 ปีเหล่านี้ถูกใช้งานรวมกันเพียง 9 วันเท่านั้นแต่พังไปถึง 7 เครื่อง, เจ้าตัวย้ำว่าเวลาเคลื่อนย้ายก็เก็บอย่างดีมากด้วย hard shell case และโฟมแยกแต่ละเครื่อง จึงไม่น่าใช่ปัญหาการเก็บรักษา, ถึงอย่างนั้น Stripe M2 reader ก็ยังเป็นตัวเลือกที่ใช้งานได้ดีที่สุดอยู่ดีเลยต้องจำใจใช้ต่อ, พร้อมเสริมว่าบริษัทของตนรับผิดชอบระบบจ่ายเงินในงานเทศกาล จึงมีรูปแบบใช้งานที่ต้องใช้จำนวนมากในช่วงสั้น ๆ
จินตนาการว่าถ้าระบบป้องกันการงัดแงะทางกายภาพทำงาน อาจมี root shell เปิดขึ้นมาได้, คือระบบอาจเข้าสู่ secure mode ที่ยังมีคีย์เข้ารหัสทั้งหมดที่จำเป็น หรือไม่ก็เปิด root shell เพื่อใช้ดีบัก/วิเคราะห์ความเสียหาย, แต่ก็หวังว่า private key สำคัญต่าง ๆ จะถูกลบอัตโนมัติไปแล้วในจังหวะนั้น
อ้างถึงข้อความจากบทความต้นทางว่า ‘ถึงจะเปิด root shell ได้ ข้อมูลบัตรก็ยังไม่ตกอยู่ในความเสี่ยง’ พร้อมแนะนำว่านี่เป็นเนื้อหาที่คนออกแบบระบบความปลอดภัยควรอ่าน
เสนอความเห็นว่า Linux ฝั่งที่ถูกงัดแงะอาจเป็นตัวตัดสินว่าจะอ่าน “compromised mode” code หรือระบบความปลอดภัย mp1, ชี้ว่าต่อให้ bootloader เองปลอดภัย ก็ยังต้องดูว่าสุดท้ายมันถูกนำไปใช้รันในบริบทไหน, co-processor อาจทำหน้าที่แบบ Secure Enclave ได้ แต่ถ้า Linux สามารถโหลด bootloader แยกต่างหากได้ โครงสร้างนี้ก็อาจมีปัญหาด้านความปลอดภัยร้ายแรง
แนะนำว่าถ้าเป็นมือใหม่ ลองเริ่มจากเครื่องรูดบัตรเครดิตสมัยใหม่ที่ใช้ Android ก่อนก็ดี, เพราะการใส่ PIN ผ่านหน้าจอสัมผัสดูน่าสนุกกว่า
อธิบายว่า touch controller โดยทั่วไปจะต่ออยู่กับ MUX ที่ถูกควบคุมโดย secure processor, และตอนป้อนข้อมูลความปลอดภัย สัญญาณสัมผัสจะถูกส่งตรงไปยัง secure processor โดยที่ระบบปฏิบัติการสาย Android ไม่ได้เข้ามาเกี่ยวข้อง
ย้ำว่าต่อให้ PIN ไปแสดงบน touchpad ข้อมูล PIN ก็ยังถูกจัดการโดยเฟิร์มแวร์ที่รันอยู่ใน trust zone และอยู่ในสถานะเข้ารหัส, แอปต่าง ๆ ที่อยู่ตรงกลางจึงมองไม่เห็น PIN
มองว่าต่อให้แฮ็กเครื่อง Android เหล่านี้ได้ ถ้าการออกแบบความปลอดภัยยังเหมือนเดิม ตัวบัตรเองก็ยังทำการเข้ารหัสที่ซับซ้อนอยู่ ทำให้แทบไม่มีข้อมูลที่นำไปใช้ได้จริง, การโจมตีแบบนี้จะได้ผลก็ต่อเมื่อเหลือเพียง card reader อย่างเดียว ซึ่งถ้าเป็นแบบนั้นตัวเครื่องก็น่าจะดูเป็นสัญญาณเตือนเรื่อง skimmer สำหรับผู้ใช้อยู่แล้ว
เสริมสั้น ๆ อย่างสนใจว่า terminal แบบ Android ที่ใช้ในอินเดียบางรุ่นยังรัน Android Oreo อยู่เลย ทั้งที่หมดซัพพอร์ตไปตั้งแต่เดือนมกราคม 2021
รู้สึกแปลกใจที่พอเริ่มวิเคราะห์ภายในเครื่องก็เปิดฝาแล้วไปกระตุ้นโหมดงัดแงะทันที, เดาว่าผู้เขียนอาจไม่รู้ว่า reader ส่วนใหญ่มีระบบตรวจจับการงัดแงะอยู่, การทดสอบในโหมด tamper อาจทำให้ความหมายของผลลดลง, และก็สงสัยว่าหลัง trigger tamper แล้ว shell ที่เปิดขึ้นมานั้นจริง ๆ อาจเป็น shell สำหรับ reset เครื่องหรือเปล่า, ปิดท้ายด้วยคำแนะนำว่าอย่าคิดไปเองว่าการเริ่มจากการเปิดเครื่องเป็นลำดับที่ถูกต้องเสมอไป
ชื่นชมว่าน่าทึ่งที่แม้จะมีระบบป้องกันการงัดแงะอย่างเข้มงวด ก็ยังมีทางอ้อมและร่องรอยน่าสนใจให้สำรวจได้อีกมาก, และประเมินว่าส่วนที่เกี่ยวกับความปลอดภัยถูกออกแบบมาให้ล้มเหลวอย่างปลอดภัยแล้ว
เน้นย้ำว่าโปรเซสเซอร์ที่ถูกเสริมความแข็งแรงแล้วอย่าง mp1 ยังไม่สามารถเจาะเข้าไปได้, โดยอธิบายว่าในความเป็นจริงมีเพียงการส่ง string ไปยังไบนารี display_tool เพื่อสื่อสารกับโปรเซสเซอร์อีกตัว, ส่วน card reader หรือ keypad นั้น Linux เข้าไม่ถึงโดยตรง, เพราะมีโปรเซสเซอร์ mp1 ที่แยกออกมาต่างหากรับหน้าที่งาน ‘ความปลอดภัย’ ทั้งหมด เช่น อ่านบัตร, รับ PIN, แสดงผลบนหน้าจอ, ขณะที่ mp2 Linux ดูแลเพียงเครือข่าย, การอัปเดต, และ business logic
เสนออีกสถานการณ์ว่าฝั่ง Linux อาจเป็นตัวคอยตรวจจับการจัดการ tamper event, แต่ถ้าต้องรอจนตรวจพบ tamper อย่างสมบูรณ์ก่อนจึงจะลบ security key ได้ ก็อาจอันตรายเพราะผู้โจมตีอาจชิงเอา root shell มาก่อนแล้วค่อยหาทางเลี่ยง tamper ได้
กล่าวถึงข้อเท็จจริงว่าเครื่องประเภทนี้กระจายอยู่ทั่วยุโรป, แม้ไม่แน่ใจเรื่องสวิตเซอร์แลนด์ แต่จากประสบการณ์ส่วนตัวรู้สึกว่าในหลายพื้นที่ของยุโรปที่ตนรู้จัก คนพกบัตรเครดิตกันไม่มากนัก, แทนที่จะเรียกเครื่องเหล่านี้ว่าเครื่องบัตรเครดิต น่าจะเรียกว่า ‘ระบบ POS’ จะเหมาะกว่า เพราะมันอ่านบัตรได้แทบทุกชนิด, อย่างไรก็ดีบอกว่าอ่านโพสต์นี้แล้วสนุกมาก