O trecho abaixo mostra um código de exemplo que envia dados sensíveis pela rede usando a classe HttpURLConnection. Os dados são enviados para https://httpbin.org/post, que é um endpoint fictício que retorna os dados recebidos.
packageorg.owasp.mastestappimportandroid.content.Contextimportandroid.util.Logimportjava.io.BufferedOutputStreamimportjava.io.BufferedWriterimportjava.io.OutputStreamWriterimportjava.net.HttpURLConnectionimportjava.net.URLimportjava.net.URLEncoderimportjava.util.logging.LoggerclassMastgTest(privatevalcontext:Context){funmastgTest():String{valSENSITIVE_DATA=mapOf("precise_location_latitude"to"37.7749","precise_location_longitude"to"-122.4194","name"to"John Doe","email_address"to"john.doe@example.com","phone_number"to"+11234567890","credit_card_number"to"1234 5678 9012 3456")varresult=""valthread=Thread{try{valurl=URL("https://httpbin.org/post")valhttpURLConnection=url.openConnection()asHttpURLConnectionhttpURLConnection.requestMethod="POST"httpURLConnection.doOutput=truehttpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded")// Creating POST data from the SENSITIVE_DATA mapvalpostData=SENSITIVE_DATA.map{(key,value)->"${URLEncoder.encode(key,"UTF-8")}=${URLEncoder.encode(value,"UTF-8")}"}.joinToString("&")valoutputStream=BufferedOutputStream(httpURLConnection.outputStream)valbufferedWriter=BufferedWriter(OutputStreamWriter(outputStream,"UTF-8"))bufferedWriter.write(postData)bufferedWriter.flush()bufferedWriter.close()outputStream.close()valresponseCode=httpURLConnection.responseCodevalresponseContent=httpURLConnection.inputStream.bufferedReader().readText()if(responseCode==HttpURLConnection.HTTP_OK){Log.d("HTTP_SUCCESS","Successfully authenticated.")}else{Log.e("HTTP_ERROR","Failed to authenticate. Response code: $responseCode")}result="$responseCode\n\n$responseContent"}catch(e:Exception){e.printStackTrace()}}thread.start()thread.join()returnresult}}
Execute mitmproxy com o script personalizado para registrar dados sensíveis e despeje o tráfego relevante em um arquivo.
Observe que o script está pré-configurado com dados já considerados sensíveis para este aplicativo. Ao executar este teste em um cenário real, você deve determinar o que é considerado dados sensíveis) com base na política de privacidade do aplicativo e nas regulamentações de privacidade relevantes. Uma maneira recomendada de fazer isso é verificando a política de privacidade do aplicativo e as declarações de privacidade da App Store.
frommitmproxyimporthttp# This data would come from another file and should be defined after identifying the data that is considered sensitive for this application.# For example by using the Google Play Store Data Safety section.SENSITIVE_DATA={"precise_location_latitude":"37.7749","precise_location_longitude":"-122.4194","name":"John Doe","email_address":"john.doe@example.com","phone_number":"+11234567890","credit_card_number":"1234 5678 9012 3456"}SENSITIVE_STRINGS=SENSITIVE_DATA.values()defcontains_sensitive_data(string):returnany(sensitiveinstringforsensitiveinSENSITIVE_STRINGS)defprocess_flow(flow):url=flow.request.pretty_urlrequest_headers=flow.request.headersrequest_body=flow.request.textresponse_headers=flow.response.headersifflow.responseelse"No response"response_body=flow.response.textifflow.responseelse"No response"if(contains_sensitive_data(url)orcontains_sensitive_data(request_body)orcontains_sensitive_data(response_body)):withopen("sensitive_data.log","a")asfile:ifflow.response:file.write(f"RESPONSE URL: {url}\n")file.write(f"Response Headers: {response_headers}\n")file.write(f"Response Body: {response_body}\n\n")else:file.write(f"REQUEST URL: {url}\n")file.write(f"Request Headers: {request_headers}\n")file.write(f"Request Body: {request_body}\n\n")defrequest(flow:http.HTTPFlow):process_flow(flow)defresponse(flow:http.HTTPFlow):process_flow(flow)
run.sh
1
mitmdump-smitm_sensitive_logger.py
Inicie o aplicativo a partir do Android Studio e clique no botão que enviará os dados sensíveis pela rede. O script capturará o tráfego de rede e registrará os dados sensíveis.
Após revisar o tráfego de rede capturado, podemos concluir que o teste falha porque os dados sensíveis são enviados pela rede.
Este é um exemplo fictício, mas em um cenário real, você deve determinar quais das instâncias relatadas são relevantes para a privacidade e precisam ser tratadas.
Observe que tanto a requisição quanto a resposta estão criptografadas usando TLS, portanto, podem ser consideradas seguras. No entanto, isso pode representar um problema de privacidade dependendo das regulamentações de privacidade relevantes e da política de privacidade do aplicativo. Agora você deve verificar a política de privacidade e as declarações de privacidade da App Store para ver se o aplicativo tem permissão para enviar esses dados para terceiros.