content: package fuzion24.device.vulnerability.vulnerabilities.framework.zip;
  
  import android.content.Context;
  
  import org.apache.commons.compress.archivers.zip.ModdedZipArchiveEntry;
  import org.apache.commons.compress.archivers.zip.ModdedZipArchiveOutputStream;
  import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
  
  import java.io.ByteArrayOutputStream;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.util.ArrayList;
  import java.util.Enumeration;
  import java.util.List;
  import java.util.zip.CRC32;
  import java.util.zip.ZipEntry;
  import java.util.zip.ZipFile;
  
  import fuzion24.device.vulnerability.util.CPUArch;
  import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityTest;
  
  public class ZipBug9695860 implements VulnerabilityTest {
      /*
  
       */
      @Override
      public String getCVEorID() {
          return "ZipBug 9695860";
      }
  
  
  
      @Override
      public List<CPUArch> getSupportedArchitectures() {
          ArrayList<CPUArch> archs = new ArrayList<>();
          archs.add(CPUArch.ALL);
          return archs;
      }
  
      private long getCRC(byte[]data){
          CRC32 crc = new CRC32();
          crc.reset();
          crc.update(data);
          return crc.getValue();
      }
  
      @Override
      public boolean isVulnerable(Context context) throws Exception {
          String fileName1 = "test_file_name1";
          String fileName2 = "test_file_name2";
  
          byte []file1Data = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes();
          byte []file2data = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB".getBytes();
  
          // create the template data
          ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
          ModdedZipArchiveOutputStream out = new ModdedZipArchiveOutputStream(bytesOut);
  
          ModdedZipArchiveEntry ze1 = new ModdedZipArchiveEntry(fileName1);
          ze1.setCrc(getCRC(file1Data));
          ze1.setSize(file1Data.length);
          ze1.setMethod(ZipEntry.STORED);
  
          ModdedZipArchiveEntry ze2 = new ModdedZipArchiveEntry(fileName2);
          ze2.setCrc(getCRC(file2data));
          ze2.setSize(file2data.length);
          ze2.setMethod(ZipEntry.STORED);
  
          out.putArchiveEntry(ze1);
          out.write(file1Data);
          out.closeArchiveEntry();
  
          out.putArchiveEntry(ze2);
          out.write(file2data);
          out.closeArchiveEntry();
  
          List<ZipArchiveEntry> normalEntries = new ArrayList<>();
          List<ZipArchiveEntry> moddedEntries = new ArrayList<>();
          normalEntries.add(ze1);
          moddedEntries.add(ze2);
  
          out.flush();
          out.finish(normalEntries, moddedEntries);
  
          // write the result to a file
          File outputDir = context.getCacheDir();
          File badZip = File.createTempFile("prefix", "extension", outputDir);
          badZip.deleteOnExit();
          FileOutputStream outstream = new FileOutputStream(badZip);
          outstream.write(bytesOut.toByteArray());
          outstream.close();
  
          // see if we can still handle it
          ZipFile bad = new ZipFile(badZip);
          final Enumeration<? extends ZipEntry> entries = bad.entries();
          while ( entries.hasMoreElements() )
          {
              final ZipEntry entry = entries.nextElement();
              if(entry.getName().equals(fileName2))
                  return true;
          }
          bad.close();
          return false;
  
      }
  }
  