Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Plugin-API-Referenz
Vollständige API-Referenz für Inspector-Sbomgen Lua-Plugins. Eine Anleitung zum Schreiben von Plugins finden Sie unter. Leitfaden für Plugin-Entwickler Informationen zum Testen finden Sie unterLeitfaden zum Testen von Plugins.
-Übersicht
Auf alle zur Laufzeit bereitgestellten Funktionen wird über die globale sbomgen Tabelle zugegriffen (Datei I/O, Regex, Protokollierung, Konstanten usw.). Darüber hinaus definiert jedes Plugin einen kleinen Satz globaler Funktionen der obersten Ebene (discover,, usw.) collect get_scanner_namesubscribe_to_event, die sbomgen an definierten Punkten im Plugin-Lebenszyklus aufruft. Diese sind dokumentiert in. Plugin Lifecycle Globals
In *_test.lua Dateien stellt sbomgen zusätzlich eine testing globale Option zur Verfügung, die es Testautoren ermöglicht, die Discovery→Collection-Pipeline zu steuern und Aussagen zu treffen. Siehe API testen.
Sandbox-Einschränkungen
Plugins werden auf einer Lua-VM in Sandbox mit eingeschränktem Zugriff auf die Standardbibliothek ausgeführt. Die folgenden Lua-Standardbibliotheksmodule sind verfügbar:
| Modul | Hinweise |
|---|---|
base |
Kernfunktionen (printtype,tostring,tonumber,pairs, ipairspcall,error,select,unpack,rawget,rawset, usw.). dofileloadfile, und loadstring werden entfernt. |
string |
Vollständige Bearbeitung von Zeichenketten (string.matchstring.findstring.format,string.gsub,, usw.) |
table |
Vollständige Tabellenmanipulation (table.inserttable.remove,table.sort,table.concat, usw.) |
math |
Vollständige Mathe-Bibliothek (math.floormath.maxmath.min,, usw.) |
package |
require()ist verfügbar, aber auf Module innerhalb des eigenen Verzeichnisbaums des Plugins beschränkt. Parent-directory traversal (require("../shared")) ist blockiert. package.cpathund package.path sind gelöscht. |
Die folgenden Standardbibliotheksmodule sind aus Sicherheits- und Stabilitätsgründen ausdrücklich verboten:
| Modul | Grund |
|---|---|
io |
Der direkte Dateisystemzugriff ist gesperrt. Alle Dateioperationen müssen sbomgen.* Funktionen durchlaufen, die über die Artefaktschnittstelle weitergeleitet werden, um ein konsistentes Verhalten über alle Artefakttypen (Verzeichnis, Container, Volumen usw.) hinweg zu gewährleisten und Lesevorgänge auf das Artefakt zu beschränken, das sich im Inventar befindet (siehe). Grenze für den Dateizugriff |
os |
System-level Operationen (os.execute,, os.removeos.rename, usw.) werden blockiertos.getenv, um zu verhindern, dass Plugins das Hostsystem verändern. |
debug |
Die Debug-Bibliothek ist blockiert, um eine Überprüfung oder Änderung der internen Funktionen der Lua-VM zu verhindern. |
coroutine |
Coroutinen werden nicht geladen. |
Diese Module sind nicht in der Zulassungsliste der VM enthalten und Plugins können nicht darauf zugreifen.
Anmerkung
Wichtig: Alle Dateien I/O müssen sbomgen.* Funktionen erfüllen (z. B., sbomgen.read_filesbomgen.open_file,sbomgen.get_file_list). Wenn Sie io.open oder irgendein direkter Dateisystemzugriff verwenden, wird ein Laufzeitfehler ausgelöst. Die sbomgen API stellt sicher, dass Plugins mit der Artefakt-Abstraktionsebene interagieren, was für ein konsistentes Verhalten sorgt, egal ob ein Verzeichnis, ein Container-Image, ein Archiv oder ein Volume gescannt wird.
Plugin Lifecycle Globals
Ein Plugin ist eine Lua-Datei mit dem Nameninit.lua, die bestimmte globale Funktionen der obersten Ebene definiert. Diese Globals liegen nicht auf der sbomgen Tabelle — es sind Funktionen, die das Plugin für den Aufruf durch sbomgen definiert. Die Menge der gültigen Globals unterscheidet sich zwischen Discovery-Plugins und Sammlungs-Plugins. Wenn das Plugin sie weglässt, wird für jede der unten aufgeführten Funktionen die in der Tabelle angegebene Standardeinstellung verwendet.
Discovery-Plugins
| Funktion | Arität | Erforderlich | Standard (wenn weggelassen) | Beschreibung |
|---|---|---|---|---|
discover() |
0 | Ja | — | Gibt die Dateien zurück, die dieses Plugin gefunden hat. Gibt eine sequentielle Tabelle mit Pfadzeichenfolgen (Einzelereignismodus) oder eine Tabelle zurück, die durch Zeichenketten mit Ereignisnamen gekennzeichnet ist, deren Werte Pfadtabellen sind (Mehrfachereignismodus). |
get_event_name() |
0 | Nein | "lua:{platform}/{category}/{ecosystem}" |
Gibt den Namen des Ereignisses zurück, unter dem Dateien veröffentlicht werden. Muss für alle Discovery-Plugins eindeutig sein. |
get_scanner_name() |
0 | Nein | Name des Ökosystemverzeichnisses | Gibt den Anzeigenamen des Scanners zurück. Muss für alle Discovery-Plugins eindeutig sein. |
get_scanner_description() |
0 | Nein | "Lua discovery plugin: {ecosystem}" |
Gibt eine für Menschen lesbare Beschreibung zurück. |
get_scanner_groups() |
0 | Nein | Abgeleitet aus dem Kategorienverzeichnis (siehe Entwicklerhandbuch) | Gibt eine Tabelle mit Zeichenfolgen für Scanner-Gruppen zurück. Verwenden Sie sbomgen.groups.* Konstanten. |
get_localhost_scan_paths() |
0 | Nein | — | Gibt eine Tabelle mit file/directory Pfaden zurück, die beim Scannen eines Localhost-Artefakts berücksichtigt werden sollen. Wird nur für localhost Scans konsultiert. |
Plugins für Sammlungen
| Funktion | Arität | Erforderlich | Standard (wenn weggelassen) | Beschreibung |
|---|---|---|---|---|
collect(file_path) |
1 | Ja | — | Wird einmal pro Datei aufgerufen, die für das abonnierte Ereignis veröffentlicht wurde. Analysieren Sie die Datei und senden Sie die Ergebnisse über. sbomgen.push_package() Gibt nichts zurück. |
subscribe_to_event() |
0 | Nein | "lua:{platform}/{category}/{ecosystem}" |
Gibt den Eventnamen zurück, den dieser Collector abonniert. Sollte mit denen des entsprechenden Discovery-Plugins übereinstimmen. get_event_name() |
get_collector_name() |
0 | Nein | Name des Ökosystemverzeichnisses | Gibt den Anzeigenamen des Collectors zurück. Muss für alle Sammlungs-Plugins eindeutig sein. |
get_collector_description() |
0 | Nein | ""(leer) |
Gibt eine für Menschen lesbare Beschreibung zurück. |
Datei I/O
Alle Dateioperationen müssen die sbomgen.* API durchlaufen. Direkter Dateisystemzugriff über Luas io Bibliothek ist nicht verfügbar (sieheSandbox-Einschränkungen). Die sbomgen I/O Dateifunktionen werden über die Artefaktschnittstelle weitergeleitet und stellen so sicher, dass Ihr Plugin identisch funktioniert, egal ob Sie ein Verzeichnis auf der Festplatte, ein Container-Image, ein komprimiertes Archiv oder ein gemountetes Volume scannen.
Grenze für den Dateizugriff
Die sbomgen.* Dateifunktionen beschränken Lesevorgänge auf das Artefakt, das sich im Inventar befindet. Ein Pfad, der außerhalb des Artefaktstamms aufgelöst wird — zum Beispiel durch ../ Traversal — wird zurückgewiesen, und der Aufruf gibt einen Fehler zurück, anstatt das Host-Dateisystem zu lesen. Das gilt für,read_file, und die binary/hash Helfer open_file read_dirfile_stat, die einen Pfad einschlagen.
Die Ausnahme ist der localhost Artefakt-Typ, der den Host selbst inventarisiert; da ist das Host-Dateisystem das Artefakt, sodass Lesevorgänge nicht auf einen engeren Stamm beschränkt sind.
Diese Grenze bestimmt nur das Lesen von Dateien. Sie schränkt nicht ein, was ein Plugin in die SBOM schreibt — siehe. SBOM-Inhalte werden nicht bereinigt
sbomgen.get_file_list ()
Gibt alle Dateipfade im Artefakt als Tabelle mit Zeichenketten zurück.
-
Gibt Folgendes zurück:
{string, ...}— Tabelle mit absoluten Dateipfadzeichenfolgen -
Leistung: Diese Funktion kopiert jeden Dateipfad im Artefakt als Lua-Zeichenfolge in die Lua-VM. Bei großen Artefakten (z. B. einem Localhost-Scan mit über 300.000 Dateien) dauert dies allein mehrere Sekunden. Das Iterieren der zurückgegebenen Tabelle in Lua
string.match()erhöht den Aufwand zusätzlich — ein vollständiger Scan kann mehr als 15 Sekunden dauern. Je mehr Dateien das Artefakt enthält, desto langsamer wird dein Plugin sein.
Anmerkung
Bevorzugen Sie nach Möglichkeit diese gezielten Alternativen:
| Funktion | Verwenden Sie, wenn... |
|---|---|
sbomgen.find_files_by_name() |
Sie kennen die genauen Dateinamen, die übereinstimmen müssen (z. B."requirements.txt","curl") |
sbomgen.find_files_by_name_icase() |
Wie oben, aber ohne Berücksichtigung der Groß- und Kleinschreibung |
sbomgen.find_files_by_suffix() |
Sie müssen Pfadsuffixe abgleichen (z. B.,) "/pom.properties" "curlver.h" |
sbomgen.find_files_by_path_regex() |
Sie benötigen den vollständigen Pfadregex-Abgleich |
sbomgen.glob_find_files() |
Sie benötigen einen Basisnamenabgleich im Glob-Stil |
Diese Funktionen führen den Abgleich außerhalb der Lua-VM durch und geben nur die übereinstimmenden Pfade zurück, was selbst bei 300 Artefakten in weniger als einer Millisekunde abgeschlossen ist. K-file Verwenden Sie diese get_file_list() Option nur, wenn Ihre Abgleichslogik mit keiner der oben genannten Methoden ausgedrückt werden kann.
Die glob_find_files Hilfsprogramme find_files_by_* und überspringen Symlinks und geben nur konkrete Dateien zurück, sodass ein Symlink-Alias und sein Ziel nicht gleichzeitig inventarisiert werden. get_file_list()gibt jeden Eintrag zurück, einschließlich Symlinks.
-- AVOID in discovery plugins when possible: local files = sbomgen.get_file_list() for _, f in ipairs(files) do if string.match(f, "pattern$") then ... end end -- PREFER: local matches = sbomgen.find_files_by_name({"target-file.txt"})
sbomgen.read_file (Pfad)
Liest den gesamten Inhalt einer Datei und gibt ihn als Zeichenfolge zurück.
-
Gibt zurück:
string, err -
Bei einem Ausfall:
nil, error_string
local content, err = sbomgen.read_file("/app/package.json") if err then sbomgen.log_error("read failed: " .. err) return end
sbomgen.open_file (Pfad)
Öffnet eine Datei für Streaming-Lesevorgänge. Gibt ein FileHandle Objekt zurück. Verwenden Sie dies für große Dateien, bei denen das Laden des gesamten Inhalts in den Speicher nicht praktikabel ist.
-
Kehrt zurück:
FileHandle, err
local fh, err = sbomgen.open_file(path) if err then return end local line = fh:read_line() while line do -- process line line = fh:read_line() end fh:close()
sbomgen.glob_find_files (Muster)
Gibt Dateien zurück, die einem Go-Glob-Muster entsprechen. filepath.Match Das Muster wird mit dem Basisdateinamen abgeglichen. Symlinks werden übersprungen; es werden nur konkrete Dateien zurückgegeben.
-
Gibt zurück:
{string, ...}, err
local files, err = sbomgen.glob_find_files("*.txt")
Verwenden Sie sbomgen.get_file_list() mit string.match für den vollständigen Pfadmusterabgleich.
sbomgen.find_files_by_name (Namen)
Gibt Dateien zurück, deren Basisname (letzte Pfadkomponente) genau mit einem der angegebenen Namen übereinstimmt. Die Iteration und der Vergleich erfolgen in Go, wodurch dies erheblich schneller ist als die Iteration sbomgen.get_file_list() in Lua.
-
Parameter:
names— Tabelle mit Zeichenketten (Basisnamen, die übereinstimmen müssen) -
Rückgabe:
{string, ...}— übereinstimmende Dateipfade, ohne symbolische Links (kein Fehlertupel)
local curl_bins = sbomgen.find_files_by_name({"curl", "curl.exe"}) local headers = sbomgen.find_files_by_name({"curlver.h"})
sbomgen.find_files_by_name_icase (Namen)
Gibt Dateien zurück, deren Basisname mit einem der angegebenen Namen übereinstimmt, wobei Groß- und Kleinschreibung ignoriert wird. Stimmt beispielsweise "version" mit VERSIONVersion, und überein. version Zum find_files_by_name Beispiel findet der Abgleich außerhalb der Lua-VM statt.
-
Parameter:
names— Tabelle mit Zeichenketten (zu vergleichende Basisnamen, Groß- und Kleinschreibung wird nicht beachtet) -
Gibt Folgendes zurück:
{string, ...}— übereinstimmende Dateipfade, ohne symbolische Links (kein Fehlertupel)
local version_files = sbomgen.find_files_by_name_icase({"version"}) local war_files = sbomgen.find_files_by_name_icase({"jenkins.war"})
sbomgen.find_files_by_suffix (Suffixe)
Gibt Dateien zurück, deren vollständiger (mit Schrägstrich normalisierter) Pfad mit einem der angegebenen Suffixe endet. Zum Beispiel findet der Abgleich außerhalb der find_files_by_name Lua-VM statt.
-
Parameter:
suffixes— Tabelle mit Zeichenketten (Pfadsuffixe, die übereinstimmen müssen) -
Rückgabe:
{string, ...}— übereinstimmende Dateipfade, ohne symbolische Links (kein Fehlertupel)
local pom_files = sbomgen.find_files_by_suffix({"/pom.properties"}) local release_headers = sbomgen.find_files_by_suffix({"ap_release.h", "opensslv.h"})
sbomgen.find_files_by_path_regex (Muster)
Gibt Dateien zurück, deren durch Schrägstrich normalisierter Pfad mit einem der angegebenen Go (RE2) -Regex-Muster übereinstimmt. Der Abgleich erfolgt außerhalb der Lua-VM, was dies bei großen Dateilisten effizient macht.
-
Parameter:
patterns— Tabelle mit Go-Regex-Zeichenfolgen -
Rückgabe:
{string, ...}— übereinstimmende Dateipfade, ohne symbolische Links (kein Fehlertupel) -
Löst aus: Ein Lua-Fehler, wenn ein Muster nicht kompiliert werden kann
local configs = sbomgen.find_files_by_path_regex({"/etc/.*\\.conf$", "/opt/.*/config\\.json$"})
Leistung: find_files_by_* im Vergleich zu get_file_list
Für Discovery-Plugins bevorzuge oder übertreibe Iteration in Lua. find_files_by_name find_files_by_suffix find_files_by_path_regex get_file_list() Bei einem Localhost-Scan mit 300.000 Dateien string.match() dauert das Iterieren der Dateiliste in Lua mit ~15 Sekunden, während es in weniger als 1 Millisekunde abgeschlossen ist. find_files_by_name Der Unterschied besteht darin, dass jeder Dateipfad als Zeichenfolge in die Lua-VM get_file_list() kopiert wird und Lua dann die Schleife und die Musterübereinstimmung für jeden einzelnen interpretiert. Die find_files_by_* Funktionen führen den Abgleich außerhalb der Lua-VM durch und geben nur die übereinstimmenden Pfade zurück, wodurch sowohl der Kopieraufwand als auch der Aufwand für die Interpretation pro Pfad vermieden werden.
Verwenden Sie diese get_file_list() Option nur, wenn Sie eine benutzerdefinierte Abgleichslogik benötigen, die nicht als Basisnamen-, Suffix- oder Regex-Match ausgedrückt werden kann.
sbomgen.read_dir (Pfad)
Listet Einträge in einem Verzeichnis auf.
-
Gibt zurück:
{{name, is_dir}, ...}, err
local entries, err = sbomgen.read_dir("/app/node_modules") if err then return end for _, e in ipairs(entries) do if e.is_dir then sbomgen.log_debug("directory: " .. e.name) end end
sbomgen.file_stat (Pfad)
Gibt Metadaten über eine Datei zurück.
-
Gibt zurück:
{is_regular, is_dir, size}, err
local info, err = sbomgen.file_stat(path) if err then return end if info.is_regular and info.size > 0 then -- process file end
sbomgen.read_zip_entry (Pfad, Eintragspfad)
Liest einen einzelnen Eintrag aus einem ZIP-, JAR- oder WAR-Archiv.
-
Gibt zurück:
string, err
local manifest, err = sbomgen.read_zip_entry( "/app/lib/example.jar", "META-INF/MANIFEST.MF" )
sbomgen.search_binary (Pfad, regulärer Ausdruck)
Analysiert eine Datei als ELF, PE oder Mach-O Binärdatei und durchsucht den Standardabschnitt nach einem Go-Regex-Match. constant/variable
-
Gibt zurück:
string|nil, err— die übereinstimmende Zeichenfolge oder nil, wenn keine Übereinstimmung gefunden wurde
local version, err = sbomgen.search_binary(path, "Version:\\s+([\\d.]+)") if version then sbomgen.log_info("found version: " .. version) end
sbomgen.search_binary_all (Pfad, regulärer Ausdruck [, n])
Analysiert eine Datei als ELF, PE oder Mach-O Binärdatei und gibt alle eindeutigen Treffer der ersten Capture-Gruppe aus dem Standardabschnitt zurück. constant/variable Übergebenn, um die Ergebnisse zu begrenzen.
-
Gibt Folgendes zurück:
{string, ...}|nil, err— Tabelle mit übereinstimmenden Zeichenfolgen oder Null, wenn keine Treffer gefunden wurden
local versions, err = sbomgen.search_binary_all(path, "version[= ]+([\\d.]+)", 5) if versions then for _, v in ipairs(versions) do sbomgen.log_info("found: " .. v) end end
sbomgen.search_binary_raw (Pfad, regulärer Ausdruck)
Durchsucht die gesamte Binärdatei nach dem ersten Regex-Match und ist nicht auf einen bestimmten Abschnitt beschränkt. Wird verwendet, wenn die abschnittsbasierte Suche (search_binary) nicht ausreicht — zum Beispiel, wenn Versionszeichenfolgen in nicht standardmäßigen Abschnitten enthalten sind.
-
Gibt zurück:
string|nil, err— die übereinstimmende Zeichenfolge oder Null, wenn keine Übereinstimmung gefunden wurde
local version, err = sbomgen.search_binary_raw(path, "ProductVersion[\\x00\\s]+([\\d.]+)")
FileHandle Methoden
FileHandle Objekte werden von zurückgegebensbomgen.open_file().
fh:read_line ()
Liest die nächste Zeile (ohne das Zeilenumbruchzeichen). Kehrt nil bei EOF zurück.
-
Gibt zurück:
string|nil, err
fh:read (n)
Liest bis zu 4 Byte. n Kehrt nil bei EOF zurück.
-
Gibt zurück:
string|nil, err
fh:close ()
Schließt das Datei-Handle. Schließen Sie die Griffe immer, wenn Sie fertig sind.
Binäre Dienstprogramme
sbomgen.hash (Daten, Algorithmus)
Gibt den hexadezimalen Digest einer speicherinternen Bytezeichenfolge unter dem angegebenen Algorithmus zurück. Kombinieren Sie mitsbomgen.read_file(path), um eine Datei zu hashen, die Sie bereits zum Parsen gelesen haben. Dies ist vorzuziehen, sbomgen.hash_file(path) wenn Sie sowohl die Bytes als auch den Digest benötigen, da die Datei nicht erneut gelesen wird. hash
-
Gibt zurück:
string, err -
Algorithmen: Eine Liste der akzeptierten Algorithmuskonstanten finden Sie unterKomponenten-Hashes.
local data, err = sbomgen.read_file("/path/to/manifest.json") if data then local sha256 = sbomgen.hash(data, sbomgen.hash_algorithms.SHA256) sbomgen.log_info("SHA-256: " .. sha256) end
sbomgen.hash_file (Pfad, Algorithmus)
Gibt die hexadezimale Zusammenfassung des Inhalts einer Datei unter dem angegebenen Algorithmus zurück. Leitet den Lesevorgang durch die I/O Artefaktebene, sodass er für Verzeichnis-, Container-, Archiv-, Volume- und Localhost-Artefakte einheitlich funktioniert. Verwenden Sie diese Option, wenn der Digest das Einzige ist, was Sie aus der Datei benötigen.
-
Kehrt zurück:
string, err
local sha256, err = sbomgen.hash_file("/app/bin/server", sbomgen.hash_algorithms.SHA256) if sha256 then sbomgen.log_info("SHA-256: " .. sha256) end
sbomgen.sha256 (Pfad)
Wichtig
Als veraltet gekennzeichnet. Verwenden Sie stattdessen sbomgen.hash_file(path, sbomgen.hash_algorithms.SHA256). Dieser Alias wird aus Gründen der Abwärtskompatibilität beibehalten und funktioniert weiterhin, wird aber in einer zukünftigen Version entfernt. Neue Plugins sollten aufgerufen werdenhash_file, damit die Algorithmusauswahl explizit ist.
Äquivalent mit sbomgen.hash_file(path, "SHA-256").
-
Gibt zurück:
string, err
local hash, err = sbomgen.sha256("/app/bin/server") if hash then sbomgen.log_info("SHA-256: " .. hash) end
sbomgen.contains_bytes (Pfad, Muster)
Prüft, ob eine Datei jedes der angegebenen Bytemuster enthält. Gibt eine Tabelle mit booleschen Werten in derselben Reihenfolge wie die Eingabemuster zurück.
-
Gibt zurück:
{bool, ...}, err
local results, err = sbomgen.contains_bytes(path, { "\xff Go buildinf:", -- Go build identifier "/rustc/", -- Rust build identifier }) if results then local is_go = results[1] local is_rust = results[2] end
sbomgen.get_pe_version_info (Pfad)
Analysiert Windows PE-Versionsressourcen aus einer Binärdatei. Gibt eine Tabelle mit Versionsfeldern zurück, oder nil, err wenn die Datei keine PE-Binärdatei ist oder keine Versionsressource enthält.
-
Gibt zurück:
{product_version, file_version, string_table}, err
Die file_version Felder product_version und stammen aus der FixedFileInfo PE-Struktur und sind formatiert als"major.minor.build.revision". Das string_table Feld ist eine verschachtelte Tabelle, die mit einem Gebietsschemacode versehen ist (z. B. "040904B0" für US-amerikanisches Englisch). Jedes Gebietsschema ist einer Tabelle mit name/value Paaren zugeordnet, die aus dem PE StringFileInfo (ProductVersion, ProductNameFileDescription, usw.) stammen. Eine PE-Binärdatei kann ein oder mehrere Gebietsschemas verfügbar machen.
local info, err = sbomgen.get_pe_version_info(file_path) if err then return end -- Fixed version fields (always flat) local product_ver = info.product_version -- e.g. "25.1.0.0" local file_ver = info.file_version -- e.g. "25.1.0.0" -- String table — iterate locales, or address a known locale by key for locale, fields in pairs(info.string_table or {}) do sbomgen.log_info(string.format("%s ProductName=%s", locale, fields.ProductName or "")) end -- US English Unicode is the most common locale for PE files local us = (info.string_table or {})["040904B0"] if us then local display_ver = us.ProductVersion -- e.g. "25.01" local name = us.ProductName -- e.g. "7-Zip" end
sbomgen.parse_product_version (Pfad)
Praktischer Wrapper, der nur die Produktversionszeichenfolge aus einer PE-Binärdatei zurückgibt. FixedFileInfo Entspricht dem Anrufen get_pe_version_info(path) und Lesenproduct_version.
-
Retouren:
string, err
local version, err = sbomgen.parse_product_version(file_path) if version then sbomgen.log_info("product version: " .. version) end
sbomgen.parse_file_version (Pfad)
Praktischer Wrapper, der nur die Dateiversionszeichenfolge aus einer PE-Binärdatei zurückgibt. FixedFileInfo Entspricht dem Anrufen get_pe_version_info(path) und Lesenfile_version.
-
Gibt zurück:
string, err
local version, err = sbomgen.parse_file_version(file_path) if version then sbomgen.log_info("file version: " .. version) end
Paket-Ausgabe
sbomgen.push_package (Paket)
Verschiebt eine Paketsuche in die SBOM. Nur in Sammlungs-Plugins verfügbar.
Die pkg Tabelle unterstützt die folgenden Felder:
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name |
Zeichenfolge | Ja | Package name |
version |
Zeichenfolge | Nein | Die Versionszeichenfolge wurde aufgelöst |
namespace |
Zeichenfolge | Nein | PURL-Namespace (z. B.,"curl") "wordpress/plugin" |
purl_type |
Zeichenfolge | Ja | PURL-Typ (z. B.,,"pypi","npm","cargo") "deb" "generic" |
component_type |
Zeichenfolge | Ja | CyclonedX-Komponententyp; verwenden Sie sbomgen.component_types.* Konstanten (z. B.) sbomgen.component_types.LIBRARY |
qualifiers |
Tabelle | Nein | PURL-Qualifizierer als Schlüssel-Wert-Paare (erscheinen in der Paket-URL) |
properties |
Tabelle | Nein | Eigenschaften von CyclonedX-Komponenten als Schlüssel-Wert-Paare (siehe) Eigenschaften von CyclonedX |
hashes |
Tabelle | Nein | Komponenten-Hashes, die nach dem Algorithmusnamen eingegeben werden; siehe Komponenten-Hashes |
children |
Tabelle | Nein | Verschachtelte untergeordnete Pakete, jedes mit derselben Form wie pkg (erforderliche Felder werden rekursiv validiert) |
sbomgen.push_package({ name = "requests", version = "2.28.1", purl_type = "pypi", component_type = sbomgen.component_types.LIBRARY, qualifiers = { example_qualifier = "example_qualifier_value" }, properties = { -- Use your own namespace; amazon:inspector:* is reserved for Amazon Inspector. ["acme:example:extra_field"] = "example_value", }, hashes = { [sbomgen.hash_algorithms.SHA256] = "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", }, })
Komponenten-Hashes
Das optionale hashes Feld in sbomgen.push_package() Datensatzintegritätsanalysen für eine Komponente. Die Einträge werden anhand des Algorithmusnamens eingegeben und in das components[].hashes CyclonedX-Array serialisiert, was dem Schema entspricht, das Amazon Inspector erwartet.
Unterstützte Algorithmen
Verwenden Sie die Konstanten unter, sbomgen.hash_algorithms sodass der ansbomgen.hash()/übergebene Algorithmusname dieselbe Zeichenfolge ist, die akzeptiert sbomgen.hash_file() wird von: push_package({ hashes = ... })
| Konstante | Wert | Länge des Hexadezimalwerts |
|---|---|---|
sbomgen.hash_algorithms.SHA1 |
"SHA-1" |
40 |
sbomgen.hash_algorithms.SHA256 |
"SHA-256" |
64 |
Regeln für die Validierung
push_package()validiert, hashes bevor ein Ergebnis ausgegeben wird. Ein Paket, dessen Hashes die Validierung nicht bestehen, wird gelöscht und eine Warnung wird protokolliert. Validierung:
-
Algorithmusnamen müssen mit einem Eintrag in
sbomgen.hash_algorithms(Groß- und Kleinschreibung beachten, genau"SHA-1"oder"SHA-256") übereinstimmen. -
Die Werte dürfen keine leeren Hexadezimalzahlen in Kleinbuchstaben sein.
-
Die Werte müssen die richtige Länge für den Algorithmus haben (40 Zeichen für, 64 Zeichen für SHA-1). SHA-256
-
Die Validierung ist rekursiv: Ein falsch formatierter Hash im Inneren
children[].hasheslehnt das gesamte Paket ab.
Beispiel: Hashing eines Manifests und Anhängen des Digest
function collect(file_path) local data, err = sbomgen.read_file(file_path) if err then return end local sha256 = sbomgen.hash(data, sbomgen.hash_algorithms.SHA256) sbomgen.push_package({ name = "skill-manifest", version = "1.0.0", purl_type = "generic", component_type = sbomgen.component_types.DATA, hashes = { [sbomgen.hash_algorithms.SHA256] = sha256, }, }) end
Wenn der Digest das einzige ist, was Sie aus der Datei benötigen, sbomgen.hash_file(path, algo) ziehen Sie es vor, die Datei zweimal zu lesen — er leitet den Lesevorgang in einem einzigen Durchgang durch die I/O Artefaktebene.
Eigenschaften von CyclonedX
CyclonedX-Eigenschaften sind Schlüsselwertmetadaten, die an eine Komponente in der SBOM angehängt sind. Sie unterscheiden sich von PURL-Qualifizierern:
-
qualifiers— PURL-Qualifizierer. Diese werden Teil der Paket-URL-Zeichenfolge (z. B.pkg:deb/debian/curl@7.88.1?arch=amd64). Einige PURL-Qualifizierer haben für Amazon Inspector eine semantische Bedeutung und beeinflussen die Identifizierung von Sicherheitslücken. Siehe Was ist eine Paket-URL? für die typspezifischen Konventionen von Inspector. -
properties— Eigenschaften der CyclonedX-Komponente. Diese erscheinen imcomponents[].propertiesArray der SBOM und ändern nichts daran, wie die Komponente identifiziert wird.
Reservierte Namespaces
Die amazon:inspector:* Familie der CyclonedX-Eigenschaftsnamespaces ist Amazon Inspector vorbehalten:
-
amazon:inspector:sbom_generator:*— wird von Sbomgen und seinen eingebauten Scannern verwendet. -
amazon:inspector:sbom_scanner:*— wird von der Amazon Inspector Scan API verwendet.
Plugin-defined Eigenschaften dürfen diese Namespaces nicht verwenden. Das Schreiben in einen reservierten Namespace kann Werte, auf die sich Inspector stützt, überschattet oder in Konflikt geraten. Die daraus resultierende SBOM kann bei der Identifizierung der Sicherheitslücke falsch interpretiert werden. Eine vollständige Liste der reservierten Schlüssel finden Sie unter Verwenden von CyclonedX-Namespaces mit Amazon Inspector.
Wichtige Regeln für die Benennung
Eigenschaftsschlüssel, die an übergeben sbomgen.push_package() werden, werden wie folgt verarbeitet:
| Eingabeschlüssel | Resultierender Schlüssel in SBOM | Empfohlen für benutzerdefinierte Plugins? |
|---|---|---|
Enthält : (z. B.acme:my_plugin:field) |
Wörtlich verwendet | Ja — platzieren Sie jede vom Plugin definierte Eigenschaft in Ihrem eigenen Namespace |
Nein : (z. B.) field |
Auto-prefixed zu amazon:inspector:sbom_generator:field |
Nein — das schreibt in einen reservierten Namespace |
Fügen Sie in den Eigenschaftsschlüsseln, die Sie definieren, immer mindestens einen Doppelpunkt ein. Verwenden Sie einen Namespace, der für Ihre Organisation oder Ihr Plugin einzigartig ist (zum Beispielacme:python-pip:*):
properties = { -- Custom namespace — safe to use (recommended) ["acme:python-pip:manifest_path"] = file_path, ["acme:python-pip:pinned"] = "true", -- Fully-qualified key outside amazon:inspector:* — also fine ["my:custom:namespace:key"] = "value", -- No colon: avoid — ends up as "amazon:inspector:sbom_generator:custom_field" -- custom_field = "value", }
Von sbomgen festgelegte Eigenschaften
Sbomgen kann jeder Komponente, die es aussendet, eigene Eigenschaften zuweisen. Diese Werte stammen aus dem reservierten amazon:inspector:sbom_generator:* Namespace und sollten nicht von Plugins erzeugt werden. Beobachtetes Laufzeitverhalten:
-
source_pathwird immer von sbomgen hinzugefügt. -
source_file_scannerundsource_package_collectorwerden hinzugefügt, wenn aktiviert--enable-debug-propsist.
Die vollständige Taxonomie der reservierten Schlüssel wird im Amazon Inspector-Benutzerhandbuch behandelt: Verwenden von CyclonedX-Namespaces mit Amazon Inspector.
SBOM-Inhalte werden nicht bereinigt
Sbomgenüberprüft oder filtert die Daten, die ein Plugin ausgibt, nicht. Komponentennamen, Versionen, PURLs, Hashes und Eigenschaftswerte werden wie angegeben in die SBOM geschrieben. Sbomgenerkennt oder redigiert keine Geheimnisse, Anmeldeinformationen, Token oder andere vertrauliche Daten — wenn ein Plugin einen solchen Wert in ein Ergebnis einfügt, erscheint er in der Ausgabe-SBOM und wird überall dort übertragen, wo das SBOM veröffentlicht wird.
Sie sind dafür verantwortlich, was Ihre Plugins schreiben. Geben Sie nur Daten aus, die von dem Artefakt stammen, das Sie inventarisieren möchten, und behandeln Sie die SBOM als gemeinsam nutzbares Artefakt, wenn Sie entscheiden, was aufgenommen werden soll.
Konstanten für Eigenschaften
Built-in Eigenschaftsschlüsselkonstanten sind über verfügbar. sbomgen.properties Jede der unten aufgeführten Konstanten wird in einen Schlüssel innerhalb des amazon:inspector:sbom_generator:* reservierten Namespace aufgelöst. Diese Konstanten existieren, damit die eingebauten Scanner von sbomgen konsistente Eigenschaftsschlüssel ausgeben. Sie sind keine Erweiterungspunkte für benutzerdefinierte Plugins — wenn Sie sie in einem benutzerdefinierten Plugin verwenden, wird in einen reservierten Namespace geschrieben, der Werte, auf die sich Inspector verlässt, überlagern kann. Siehe Reservierte Namespaces oben.
Autoren benutzerdefinierter Plugins sollten Eigenschaften (zum Beispielacme:my_plugin:*) in ihrem eigenen Namespace definieren, anstatt diese Konstanten wiederzuverwenden.
| Konstante | Aufgelöster Wert |
|---|---|
sbomgen.properties.NAMESPACE |
amazon:inspector:sbom_generator: |
sbomgen.properties.VENDOR |
amazon:inspector:sbom_generator:vendor |
sbomgen.properties.FILE_SIZE_BYTES |
amazon:inspector:sbom_generator:file_size_bytes |
sbomgen.properties.KERNEL_COMPONENT |
amazon:inspector:sbom_generator:kernel_component |
sbomgen.properties.RUNNING_KERNEL |
amazon:inspector:sbom_generator:running_kernel |
sbomgen.properties.UNRESOLVED_VERSION |
amazon:inspector:sbom_generator:unresolved_version |
sbomgen.properties.TRANSITIVE_DEPENDENCY |
amazon:inspector:sbom_generator:experimental:transitive_dependency |
sbomgen.properties.GO_REPLACE_DIRECTIVE |
amazon:inspector:sbom_generator:replaced_by |
sbomgen.properties.DUPLICATE_PACKAGE |
amazon:inspector:sbom_generator:is_duplicate_package |
sbomgen.properties.DUPLICATE_PURL |
amazon:inspector:sbom_generator:duplicate_purl |
sbomgen.properties.DOCKERFILE_CHECK |
amazon:inspector:sbom_generator:dockerfile_finding |
sbomgen.properties.CERTIFICATE_FINDING |
amazon:inspector:sbom_generator:certificate_finding |
sbomgen.properties.CERTIFICATE_SUBJECT_NAME |
amazon:inspector:sbom_generator:certificate:subject_name |
sbomgen.properties.CERTIFICATE_ISSUER_NAME |
amazon:inspector:sbom_generator:certificate:issuer_name |
sbomgen.properties.CERTIFICATE_SIGNATURE_ALGORITHM |
amazon:inspector:sbom_generator:certificate:signature_algorithm |
sbomgen.properties.CERTIFICATE_NOT_VALID_BEFORE |
amazon:inspector:sbom_generator:certificate:not_valid_before |
sbomgen.properties.CERTIFICATE_NOT_VALID_AFTER |
amazon:inspector:sbom_generator:certificate:not_valid_after |
sbomgen.properties.WINDOWS_REGISTRY_KEY |
amazon:inspector:sbom_generator:registry_key |
sbomgen.properties.SUBSCRIPTION_ENABLED |
amazon:inspector:sbom_generator:subscription:enabled |
sbomgen.properties.SUBSCRIPTION_NAME |
amazon:inspector:sbom_generator:subscription:name |
sbomgen.properties.SUBSCRIPTION_LOCKED_VERSION |
amazon:inspector:sbom_generator:subscription:locked_version |
sbomgen.properties.OPENSSL_FULL_VERSION |
amazon:inspector:sbom_generator:openssl:full_version |
sbomgen.properties.HARDENED_IMAGE_VENDOR |
amazon:inspector:sbom_generator:hardened_image:vendor |
Scanner-Gruppen
Discovery-Plugins müssen ihre Scanner-Gruppen über deklarierenget_scanner_groups(). Gruppen kategorisieren Scanner und ermöglichen es Benutzern, Kategorien selektiv zu aktivieren oder zu deaktivieren. Konstanten sind verfügbar über: sbomgen.groups
| Konstante | Wert | Beschreibung |
|---|---|---|
sbomgen.groups.OS |
"os" |
Betriebssystem-Paketmanager (dpkg, rpm usw.) |
sbomgen.groups.PROGRAMMING_LANGUAGE |
"programming-language-packages" |
Sprachpaketmanager (pip, npm, maven usw.) |
sbomgen.groups.BINARY |
"binary" |
Kompilierte Binäranalyse (Go, Rust) |
sbomgen.groups.PACKAGE_COLLECTOR |
"pkg-scanner" |
Allgemeine Paketsammlung |
sbomgen.groups.EXTRA_ECOSYSTEMS |
"extra-ecosystems" |
Zusätzliche Ökosysteme (Curl, Nginx usw.) |
sbomgen.groups.CERTIFICATE |
"certificate" |
Scannen von Zertifikaten |
sbomgen.groups.CUSTOM |
"custom" |
Automatisch zu allen benutzerdefinierten Plugins hinzugefügt, die über geladen werden --plugin-dir |
sbomgen.groups.MACHINE_LEARNING |
"machine-learning" |
Erkennung von Modellen für maschinelles Lernen |
Beispiel:
function get_scanner_groups() return {sbomgen.groups.PROGRAMMING_LANGUAGE, sbomgen.groups.PACKAGE_COLLECTOR} end
Konstanten des Komponententyps
Das component_type Feld in push_package() muss einer der CyclonedX 1.5-Komponententypen sein. Konstanten sind verfügbar über: sbomgen.component_types
| Konstante | Wert |
|---|---|
sbomgen.component_types.APPLICATION |
"application" |
sbomgen.component_types.FRAMEWORK |
"framework" |
sbomgen.component_types.LIBRARY |
"library" |
sbomgen.component_types.CONTAINER |
"container" |
sbomgen.component_types.PLATFORM |
"platform" |
sbomgen.component_types.OPERATING_SYSTEM |
"operating-system" |
sbomgen.component_types.DEVICE |
"device" |
sbomgen.component_types.DEVICE_DRIVER |
"device-driver" |
sbomgen.component_types.FIRMWARE |
"firmware" |
sbomgen.component_types.FILE |
"file" |
sbomgen.component_types.MACHINE_LEARNING_MODEL |
"machine-learning-model" |
sbomgen.component_types.DATA |
"data" |
Beispiel:
sbomgen.push_package({ name = "requests", version = "2.28.1", purl_type = "pypi", component_type = sbomgen.component_types.LIBRARY, })
Konstanten des Hash-Algorithmus
Konstanten für den Algorithmusparameter von sbomgen.hash()sbomgen.hash_file(), und das hashes Feld von. sbomgen.push_package() Die Zeichenfolgenwerte entsprechen den Namen des CyclonedX-Hashalgorithmus, sodass dieselbe Konstante ohne Übersetzung den gesamten Hashing-Pfad durchläuft.
| Konstante | Wert |
|---|---|
sbomgen.hash_algorithms.SHA1 |
"SHA-1" |
sbomgen.hash_algorithms.SHA256 |
"SHA-256" |
Beispiel:
local digest = sbomgen.hash_file(path, sbomgen.hash_algorithms.SHA256) sbomgen.push_package({ name = "example", purl_type = "generic", component_type = sbomgen.component_types.LIBRARY, hashes = { [sbomgen.hash_algorithms.SHA256] = digest }, })
Plattformkonstanten
Konstanten für den Vergleich mit. sbomgen.get_platform() Verfügbar übersbomgen.platform:
| Konstante | Wert |
|---|---|
sbomgen.platform.LINUX |
"linux" |
sbomgen.platform.WINDOWS |
"windows" |
sbomgen.platform.DARWIN |
"darwin" |
Beispiel:
if sbomgen.get_platform() == sbomgen.platform.WINDOWS then -- Windows-specific logic end
Informationen zum Artefakt
sbomgen.get_platform ()
Gibt die Zeichenfolge der Laufzeitplattform zurück (z. B.,,). "linux" "windows" "darwin"
sbomgen.get_artifact_type ()
Gibt den Typ des Artefakts zurück, das gescannt wird (z. B.,). "directory" "archive"
sbomgen.should_collect_licenses ()
Gibt zurücktrue, ob der Benutzer die Lizenzerfassung über aktiviert hat. --collect-licenses
sbomgen.get_env_vars ()
Gibt Umgebungsvariablen aus dem Artefakt als Tabelle mit Einträgen zurück. {key, value}
local env_vars = sbomgen.get_env_vars() for _, env in ipairs(env_vars) do if env.key == "NODE_ENV" then sbomgen.log_info("Node environment: " .. env.value) end end
sbomgen.get_system_drive ()
Gibt den Systemlaufwerksbuchstaben (z. B.) aus der Umgebung des Artefakts zurück. "C:" Liest die SystemDrive Umgebungsvariable. Die Standardeinstellung ist, "C:" wenn sie nicht gesetzt ist. Dies ist das Lua-Äquivalent von. strutils.GetSystemDriverLetter()
local drive = sbomgen.get_system_drive() local program_files = drive .. "/Program Files/"
sbomgen.resolve_glob_paths (Muster)
Erweitert die Glob-Muster des Dateisystems anhand des Host-Dateisystems. Localhost-only: gibt nil plus einen Fehler bei anderen Artefakttypen zurück.
function get_localhost_scan_paths() return sbomgen.resolve_glob_paths({ "/home/*/.cache/huggingface/hub", "/Users/*/.cache/huggingface/hub", "C:/Users/*/.cache/huggingface/hub", }) end
Verhalten:
-
Die Mustersyntax folgt der Syntax von Go
filepath.Match: *?,[abc],,[a-z]. -
Eingabemuster und Ausgabepfade sind normalisiert: redundante Trennzeichen (
a//b), Punktsegmente (a/./b) und nachfolgende Trennzeichen (a/b/) sind ausgeblendet. -
Die Ausgabe wird dedupliziert; das erste Vorkommen eines Pfads gewinnt. Die Reihenfolge der Eingabemuster wird im gesamten Ergebnis beibehalten.
-
Muster, die mit nichts übereinstimmen, geben keine Einträge zurück. Empty-string Muster werden stillschweigend übersprungen. Bei falsch formatierten Mustern (z. B. nicht übereinstimmende Klammern) wird eine Warnung ausgegeben und übersprungen.
Cross-platform Pfadtrennzeichen:
-
Verwenden Sie Schrägstriche (
/) für alle Pfade. Schrägstriche funktionieren unter Linux, macOS und Windows; die Dateipfadlogik von Go übersetzt sie unter Windows in das native Trennzeichen. -
Backslash-Trennzeichen funktionieren nur unter Windows. Unter Linux und macOS
\ist es ein literales Dateinamenzeichen, kein Pfadtrennzeichen — ein Muster, wie es auf POSIX-Systemen zu nichts"C:\\Users\\*"passt. -
Vermeiden Sie literale Windows-style Pfade in Lua-Zeichenketten. Eine Lua-Zeichenfolge wie
"C:\Users"wird so interpretiert,C:<form-feed>sersdass sie kein gültiges Lua-Escape-Zeichen\Uist (und\f,\tusw. sind)\n, sodass das Muster stillschweigend fehlschlägt. Verwenden Sie entweder Schrägstriche, maskierte Backslashes ("C:\\Users") oder eine rohe Zeichenfolge in langen Klammern ().[[C:\Users]]
sbomgen.get_home_dirs ()
Gibt die Stammverzeichniswurzeln des Benutzers für das Artefakt als Pfadtabelle zurück. Localhost zählt das echte Host-Dateisystem auf; Container- und Volume-Artefakte zählen ihr eigenes Dateisystem (Rootfs oder gemountet) auf; alle anderen Artefakttypen geben eine leere Tabelle zurück. Pfade werden mit Schrägstrichen normalisiert, dedupliziert und sortiert.
Dies ist die Methode, um Verzeichnisse pro Benutzer (wie Modell-Caches oder Tool-Konfigurationen) ohne harte Codierung von oder zu lokalisieren. /home/* /Users/* Es beinhaltet das Home-Verzeichnis von root und überspringt bekannte Nicht-Benutzerverzeichnisse (integrierte Profile wie Public und on, on und Default on). Windows Shared macOS lost+found Linux
function get_localhost_scan_paths() local patterns = {} for _, home in ipairs(sbomgen.get_home_dirs()) do table.insert(patterns, home .. "/.cache/huggingface/hub") end return sbomgen.resolve_glob_paths(patterns) end
Die obige Zusammenstellung gilt nur für Localhost, da resolve_glob_paths Fehler bei Artefakten auftreten, die nicht von Localhost stammen. Ordnen Sie bei Container- und Volume-Scans stattdessen die zurückgegebenen Home-Roots der Dateiliste des Artefakts zu (z. B. mit). sbomgen.find_files_by_path_regex
Verhalten:
-
Definiert für
localhostcontainer, undvolumeArtefakte. Andere Artefakttypen geben eine leere Tabelle zurück, sowohl weil ein benutzerspezifisches Home-Konzept nicht für einen bloßen Verzeichnis- oder Binärscan gilt, als auch weil das Lesen absoluter Hostpfade dort das Scan-Stammverzeichnis umgehen würde. -
Gibt auf localhost absolute Hostpfade zurück (z. B.,
/home/alice)./rootGibt auf einem Container oder Volume Pfade so zurück, wie sie im Dateisystem des Artefakts erscheinen. -
Die Aufzählung wird über die Artefaktschnittstelle gelesen, sodass Container- und Volume-Homes anhand ihres eigenen Dateisystems und nicht anhand des Hosts aufgelöst werden.
-
Auf symbolisch verknüpfte Einträge wird nicht gefolgt; es werden nur echte Verzeichnisse zurückgegeben.
-
AnWindows, das
UsersVerzeichnis befindet sich auf dem des Scanning-HostsSystemDrive, sodass ein Windows Container oder ein Volume unter dem Laufwerksbuchstaben des Hosts aufgeführt wird. Es handelt sich um eine bekannte Einschränkung, die mit geteilt wird.sbomgen.get_system_drive
Systeminformationen
Diese Funktionen geben Metadaten über das Betriebssystem und die Hardware des Artefakts zurück. Werte können leere Zeichenketten sein, wenn die Informationen nicht verfügbar sind (z. B. beim Scannen eines Verzeichnisses ohne Betriebssystem-Metadaten).
| Funktion | Rückgabewerte |
|---|---|
sbomgen.get_os_name() |
Betriebssystemname (z. B."Ubuntu","Alpine Linux") |
sbomgen.get_os_version() |
Betriebssystemversion (z. B."22.04","3.18") |
sbomgen.get_os_codename() |
Betriebssystem-Codename (z. B.,"jammy") "bookworm" |
sbomgen.get_os_id() |
Betriebssystem-ID (z. B.,"ubuntu") "alpine" |
sbomgen.get_kernel_name() |
Kernelname (z. B."Linux") |
sbomgen.get_kernel_version() |
Zeichenfolge für die Kernel-Version |
sbomgen.get_cpu_arch() |
CPU-Architektur (z. B."x86_64","aarch64") |
sbomgen.get_hostname() |
Hostname des Systems |
Reguläre Ausdrücke
Den eingebauten Mustern von Lua fehlen Funktionen wie Alteration (|), Quantifier Ranges ({n,}) und Lookahead. Um diese Lücke zu schließen, macht sbomgen das Paket von Go direkt verfügbar. regexp Diese Funktionen verwenden die Go-Regex-Syntax (RE2), keine Lua-Muster.
sbomgen.regex_find (str, muster)
Gibt die erste Übereinstimmung eines Go-Regex-Musters zurück, oder wenn keine Übereinstimmung vorliegt. nil
-
Gibt zurück:
string|nil, err
local version = sbomgen.regex_find(content, "\\d+\\.\\d+\\.\\d+")
sbomgen.regex_match (str, Muster)
Gibt Capture-Gruppen aus dem ersten Spiel zurück. Index 1 ist der vollständige Treffer, mindestens 2 sind Capture-Gruppen.
-
Gibt zurück:
{string, ...}|nil, err
local groups = sbomgen.regex_match(content, "(MySQL|MariaDB) (\\d+)\\.(\\d+)\\.(\\d+)") if groups then local db_type = groups[2] -- "MySQL" or "MariaDB" local major = groups[3] end
sbomgen.regex_find_all (str, Muster [, n])
Gibt alle Treffer zurück, die sich nicht überschneiden. Übergebenn, um die Ergebnisse zu begrenzen (Standardeinstellung: alle).
-
Gibt zurück:
{string, ...}|nil, err
local versions = sbomgen.regex_find_all(content, "\\d+\\.\\d+\\.\\d+")
sbomgen.regex_replace (str, Muster, Ersatz)
Ersetzt alle Treffer. Die Ersatzzeichenfolge kann $1$2, usw. für Capture-Gruppenverweise verwenden.
-
Gibt Folgendes zurück:
string, err
local cleaned = sbomgen.regex_replace(raw_version, "(1[6-9]\\d{8,}|buildkitsandbox.*)$", "")
Wann sollten Regex- oder Lua-Muster verwendet werden
Verwende das eingebautestring.match/von Lua string.find für einfache Muster — sie sind schneller und erfordern keine Umgehung von Backslashes. Verwenden Sie, wenn Sie Folgendes benötigensbomgen.regex_*:
-
Abwechslung:
(foo|bar) -
Bereiche des Quantifizierers:
\d{8,} -
Komplexe Zeichenklassen, die nicht in Lua-Mustern ausgedrückt werden können
Strukturiertes Parsen
Sbomgen stellt einfache Helfer zur Verfügung, mit denen strukturierte Textformate direkt in Lua-Tabellen dekodiert werden können.
sbomgen.json_decode (str)
Analysiert eine JSON-Zeichenfolge in eine Lua-Tabelle.
-
Gibt zurück:
table|nil, err
local doc, err = sbomgen.json_decode('{"name":"requests","version":"2.28.1"}') if err then return end sbomgen.log_info(doc.name)
sbomgen.xml_decode (str)
Analysiert eine XML-String in eine Lua-Tabelle.
-
Gibt zurück:
table|nil, err
XML-Werte verwenden die folgende Form:
-
_name— Name des Elements -
_attr— Attributtabelle, falls vorhanden -
_text— getrimmter Textinhalt, falls vorhanden -
numerische Indizes
1..n— untergeordnete Elemente
local doc, err = sbomgen.xml_decode('<package id="Newtonsoft.Json" version="13.0.3" />') if err then return end sbomgen.log_info(doc._attr.id)
Windows Registry
Diese Funktionen bieten nur Lesezugriff auf die Windows-Registrierung. Gibt bei Nicht-Windows-Artefakten einen Fehler registry_open_key zurück. Der Registry Accessor wird bei der ersten Verwendung verzögert initialisiert und unterstützt sowohl den Live-Zugriff auf die Windows-API (Localhost-Scans unter Windows) als auch das dateibasierte REGF-Hive-Parsing (Scans). container/volume
sbomgen.registry_open_key (Pfad)
Öffnet einen Registrierungsschlüssel. Gibt ein Schlüssel-Handle zurück, das mit geschlossen werden mussregistry_close.
-
Gibt zurück:
key, err
local key, err = sbomgen.registry_open_key("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\7-Zip") if err then return end -- use key... sbomgen.registry_close(key)
sbomgen.registry_get_string (Schlüssel, Wertname)
Liest einen Zeichenkettenwert aus einem geöffneten Registrierungsschlüssel.
-
Gibt zurück:
string, err
local version, err = sbomgen.registry_get_string(key, "DisplayVersion")
sbomgen.registry_get_integer (Schlüssel, Wertname)
Liest einen Integer-Wert aus einem geöffneten Registrierungsschlüssel.
-
Gibt zurück:
number, err
sbomgen.registry_get_strings (Schlüssel, Wertname)
Liest einen Wert mit mehreren Zeichenketten (REG_MULTI_SZ) aus einem geöffneten Registrierungsschlüssel. Gibt eine Tabelle mit Zeichenketten zurück.
-
Gibt zurück:
{string, ...}, err
local paths, err = sbomgen.registry_get_strings(key, "DependsOnService") if paths then for _, p in ipairs(paths) do sbomgen.log_info("depends on: " .. p) end end
sbomgen.registry_get_subkeys (Schlüssel)
Gibt alle Unterschlüsselnamen unter einem geöffneten Registrierungsschlüssel zurück.
-
Gibt zurück:
{string, ...}, err
local subkeys, err = sbomgen.registry_get_subkeys(key) for _, name in ipairs(subkeys) do local subkey, err = sbomgen.registry_open_key(parent_path .. "\\" .. name) -- ... end
sbomgen.registry_close (Schlüssel)
Schließt ein Registrierungsschlüssel-Handle. Schlüssel-Handles werden ebenfalls automatisch vom Garbage Collector geschlossen, ein explizites Schließen wird jedoch empfohlen.
Protokollierung
Log-Meldungen werden in die Konsolenausgabe von sbomgen geschrieben. Jeder von einem Plugin ausgegebenen Nachricht wird automatisch das Quelllabel und das Ökosystem des Plugins vorangestellt, zum Beispiel:
[custom:python-pip] Parsing requirements.txt
log_infolog_warn, und log_error immer drucken. log_debugdruckt nur, wenn sbomgen mit aufgerufen wird. --verbose
| Funktion | Stufe | Standardmäßig sichtbar? |
|---|---|---|
sbomgen.log_debug(message) |
DEBUG | Nein — benötigt --verbose |
sbomgen.log_info(message) |
INFO | Ja |
sbomgen.log_warn(message) |
WARN | Ja |
sbomgen.log_error(message) |
ERROR | Ja |
string.formatFür formatierte Nachrichten verwenden:
sbomgen.log_info(string.format("found %d packages in %s", count, file_path))
Debugging-Funktionen
sbomgen.breakpoint (Nachricht)
Druckt message auf stderr und blockiert die Ausführung, bis der Benutzer die Eingabetaste drückt. Wenn message es weggelassen wird, wird eine Standardnachricht gedruckt.
Verwenden Sie dies als einfachen Debugger, indem Sie Breakpoints an wichtigen Stellen in Ihrem Plugin platzieren und es ausführen, um die umgebende Protokollausgabe --verbose zu sehen.
sbomgen.log_info("state: " .. some_variable) sbomgen.breakpoint("paused after state dump — press Enter to continue")
API testen
Funktionen in der globalen testing Tabelle sind nur in den Plugin-Testdateien (*_test.lua) verfügbar, geladen voninspector-sbomgen plugin test. Sie sind zur Laufzeit in Discovery- oder Collection-Plugins nicht verfügbar. Die vollständige sbomgen.* API ist auch in Testdateien verfügbar, aber sbomgen.* Funktionen, die (zum Beispielsbomgen.read_file()) ein Artefakt benötigen, liefern nur dann aussagekräftige Ergebnisse, wenn sie innerhalb eines Scans aufgerufen werden. Eine ausführliche Anleitung finden Sie imLeitfaden zum Testen von Plugins.
Scan-Funktionen
Jede Scan-Funktion erstellt ein Artefakt der angegebenen Art, führt die Discovery→Collection-Pipeline des aktuellen Plugins gegen dieses Objekt aus und gibt die resultierenden Ergebnisse zurück. Das path Argument wird relativ zum Verzeichnis der Testdatei aufgelöst.
| Funktion | Art des Artefakts |
|---|---|
testing.scan_directory(path) |
Verzeichnis |
testing.scan_archive(path) |
Verzeichnis (Alias vonscan_directory) |
testing.scan_localhost(path) |
Lokaler Host |
testing.scan_binary(path) |
Binär |
testing.scan_volume(path) |
Volume |
testing.scan_container(path) |
Behälter |
Alle sechs geben eine Ergebnistabelle mit der folgenden Form zurück.
Form des Ergebnisses
Jede Ergebnistabelle projiziert nur die unten aufgeführten Felder. Insbesondere purl_type werden sie nicht separat projiziert, namespace sondern in die gesamte purl Zeichenfolge aufgenommen.
local result = testing.scan_directory("_testdata/example") -- result.findings -- array of finding tables -- result.findings[i].name -- string -- result.findings[i].version -- string -- result.findings[i].component_type -- string -- result.findings[i].purl -- string (the full Package URL, or "" if none) -- result.findings[i].properties -- table<string, string> -- result.findings[i].children -- array of finding tables (same shape, recursive)
Assertionen
| Funktion | Signature | Beschreibung |
|---|---|---|
testing.assert_equals |
(expected: any, actual: any, message?: string) |
Schlägt fehl, wenntostring(expected) ~= tostring(actual). |
testing.assert_not_equals |
(expected: any, actual: any, message?: string) |
Schlägt fehl, wenntostring(expected) == tostring(actual). |
testing.assert_true |
(value: any, message?: string) |
Schlägt fehlvalue, wenn false odernil. |
testing.assert_false |
(value: any, message?: string) |
Schlägt fehl, wenn value nicht false und nichtnil. |
testing.assert_nil |
(value: any, message?: string) |
Schlägt fehlvalue, wenn nichtnil. |
testing.assert_not_nil |
(value: any, message?: string) |
Schlägt fehl, value wenn janil. |
testing.assert_contains |
(haystack: string, needle: string, message?: string) |
Schlägt fehl, wenn haystack es nicht needle (Teilzeichenfolge entspricht) enthält. |
testing.assert_matches |
(str: string, pattern: string, message?: string) |
Schlägt fehl, wenn str es nicht mit der angegebenen Go (RE2) -Regex übereinstimmt. |
testing.assert_length |
(tbl: table, expected: integer, message?: string) |
Schlägt fehl, wenn #tbl nicht gleich. expected |
Ablauf kontrollieren
| Funktion | Signature | Beschreibung |
|---|---|---|
testing.fail |
(message: string) |
Schlägt den aktuellen Test mit der angegebenen Meldung sofort fehl. |
testing.skip |
(message: string) |
Überspringt den aktuellen Test. Das Ergebnis wird als übersprungen und nicht als fehlgeschlagen gemeldet. |
Erkennung testen
Jede globale Lua-Funktion, deren Name mit test_ einem Dateiabgleich beginnt, *_test.lua wird als Test behandelt. Die Testdatei muss neben einer init.lua in normaler {phase}/{platform}/{category}/{ecosystem}/ Tiefe liegen. Die Fixture-Daten werden _testdata/ neben der Testdatei eingegeben — der Runner taucht _testdata/ bei der Suche nach Testdateien nicht ab.
Fehlerbehandlung
API-Funktionen, die fehlschlagen können, geben zwei Werte zurück:. value, err Bei Erfolg err istnil. Im Fehlerfall ist nil und err ist der erste Wert eine Fehlerzeichenfolge.
local content, err = sbomgen.read_file(path) if err then sbomgen.log_error("failed to read " .. path .. ": " .. err) return end -- content is safe to use here
Wenn ein Plugin einen unbehandelten Lua-Fehler auslöst, protokolliert sbomgen eine Warnung und fährt mit der nächsten Datei oder dem nächsten Plugin fort. Andere Plugins sind nicht betroffen.