package fuzion24.device.vulnerability.vulnerabilities.system; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.AssetManager; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.lang.Thread; import java.util.ArrayList; import java.util.List; import android.os.Build; import fuzion24.device.vulnerability.util.CPUArch; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityTest; public class SamsungCREDzip implements VulnerabilityTest { private final static int BUFFER_SIZE = 1024; private final static String DESTINATION = "/sdcard/Download/"; private final static String FILENAME = "cred.zip"; private final static String ASSETNAME = "Samsung_cred.zip"; @Override public List<CPUArch> getSupportedArchitectures() { ArrayList<CPUArch> archs = new ArrayList<>(); archs.add(CPUArch.ALL); return archs; } @Override public String getCVEorID() { return "CVE-2015-7888"; } private boolean thisHasSDCardPermission(Context ctx) { String readPermission = "android.permission.READ_EXTERNAL_STORAGE"; String writePermission = "android.permission.WRITE_EXTERNAL_STORAGE"; return (ctx.checkCallingOrSelfPermission(readPermission) == PackageManager.PERMISSION_GRANTED && ctx.checkCallingOrSelfPermission(writePermission) == PackageManager.PERMISSION_GRANTED); } private boolean isSamsungPhone(){ return Build.MANUFACTURER.equals("samsung"); } @Override public boolean isVulnerable(Context context) throws Exception { boolean isVuln = false; if(!isSamsungPhone()) return false; if(!thisHasSDCardPermission(context)) throw new Exception("No SDCard permission assigned to app to perform Samsung cred.zip remote code execution test"); InputStream in = null; OutputStream out = null; try{ AssetManager assetFiles = context.getAssets(); File outFile = new File(DESTINATION, FILENAME); in = assetFiles.open(ASSETNAME); out = new FileOutputStream(outFile); byte[] buffer = new byte[BUFFER_SIZE]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } Thread.sleep(3000); outFile = null; outFile = new File(DESTINATION, FILENAME); if(outFile.exists()){ isVuln = false; outFile.delete(); }else{ isVuln = true; } }catch(IOException e){ throw new Exception("Error when extracting the asset file: " + e); }finally{ if (in != null) in.close(); if (out != null) out.close(); } return isVuln; } }