Guida introduttiva: Caricare immagini del firmware nell'analisi del firmware con Python
Questo articolo illustra come usare uno script Python per caricare immagini del firmware nell'analisi del firmware.
L'analisi del firmware è uno strumento che analizza le immagini del firmware e fornisce informazioni sulle vulnerabilità di sicurezza nelle immagini del firmware.
Prerequisiti
Questo argomento di avvio rapido presuppone una conoscenza di base dell'analisi del firmware. Per altre informazioni, vedere Analisi del firmware per i costruttori di dispositivi Per un elenco dei file system supportati, vedere Domande frequenti sull'analisi del firmware.
Predisporre l'ambiente
- Python versione 3.8+ è necessario per usare questo pacchetto. Eseguire il comando
python --version
per controllare la versione di Python. - Prendere nota dell'ID sottoscrizione di Azure, del nome del gruppo di risorse in cui si vogliono caricare le immagini, il nome dell'area di lavoro e il nome dell'immagine del firmware da caricare.
- Assicurarsi che l'account Azure disponga delle autorizzazioni necessarie per caricare immagini del firmware nell'analisi del firmware per la sottoscrizione di Azure. Per caricare immagini firmware, è necessario essere proprietario, collaboratore, amministratore della sicurezza o amministratore dell'analisi del firmware a livello di sottoscrizione o gruppo di risorse. Per altre informazioni, vedere Ruoli, ambiti e funzionalità di analisi del firmware.
- Assicurarsi che l'immagine del firmware sia archiviata nella stessa directory dello script Python.
- Installare i pacchetti necessari per eseguire questo script:
pip install azure-mgmt-iotfirmwaredefense pip install azure-identity
- Accedere all'account Azure eseguendo il comando
az login
.
Eseguire lo script Python seguente
Copiare lo script Python seguente in un .py
file e salvarlo nella stessa directory dell'immagine del firmware. Sostituire la subscription_id
variabile con l'ID sottoscrizione di Azure, resource_group_name
con il nome del gruppo di risorse in cui si vuole caricare l'immagine del firmware e firmware_file
con il nome dell'immagine del firmware, che viene salvata nella stessa directory dello script 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())