- ปัญหาจากการทำงานร่วมกันของ Boosts ใน Arc กับกฎ Firestore ทำให้ผู้โจมตีสามารถผูก Boost ที่มี JavaScript ตามต้องการเข้ากับบัญชีของเหยื่อได้
- มีการยืนยันการใช้ Firebase Auth และ Firestore ด้วย การ hook ด้วย Frida และพบลำดับการเข้าถึงคอลเลกชัน
preferences,users,user_referrals,boosts - ช่องโหว่เกิดจาก Arc ใช้
creatorIDเป็นเกณฑ์ตัดสินว่า Boost จะถูกนำไปใช้กับใคร แต่ผู้โจมตีสามารถ เปลี่ยนcreatorIDในเอกสาร Boost ของตัวเองเป็น ID ผู้ใช้อื่นได้ - สามารถหา ID ของเหยื่อได้จาก
user_referrals,boostSnapshotsของ Boost แบบสาธารณะ, และ Easels ที่แชร์ไว้ และเมื่อเหยื่อเข้าเว็บเป้าหมาย Boost อันตรายก็อาจถูกรันได้ - The Browser Company ออกแพตช์พร้อมจ่ายรางวัล $2,000 และหลังได้รับการกำหนด CVE-2024-45489 ก็ประกาศว่าจะลดการใช้ Firebase, ทำ security audit, และเดินหน้าโปรแกรม bug bounty
ฟีเจอร์คลาวด์ของ Arc และการใช้ Firestore
- Arc ต้องใช้ บัญชีผู้ใช้ จึงจะใช้งานได้ และยืนยันได้ว่ากระบวนการสมัครใช้ Firebase Auth
- ในการสังเกตเครือข่ายช่วงแรกไม่เห็นคำขออื่นที่ชัดเจน แต่เมื่อดูฟีเจอร์แชร์ Easels ก็เริ่มเห็นความเป็นไปได้ว่าใช้งาน Firestore
- Easels คืออินเทอร์เฟซลักษณะไวท์บอร์ดที่สามารถแชร์ให้คนอื่นดูบนเว็บได้
- Firestore เป็นบริการ database-as-a-backend ที่สามารถสร้างฟีเจอร์ได้ด้วยกฎความปลอดภัยของฐานข้อมูลและการเข้าถึงโดยตรงจากไคลเอนต์ โดยไม่ต้องมีแบ็กเอนด์แยกต่างหาก
- ตัวอย่างก่อนหน้าของกฎความปลอดภัย Firestore ที่หละหลวมเชื่อมโยงไปยัง Firewreck
วิธีที่ใช้ยืนยันการเรียก Firebase
- เนื่องจาก Swift SDK ของ Firebase มักไม่ทำตามการตั้งค่า system proxy จึงใช้ สคริปต์ Frida dump การเรียกที่เกี่ยวข้องแทน mitmproxy
- สคริปต์ทำการ hook การเรียก Firestore ของ Objective-C class
FIRCollectionReference["- documentWithPath:"]FIRQuery["- queryWhereField:isEqualTo:"]FIRFirestore["- collectionWithPath:"]- เมธอดที่ใช้รันจริง เช่น
getDocuments,addSnapshotListener:,getDocument - เมธอดเขียนเอกสารตระกูล
updateData,setData
- ระหว่างรัน Arc พบเส้นทางและคิวรี Firestore ประเภทต่อไปนี้
preferences/{userID}preferences/{userID}/stringValues/...users/{userID}- คิวรี
user_referralsด้วยเงื่อนไขinviter_id == {userID} - คิวรี
boostsด้วยเงื่อนไขcreatorID == {userID}
- จากโครงสร้างนี้ Arc เก็บการตั้งค่าบางส่วน, ออบเจ็กต์ผู้ใช้พื้นฐาน, ข้อมูลการแนะนำ, และ Boosts ไว้ใน Firestore
เหตุใด Boosts จึงกลายเป็นเส้นทางโจมตี
- Arc Boosts คือฟีเจอร์ที่ให้ผู้ใช้ปรับแต่งเว็บไซต์ได้
- บล็อกองค์ประกอบ
- เปลี่ยนฟอนต์
- เปลี่ยนสี
- CSS แบบกำหนดเอง
- JavaScript แบบกำหนดเอง
- Boosts ถูกเก็บไว้ใน Firestore และเบราว์เซอร์ Arc จะคิวรีด้วยฟิลด์
creatorIDเพื่อดูว่าควรใช้ Boost ใด - ผู้โจมตีสร้าง Boost สำหรับ Google.com จากบัญชีของตัวเอง แล้วทดลองแก้พารามิเตอร์บางส่วนในเอกสาร Firestore
- แม้จะคิวรี Boost ของผู้ใช้อื่นโดยตรงไม่ได้เพราะใช้เงื่อนไข
creatorIDแต่ผู้โจมตีสามารถ เปลี่ยนcreatorIDในเอกสาร Boost ของตัวเองเป็น ID ผู้ใช้ของบัญชีอื่นได้ - เมื่อลองกับอีกบัญชีหนึ่ง พบว่าเมื่อเครื่องของเหยื่อเข้า Google.com Boost ที่ผู้โจมตีสร้างไว้จะถูกนำไปใช้
สายโซ่การโจมตีและการหา user ID
- ลำดับการโจมตีสุดท้ายเป็นดังนี้
- หา user ID ของเหยื่อ
- สร้าง Boost อันตรายที่มี payload ตามต้องการจากบัญชีของผู้โจมตี
- เปลี่ยนฟิลด์
creatorIDของเอกสาร Boost ให้เป็น ID ของเหยื่อ - เมื่อเหยื่อเข้าเว็บไซต์เป้าหมาย Boost อันตรายจะทำงาน
- ช่องโหว่นี้เกิดขึ้นได้เพราะ Arc Boosts สามารถมี JavaScript ตามต้องการได้, ถูกเก็บไว้ใน Firestore, และการตัดสินว่าจะใช้กับใครอิงจากฟิลด์
creatorID - มีหลายวิธีในการหา user ID ของเหยื่อ
user_referrals: หากมีการเชิญหรือได้รับคำเชิญให้ใช้ Arc ก็สามารถหา user ID ของอีกฝ่ายได้จากตารางuser_referrals- Boosts แบบสาธารณะ: Boost ที่ไม่มี JavaScript สามารถแชร์ได้ และ
boostSnapshotsบน เว็บไซต์สาธารณะของ Arc Boosts มี user ID ของผู้สร้างรวมอยู่ด้วย - Easels: ฟีเจอร์ไวท์บอร์ดที่แชร์ได้ก็เป็นอีกช่องทางในการหา user ID
แพตช์และไทม์ไลน์การเปิดเผย
- โดยปกติ The Browser Company ไม่ค่อยมี bug bounty แต่สำหรับช่องโหว่นี้ได้จ่าย $2,000 USD
- ไทม์ไลน์ของช่องโหว่มีดังนี้
- 25 สิงหาคม 5:48pm: ติดต่อ Hursh ผู้ร่วมก่อตั้ง Arc ครั้งแรกผ่าน Signal
- 25 สิงหาคม 6:02pm: รัน PoC ของช่องโหว่บนบัญชี Arc ของ Hursh
- 25 สิงหาคม 6:13pm: แชร์รายละเอียดในรูปแบบเข้ารหัสแล้วถูกเพิ่มเข้า Slack channel
- 26 สิงหาคม 9:41pm: แพตช์ช่องโหว่และจ่ายเงินรางวัล
- 6 กันยายน 7:49pm: ได้รับการกำหนด CVE-2024-45489
- หลังจากนั้น Arc ก็เผยแพร่บทความของตัวเองเกี่ยวกับประเด็นนี้ที่ CVE-2024-45489 incident response
การรันบนหน้าที่มีสิทธิ์และความขัดแย้งด้านความเป็นส่วนตัว
- แม้จะไม่สามารถสร้าง Boosts จากฝั่งไคลเอนต์ได้ แต่ก็ยังสามารถรันบนโปรโตคอลอื่นได้
- หากสร้าง Boost โดยกำหนดเป้าหมายเป็นหน้า
settingsก็จะไปรันบนchrome://settingsและอาจนำไปสู่ การยกระดับสิทธิ์ - เมื่อมีการเข้าเว็บไซต์ จะเกิดคิวรี Firestore ดังนี้
- คิวรีคอลเลกชัน
boostsด้วยเงื่อนไขcreatorID == {userID}และhostPattern == "www.google.com"
- คิวรีคอลเลกชัน
- ในที่นี้
hostPatternหมายถึงเว็บไซต์ที่เข้าใช้งาน ซึ่งขัดกับ นโยบายความเป็นส่วนตัวของ Arc ที่ระบุว่า Arc ไม่ทราบว่าผู้ใช้เข้าเว็บไซต์ใด
มาตรการติดตามผลของ Arc
- Arc ปรับทิศทาง ออกจาก Firebase โดยอาศัยโอกาสจากทั้งช่องโหว่นี้และการเพิ่มฟีเจอร์ใหม่
- ในสรุปของ Arc เองมีมาตรการดังต่อไปนี้
- ยืนยันการแก้ไขปัญหา
- เพิ่มฟีเจอร์ปิดใช้งาน Boosts จากฝั่งไคลเอนต์
- ตรวจสอบภายในเกี่ยวกับกฎ Firebase ACL ที่ใช้อยู่ในปัจจุบัน
- จัดทำโปรโตคอลรับมือประเด็นด้านความปลอดภัย
- มาตรการเพิ่มเติมที่แชร์จากการหารือภายใน Arc มีดังนี้
- แก้ปัญหาด้านความเป็นส่วนตัวในอัปเดต v1.61.1
- หยุดใช้ Firebase ในฟีเจอร์และผลิตภัณฑ์ใหม่
- ทำ external security audit สำหรับเวอร์ชันดังกล่าว
- เริ่มโปรแกรม bug bounty สำหรับช่องโหว่ในอนาคต
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมคือ Hursh ผู้ร่วมก่อตั้งและ CTO ของ The Browser Company ผู้พัฒนา Arc แม้จะไม่มีผู้ใช้ที่ได้รับผลกระทบจริงและเราแพตช์ทันที แต่เรามองว่า ความร้ายแรงที่อาจเกิดขึ้นได้ ของช่องโหว่นี้เป็นสิ่งที่ยอมรับได้ยาก
รายละเอียดทางเทคนิค แผนการปรับปรุงในอนาคต การย้ายออกจาก Firebase และการจัดทำ โปรแกรมบั๊กบาวน์ตี อย่างเป็นทางการ สรุปไว้ที่นี่: https://arc.net/blog/CVE-2024-45489-incident-response
ขออภัยอย่างจริงใจทั้งเรื่องช่องโหว่เองและการสื่อสารที่ล่าช้า ฟีดแบ็กทั้งความผิดหวัง ความโกรธ และกำลังใจทำให้เรารู้สึกมีความรับผิดชอบที่จะทำให้ดียิ่งขึ้น
การตอบสนองทั้งหมดดูเหมือนจะเกิดขึ้นก็ต่อเมื่อเรื่องดังมากพอเท่านั้น
ผมไม่อยากใช้เบราว์เซอร์ที่ทำโดยบริษัทที่มองความปลอดภัยของผู้ใช้เบาแบบนี้ ถึงจะไม่แน่ใจ แต่ถ้าร้ายแรงระดับนี้ก็น่าจะขายในตลาดมืดได้แพงกว่านี้มาก
ช่องโหว่เกิดขึ้นได้ แต่การส่งข้อมูลการท่องเว็บดูเหมือนเป็นการเลือกออกแบบโดยตั้งใจ
ผมคิดว่านี่เป็นกรณีที่ CTO ควรลาออก
ถือว่าได้รับโอกาสทองในการกำหนดทิศทางที่ถูกต้องแล้ว
หลายคอมเมนต์ที่นี่โทษ Firebase กันมาก แต่ดูเหมือนพูดตาม ๆ กันในเรื่องที่จริง ๆ แล้วไม่ค่อยรู้ ผมไม่ได้ใช้ Firebase แต่จากที่เคยใช้มาก่อน เรื่องนี้ไม่ใช่เคสชายขอบและไม่ใช่ปัญหาที่แก้ยากเลย แต่เป็น พื้นฐานสุด ๆ
ปัญหาจริงคือ API ถูกทำให้เชื่อค่าที่ไคลเอนต์ส่งมาว่า “ฉันคือใคร” สุดท้ายคือความผิดพลาดแบบมือสมัครเล่น และอาจแก้ได้ด้วยการแก้เพียงบรรทัดเดียวด้วยซ้ำ แค่ดูเอกสารที่ https://firebase.google.com/docs/rules/rules-and-auth#cloud-... ก็จะเห็นว่า
request.authให้ ID ผู้ใช้ที่ต้องการ (request.auth.uid)กฎความปลอดภัยต้องถูกปฏิบัติอย่างจริงจัง และแทบจะเป็นแนวป้องกันเพียงอย่างเดียว
ไม่ว่าจะสร้างระบบยืนยันตัวตนเองหรือไม่ หลักสำคัญมีอย่างเดียว: อย่าเชื่อใจไคลเอนต์เด็ดขาด
matchของfirestore.rulesซึ่งเป็นเนื้อหาที่มีอยู่ตรง ๆ ในเอกสารระดับเริ่มต้นด้านความปลอดภัยของ Firebase Firestoreผมชอบ แมวพิกเซลอาร์ต ตัวเล็ก ๆ ที่วิ่งมาตรงจุดที่คลิกมาก เป็นลูกเล่นเล็ก ๆ ที่สนุกและแปลกใหม่ ซึ่งช่วงนี้ไม่ค่อยได้เห็นบ่อย และเหมือนเป็น reminder ว่าอินเทอร์เน็ตก็เป็นพื้นที่สนุกแบบนั้นได้ถ้าเราต้องการ
prefers-reduced-motionเลยไม่แสดงถ้ามีการตั้งค่านั้นไว้ เป็นการจัดการที่ดีมาก ให้ความสนุกกับคนที่อยากได้ และไม่รบกวนคนที่ไม่ชอบhttps://en.wikipedia.org/wiki/Neko_(software)
sudo apt install onekooneko &เหมาะเป็นของขวัญให้คอมพิวเตอร์ของเพื่อนร่วมงานที่ไม่อยู่ที่โต๊ะ
ตามบทความนี้ Arc บังคับให้มีบัญชี และส่งชื่อโฮสต์ของทุกหน้าที่ผู้ใช้เข้าเยี่ยมชมพร้อมกับ ID ผู้ใช้ไปยัง Google Firebase ถ้าอย่างนั้น Arc ก็อาจเป็น เบราว์เซอร์ที่มีความเป็นส่วนตัวอ่อนแอที่สุด ในบรรดาเบราว์เซอร์ที่ใช้งานกันอยู่ตอนนี้ไม่ใช่หรือ
เป็นบั๊กที่เจ๋งจริง ๆ บริการแบ็กเอนด์อย่าง Firebase มีค่าเริ่มต้นแปลก ๆ ในกฎความปลอดภัยที่อธิบายได้ยาก ถ้าสร้าง API เอง
userIdของเรคอร์ดอย่างboostในกรณีนี้ ผมจะไม่รับจาก request payload แต่จะตั้งจาก ID ผู้ใช้ใน sessionนักพัฒนาระดับหนึ่งขึ้นไปแทบจะไม่คิดให้ไคลเอนต์ส่งค่าที่อ้างว่าเป็น
userIdของตัวเองเข้ามาในเส้นทาง API ที่ถูกป้องกันอยู่แล้ว ในทางกลับกัน สำหรับกฎความปลอดภัย คุณต้องจินตนาการทุกวิธีที่ระบบอาจถูกนำไปใช้ผิด ๆ โดยไม่ขึ้นกับวิธีใช้งานที่โปรแกรมไว้จริงวิธีแก้ที่ถูกน่าจะเป็นการตั้ง สิทธิ์ปฏิเสธโดยปริยาย ให้ทุกฟิลด์ อย่างน้อยก็จะบังคับให้ต้องระบุชัดเจนว่าฟิลด์เจ้าของเขียนได้ และทำให้ต้องคิดถึงผลกระทบของการโอนอ็อบเจกต์นี้ให้ผู้ใช้อื่น
น่าทึ่งว่าช่องโหว่นี้โง่แบบเหลือเชื่อแค่ไหน ถ้าจะรันโค้ดตามอำเภอใจ ก็แค่ส่ง ID ผู้ใช้ของคนอื่นเข้าไปตามตัวอักษร และ ID นั้นก็หาได้ค่อนข้างง่าย
ผมไม่ได้ทำงานที่ FAANG ด้วยซ้ำ แถมทำงานในบริษัทที่ทำผลิตภัณฑ์ห่วย ๆ ซึ่งจริง ๆ ก็ไม่จำเป็น แต่ถึงเป็นผมก็ไม่ทำบั๊กแบบนี้ แล้วคนพวกนี้จะมาทำเบราว์เซอร์ และรับทั้งความเชี่ยวชาญด้านความปลอดภัยกับความรับผิดชอบทางจริยธรรมที่ตามมาด้วยจริงหรือ
อยากให้ใส่ Arc ไว้ในชื่อโพสต์ เพื่อให้คนที่ใช้ Arc หรือมีคนรู้จักใช้ Arc สังเกตเห็นได้ดีกว่านี้
พูดตรง ๆ ผมรู้สึกแรงมากว่าชื่อเรื่องควรเป็นประมาณ “บั๊กพื้นฐานในเบราว์เซอร์ Arc (CVE 123-4567)”
ในโลกนี้มีช่องโหว่ความปลอดภัยร้ายแรงจำนวนมากที่เกิดขึ้นอย่างพอเข้าใจได้ และถ้าจัดการกับมันอย่างรับผิดชอบและแก้ไขก็ให้อภัยได้
แต่นี่ไม่ใช่กรณีแบบนั้น สำหรับผมมันแสดงถึง ความไร้ความสามารถระดับทำลายชื่อเสียง และมากพอให้ตัดสินใจว่าจะไม่ใช้ Arc อีก
aug 25 5:48pm: ติดต่อ Hursh ผู้ร่วมก่อตั้ง Arc ครั้งแรกผ่านช่องทางเข้ารหัสของ Signalaug 25 6:02pm: รัน proof of concept ของช่องโหว่บนบัญชี Arc ของ Hurshaug 25 6:13pm: เปิดเผยรายละเอียดในรูปแบบเข้ารหัส แล้วถูกเพิ่มเข้า Slack channelaug 26 9:41pm: แพตช์ช่องโหว่และจ่าย bountysep 6 7:49pm: ได้รับการกำหนด CVE (CVE-2024-45489)จากการติดต่อครั้งแรกแบบกะทันหันจนถึงการปล่อยแก้ไขใน 4 ชั่วโมง ถือว่าดีทีเดียว แม้จะคำนึงว่าการแก้อาจเรียบง่ายก็ตาม แก้ไข: วันที่เปลี่ยนไปแล้ว ดังนั้นจริง ๆ คือ 28 ชั่วโมง ถึงอย่างนั้นก็ยังใช้ได้ และการตอบกลับภายใน 30 นาทีหลังติดต่อครั้งแรกว่า “เข้ามาใน Slack channel ของเรา” นั้นเร็วมาก
สำหรับผลิตภัณฑ์ที่สำคัญและเป็นส่วนตัวอย่างเบราว์เซอร์ การที่ได้รับเงินสด 50–60 ล้านดอลลาร์และมูลค่าประเมิน 500 ล้านดอลลาร์ แต่ไม่มีโมเดลธุรกิจ ถือเป็นสัญญาณอันตรายใหญ่ นี่ไม่ใช่งานการกุศล ดังนั้นต้องมีใครสักคนจ่ายต้นทุนในทางใดทางหนึ่ง
น่าเสียดายที่ Firebase ก็ทำให้มันกันพลาดมากกว่านี้ไม่ได้ และจริง ๆ ให้แค่ $2,500 เองหรือ? ตามตัวอักษรคือสามารถยึดผู้ใช้ Arc ทั้งหมดได้เลย ถ้าเป็น NSA คงเติมศูนย์เพิ่มอีกหลายตัว
โดยเฉพาะเมื่อคู่แข่งด้านฟีเจอร์อย่าง Supabase เป็นการห่อหุ้ม DBMS ทั่วไปกับโมเดลการยืนยันตัวตน
ขอบคุณที่แชร์ ผมใช้ Arc มาตั้งแต่สัปดาห์แรกของเบต้า
แต่ข้อเท็จจริงที่ว่าไม่มีการพูดถึงบั๊กนี้และสิ่งที่แก้ไขบนโซเชียลมีเดียที่ไหนเลยนั้นค่อนข้างน่ากังวล ช่วงเวลาที่ใช้ Arc สนุกดี แต่เห็นวิธีจัดการแบบนี้แล้วคงใช้ต่อไม่ไหว
$2,000 สำหรับช่องโหว่ใหญ่ขนาดนี้เป็นจำนวนเงินที่ดูถูกกันมาก
อาจเป็นเพราะหน่วยงานกำกับดูแลไม่ได้ลงโทษบริษัทจากเหตุละเมิดก็ได้