package fuzion24.device.vulnerability.broadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import org.json.JSONObject; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import fuzion24.device.vulnerability.test.VulnerabilityTestResult; import fuzion24.device.vulnerability.util.DeviceInfo; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityOrganizer; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityResultSerialzier; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityTest; /** * Created by fuzion24 on 11/25/15. */ public class ScanRunnerBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "ScanRunnerReceiver"; /* Example usage adb shell am broadcast -a com.android.vts.RUN_SCAN --es RESULT_PATH /sdcard/vts_out -n com.nowsecure.android.vts/fuzion24.device.vulnerability.broadcastreceiver.ScanRunnerBroadcastReceiver */ @Override public void onReceive(final Context context, Intent intent) { Log.d(TAG, "Received broadcast for scanrunner"); //Only allow this code to be ran on debug builds, since it accepts and writes to arbitrary file //paths, which would allow another app to arbitrarily write anywhere in this app's context. // http://android-developers.blogspot.com/2010/09/securing-android-lvl-applications.html boolean isDebuggable = ( 0 != ( context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) ); if(!isDebuggable){ Log.d(TAG, "Not running the tests because the app is not debuggable"); return; } Bundle intentExtras = intent.getExtras(); if(intentExtras == null){ Log.d(TAG, "There were no extras with the broadcast. Include RESULT_PATH"); return; } final String writeResultPath = intentExtras.getString("RESULT_PATH"); if(writeResultPath == null || writeResultPath.equals("")){ Log.d(TAG, "Result write path is null or empty"); } Log.d(TAG, "Results will be written to: " + writeResultPath); new AsyncTask<Void,Void,Void>(){ @Override protected Void doInBackground(Void... params) { List<VulnerabilityTest> tests = VulnerabilityOrganizer.getTests(context); List<VulnerabilityTestResult> results = new ArrayList<>(); for(VulnerabilityTest vt : tests){ Log.d(TAG, "Running: " + vt.getCVEorID()); boolean vulnerable = false; Exception x = null; try { vulnerable = vt.isVulnerable(context); }catch(Exception e){ x = e; } results.add(new VulnerabilityTestResult(vt, vulnerable, x)); } try { JSONObject jobj = VulnerabilityResultSerialzier.serializeResultsToJson(results, DeviceInfo.getDeviceInfo()); FileOutputStream fos = new FileOutputStream(writeResultPath); fos.write(jobj.toString(2).getBytes()); fos.close(); }catch(Exception e){ e.printStackTrace(); } return null; } }.execute(); } }