เอ็กซ์พลอยต์แบบ 1 คลิกที่พบในแอปแชตมือถือรายใหญ่ที่สุดของเกาหลี
(stulle123.github.io)- ในแอป KakaoTalk บน Android การทำงานร่วมกันของ deep link, WebView และ XSS ทำให้เพียงผู้ใช้กดลิงก์อันตรายหนึ่งครั้ง ก็อาจนำไปสู่ การรั่วไหลของ access token และการยึดบัญชีได้
- จุดเข้าหลักคือ WebView ของ
CommerceBuyActivityใน KakaoTalk10.4.3โดย การตรวจสอบ deep link ที่ไม่เพียงพอ การเปิดใช้ JavaScript และการเปิดเผย headerAuthorizationร่วมกันก่อให้เกิดปัญหา - เชนการโจมตีใช้การ redirect ของ
buy.kakao.comและ DOM XSS บนm.shoppinghow.kakao.comเพื่อรัน JavaScript ใดๆ ภายใน WebView - โทเคนที่รั่วไหลสามารถถูกนำไปใช้เข้าถึง Kakao Mail, รีเซ็ตรหัสผ่าน และลงทะเบียนไคลเอนต์ KakaoTalk สำหรับ PC/Mac หรือ KiwiTalk ได้
- ช่องโหว่นี้ได้รับหมายเลข CVE-2023-51219 และหลังจากได้รับรายงาน Kakao Corp. ได้ปิด
buy.kakao.comและลบ redirect ที่เกี่ยวข้องรวมถึงCommerceBuyActivityที่มีช่องโหว่ออก
ขอบเขตและเงื่อนไขตั้งต้นของช่องโหว่
- KakaoTalk เป็นแอปแชตตัวแทนของเกาหลีที่มียอดดาวน์โหลดบน Google Playstore มากกว่า 100 ล้านครั้ง และมีลักษณะเป็น แอปแบบ all-in-one ที่รวมการชำระเงิน การเรียกรถ ช็อปปิง อีเมล และอื่นๆ
- ห้องแชตทั่วไปไม่ได้เปิดใช้การเข้ารหัสแบบปลายทางถึงปลายทาง (E2EE) เป็นค่าเริ่มต้น จึงมีโครงสร้างที่ Kakao Corp. สามารถเข้าถึงข้อความระหว่างการส่งได้
- มีฟีเจอร์ E2EE แบบเลือกใช้ชื่อ Secure Chat แต่ไม่รองรับการส่งข้อความแบบกลุ่มหรือการโทรด้วยเสียง
- เป้าหมายของ PoC คือการลงทะเบียน KakaoTalk for Windows/macOS หรือไคลเอนต์โอเพนซอร์ส KiwiTalk เข้ากับบัญชีของเหยื่อ เพื่ออ่าน ข้อความแชตที่ไม่ได้เข้ารหัสแบบปลายทางถึงปลายทาง
จุดเข้า: WebView ของ CommerceBuyActivity
- WebView ของ
CommerceBuyActivityมีเงื่อนไขหลายอย่างที่เอื้อต่อผู้โจมตี- ถูกเปิดเผยออกภายนอก (exported) และสามารถเริ่มได้ด้วย deep link อย่าง
kakaotalk://buy - เปิดใช้ JavaScript ด้วย
settings.setJavaScriptEnabled(true) - JavaScript สามารถส่งข้อมูลผ่านสคีม
intent://ไปยังคอมโพเนนต์ของแอปที่ไม่ได้เปิดเผยออกภายนอกได้ด้วย - การจัดการ URI ยังไม่เพียงพอ เพราะ
ComponentหรือSelectorของ URIintent://ไม่ถูกจัดการให้เป็นnull
- ถูกเปิดเผยออกภายนอก (exported) และสามารถเริ่มได้ด้วย deep link อย่าง
- WebView นี้ส่ง access token ไปใน header
Authorizationของคำขอ HTTP - WebView debugging ถูกเปิดไว้ จึงสามารถตรวจสอบการทำงานผ่าน
chrome://inspectได้ และหากนำทางไปยังที่อยู่ภายนอก headerAuthorizationจะถูกเปิดเผยไปพร้อมกับคำขอ GET - หากผู้โจมตีรัน JavaScript ภายใน WebView นี้ได้ ก็สามารถขโมย access token ของผู้ใช้ได้เพียงแค่ให้คลิก deep link
kakaotalk://buyที่เป็นอันตราย
การข้ามการตรวจสอบ URL และการเชื่อมกับ DOM XSS
CommerceBuyActivityไม่ได้โหลด URL ของผู้โจมตีโดยตรง แต่ประกอบ deep link ที่ป้อนเข้ามาให้เป็น URL ที่ขึ้นต้นด้วยhttps://buy.kakao.com- ตัวอย่างเช่น
kakaotalk://buy/fooจะถูกโหลดเป็นhttps://buy.kakao.com/foo - path, query parameter และ fragment อยู่ภายใต้การควบคุมของผู้โจมตี
- ตัวอย่างเช่น
- endpoint
https://buy.kakao.com/auth/0/cleanFrontRedirect?returnUrl=สามารถ redirect ไปยังโดเมนkakao.comใดๆ ได้ ทำให้ขอบเขตการโจมตีในการหา XSS บน subdomain ของkakao.comกว้างขึ้น - บน
m.shoppinghow.kakao.comพบ endpoint ที่ส่ง query ค้นหาไปยัง sinkinnerHTMLและสามารถทำ DOM XSS ได้ด้วย payload แบบง่าย - มีการระบุว่าพบ stored XSS ที่เคยมีอยู่ก่อนหน้านี้ด้วย แต่ ณ เดือนพฤษภาคม 2024 ดูเหมือนว่าจะได้รับการแก้ไขแล้ว
- ด้วยการผสมผสานนี้ เมื่อผู้ใช้คลิก deep link อันตราย JavaScript ใดๆ จะถูกรันภายใน WebView ของ
CommerceBuyActivityและ access token ใน headerAuthorizationอาจถูกส่งออกไปภายนอกได้
ใช้โทเคนเข้าถึง Kakao Mail และรีเซ็ตบัญชี
- access token ของ KakaoTalk ที่รั่วไหลสามารถถูกใช้เพื่อเข้าถึงบัญชี Kakao Mail ของเหยื่อได้
- สามารถตรวจสอบว่าเหยื่อใช้ Kakao Mail อยู่หรือไม่ จากนั้นรับโทเคนแยกต่างหากเพื่อเข้าถึง
talk.mail.kakao.com - แม้เหยื่อจะไม่มีบัญชี Kakao Mail ก็สามารถสร้างบัญชีใหม่ในชื่อของเหยื่อได้ และเมื่อเลือก
Set As Primary Emailตอนสร้างอีเมลใหม่ ที่อยู่อีเมลที่ลงทะเบียนเดิมอาจถูกเขียนทับได้โดยไม่ต้องมีการยืนยันเพิ่มเติม - หลังจากเข้าถึง Kakao Mail แล้ว ขั้นถัดไปคือ การรีเซ็ตรหัสผ่าน KakaoTalk
- ข้อมูลเพิ่มเติมที่จำเป็นของเหยื่อ ได้แก่ ที่อยู่อีเมล ชื่อเล่น และหมายเลขโทรศัพท์ สามารถได้จากการเรียก API การตั้งค่าบัญชีเดียวกัน
- กระบวนการรีเซ็ตรหัสผ่านของ
accounts.kakao.comมี SMS 2FA แต่สามารถดักและแก้ไขคำขอกับคำตอบด้วย Burp เพื่อเปลี่ยนเป็น flow การยืนยันทางอีเมลได้ - รหัสยืนยันสามารถตรวจสอบได้จาก Kakao Mail ของเหยื่อ
การลงทะเบียนไคลเอนต์ PC และการเข้าถึงข้อความ
- เมื่อเข้าสู่ระบบ KakaoTalk for Windows/macOS หรือ KiwiTalk ด้วย credential ของเหยื่อ จะต้องใช้องค์ประกอบการยืนยันตัวตนที่สอง
- การยืนยันนี้เป็นแบบ PIN 4 หลัก โดย PIN จะแสดงบนเวอร์ชัน PC แล้วนำไปกรอกในแอปมือถือ หรือในทางกลับกันจะถูกส่งไปยังแอปมือถือแล้วนำมากรอกในแอป PC
- PIN เดาแบบ brute force ได้ยาก และ endpoint ที่เกี่ยวข้องมีการจำกัดอัตรา โดย บล็อกหลังลอง 5 ครั้ง
- อย่างไรก็ตาม สามารถใช้ access token ที่รั่วไหลส่งหรือดึง PIN จาก backend ของ KakaoTalk ได้
- ด้วยกระบวนการนี้ PoC จึงสมบูรณ์ โดยสามารถลงทะเบียนอุปกรณ์ที่ผู้โจมตีควบคุมเข้ากับบัญชี KakaoTalk ของเหยื่อ และอ่านข้อความแชตที่ไม่ได้เข้ารหัสแบบปลายทางถึงปลายทางได้
การเปิดเผย การแก้ไข และเอกสารวิจัย
- ช่องโหว่นี้ได้รับหมายเลข CVE-2023-51219
- นักวิจัยได้เผยแพร่ เครื่องมือ เพื่อให้นักวิจัยด้านความปลอดภัยรายอื่นสามารถวิเคราะห์ attack surface ที่กว้างของ KakaoTalk ได้
- ช่องโหว่ถูกรายงานผ่าน Kakao Bug Bounty Program ในเดือนธันวาคม 2023
- ผู้รายงานระบุว่าไม่ได้รับรางวัล เนื่องจากผู้มีสิทธิ์รับรางวัลถูกจำกัดไว้เฉพาะชาวเกาหลี
- Kakao Corp. ได้ปิด
https://buy.kakao.comทันที ลบ redirect/auth/0/cleanFrontRedirect?returnUrl=และในเวอร์ชันต่อมาก็ลบCommerceBuyActivityที่มีช่องโหว่ออกด้วย
1 ความคิดเห็น
ความเห็นจาก Hacker News
โดยเฉพาะถ้าเป็นช่องโหว่ที่ทำให้โดเมนดูเหมือนปกติ คุณย่าคุณยายคงสังเกตลิงก์น่าสงสัยได้ยาก และผมก็คิดว่าวัฒนธรรมการทำงานแบบลำดับชั้นของเกาหลีก็มีส่วนด้วย
หัวหน้ามักโยนเดดไลน์ฟีเจอร์มาแบบต่อรองไม่ได้ ส่วนช่องโหว่ความปลอดภัยนั้นมองไม่เห็น แต่ UI มองเห็นได้ เลยตัด ๆ ทอน ๆ แล้วปล่อยออกไป
สุดท้ายก็กลายเป็นแอปที่มีรูรั่วด้านความปลอดภัยเต็มไปหมด และก็คงไม่แก้กันจริงจังจนกว่า หุ้น Kakao จะตก
เรื่องความปลอดภัย ผมไม่คิดว่าเป็นเพราะวัฒนธรรมการทำงานของเกาหลีเท่าไรนัก แต่เพราะบริษัท IT ใหญ่ ๆ ที่มักถูกจับรวมเป็น Naver, Kakao, LINE, Coupang, Woowa Bros นั้นมีวัฒนธรรมการทำงานและค่าตอบแทนที่ดีกว่าค่าเฉลี่ยมากอยู่แล้ว
น่าจะใกล้เคียงกับกรณีที่เป็นแอปใช้ในประเทศ จึงไม่ได้ถูกทดสอบหนักเท่าแอประดับโลกที่ได้รับความนิยมทั่วโลก อย่างไรก็ตาม จากประสบการณ์ผม ค่าตอบแทนก็ยังต่ำกว่าสหรัฐหรือบางสตาร์ตอัปเกาหลีอยู่ดี
ความต่างคือในเกาหลี ภาครัฐและ แชบอล กินสัดส่วนใหญ่ของตลาด IT ทำให้แทบไม่มีพื้นที่ให้วัฒนธรรมสตาร์ตอัปสร้างความแตกต่าง
Kakao เองก็เคยเป็นสตาร์ตอัปเท่ ๆ แต่หลังจากประสบความสำเร็จก็ดูเหมือนพยายามเลียนแบบแชบอลมาตลอด
มันอาจรุนแรงกว่าในเกาหลีเพราะเรื่องวัฒนธรรม แต่ในโลกตะวันตกก็เกิดขึ้นแน่นอน และแทบจะเป็นปัญหาสากลด้วยซ้ำ
แค่เคยทำงานไม่กี่ปีในบริษัทออฟฟิศของอเมริกาที่มีขนาดพอสมควร โดยเฉพาะสายเทค การเงิน คอนซัลต์ หรือ FAANG ก็จะรู้ว่าโลกตะวันตกก็ไม่ต่างกัน
วิศวกรระดับกลางก็เอาใจ VP เพื่อให้ได้เข้ารอบเลื่อนขั้นรอบถัดไป และบริษัทต่าง ๆ ก็แค่เก่งเรื่องทำการตลาดว่า “องค์กรแนวราบ” ทั้งที่ของจริงใกล้เคียงคำโฆษณามากกว่า
พอ PM หรือ SVP สั่งอะไรลงมา ก็มักไม่มีใครถามตรง ๆ มีแต่บ่นแล้วทำตาม และการที่คนเชื่อการตลาดเรื่องวัฒนธรรมองค์กรแบบนั้นอย่างสนิทใจ จนนำไปสู่ความรู้สึกเหนือกว่าผิวเผิน กลับน่าหดหู่ยิ่งกว่า
ตอนผมไปเที่ยวโซลล่าสุด ผมต้องสร้างบัญชีของแอปแชตมือถือเพื่อจะล็อกอินเข้าแอปนั้น ประสบการณ์ใช้งานก็ไม่ดี แถมเกือบทั้งหมดเป็นภาษาเกาหลี เลยลำบากพอสมควร
ไม่ได้ให้ความรู้สึกว่าเป็นการดำเนินงานที่เป็นมืออาชีพนัก
KakaoTalk กับ Naver รับบทแทบจะเหมือน WhatsApp/Meta และ Google ของโลกตะวันตก
ผมว่ามันน่าชื่นชมที่ยังอยู่รอดได้แม้การแข่งขันกับบริษัทข้ามชาติจะรุนแรงขึ้น ในอีกหลายประเทศ ช่วง 10 ปีที่ผ่านมา บริษัทเทคท้องถิ่นแทบหมดความหมายไปแล้ว ซึ่งน่าเสียดาย
เพราะงั้นการเรียกแท็กซี่ข้างทางก็ยาก และดูเหมือนส่วนใหญ่จะรับแต่ลูกค้าที่เรียกผ่านแอป
ครั้งหนึ่งผมอุตส่าห์ได้คุยกับคนขับแท็กซี่ แต่เขาบอกว่าไม่รับ “ชาวต่างชาติ” และผมก็ไม่รู้ว่าเป็นการเหยียดจริง ไม่อยากรับเงินสด หรือเป็นความเข้าใจผิดเพราะคุยเกาหลีไม่ได้กันแน่
หลังจากนั้นครั้งที่เรียกแท็กซี่สำเร็จก็ยังกลายเป็นว่าเขาจะขับอ้อมข้ามเขาไปอีกฟากเมือง จนผมต้องโทรหาคนที่ไปเดตด้วยเพื่อให้ช่วยบอกคนขับว่าเขาไปผิดทาง ผมคิดว่านี่คือความเสี่ยงที่เกิดจากการไปประเทศแปลกหน้าโดยเตรียมตัวไม่พอ
ตอนผมไปช่วงต้นปี 2015 Google ก็เป็นตัวอย่างแบบนั้น
คุณคาดหวังให้แอปเกาหลีเป็นภาษาอะไร ฝรั่งเศสหรือ?
แต่ผมเข้าใจว่ามันไม่ใช่ Uber แท้ ๆ เท่าไรนัก แต่ใกล้เคียงกับ พร็อกซี KakaoTaxi ที่ใช้หน้าตาแบบ Uber มากกว่า
ในแอปแชตหลักมีฟีเจอร์เสริมอย่างการให้ของขวัญ ซึ่งเป็นสิ่งที่ทำให้ช่องโหว่นี้เกิดขึ้นได้ แต่การเรียกรถนั้นทำผ่านแอปโมบิลิตี Kakao T ไม่ใช่ KakaoTalk และแอปนี้ยังมีบริการสกู๊ตเตอร์เช่า จักรยานไฟฟ้า การจองรถไฟและตั๋วเครื่องบินด้วย
แม้จะเชื่อมกับแพลตฟอร์มจ่ายเงิน KakaoPay แต่ตัวบริการอยู่ในแอปแยกต่างหาก และใกล้เคียงกับ Google บน Android ที่ใช้ ID กลางเข้าถึงหลายบริการมากกว่า
เพราะงั้นที่แอปมีจุดเชื่อมต่อเยอะก็น่าจะมาจากการผสานบริการภายในของตัวเองด้วย
เหมือนกับ WeChat ตรงที่ KakaoPay ถูกผสานเข้า KakaoTalk มากพอสมควร จนผู้ใช้ส่วนใหญ่ใช้ KakaoPay แค่ภายใน KakaoTalk ไม่ได้ใช้แอป KakaoPay โดยตรง
การที่มีแอป KakaoPay แยกแทบไม่มีผลอะไร และถึงไม่มีแอป KakaoPay ก็ยังโอน รับเงิน และจ่ายเงินผ่าน KakaoTalk ได้
แล้วสุดท้ายก็พบว่าไคลเอนต์นั้นเต็มไปด้วยบั๊กที่แสดงข้อความให้ผู้ใช้ผิดคนเห็น
แอปแชตบนมือถือไม่ควรถูกพัฒนาแบบ “ขยับให้ไวแล้วค่อยพังทีหลัง” และผมมองว่านี่คือผลตามธรรมชาติของ แอป all-in-one อย่าง Kakao
ถ้าไม่ใช่ แบบนั้นก็ดูจะเป็น บั๊กฝั่งเซิร์ฟเวอร์ มากกว่าบั๊กไคลเอนต์
อีกอย่าง Telegram ก็เป็นหนึ่งในแอปแชตที่เสถียร ฟีเจอร์เยอะ และใช้งานง่ายที่สุดเท่าที่ผมเคยใช้มา
เขียนไว้ว่า ต้องเป็น “คนเกาหลีที่พำนักอยู่ในหรือต่างประเทศ”
https://bugbounty.kakao.com/home
ถ้าส่งไปโดยคาดหวังว่าจะได้เงิน แล้วค่อยมารู้ทีหลังว่าจำกัดเฉพาะผู้ถือสัญชาติเกาหลี ก็คงแย่กว่านี้อีก
เพิ่มเติมคือเงินรางวัลก็ต่ำมาก เริ่มต้นที่ 50,000 วอน หรือราว 35 ดอลลาร์ ไปจนถึงสูงสุด 10,000,000 วอน หรือประมาณ 7,100 ดอลลาร์
ในฐานะชาวต่างชาติที่สร้างสตาร์ตอัปในโซลตลอด 9 ปีที่ผ่านมา ผมเจออะไรทำนองนี้มาหลายครั้ง
ต้องถามว่ามันถูกสร้างมาเพื่อเกมระยะยาว หรือเพื่อผลประโยชน์ระยะสั้นที่ตกกับคนเพียงไม่กี่คนกันแน่
มีข้อมูลไหมว่ามันถูกนำไปใช้โจมตีจริงในภาคสนามแล้วหรือยัง?