การส่งโค้ดใช้ครั้งเดียวทางอีเมลแย่กว่าการใช้รหัสผ่านเสียอีก
(blog.danielh.cc)- ช่วงหลังมานี้ หลายบริการเริ่มนำวิธี ล็อกอินด้วยรหัส 6 หลักผ่านอีเมลหรือหมายเลขโทรศัพท์ มาใช้
- เมื่อกรอกอีเมล/หมายเลขโทรศัพท์ ระบบจะส่งรหัสยืนยัน 6 หลักมาให้ แล้วจึงนำรหัสดังกล่าวมากรอกเพื่อล็อกอิน
- วิธีนี้ก่อให้เกิด ช่องโหว่ร้ายแรงต่อความปลอดภัยของบัญชี
- ผู้โจมตีสามารถเพียงแค่ กรอกอีเมลของผู้อื่นลงในบริการที่ถูกต้องตามกฎหมาย เพื่อขอให้ส่งรหัสยืนยันได้
- ผู้ใช้จะมีปัญหาในการแยกแยะได้ยากว่ารหัสยืนยันที่ได้รับนั้น เป็นสถานการณ์ที่ควรใช้งานจริงหรือไม่ หรือเป็นความพยายามฟิชชิง
- เครื่องมือป้องกันฟิชชิงแบบเดิม เช่น Password manager (ตัวจัดการรหัสผ่าน) แทบไม่มีประสิทธิภาพ
- รูปแบบรหัสยืนยันนี้ถูกนำไปใช้ในทางที่ผิดอย่างต่อเนื่องจริง
- แม้แต่ใน การล็อกอินบัญชี Minecraft ที่ Microsoft เป็นผู้ให้บริการ ก็ใช้วิธีคล้ายกัน
- มีรายงาน กรณีขโมยบัญชีจำนวนมาก จากชุมชนออนไลน์และสื่อหลากหลายแห่ง เช่น Reddit และ YouTube
บทสรุป
วิธีการยืนยันตัวตนด้วยอีเมลรหัส 6 หลักมีความ เปราะบางด้านความปลอดภัยมากกว่าที่คาด
- เมื่อเทียบกับการใช้รหัสผ่านแบบเดิม ความเสี่ยงจากฟิชชิงกลับ เพิ่มสูงขึ้นอย่างมาก
- แม้จะถูกนำมาใช้เพื่อปรับปรุงประสบการณ์ผู้ใช้หรือความปลอดภัย แต่ ในความเป็นจริงอาจก่อให้เกิดผลลัพธ์ที่แย่กว่าเดิม
3 ความคิดเห็น
ไม่ค่อยเห็นด้วยเท่าไรครับ ดูเหมือนว่าเป็นแค่ทริกที่ใช้ได้ผลเฉพาะในสถานการณ์ที่เจาะจงมาก ๆ เท่านั้น
ถ้าใช้ passkey อยู่แล้วทำอุปกรณ์หายขึ้นมาจริง ๆ คงลำบากน่าดู...
ความคิดเห็นจาก Hacker News
รูปแบบการโจมตีเป็นดังนี้
1) ผู้ใช้สมัครใช้งานเว็บไซต์หลอกลวง
2) เว็บไซต์นั้นแจ้งว่า “เราได้ส่งโค้ดสำหรับเข้าสู่ระบบจากเว็บไซต์ GOOD ไปทางอีเมลแล้ว กรุณากรอกโค้ด”
3) เว็บไซต์หลอกลวงเริ่มขั้นตอน “เข้าสู่ระบบด้วยโค้ดใช้ครั้งเดียวทางอีเมล” ของเว็บไซต์ GOOD โดยใช้ที่อยู่อีเมลของผู้ใช้
4) เว็บไซต์ GOOD ส่งโค้ดเข้าสู่ระบบไปยังผู้ใช้ทางอีเมล
5) ผู้ใช้เห็นว่าอีเมลมาจาก GOOD จึงเชื่อถือและกรอกโค้ดนั้น
6) ผู้ใช้กรอกโค้ดลงในเว็บไซต์หลอกลวง
7) เว็บไซต์หลอกลวงใช้โค้ดนั้นเข้าสู่ระบบเว็บไซต์ GOOD โดยแอบอ้างเป็นผู้ใช้
ด้วยเหตุนี้ วิธีการยืนยันตัวตนแบบ “ส่งโค้ดใช้ครั้งเดียวทางอีเมล” จึงเปราะบางต่อการโจมตีแบบฟิชชิงอย่างมาก
วิธีแบบ “คลิกลิงก์ในอีเมล” ดีกว่านิดหน่อย เพราะผู้ใช้จะถูกพาไปยังเว็บไซต์ GOOD โดยตรง และการคัดลอก/วางลิงก์นั้นกลับไปยังเว็บไซต์หลอกลวงจะยุ่งยากและน่าสงสัยกว่า
อย่างไรก็ตาม หากบริการอีเมลยอดนิยมเริ่มบล็อกอีเมลเข้าสู่ระบบหรือลิงก์เหล่านี้ขึ้นมากะทันหัน ก็จะเกิดปัญหาที่ผู้ใช้จำนวนมากไม่สามารถเข้าสู่ระบบได้เลย
Passkeys คือแนวทางที่ถูกต้องที่สุด
การรองรับ passkey ของ password manager ก็ดีขึ้นเรื่อย ๆ
ต่อให้ทำ passkey ทั้งหมดหายเพราะทำอุปกรณ์ที่เก็บ passkey สูญหาย ก็ยังมั่นใจว่าปลอดภัยกว่าระบบรหัสผ่านแบบเดิมมาก
ผมคิดว่าการที่คุณยายต้องไปธนาคารเพื่อขอเข้าถึงบัญชีนั้น ยังดีกว่าให้ใครสักคนฟิชชิงเอาเงินของคุณยายไปจนหมด
ปัญหาของ passkey ซับซ้อนกว่าแค่ “ถ้าทำอุปกรณ์หายก็จะเสียสิทธิ์เข้าถึง” (ขึ้นอยู่กับการตั้งค่า บางกรณีแก้ได้แม้ทำอุปกรณ์หาย)
ปัญหาใหญ่ที่สุดคือ Attestation
มันเปิดทางให้บริการสามารถบล็อกคนที่ใช้เครื่องมือซึ่งเพิ่มเสรีภาพให้ผู้ใช้ได้ (เช่น โซลูชันยืนยันตัวตนแบบโอเพนซอร์ส)
เดิมที passkey หรือโปรโตคอลแบบ challenge-response น่าจะเป็นการปรับปรุงครั้งใหญ่ที่แทนรหัสผ่านได้
แต่ในความเป็นจริงกลับถูกออกแบบมาเพื่อทำให้ระบอบการครอบงำของ BigTech แข็งแรงขึ้น และลดเสรีภาพของผู้ใช้ลง
เรื่องที่บอกว่า “ให้คุณยายไปธนาคารเพื่อกู้คืนบัญชีก็ยังดีกว่า”
ลองคิดดูว่าถ้าถูกจ่อปืนบังคับให้ปลดล็อกบัญชี และเงินถูกกวาดไปจนหมดจะเป็นอย่างไร
ในประเทศโลกที่สามที่ผมอยู่ ปัญหาการปล้นสมาร์ตโฟนรุนแรงมากจนแม้แต่ 2FA ก็แทบใช้ไม่ได้จริง
ผมเคยกู้คืน 2FA อยู่ครั้งหนึ่ง และมันเหมือนนรก
รหัสผ่านนั้นไม่ว่าอยู่ที่ไหนก็แค่เข้า Bitwarden ก็จัดการได้แล้ว
ผมตั้งค่า passkey ไว้กับ github และยืนยันแล้วว่ามันถูกเก็บไว้ใน Chrome
แต่พอพยายามล็อกอิน github ด้วย passkey, Chrome กลับเด้งหน้าต่างให้ใส่ PIN ของ Google Password Manager
ผมไม่รู้ว่า PIN นี้คืออะไร และก็หาวิธีรีเซ็ตไม่ได้
ใน Google profile, Password Manager หรือการตั้งค่าความปลอดภัย ก็ไม่มีคำอธิบายเกี่ยวกับ PIN นี้เลย
สำหรับความเห็นที่ว่าให้คุณยายไปธนาคารเพื่อกู้คืนบัญชีก็ไม่เป็นไร
ผมยังเดินไปที่ธนาคารหรือ IT helpdesk ของบริษัทเพื่อกู้คืนบัญชีของตัวเองได้
แต่ผมคงเดินไปที่สำนักงานใหญ่ของ Google, Facebook หรือ Xitter เพื่อทำแบบนั้นไม่ได้
passkey ที่ผูกกับอุปกรณ์มีโอกาสผิดพลาดสูงมากในกรณีแบบนี้
ผู้ใช้ส่วนใหญ่ไม่ได้คิดถึงสถานการณ์พวกนี้
Passkey อย่างเดียวไม่เพียงพอ
ประเด็นคืออย่าทำพลาดแบบเดิมซ้ำอีก
password manager ควรเป็นพื้นฐาน และควรมี MFA แบบเฉพาะทางเฉพาะในกรณีที่พิเศษจริง ๆ เท่านั้น (เช่น บัญชีอีเมล, บัญชีการเงิน ฯลฯ)
ผมคิดว่าการตั้งค่า MFA ควรถูกบังคับให้ตั้งอย่างน้อย 3 วิธี และต้องใช้ได้อย่างน้อย 2 วิธีจากนั้น
ถ้าไม่รองรับแทบทุกวิธี เช่น โค้ดที่พิมพ์ออกมาเก็บไว้, แอปยืนยันตัวตนที่ไม่ผูกกับระบบปฏิบัติการ, ฮาร์ดแวร์คีย์อย่าง yubikey เป็นต้น ผมก็มองว่า MFA นั้นไม่มีค่าให้ใช้งาน
ผมได้รับอีเมลแจ้งคำขอรีเซ็ตรหัสผ่านบัญชี Microsoft วันละสี่ครั้ง
เป็นอีเมลที่มีตัวเลข 6 หลัก และสามารถใช้กู้คืนบัญชีได้ด้วย
เท่ากับว่าผู้โจมตีมีโอกาส 1 ใน 1,000,000 ที่จะลองยึดบัญชีผมได้วันละ 4 ครั้ง
ถ้าทำแบบนี้กับบัญชีนับพันบัญชี ก็เท่ากับเจาะบางบัญชีได้ฟรีทุกวัน
ผมถึงขั้นส่งรายงานด้านความปลอดภัยไปแล้ว แต่ถูกปฏิเสธโดยบอกว่าหลักฐานเชิงคณิตศาสตร์ยังไม่เพียงพอจะพิสูจน์ว่าเป็นช่องโหว่
สิ่งที่เหลืออยู่ก็คงมีแค่ทนสแปมต่อไปและภาวนาว่าบัญชีจะไม่โดนยึด
ผมแก้ปัญหาได้ด้วยการเพิ่ม alias สำหรับการเข้าสู่ระบบ
ตอนล็อกอินจะบล็อกอีเมลบัญชีเดิมที่เปิดเผยต่อสาธารณะ และอนุญาตให้ล็อกอินได้เฉพาะด้วย alias ที่เป็นสตริงสุ่มแบบไม่เปิดเผยเท่านั้น
หลังจากนั้นก็ไม่เคยมีความพยายามล็อกอินจากภายนอกอีกเลย
[วิธีตั้งค่า: account.microsoft.com > ข้อมูลของคุณ > การตั้งค่าการลงชื่อเข้าใช้ > เพิ่มอีเมล > เพิ่ม alias แล้วตั้งเป็นค่าเริ่มต้น > ในการตั้งค่าการลงชื่อเข้าใช้ให้เลือกอนุญาตเฉพาะ alias]
ผมก็เจอแบบเดียวกัน
เดาว่าน่าจะเป็นผลพวงจากตอนที่เคยต้องใช้ Microsoft Teams
ถ้าผู้โจมตีใช้วิธีนี้กับบัญชี 125,000 บัญชี ก็มีโอกาสได้มาวันละประมาณ 1 บัญชี
ถ้าไม่ได้เล็งบัญชีใดบัญชีหนึ่งเป็นพิเศษ แต่โจมตีแบบหว่านทั้งระบบ ประสิทธิภาพต่อเวลาถือว่าดีพอสมควร
ถ้าจะแก้ปัญหานี้ ควรใช้ exponential backoff คือเพิ่มเวลารอทุกครั้งที่ล้มเหลว แทนการจำกัดคงที่แค่ 4 ครั้ง
ผมก็ยังได้รับข้อความคล้ายกันเรื่อย ๆ จากบัญชี Instagram เก่า
“มีปัญหาในการเข้าสู่ระบบหรือไม่? คลิกที่นี่เพื่อเปลี่ยนรหัสผ่าน!”
ผมก็เคยเจอเรื่องเดียวกันกับบัญชีเก่าไร้ประโยชน์บัญชีหนึ่ง
พอตรวจดู IP ที่พยายามล็อกอิน ก็พบว่ามาจากผู้ให้บริการอินเทอร์เน็ตทั่วโลก และส่วนใหญ่อยู่คนละเครือข่าย /16 กัน
เห็นได้ว่าแม้แต่บัญชี “ไร้ค่า” แบบนี้ยังมีการใช้ botnet เข้ามาโจมตี ก็ยิ่งทำให้ผมกังวลว่าคนที่ตกเป็นเป้าจริง ๆ จะเจอสถานการณ์หนักกว่านี้แค่ไหน
พอเพิ่ม 2FA แล้วปัญหาก็หายไปเลย
ผมยังไม่รู้จนถึงตอนนี้ว่าพวกเขาไปเจอขั้นตอนล็อกอินที่ใช้โค้ด 6 หลักตั้งแต่แรกได้อย่างไร (เพราะของผมทุกครั้งใส่รหัสผ่านแล้วก็ล็อกอินได้ทันที)
แต่อย่างน้อยหลังจากเพิ่ม 2FA แล้วก็ไม่เห็นความพยายามเพิ่มเติมอีกเลย
ผมเก็บโค้ด 2FA ไว้ใน password manager ด้วยเช่นกัน
รู้สึกพอใจที่พวกเขาโจมตี “รหัสผ่าน” 6 หลักอัตโนมัติของ Microsoft (ซึ่งไม่ใช่แม้แต่ตัวอักษรอังกฤษ มีแต่ตัวเลขล้วน!) ไม่ได้อีกต่อไป
สิ่งที่แย่ที่สุดคือรูปแบบการยืนยันตัวตนแบบนี้ทำให้นิสัยและความคาดหวังของผู้ใช้แย่ลงไปอีก
ถ้าใช้ password manager สมัยใหม่อย่าง 1password มันง่ายกว่า ปลอดภัยกว่า และเร็วกว่ารูปแบบโทเคนอีเมลมาก
แค่ต้องใส่ใจตอนตั้งค่าเริ่มต้นและตรวจสอบบนอุปกรณ์สักไม่กี่เครื่อง
ผมคิดว่ามันก็เหมือนตอนย้ายบ้านใหม่แล้วทำสำเนากุญแจ ต้องบันทึกไว้ใน password manager แล้วตรวจดูด้วยว่าซิงก์ไปยังอุปกรณ์อื่นแล้ว จึงจะสบายใจ
คนเราทำได้อยู่แล้ว
ต่อให้ไม่รู้เรื่องการเข้ารหัสหรือแนวคิดของ 2FA ก็แค่กด “สร้างรหัสผ่านใหม่” แล้วใช้รหัสผ่านสุ่มที่แอปบันทึกให้
passkey ก็เหมือนกัน แค่ต้องคำนึงถึงตำแหน่งที่เก็บ ไม่ใช่เก็บในที่เก็บในตัวเครื่องอย่างเดียว แต่ต้องคิดถึงการสำรองและกู้คืนด้วย
น่าแปลกที่วิธีแบบเก่า (กรอกอีเมลกับรหัสผ่าน) กลับทำงานได้ดีกว่า
เพราะ password manager จะกรอกให้อัตโนมัติทันที จึงเร็วกว่าในทางปฏิบัติมาก
passkey อาจเร็วได้ยิ่งกว่านั้นอีก
ผมเองก็หงุดหงิด แต่ในคนรอบตัวที่ไม่ได้ทำงานสายไอทีของผม 80% ดูเหมือนไม่รู้เรื่องความปลอดภัยเลย และใช้ชีวิตแบบยอมแพ้ไปแล้ว
กรณีที่พอเรียกว่าสำเร็จก็มีแค่ให้เขาจดข้อมูลบัญชีไว้ในสมุดเล็ก ๆ และตั้งให้รหัสผ่านต้องมีทั้งตัวเลขกับตัวอักษรอังกฤษ
ผมเข้าใจปัญหาของ flow นี้
จากที่ผมเจอมา วิธีรหัสผ่านใช้ครั้งเดียวนี้เป็นรูปแบบการยืนยันตัวตนที่คนรอบตัวผมซึ่งไม่ใช่สายไอทีคุ้นเคยรองจากรหัสผ่าน
อย่างน้อยในเมืองเล็ก ๆ ที่ผมอยู่ password manager หรือ passkey กลับเป็นเรื่องเข้าใจยากกว่า และต่อให้สอนต่อหน้าก็ทำให้เข้าใจไม่ได้เลย
mental model มันแปลกใหม่เกินไป และ UX ก็ซับซ้อนเกินกว่าจะเข้าใจ
จนกว่าจะมีอะไรที่คนทั่วไปเข้าใจได้อย่างเป็นธรรมชาติ ผมคิดว่ารหัสผ่านกับวิธีโค้ดใช้ครั้งเดียวที่ “มีปัญหา” นี้ก็จะยังครองตลาดต่อไปเพราะมันเรียบง่าย
ต่อให้ใช้รหัสผ่านที่ดีจริง ๆ เวลาผู้ใช้ “ลืมรหัสผ่าน” วิธีการกู้คืนบัญชีก็มักเป็นรูปแบบโค้ดใช้ครั้งเดียวแบบเดียวกันอยู่ดี
สุดท้ายผู้โจมตีที่แกล้งทำตัวเหมือน “ลืมรหัสผ่าน” ก็สามารถล็อกอินผ่านขั้นตอนกู้คืนนี้ได้
ผมเองก็ใช้การล็อกอินแบบโค้ดใช้ครั้งเดียวกับบริการที่ผมสร้าง
แต่เป็นบริการที่ไม่อ่อนไหว จึงไม่ได้มีเป้าหมายให้การยืนยันตัวตนเข้มงวดมาก
ผมถึงกับเรียกระบบนี้ว่า ICGAFAS (“I Couldn't Give A Factor” Auth System) เพื่อสื่อว่าแต่แรกก็ไม่ได้ใส่ใจเรื่องความปลอดภัยมากนัก
การยืนยันตัวตนผ่านอีเมลยังเพิ่มเรื่องให้ผู้ดูแลระบบต้องกังวลอีก เช่น ปัญหาการส่ง/การส่งถึงของ SMTP
ท้ายที่สุดถ้าไม่อยากโดน blacklist หรือสแปมฟิลเตอร์บล็อก ก็แทบต้องใช้บริการ relay ของ third party อยู่ดี
ผมหงุดหงิดมากที่บริการส่วนใหญ่บังคับใช้วิธีโค้ดใช้ครั้งเดียวนี้แทน email+PW แบบเดิมหรือ social login
ผมแค่อยากให้พิมพ์รหัสผ่านยาว 100 ตัวอักษรของตัวเองได้
คุณไม่ใช่ผู้ใช้เป้าหมาย
ตรงกันข้าม คุณอยู่ในกลุ่มส่วนน้อยที่พิเศษมาก
ในระยะยาวเราต้องคิดหาวิธีที่เชื่อมต่อกับ “คนส่วนใหญ่” ได้
ผมมองว่ารหัสผ่านยาวมากแบบ 100 ตัวอักษรไม่มีความหมาย
เพราะสุดท้ายความยาวจะถูก truncate ตามความยาวคีย์ที่ใช้จริงในระบบเข้ารหัสข้างล่าง
ผมลองตรวจดูเอกสาร NIST (NIST 800-63b section 5.1.2.1) ว่าวิธีการยืนยันตัวตนแบบนี้ได้รับอนุญาตอย่างเป็นทางการหรือไม่
ถ้ามองว่าเป็น “Look-up Secret Authenticator” ก็ไม่ได้มีปัญหาอะไรเป็นพิเศษ
เดิมทีวิธีนี้หมายถึงรหัสยืนยันตัวตนที่แจกไว้ล่วงหน้า (เช่น recovery code) แต่ตอนนี้กลับถูกนำมาใช้ผิดทางเป็นการส่งแบบเรียลไทม์และให้เลือกเพียงค่าเดียว
ผมคิดว่าวิธีนี้อ่อนแอต่อฟิชชิง แต่ก็ยากจะฟันธงว่ามันอันตรายกว่ารูปแบบ username/password แบบดั้งเดิมจริง ๆ
เช่น ถ้าขอรหัส 6 หลักไปที่อีเมลของผู้ใช้แล้วให้กรอก ผู้ใช้ก็ไม่สามารถแยกได้ว่าโค้ดนั้นเป็นของจริงหรือของปลอม
แต่ในอีกด้านหนึ่ง ผู้โจมตีก็อาจหลอกผู้ใช้ด้วยหน้าเว็บปลอมที่ทำให้ดูน่าเชื่อถือคล้ายบัญชี Google เพื่อขโมยข้อมูลได้เช่นกัน
สุดท้ายผมคิดว่ามีเพียงการยืนยันตัวตนที่ต้านทานฟิชชิงได้เท่านั้นที่เป็นอนาคตจริง ๆ
เหตุผลที่ผมต้องลบบัญชี gofundme ก็เพราะวันนี้จู่ ๆ ผมติดอยู่ในวงจรการยืนยันตัวตนแบบนี้
ใช้บัญชีมาหลายปีและเคยบริจาคด้วย แต่ตอนนี้กลับบังคับให้ต้องใส่หมายเลขโทรศัพท์และโค้ด MFA โดยไม่มีตัวเลือกให้ปฏิเสธ
สุดท้ายผมทำตามขั้นตอนทั้งหมดแล้วก็ปิดใช้งานบัญชีไปเลย
ผมคิดว่าการยืนยันตัวตนแบบนี้เป็นเรื่องไม่จำเป็นในชีวิต และก็อยู่ได้โดยไม่ต้องมี gofundme
ช่วงนี้ผมกำลังหาบ้านอยู่ และแอป Zillow ก็เหมือนกัน คือต้องล็อกอิน และทุกครั้งที่จะอ่านข้อความที่ได้รับก็ต้องทำ MFA อีก
หนึ่งชั่วโมงเซสชันก็หมดอายุ
ผมเบื่อการยืนยันตัวตนแบบนี้มาก
โลกมันบ้าสิ้นดี
Ticketmaster ก็ทำคล้ายกัน
ไม่ยอมรับหมายเลข Google Voice และบังคับเอาเฉพาะหมายเลขที่ผูกกับ SIM เท่านั้น
สำหรับผม หมายเลข SIM เป็นแค่ “รายละเอียดเชิง implementation” ที่เปลี่ยนบ่อย
แต่ตอนนี้ถ้าไม่มีหมายเลขนั้นก็ล็อกอินบัญชีไม่ได้
สุดท้ายก็ต้องเลิกซื้อตั๋วแบบนี้ หรือไม่ก็ยอมเสี่ยงถูกล็อกบัญชีทุกครั้งที่เปลี่ยน SIM
Google เปิด 2FA ให้บัญชีผมเอง และเพราะเบอร์โทรที่ลงทะเบียนไว้เป็นเบอร์เก่า ตอนนี้เลยติดล็อกออกจากบัญชีอย่างสมบูรณ์
เวลาที่บริการเปลี่ยนรหัสผ่านและการยืนยันตัวตนขั้นที่สองโดยไม่เตือนล่วงหน้า ระหว่างเดินทางและไม่มีโทรศัพท์ที่ผูกกับบัญชีอยู่ด้วย คุณอาจถูกตัดการเข้าถึงไปตลอดกาล
บริการส่วนใหญ่ถือว่าการยืนยันตัวตนขั้นที่สองปลอดภัยกว่ารหัสผ่านสุ่ม 20 ตัวอักษรของผมที่เก็บไว้ใน password manager ในเครื่อง
แต่รูปแบบการยืนยันตัวตนขั้นที่สองที่ว่านี้ สุดท้ายก็เป็นแค่การส่งข้อความ plaintext ทาง SMS หรือ plaintext ทางอีเมลเท่านั้น
ผมอ่านประโยคนี้สี่รอบแล้วก็ยังไม่เข้าใจ
มันประมาณว่า “ถ้าผู้โจมตีส่งที่อยู่อีเมลของผู้ใช้ไปยังบริการจริงและขอรหัส 6 หลัก ผู้ใช้ก็จะไม่รู้ว่าโค้ดนั้นเป็นโค้ดเข้าสู่ระบบจริงหรือไม่”