Compartilhar via


Início Rápido: Carregar imagens de firmware na Análise de Firmware usando Python

Este artigo explica como usar um script Phyton para carregar imagens de firmware na Análise de Firmware.

Análise de Firmware é uma ferramenta que analisa imagens de firmware e fornece um entendimento das vulnerabilidades de segurança nas imagens de firmware.

Pré-requisitos

Este início rápido pressupõe uma compreensão básica da Análise de Firmware. Para obter mais informações, confira nossas Análise de firmware para criadores de dispositivos. Para obter uma lista dos sistemas de arquivos com suporte, consulte Perguntas frequentes sobre a Análise de Firmware.

Prepare o seu ambiente

  1. É necessário o Python versão 3.8 ou superior para usar esse pacote. Execute o comando python --version para verificar sua versão do Python.
  2. Anote sua ID de assinatura do Azure, o nome do seu Grupo de Recursos em que você gostaria de carregar suas imagens, o nome do seu espaço de trabalho e o nome da imagem de firmware que você gostaria de carregar.
  3. Certifique-se de que sua conta do Azure tenha as permissões necessárias para carregar imagens de firmware na Análise de Firmware para a sua assinatura do Azure. Você precisa ser um Proprietário, Colaborador, Administrador de Segurança ou Administrador de Análise de Firmware no nível de Assinatura ou de Grupo de Recursos para carregar imagens de firmware. Para obter mais informações, acesse Funções, escopos e funcionalidades da Análise de Firmware.
  4. Certifique-se de que sua imagem de firmware esteja armazenada no mesmo diretório que o script do Python.
  5. Instale os pacotes necessários para executar esse script:
    pip install azure-mgmt-iotfirmwaredefense
    pip install azure-identity
    
  6. Faça login na sua conta do Azure executando o comando az login.

Execute o script do Python a seguir

Copie o script do Python a seguir em um arquivo .py e salve-o no mesmo diretório da sua imagem de firmware. Substitua a variável subscription_id pela ID da sua assinatura do Azure, resource_group_name pelo nome do seu Grupo de Recursos em que gostaria de carregar sua imagem de firmware e firmware_file pelo nome da sua imagem de firmware, que foi salva no mesmo diretório do script do Python.

from azure.identity import AzureCliCredential
from azure.mgmt.iotfirmwaredefense import *
from azure.mgmt.iotfirmwaredefense.models import *
from azure.core.exceptions import *
from azure.storage.blob import BlobClient
import uuid
from time import sleep
from halo import Halo
from tabulate import tabulate

subscription_id = "subscription-id"
resource_group_name = "resource-group-name"
workspace_name = "default"
firmware_file = "firmware-image-name"

def main():
    firmware_id = str(uuid.uuid4())
    fw_client = init_connections(firmware_id)
    upload_firmware(fw_client, firmware_id)
    get_results(fw_client, firmware_id)

def init_connections(firmware_id):
    spinner = Halo(text=f"Creating client for firmware {firmware_id}")
    cli_credential = AzureCliCredential()
    client = IoTFirmwareDefenseMgmtClient(cli_credential, subscription_id, 'https://management.azure.com')
    spinner.succeed()
    return client

def upload_firmware(fw_client, firmware_id):
    spinner = Halo(text="Uploading firmware to Azure...", spinner="dots")
    spinner.start()
    token = fw_client.workspaces.generate_upload_url(resource_group_name, workspace_name, {"firmware_id": firmware_id})
    fw_client.firmwares.create(resource_group_name, workspace_name, firmware_id, {"properties": {"file_name": firmware_file, "vendor": "Contoso Ltd.", "model": "Wifi Router", "version": "1.0.1", "status": "Pending"}})
    bl_client = BlobClient.from_blob_url(token.url)
    with open(file=firmware_file, mode="rb") as data:
        bl_client.upload_blob(data=data)
    spinner.succeed()

def get_results(fw_client, firmware_id):
    fw = fw_client.firmwares.get(resource_group_name, workspace_name, firmware_id)

    spinner = Halo("Waiting for analysis to finish...", spinner="dots")
    spinner.start()
    while fw.properties.status != "Ready":
        sleep(5)
        fw = fw_client.firmwares.get(resource_group_name, workspace_name, firmware_id)
    spinner.succeed()

    print("-"*107)

    summary = fw_client.summaries.get(resource_group_name, workspace_name, firmware_id, summary_name=SummaryName.FIRMWARE)
    print_summary(summary.properties)
    print()

    components = fw_client.sbom_components.list_by_firmware(resource_group_name, workspace_name, firmware_id)
    if components is not None:
        print_components(components)
    else:
        print("No components found")

def print_summary(summary):
    table = [[summary.extracted_size, summary.file_size, summary.extracted_file_count, summary.component_count, summary.binary_count, summary.analysis_time_seconds, summary.root_file_systems]]
    header = ["Extracted Size", "File Size", "Extracted Files", "Components", "Binaries", "Analysis Time", "File Systems"]
    print(tabulate(table, header))

def print_components(components):
    table = []
    header = ["Component", "Version", "License", "Paths"]
    for com in components:
        table.append([com.properties.component_name, com.properties.version, com.properties.license, com.properties.file_paths])
    print(tabulate(table, header, maxcolwidths=[None, None, None, 57]))

if __name__ == "__main__":
    exit(main())