- Sự kết hợp giữa Boosts của trình duyệt Arc và vấn đề trong quy tắc Firestore đã cho phép kẻ tấn công liên kết một Boost chứa JavaScript tùy ý với tài khoản nạn nhân
- Việc sử dụng Firebase Authentication và Firestore được xác nhận bằng hooking Frida, qua đó lộ ra luồng truy cập các collection
preferences,users,user_referrals,boosts - Lỗ hổng phát sinh từ việc Boost xác định đối tượng áp dụng bằng
creatorID, trong khi kẻ tấn công lại có thể đổicreatorIDtrong tài liệu Boost của mình thành ID của người dùng khác - ID của nạn nhân có thể lấy từ
user_referrals,boostSnapshotscủa Boost công khai, Easels được chia sẻ, v.v.; khi nạn nhân truy cập website mục tiêu, Boost độc hại có thể được thực thi - The Browser Company đã vá lỗi và trả thưởng $2.000, đồng thời sau khi CVE-2024-45489 được gán, họ quyết định thu hẹp việc dùng Firebase, kiểm toán bảo mật và triển khai chương trình bug bounty
Tính năng đám mây của Arc và việc sử dụng Firestore
- Arc yêu cầu tài khoản để sử dụng, và quá trình đăng ký được xác nhận là dùng Firebase Authentication
- Quan sát mạng ban đầu không thấy yêu cầu nào khác, nhưng khi xem xét tính năng chia sẻ Easels, khả năng sử dụng Firestore đã lộ ra
- Easels là giao diện dạng bảng trắng, có thể xem trên web khi chia sẻ với người khác
- Firestore là dịch vụ database-as-a-backend, cho phép xây dựng tính năng bằng quy tắc bảo mật cơ sở dữ liệu và truy cập trực tiếp từ client mà không cần backend riêng
- Một ví dụ trước đây về quy tắc bảo mật Firestore yếu kém là Firewreck
Cách xác nhận các lời gọi Firebase
- Do Firebase Swift SDK có xu hướng không tuân theo thiết lập proxy hệ thống, tác giả đã dump các lời gọi liên quan bằng script Frida thay vì mitmproxy
- Script hook các lời gọi Firestore của các lớp Objective-C
FIRCollectionReference["- documentWithPath:"]FIRQuery["- queryWhereField:isEqualTo:"]FIRFirestore["- collectionWithPath:"]- Các phương thức thực thi như
getDocuments,addSnapshotListener:,getDocument - Các phương thức ghi tài liệu thuộc nhóm
updateData,setData
- Khi Arc chạy, các loại đường dẫn và truy vấn Firestore sau được quan sát
preferences/{userID}preferences/{userID}/stringValues/...users/{userID}- Truy vấn
inviter_id == {userID}tronguser_referrals - Truy vấn
creatorID == {userID}trongboosts
- Từ cấu trúc này, Arc đang lưu một số thiết lập môi trường, đối tượng người dùng cơ bản, thông tin giới thiệu và Boosts trên Firestore
Vì sao Boosts trở thành đường tấn công
- Arc Boosts là tính năng cho phép người dùng tùy biến website
- Chặn phần tử
- Thay đổi phông chữ
- Thay đổi màu sắc
- CSS tùy chỉnh
- JavaScript tùy chỉnh
- Boosts được lưu trong Firestore, và trình duyệt Arc truy vấn trường
creatorIDđể quyết định sẽ áp dụng Boost nào - Kẻ tấn công tạo một Boost cho Google.com từ tài khoản của mình, rồi thử thay đổi một số tham số trong tài liệu Firestore
- Do truy vấn dựa trên
creatorID, không thể trực tiếp truy vấn Boost của người dùng khác, nhưng lại có thể thay đổicreatorIDtrong tài liệu Boost của chính mình thành ID người dùng của tài khoản khác - Kết quả thử nghiệm với một tài khoản khác cho thấy khi máy tính nạn nhân truy cập Google.com, Boost do kẻ tấn công tạo được áp dụng
Chuỗi tấn công và cách lấy ID người dùng
- Luồng tấn công cuối cùng như sau
- Lấy ID người dùng của nạn nhân
- Tạo Boost độc hại chứa payload mong muốn từ tài khoản của kẻ tấn công
- Thay đổi trường
creatorIDcủa tài liệu Boost thành ID của nạn nhân - Khi nạn nhân truy cập website mục tiêu, Boost độc hại được thực thi
- Lỗ hổng này tồn tại vì Arc Boosts có thể chứa JavaScript tùy ý, được lưu trong Firestore, và đối tượng áp dụng được quyết định bằng trường
creatorID - Có nhiều cách để lấy ID người dùng của nạn nhân
user_referrals: nếu mời ai đó dùng Arc hoặc được ai đó giới thiệu, có thể lấy ID người dùng của đối phương trong bảnguser_referrals- Boosts công khai: Boost không có JavaScript có thể chia sẻ, và
boostSnapshotstrên website Arc Boosts công khai chứa ID người dùng của người tạo - Easels: cũng có thể lấy ID người dùng thông qua tính năng bảng trắng có thể chia sẻ
Bản vá và lịch trình công bố
- The Browser Company thường không có bug bounty, nhưng đã trả $2.000 USD cho lỗ hổng này
- Dòng thời gian của lỗ hổng như sau
- 25/8 5:48pm: Liên hệ lần đầu với đồng sáng lập Arc Hursh qua Signal
- 25/8 6:02pm: Chạy PoC lỗ hổng trên tài khoản Arc của Hursh
- 25/8 6:13pm: Chia sẻ chi tiết ở dạng mã hóa, sau đó được thêm vào kênh Slack
- 26/8 9:41pm: Vá lỗ hổng và trả thưởng
- 6/9 7:49pm: Gán CVE-2024-45489
- Sau đó Arc đã công bố bài viết riêng về vấn đề này, CVE-2024-45489 incident response
Thực thi trên trang có đặc quyền và xung đột quyền riêng tư
- Ngay cả khi không thể tạo Boosts từ client, chúng vẫn có thể được thực thi trên các giao thức khác
- Nếu tạo Boost nhắm vào trang
settings, nó có thể chạy trênchrome://settingsvà dẫn đến leo thang đặc quyền - Khi truy cập website, truy vấn Firestore sau xảy ra
- Truy vấn collection
boostsvới điều kiệncreatorID == {userID}vàhostPattern == "www.google.com"
- Truy vấn collection
- Ở đây
hostPatterncó nghĩa là website đã truy cập, điều này xung đột với Chính sách quyền riêng tư của Arc, nơi Arc nói rằng họ không biết người dùng truy cập website nào
Các biện pháp tiếp theo của Arc
- Nhân lỗ hổng này và việc đưa vào các tính năng mới, Arc chuyển sang hướng rời khỏi Firebase
- Bản tóm tắt của chính Arc bao gồm các biện pháp sau
- Xác nhận đã khắc phục vấn đề
- Thêm tính năng vô hiệu hóa Boosts trên client
- Kiểm toán nội bộ các quy tắc ACL Firebase hiện tại
- Thiết lập giao thức ứng phó vấn đề bảo mật
- Các biện pháp bổ sung được chia sẻ trong thảo luận nội bộ của Arc như sau
- Khắc phục vấn đề quyền riêng tư trong bản cập nhật v1.61.1
- Ngừng sử dụng Firebase trong các tính năng và sản phẩm mới
- Kiểm toán bảo mật bên ngoài cho phiên bản đó
- Khởi động chương trình bug bounty cho các lỗ hổng trong tương lai
1 bình luận
Các ý kiến trên Hacker News
Tôi là Hursh, đồng sáng lập kiêm CTO của The Browser Company, công ty làm Arc. Không có người dùng nào thực sự bị thiệt hại và chúng tôi đã vá ngay, nhưng tôi cho rằng mức độ nghiêm trọng tiềm tàng của lỗ hổng này là khó chấp nhận được
Tôi đã tổng hợp chi tiết kỹ thuật, kế hoạch cải thiện trong thời gian tới, việc rời khỏi Firebase và thiết lập chương trình bug bounty chính thức tại đây: https://arc.net/blog/CVE-2024-45489-incident-response
Tôi thực sự xin lỗi cả về bản thân lỗ hổng lẫn việc truyền thông chậm trễ; những phản hồi gồm thất vọng, giận dữ và động viên đã khiến chúng tôi thấy có trách nhiệm phải làm tốt hơn
Toàn bộ cách phản ứng trông như chỉ khi chuyện đủ ồn ào thì mới phản hồi
Tôi không muốn dùng một trình duyệt do một công ty xem nhẹ bảo mật người dùng như vậy tạo ra. Không chắc chắn, nhưng với mức độ nghiêm trọng này, nhiều khả năng nó có thể được bán với giá cao hơn rất nhiều trên chợ đen
Lỗ hổng có thể xảy ra, nhưng việc gửi dữ liệu duyệt web trông giống một lựa chọn thiết kế có chủ ý
Tôi nghĩ đây là việc mà CTO nên từ chức
Có thể nói họ đang có một cơ hội tuyệt vời để đi đúng hướng
Nhiều người trong phần bình luận ở đây đổ lỗi cho Firebase, nhưng trông giống như đang nói theo những thứ họ thật ra không hiểu rõ. Tôi không dùng Firebase, nhưng theo kinh nghiệm từng dùng trước đây, đây không phải trường hợp rìa cũng không phải vấn đề khó giải quyết, mà là cơ bản của cơ bản
Vấn đề thật sự là API được thiết kế để tin vào giá trị mà client gửi lên để nói “tôi là ai”. Rốt cuộc đây là lỗi nghiệp dư, và rất có thể chỉ cần sửa một dòng là xong. Chỉ cần xem tài liệu ở https://firebase.google.com/docs/rules/rules-and-auth#cloud-... cũng thấy
request.authcung cấp ID người dùng cần thiết (request.auth.uid)Security rules phải được xử lý nghiêm túc, và trên thực tế đó gần như là tuyến phòng thủ duy nhất
Dù có tự xây xác thực hay không, điểm cốt lõi chỉ có một: tuyệt đối không tin client
matchtrongfirestore.rules. Đây là nội dung xuất hiện nguyên như vậy trong tài liệu nhập môn bảo mật Firebase FirestoreTôi rất thích chú mèo pixel art nhỏ chạy tới chỗ mình bấm. Đó là một chi tiết nhỏ thú vị và sáng tạo mà dạo này hiếm thấy, như một lời nhắc rằng nếu chúng ta muốn thì internet cũng có thể là một không gian vui vẻ như thế
prefers-reduced-motionnên nếu bật thiết lập đó thì không hiển thị. Đây là cách xử lý rất hay: mang lại niềm vui cho người muốn, và tránh gây phiền cho người không thíchhttps://en.wikipedia.org/wiki/Neko_(software)
sudo apt install onekooneko &Rất hợp để “tặng” cho máy tính của đồng nghiệp đang rời chỗ
Theo bài viết này, Arc bắt buộc phải có tài khoản và gửi hostname của mọi trang bạn truy cập cùng ID người dùng lên Google Firebase. Vậy chẳng phải Arc đang trở thành trình duyệt có mức riêng tư yếu nhất trong số các trình duyệt hiện nay sao?
Đây là một lỗi thật sự thú vị. Các quy tắc bảo mật của dịch vụ backend như Firebase có những giá trị mặc định kỳ lạ khó giải thích. Nếu tự làm API,
userIdcủa các bản ghi nhưboosttrong trường hợp này sẽ không được nhận từ payload của request, mà sẽ được đặt bằng ID người dùng trong session.Một lập trình viên ở mức khá trở lên thường sẽ không nghĩ đến việc để client truyền vào một giá trị mà nó tự nhận là
userIdcủa mình trên một API route được bảo vệ. Ngược lại, với các quy tắc bảo mật, bất kể cách sử dụng thực tế đã được lập trình ra sao, bạn phải tưởng tượng mọi cách hệ thống có thể bị lạm dụng.Cách đúng có lẽ là đặt quyền từ chối mặc định cho mọi field. Khi đó ít nhất bạn phải chỉ rõ field chủ sở hữu là có thể ghi, và cũng sẽ phải suy nghĩ về hệ quả của việc chuyển đối tượng này cho người dùng khác.
Thật ngạc nhiên là lỗ hổng này ngớ ngẩn đến mức khó tin. Muốn thực thi mã tùy ý thì đúng nghĩa chỉ cần gửi ID người dùng của người khác, mà ID đó cũng khá dễ lấy.
Tôi không làm ở FAANG, mà làm ở một công ty tạo ra một sản phẩm tệ hại thậm chí không thật sự cần thiết, nhưng ngay cả tôi cũng sẽ không tạo ra lỗi như thế này. Vậy mà những người này nói họ sẽ làm trình duyệt, đồng thời gánh cả chuyên môn bảo mật và trách nhiệm đạo đức đi kèm sao?
Ước gì tiêu đề bài đăng có chữ Arc để những người đang dùng Arc hoặc có bạn bè dùng Arc dễ nhận ra hơn.
Nói thật, tôi cảm thấy tiêu đề nên kiểu như “Lỗi nền tảng trong trình duyệt Arc (CVE 123-4567)”.
Trên đời có nhiều lỗ hổng bảo mật nghiêm trọng nhưng vẫn có thể hiểu được vì sao chúng được tạo ra, và nếu xử lý có trách nhiệm rồi sửa thì có thể tha thứ.
Nhưng đây không phải trường hợp như vậy. Cá nhân tôi thấy nó thể hiện mức độ bất tài đủ để hủy hoại danh tiếng, đến mức khiến tôi quyết định sẽ không bao giờ dùng Arc nữa.
aug 25 5:48pm: Liên hệ lần đầu với Hursh, đồng sáng lập Arc, qua kênh mã hóa Signalaug 25 6:02pm: Chạy proof of concept lỗ hổng trên tài khoản Arc của Hurshaug 25 6:13pm: Công bố chi tiết ở dạng mã hóa và được thêm vào kênh Slackaug 26 9:41pm: Vá lỗ hổng, trả bountysep 6 7:49pm: Gán CVE (CVE-2024-45489)Từ lần liên hệ đầu đột ngột đến khi triển khai bản sửa trong 4 giờ là khá tốt, dù có tính đến khả năng bản sửa đơn giản. Sửa: ngày đã đổi nên thực ra là 28 giờ. Dù vậy vẫn ổn, và phản hồi “vào kênh Slack của chúng tôi đi” chỉ 30 phút sau lần liên hệ đầu là rất nhanh.
Với một sản phẩm quan trọng và riêng tư như trình duyệt, việc nhận 50–60 triệu USD tiền mặt và mức định giá 500 triệu USD nhưng không có mô hình kinh doanh là một dấu hiệu cảnh báo lớn. Đây không phải hoạt động từ thiện, nên bằng cách này hay cách khác sẽ có ai đó phải trả chi phí.
Cũng tiếc là Firebase không làm cho thứ này chống lỗi ngớ ngẩn tốt hơn. Và thật sự chỉ $2,500 thôi sao? Theo đúng nghĩa đen là có thể chiếm quyền toàn bộ người dùng Arc, nếu là NSA chắc họ sẽ thêm vài số 0 nữa.
Nhất là khi các đối thủ tương đương về chức năng như Supabase lại bọc quanh DBMS thông thường và mô hình xác thực.
Cảm ơn đã chia sẻ. Tôi đã dùng Arc từ tuần đầu beta.
Nhưng việc họ không nhắc đến lỗi này và các bản sửa ở bất kỳ đâu trên mạng xã hội khá đáng lo. Thời gian dùng Arc rất thú vị, nhưng sau cách xử lý như thế này, tôi không nghĩ mình có thể tiếp tục dùng.
$2,000 cho một lỗ hổng lớn như thế này là mức tiền mang tính xúc phạm.
Có lẽ cũng vì họ không bị cơ quan quản lý phạt khi xảy ra sự cố xâm nhập.