Udostępnij za pośrednictwem


Szybki start: przekazywanie obrazów oprogramowania układowego do analizy oprogramowania układowego przy użyciu języka Python

W tym artykule wyjaśniono, jak używać skryptu języka Python do przekazywania obrazów oprogramowania układowego do analizy oprogramowania układowego.

Analiza oprogramowania układowego to narzędzie, które analizuje obrazy oprogramowania układowego i zapewnia zrozumienie luk w zabezpieczeniach na obrazach oprogramowania układowego.

Wymagania wstępne

W tym przewodniku Szybki start założono podstawową wiedzę na temat analizy oprogramowania układowego. Aby uzyskać więcej informacji, zobacz Analiza oprogramowania układowego dla konstruktorów urządzeń. Aby uzyskać listę obsługiwanych systemów plików, zobacz Często zadawane pytania dotyczące analizy oprogramowania układowego.

Przygotowywanie środowiska

  1. Do korzystania z tego pakietu jest wymagany język Python w wersji 3.8 lub nowszej. Uruchom polecenie python --version , aby sprawdzić wersję języka Python.
  2. Zanotuj identyfikator subskrypcji platformy Azure, nazwę grupy zasobów, w której chcesz przekazać obrazy, nazwę obszaru roboczego i nazwę obrazu oprogramowania układowego, który chcesz przekazać.
  3. Upewnij się, że twoje konto platformy Azure ma niezbędne uprawnienia do przekazywania obrazów oprogramowania układowego do analizy oprogramowania układowego dla subskrypcji platformy Azure. Aby przekazać obrazy oprogramowania układowego, musisz być właścicielem, współautorem, administratorem zabezpieczeń lub administratorem analizy oprogramowania układowego na poziomie subskrypcji lub grupy zasobów. Aby uzyskać więcej informacji, odwiedź stronę Role, Zakresy i Możliwości analizy oprogramowania układowego.
  4. Upewnij się, że obraz oprogramowania układowego jest przechowywany w tym samym katalogu co skrypt języka Python.
  5. Zainstaluj pakiety wymagane do uruchomienia tego skryptu:
    pip install azure-mgmt-iotfirmwaredefense
    pip install azure-identity
    
  6. Zaloguj się do konta platformy Azure, uruchamiając polecenie az login.

Uruchom następujący skrypt języka Python

Skopiuj następujący skrypt języka Python do .py pliku i zapisz go w tym samym katalogu co obraz oprogramowania układowego. Zastąp zmienną subscription_id identyfikatorem subskrypcji platformy Azure nazwą grupy zasobów, resource_group_name w której chcesz przekazać obraz oprogramowania układowego, i firmware_file nazwą obrazu oprogramowania układowego, który jest zapisywany w tym samym katalogu co skrypt języka 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())