Example #1
0
 def EficheckCollectHashes(self, args):
     stderr = b"Unable to collect the hashes"
     exec_response = rdf_client_action.ExecuteBinaryResponse(stderr=stderr,
                                                             exit_status=-1)
     response = rdf_apple_firmware.CollectEfiHashesResponse(
         response=exec_response)
     return [response]
Example #2
0
 def EficheckCollectHashes(self, args):
   stdout = (
       b"01:00:00:00190048:00003c5f:"
       b"4d37da42-3a0c-4eda-b9eb-bc0e1db4713b:"
       b"03a3fb4ca9b65be048b04e44ab5d1dd8e1af1ca9d1f53a5e96e8ae0125a02bb2")
   exec_response = rdf_client_action.ExecuteBinaryResponse(
       stdout=stdout, exit_status=0)
   response = rdf_apple_firmware.CollectEfiHashesResponse(
       eficheck_version="1.9.6",
       boot_rom_version="MBP101.B00",
       response=exec_response)
   return [response]
Example #3
0
    def Run(self, args):
        """Use eficheck to extract hash files in plaintext.

    Args:
      args: EficheckConfig
    Returns:
      CollectEfiHashesResponse

    This action executes eficheck multiple times:
      * First to get the binary version, using --version.
      * Then with the --generate-hashes option. This will create one or more
        .ealf files. Each file contains a binary representation of the hashes
        extracted from a part of the flash image (e.g, EFI, SEC).
      * For each file generated, we use the --show-hashes option to get a
        plaintext representation of the hashes. This raw output is sent to the
        server which will perform further parsing.
    """

        eficheck_version = self._GetVersion(args)
        if not eficheck_version:
            return False

        with tempfiles.TemporaryDirectory() as tmp_dir:
            res = client_utils_common.Execute(args.cmd_path,
                                              ["--generate-hashes"],
                                              cwd=tmp_dir.path)
            stdout, stderr, exit_status, time_used = res
            # If something went wrong, forward the output directly.
            if exit_status:
                binary_response = rdf_client_action.ExecuteBinaryResponse(
                    stdout=stdout,
                    stderr=stderr,
                    exit_status=exit_status,
                    time_used=time_used)
                self.SendReply(
                    rdf_apple_firmware.CollectEfiHashesResponse(
                        response=binary_response))
                return
            # Otherwise, convert all the files generated and forward the output.

            for filename in glob.glob(os.path.join(tmp_dir.path, "*.ealf")):
                cmd_args = ["--show-hashes", "-h", filename]
                # Get the boot rom version from the filename.
                basename = os.path.basename(filename)
                if not self._FILENAME_RE.match(basename):
                    continue
                boot_rom_version, _ = os.path.splitext(basename)
                stdout, stderr, exit_status, time_used = client_utils_common.Execute(
                    args.cmd_path, cmd_args, bypass_allowlist=True)

                binary_response = rdf_client_action.ExecuteBinaryResponse(
                    stdout=stdout,
                    stderr=stderr,
                    exit_status=exit_status,
                    time_used=time_used)
                self.SendReply(
                    rdf_apple_firmware.CollectEfiHashesResponse(
                        eficheck_version=eficheck_version,
                        boot_rom_version=boot_rom_version,
                        response=binary_response))

                tempfiles.DeleteGRRTempFile(filename)