- Una combinación de Boosts de Arc y problemas en las reglas de Firestore permitía que un atacante asociara a la cuenta de una víctima un Boost con JavaScript arbitrario
- El uso de Firebase Auth y Firestore se confirmó mediante hooking con Frida, lo que reveló el flujo de acceso a las colecciones
preferences,users,user_referralsyboosts - La vulnerabilidad surgía porque el objetivo de aplicación de los Boost se determinaba con
creatorID, pero el atacante podía cambiar elcreatorIDde su propio documento Boost por el ID de otro usuario - El ID de la víctima podía obtenerse desde
user_referrals,boostSnapshotsde Boosts públicos, Easels compartidos y otras fuentes; cuando la víctima visitaba el sitio objetivo, el Boost malicioso podía ejecutarse - The Browser Company aplicó un parche y pagó una recompensa de $2,000; tras la asignación de CVE-2024-45489, decidió reducir su dependencia de Firebase, realizar auditorías de seguridad e impulsar un programa de bug bounty
Funciones en la nube de Arc y uso de Firestore
- Arc requería una cuenta para usarse, y se confirmó que durante el registro utilizaba autenticación de Firebase
- En la observación inicial de red no se veían otras solicitudes, pero al revisar la función para compartir Easels surgió la posibilidad de que estuviera usando Firestore
- Easels es una interfaz tipo pizarra que puede compartirse con otras personas y verse en la web
- Firestore es un servicio database-as-a-backend que permite construir funciones sin un backend propio, usando reglas de seguridad de la base de datos y acceso directo desde el cliente
- Como caso previo de reglas de seguridad deficientes en Firestore, se enlaza Firewreck
Cómo se confirmó la llamada a Firebase
- Como el SDK de Swift de Firebase tiende a no respetar la configuración del proxy del sistema, en vez de mitmproxy se usó un script de Frida para volcar las llamadas relacionadas
- El script hacía hooking de llamadas de Firestore en clases Objective-C
FIRCollectionReference["- documentWithPath:"]FIRQuery["- queryWhereField:isEqualTo:"]FIRFirestore["- collectionWithPath:"]- métodos de ejecución como
getDocuments,addSnapshotListener:,getDocument - métodos de escritura de documentos de la familia
updateData,setData
- Durante la ejecución de Arc se observaron los siguientes tipos de rutas y consultas de Firestore
preferences/{userID}preferences/{userID}/stringValues/...users/{userID}- consulta en
user_referralsconinviter_id == {userID} - consulta en
boostsconcreatorID == {userID}
- En esta estructura, Arc almacenaba en Firestore algunas preferencias, el objeto base del usuario, información de referidos y los Boosts
Por qué Boosts se convirtió en la ruta de ataque
- Arc Boosts es una función con la que el usuario puede personalizar sitios web
- bloqueo de elementos
- cambio de fuente
- cambio de colores
- CSS personalizado
- JavaScript personalizado
- Los Boosts se almacenan en Firestore, y el navegador Arc consulta qué Boost aplicar usando el campo
creatorID - El atacante creó en su propia cuenta un Boost para Google.com y luego probó modificando algunos parámetros del documento en Firestore
- Debido a la consulta basada en
creatorID, no podía consultar directamente los Boosts de otros usuarios, pero sí podía cambiar elcreatorIDde su propio documento Boost por el ID de usuario de otra cuenta - Al probarlo con otra cuenta, el Boost creado por el atacante se aplicó en la computadora de la víctima cuando esta accedió a Google.com
Cadena de ataque y obtención del ID de usuario
- El flujo final del ataque era el siguiente
- obtener el ID de usuario de la víctima
- crear en la cuenta del atacante un Boost malicioso con el payload deseado
- cambiar el campo
creatorIDdel documento Boost por el ID de la víctima - cuando la víctima visitara el sitio web objetivo, el Boost malicioso se ejecutaría
- Esta vulnerabilidad era posible porque Arc Boosts puede incluir JavaScript arbitrario, se almacena en Firestore y el destino de aplicación se decide por el campo
creatorID - Había varias formas de obtener el ID de usuario de la víctima
user_referrals: si alguien invitaba a otra persona a Arc o era referido, se podía obtener el ID de usuario de la contraparte desde la tablauser_referrals- Boosts públicos: los Boosts sin JavaScript pueden compartirse, y en
boostSnapshotsdel sitio público de Arc Boosts aparece incluido el ID de usuario del creador - Easels: la función de pizarra compartible también permitía obtener el ID de usuario
Parche y cronograma de divulgación
- The Browser Company normalmente no hacía bug bounty, pero por esta vulnerabilidad pagó $2,000 USD
- La línea de tiempo de la vulnerabilidad fue la siguiente
- 25 de agosto, 5:48pm: primer contacto por Signal con Hursh, cofundador de Arc
- 25 de agosto, 6:02pm: ejecución de la PoC de la vulnerabilidad en la cuenta de Arc de Hursh
- 25 de agosto, 6:13pm: tras compartir los detalles en formato cifrado, se añadió al investigador a un canal de Slack
- 26 de agosto, 9:41pm: parche de la vulnerabilidad y pago de la recompensa
- 6 de septiembre, 7:49pm: asignación de CVE-2024-45489
- Después, Arc publicó su propio artículo sobre el problema: CVE-2024-45489 incident response
Ejecución en páginas privilegiadas y conflicto con la privacidad
- Aunque los Boosts no podían crearse desde el cliente, sí podían ejecutarse en otros protocolos
- Si se creaba un Boost dirigido a la página
settings, este se ejecutaba enchrome://settings, lo que podía derivar en elevación de privilegios - Al visitar un sitio se producía la siguiente consulta a Firestore
- búsqueda en la colección
boostscon las condicionescreatorID == {userID}yhostPattern == "www.google.com"
- búsqueda en la colección
- Aquí,
hostPatternrepresenta el sitio visitado, lo que entra en conflicto con la política de privacidad de Arc, donde se afirma que Arc no sabe qué sitios visita el usuario
Medidas posteriores de Arc
- A raíz de la vulnerabilidad y de la incorporación de nuevas funciones, Arc comenzó a alejarse de Firebase
- El resumen propio de Arc incluye las siguientes medidas
- confirmación de la corrección del problema
- incorporación de una función para desactivar Boosts desde el cliente
- auditoría interna de las reglas ACL actuales de Firebase
- establecimiento de un protocolo de respuesta a incidentes de seguridad
- Las medidas adicionales compartidas en discusiones internas de Arc fueron las siguientes
- corrección del problema de privacidad en la actualización v1.61.1
- dejar de usar Firebase en nuevas funciones y productos
- auditoría de seguridad externa para esa versión
- inicio de un programa de bug bounty para futuras vulnerabilidades
1 comentarios
Opiniones en Hacker News
Soy Hursh, cofundador y CTO de The Browser Company, la empresa que hace Arc. No hubo usuarios afectados en la práctica y lo parcheamos de inmediato, pero considero que la gravedad potencial de esta vulnerabilidad es inaceptable.
Aquí resumimos los detalles técnicos, los planes de mejora a futuro, la salida de Firebase y la creación de un programa formal de bug bounty: https://arc.net/blog/CVE-2024-45489-incident-response
Lamento mucho tanto la vulnerabilidad en sí como la comunicación tardía, y los comentarios —incluyendo decepción, enojo y aliento— nos hacen asumir la responsabilidad de mejorar.
Toda la respuesta parece ser del tipo “solo reaccionamos cuando el ruido es suficiente”.
No quiero usar un navegador hecho por una empresa que se toma tan a la ligera la seguridad de sus usuarios. No puedo asegurarlo, pero con este nivel de gravedad probablemente se habría vendido por mucho más en el mercado negro.
Las vulnerabilidades pueden ocurrir, pero enviar datos de navegación parece una decisión de diseño intencional.
Creo que es un caso en el que el CTO debería renunciar.
Se les presentó una oportunidad excelente para encaminarse en la dirección correcta.
En estos comentarios muchos culpan a Firebase, pero parece que repiten cosas que en realidad no conocen bien. No uso Firebase, pero por lo que probé antes, esto no es un caso extremo ni un problema difícil de resolver: es lo más básico de lo básico.
El verdadero problema fue diseñar la API para que confiara en un valor que el cliente envía diciendo “quién soy”. Al final es un error de principiante y probablemente podía arreglarse con un cambio de una línea. Solo con ver la documentación, en https://firebase.google.com/docs/rules/rules-and-auth#cloud-...
request.authentrega el ID de usuario necesario (request.auth.uid).Las reglas de seguridad deben tomarse en serio y, en la práctica, son la única línea de defensa.
Ya sea que crees tu propia autenticación o no, la clave es una sola: nunca confíes en el cliente.
matchdefirestore.rules. Es contenido que aparece tal cual en la documentación introductoria de seguridad de Firebase Firestore.Me encantó el pequeño gato de pixel art que corría hacia donde hacías clic. Era un detalle divertido e ingenioso de esos que hoy casi no se ven, y se sentía como un recordatorio de que internet también puede ser un lugar así de alegre si queremos.
prefers-reduced-motiony no lo muestra si esa opción está activada. Excelente manejo: le da diversión a quien la quiere y evita molestias a quien no.https://en.wikipedia.org/wiki/Neko_(software)
sudo apt install onekooneko &Es un buen regalo para la computadora de un compañero que se ausentó.
Según este artículo, Arc exige una cuenta y envía a Google Firebase el nombre de host de cada página que visitas junto con tu ID de usuario. Entonces me pregunto si Arc no será el navegador con peor privacidad entre los que se usan hoy
Es un bug realmente genial. Las reglas de seguridad de servicios de backend como Firebase tienen valores predeterminados raros y difíciles de explicar. Si uno construyera su propia API, el
userIdde un registro como elboostde este caso no se recibiría desde el payload de la solicitud, sino que se establecería con el ID de usuario de la sesiónCualquier desarrollador por encima de cierto nivel difícilmente pensaría en permitir que el cliente envíe a una ruta de API protegida un valor que dice ser su propio
userId. En cambio, con las reglas de seguridad hay que imaginar todas las formas en que el sistema puede ser mal usado, independientemente de la manera en que realmente se programó para usarseLa solución correcta probablemente sea tener permisos de denegación por defecto para todos los campos. Así, como mínimo, tendrías que declarar explícitamente que el campo de propietario es escribible, y eso te obligaría a pensar en las implicaciones de transferir este objeto a otro usuario
Me sorprende lo ridículamente tonta que es esta vulnerabilidad. Para ejecutar código arbitrario, literalmente solo hacía falta enviar el ID de usuario de otra persona, y ese ID además era bastante fácil de obtener
No trabajo en FAANG ni nada parecido, sino en una empresa que hace un producto mediocre que ni siquiera es realmente necesario, pero aun así yo no cometería un bug así. Y esta gente pretende hacer un navegador y asumir la experiencia de seguridad y la responsabilidad moral que eso conlleva
Me gustaría que el título del post incluyera Arc para que lo reconozcan mejor quienes usan Arc o tienen conocidos que lo usan
Sinceramente, creo firmemente que el título debería ser algo como “Bug fundamental en el navegador Arc (CVE 123-4567)”
En el mundo hay muchas vulnerabilidades de seguridad graves que son comprensibles, y si se manejan y corrigen responsablemente, se pueden perdonar
Pero este no es uno de esos casos. Para mí muestra una incompetencia capaz de destruir su reputación, al punto de convencerme de no volver a usar Arc
aug 25 5:48pm: primer contacto con Hursh, cofundador de Arc, por un canal cifrado de Signalaug 25 6:02pm: ejecución de la prueba de concepto de la vulnerabilidad en la cuenta de Arc de Hurshaug 25 6:13pm: divulgación de los detalles en formato cifrado y agregado a un canal de Slackaug 26 9:41pm: vulnerabilidad parcheada, recompensa pagadaCuatro horas desde el primer contacto inesperado hasta desplegar la corrección es bastante bueno, incluso considerando que quizá el arreglo era simple. Corrección: cambió la fecha, así que en realidad fueron 28 horas. Aun así es aceptable, y que 30 minutos después del primer contacto la respuesta fuera “entra a nuestro canal de Slack” es muy rápido
En un producto tan importante y personal como un navegador, recibir entre 50 y 60 millones de dólares en efectivo y una valuación de 500 millones sin tener modelo de negocio es una gran señal de alerta. No es una obra de caridad, así que alguien terminará pagando de alguna forma
También es una lástima que Firebase no haya logrado hacer esto más a prueba de tontos. ¿Y de verdad solo $2,500? Literalmente se podía tomar control de todos los usuarios de Arc; la NSA le habría agregado varios ceros más
Sobre todo cuando competidores funcionales como Supabase envuelven un DBMS común y un modelo de autenticación
Gracias por compartirlo. Uso Arc desde la primera semana de la beta
Pero me preocupa bastante que no hayan mencionado este bug ni su corrección en ninguna red social. Disfruté el tiempo usando Arc, pero viendo esta forma de manejarlo, no creo que pueda seguir usándolo
$2,000 por una vulnerabilidad tan grande es una cantidad insultante
Quizá sea porque los reguladores no las castigan por los incidentes de seguridad