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 von der 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. Globaler Lebenszyklus von Plugins
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 in einer Sandbox-Lua-VM mit eingeschränktem Zugriff auf die Standardbibliothek ausgeführt. Die folgenden Lua-Standardbibliotheksmodule sind verfügbar:
| Modul | Hinweise |
|---|---|
base |
Kernfunktionen (printtype,tostring,tonumber,pairs,ipairs,pcall,error,select,unpack, rawgetrawset,, usw.). dofile,loadfile, 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. Das Durchqueren des übergeordneten Verzeichnisses () ist blockiertrequire("../shared"). package.cpathund sind gelöscht. package.path |
Die folgenden Standardbibliotheksmodule sind aus Sicherheits- und Stabilitätsgründen ausdrücklich nicht zulässig:
| Modul | Grund |
|---|---|
io |
Der direkte Dateisystemzugriff ist blockiert. Alle Dateioperationen müssen sbomgen.* Funktionen durchlaufen, die über die Artefaktschnittstelle weitergeleitet werden, um ein einheitliches Verhalten bei allen Artefakttypen (Verzeichnis, Container, Volume usw.) zu gewährleisten. |
os |
Operationen auf Systemebene (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 befinden sich nicht in der Zulassungsliste der VM und sie können nicht von Plugins abgerufen werden.
Anmerkung
Wichtig: Alle Dateien I/O müssen sbomgen.* Funktionen (z. B., sbomgen.read_filesbomgen.open_file,sbomgen.get_file_list) durchlaufen. Die Verwendung von io.open oder irgendein direkter Dateisystemzugriff führt zu einem Laufzeitfehler. Die sbomgen API stellt sicher, dass Plugins mit der Artefakt-Abstraktionsebene interagieren, was für ein einheitliches Verhalten sorgt, unabhängig davon, ob ein Verzeichnis, ein Container-Image, ein Archiv oder ein Volume gescannt wird.
Globaler Lebenszyklus von Plugins
Ein Plugin ist eine Lua-Datei mit dem Nameninit.lua, die bestimmte globale Funktionen der obersten Ebene definiert. Diese Globals sind nicht in der sbomgen Tabelle enthalten — es sind Funktionen, die das Plugin für den Aufruf durch sbomgen definiert. Der Satz gültiger Globalwerte unterscheidet sich zwischen Discovery-Plugins und Sammlungs-Plugins. Wenn das Plugin sie auslässt, wird für jede der unten aufgeführten Funktionen die in der Tabelle angegebene Standardeinstellung verwendet.
Discovery-Plugins
| Funktion | Arity | Erforderlich | Standard (wenn weggelassen) | Beschreibung |
|---|---|---|---|---|
discover() |
0 | Ja | — | Gibt die Dateien zurück, die dieses Plugin gefunden hat. Gibt eine sequentielle Tabelle mit Pfadzeichenfolgen zurück (Einzelereignismodus) oder eine Tabelle, die durch Zeichenketten mit Ereignisnamen gekennzeichnet ist, deren Werte Pfadtabellen sind (Mehrereignismodus). |
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 Ökosystem-Verzeichnisses | Gibt den Anzeigenamen des Scanners zurück. Muss für alle Discovery-Plug-ins 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 Kategorieverzeichnis (siehe Entwicklerhandbuch) | Gibt eine Tabelle mit Zeichenketten 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 Scans verwendetlocalhost. |
Plugins für Sammlungen
| Funktion | Arity | Erforderlich | Standard (wenn weggelassen) | Beschreibung |
|---|---|---|---|---|
collect(file_path) |
1 | Ja | — | Wird einmal pro Datei aufgerufen, die für das abonnierte Ereignis veröffentlicht wurde. Analysiert die Datei und sendet die Ergebnisse über. sbomgen.push_package() Gibt nichts zurück. |
subscribe_to_event() |
0 | Nein | "lua:{platform}/{category}/{ecosystem}" |
Gibt den Namen des Ereignisses zurück, den dieser Collector abonniert hat. Sollte mit den entsprechenden Discovery-Plug-ins get_event_name() übereinstimmen. |
get_collector_name() |
0 | Nein | Name des Ökosystem-Verzeichnisses | 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-E/A
Alle Dateioperationen müssen über die sbomgen.* API abgewickelt werden. Direkter Dateisystemzugriff über die io Bibliothek von Lua ist nicht verfügbar (sieheSandbox-Einschränkungen). Die sbomgen I/O Dateifunktionen werden über die Artifact-Schnittstelle weitergeleitet und stellen so sicher, dass Ihr Plugin identisch funktioniert, egal ob es ein Verzeichnis auf der Festplatte, ein Container-Image, ein komprimiertes Archiv oder ein gemountetes Volume scannt.
sbomgen.get_file_list()
Gibt alle Dateipfade im Artefakt als Tabelle mit Zeichenketten zurück.
-
Gibt 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 mehr als 300.000 Dateien) dauert dies allein mehrere Sekunden. Das Iterieren der zurückgegebenen Tabelle in Lua mit
string.match()fügt weiteren Aufwand hinzu — 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 diese gezielten Alternativen, wann immer dies möglich ist:
| Funktion | Verwenden Sie, wenn... |
|---|---|
sbomgen.find_files_by_name() |
Sie kennen die genauen Dateinamen, die übereinstimmen sollen (z. B."requirements.txt","curl") |
sbomgen.find_files_by_name_icase() |
Wie oben, aber unabhängig von 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 einen vollständigen Pfadabgleich mit Regex |
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. Selbst bei 300.000 Dateiartefakten ist der Abgleich in weniger als 1 Millisekunde abgeschlossen. Verwenden Sie diese get_file_list() Option nur, wenn Ihre Abgleichslogik mit keinem der oben genannten Werte ausgedrückt werden kann.
-- 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(path)
Liest den gesamten Inhalt einer Datei und gibt ihn als Zeichenfolge zurück.
-
Gibt zurück:
string, err -
Bei einem Fehler:
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(path)
Öffnet eine Datei zum Streamen von Lesevorgängen. 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.
-
Gibt 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(pattern)
Gibt Dateien zurück, die einem filepath.Match Go-Glob-Muster entsprechen. Das Muster wird mit dem Basisdateinamen abgeglichen.
-
Gibt zurück:
{string, ...}, err
local files, err = sbomgen.glob_find_files("*.txt")
Verwenden Sie sbomgen.get_file_list() with string.match für den vollständigen Pfadmusterabgleich.
sbomgen.find_files_by_name(names)
Gibt Dateien zurück, deren Basisname (letzte Pfadkomponente) genau mit einem der angegebenen Namen übereinstimmt. Die Iteration und der Vergleich erfolgen in Go, was dies deutlich schneller macht als die Iteration sbomgen.get_file_list() in Lua.
-
Parameter:
names— Tabelle mit Zeichenketten (passende Basisnamen) -
Gibt zurück:
{string, ...}— übereinstimmende Dateipfade (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(names)
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 Der find_files_by_name Abgleich findet sozusagen außerhalb der Lua-VM statt.
-
Parameter:
names— Tabelle mit Zeichenketten (abzugleichende Basisnamen, Groß- und Kleinschreibung wird nicht beachtet) -
Gibt zurück:
{string, ...}— übereinstimmende Dateipfade (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(suffixes)
Gibt Dateien zurück, deren vollständiger Pfad (forward-slash-normalized) mit einem der angegebenen Suffixe endet. Der Abgleich findet find_files_by_name sozusagen außerhalb der Lua-VM statt.
-
Parameter:
suffixes— Tabelle mit Zeichenketten (passende Pfadsuffixe) -
Gibt zurück:
{string, ...}— übereinstimmende Dateipfade (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(patterns)
Gibt Dateien zurück, deren forward-slash-normalized 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-Zeichenketten -
Gibt zurück:
{string, ...}— passende Dateipfade (kein Fehlertupel) -
Löst aus: einen Lua-Fehler, wenn ein Muster nicht kompiliert werden kann
local configs = sbomgen.find_files_by_path_regex({"/etc/.*\\.conf$", "/opt/.*/config\\.json$"})
Leistung: vs find_files_by_* get_file_list
Bei Discovery-Plugins sollten Sie lieber find_files_by_name oder find_files_by_path_regex lieber get_file_list() in Lua iterieren. find_files_by_suffix Bei einem Localhost-Scan mit 300.000 Dateien string.match() dauert die Iteration der Dateiliste in Lua mit ~15 Sekunden und ist in weniger als 1 Millisekunde abgeschlossen. find_files_by_name Der Unterschied besteht darin, dass jeder Dateipfad als Zeichenfolge in die Lua-VM get_file_list() kopiert wird. Anschließend interpretiert Lua die Schleife und den Mustervergleich für jeden einzelnen. 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 Kopier- als auch der Interpretationsaufwand pro Pfad vermieden wird.
Verwenden Sie diese get_file_list() Option nur, wenn Sie eine benutzerdefinierte Abgleichslogik benötigen, die nicht als Basisname, Suffix oder Regex-Übereinstimmung ausgedrückt werden kann.
sbomgen.read_dir(path)
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(path)
Gibt Metadaten zu einer 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(path, entry_path)
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(path, regex)
Analysiert eine Datei als ELF-, PE- oder Mach-O-Binärdatei und durchsucht den constant/variable Standardabschnitt nach einer Go-Regex-Übereinstimmung.
-
Gibt zurück:
string|nil, err— die übereinstimmende Zeichenfolge oder nil, wenn keine Übereinstimmung vorliegt
local version, err = sbomgen.search_binary(path, "Version:\\s+([\\d.]+)") if version then sbomgen.log_info("found version: " .. version) end
sbomgen.search_binary_all(path, regex [, 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 Übergeben, n um die Ergebnisse einzuschränken.
-
Gibt zurück:
{string, ...}|nil, err— Tabelle mit übereinstimmenden Zeichenketten 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(path, regex)
Durchsucht die gesamte Binärdatei nach der ersten Regex-Übereinstimmung und ist nicht auf einen bestimmten Abschnitt beschränkt. Wird verwendet, wenn die abschnittsbasierte Suche (search_binary) nicht ausreicht, z. B. wenn sich Versionszeichenfolgen in Abschnitten befinden, die nicht dem Standard entsprechen.
-
Gibt zurück:
string|nil, err— die übereinstimmende Zeichenfolge oder nil, wenn keine Übereinstimmung vorliegt
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.
-
Retouren:
string|nil, err
fh:read(n)
Liest bis zu n Byte. Kehrt nil bei EOF zurück.
-
Retouren:
string|nil, err
fh:close()
Schließt das Datei-Handle. Schließt die Griffe immer, wenn Sie fertig sind.
Binäre Dienstprogramme
sbomgen.sha256(path)
Gibt den hexadezimalen SHA-256-Hash des Inhalts einer Datei zurück.
-
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(path, patterns)
Prüft, ob eine Datei jedes der angegebenen Byte-Muster 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(path)
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 hat.
-
Gibt zurück:
{product_version, file_version, string_table}, err
Die file_version Felder product_version und stammen aus der FixedFileInfo PE-Struktur, formatiert als"major.minor.build.revision". Das string_table Feld ist eine verschachtelte Tabelle, die mit einem Gebietsschema-Code versehen ist (z. B. "040904B0" für US-amerikanisches Unicode). Jedes Gebietsschema ist einer Tabelle mit name/value Paaren zugeordnet, die aus dem PE StringFileInfo (ProductVersion, ProductNameFileDescription, usw.) gezogen wurden. 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(path)
Praktischer Wrapper, der nur die Produktversionszeichenfolge einer PE-Binärdatei zurückgibt. FixedFileInfo Entspricht dem Aufrufen get_pe_version_info(path) und Lesenproduct_version.
-
Gibt zurück:
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(path)
Praktischer Wrapper, der nur die Dateiversionszeichenfolge aus einer PE-Binärdatei zurückgibt. FixedFileInfo Entspricht dem Aufrufen 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(pkg)
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 | Aufgelöste Versionszeichenfolge |
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; verwendet 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) CyclonedX-Eigenschaften |
children |
Tabelle | Nein | Verschachtelte untergeordnete Pakete, jedes mit derselben Form wie pkg (Pflichtfelder 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", }, })
CyclonedX-Eigenschaften
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-Qualifier haben für Amazon Inspector eine semantische Bedeutung und beeinflussen die Identifizierung von Sicherheitslücken. Siehe Was ist eine Paket-URL? für die spezifischen Konventionen von Inspector. -
properties— Eigenschaften der CyclonedX-Komponente. Diese erscheinen imcomponents[].propertiesArray der SBOM und ändern nicht, 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.
Von Plugins definierte Eigenschaften dürfen diese Namespaces nicht verwenden. Das Schreiben in einen reservierten Namespace kann Werte, auf die sich Inspector stützt, überlagern oder mit ihnen in Konflikt geraten, und die resultierende SBOM kann bei der Identifizierung von Sicherheitslücken falsch interpretiert werden. Eine vollständige Liste der reservierten Schlüssel finden Sie unter Verwenden von CyclonedX-Namespaces mit Amazon Inspector.
Regeln zur Benennung von Schlüsseln
Eigenschaftsschlüssel, die an übergeben wurden, sbomgen.push_package() werden wie folgt verarbeitet:
| Eingabeschlüssel | Resultierender Schlüssel in SBOM | Für benutzerdefinierte Plugins empfohlen? |
|---|---|---|
Enthält : (z. B.acme:my_plugin:field) |
Wird wörtlich verwendet | Ja — platziere jede vom Plugin definierte Eigenschaft in deinem eigenen Namespace |
Nein : (z. B.) field |
Automatisch mit dem Präfix amazon:inspector:sbom_generator:field |
Nein — das schreibt in einen reservierten Namespace |
Fügen Sie in 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 ausgibt, 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 es aktiviert--enable-debug-propsist.
Die vollständige Taxonomie der reservierten Schlüssel finden Sie im Amazon Inspector-Benutzerhandbuch: Verwenden von CyclonedX-Namespaces mit Amazon Inspector.
Eigenschaftenkonstanten
Integrierte Eigenschaftsschlüsselkonstanten sind über verfügbar. sbomgen.properties Jede der folgenden Konstanten wird zu einem Schlüssel innerhalb des reservierten amazon:inspector:sbom_generator:* Namespaces aufgelöst. Diese Konstanten existieren, sodass die integrierten Scanner von sbomgen konsistente Eigenschaftsschlüssel ausgeben. Sie sind keine Erweiterungspunkte für benutzerdefinierte Plugins — wenn sie in einem benutzerdefinierten Plugin verwendet werden, wird in einen reservierten Namespace geschrieben, der Werte überschatten kann, auf die sich Inspector stützt. Siehe Reservierte Namespaces oben.
Autoren benutzerdefinierter Plugins sollten Eigenschaften (zum Beispielacme:my_plugin:*) in ihrem eigenen Namespace definieren, anstatt diese Konstanten wiederzuverwenden.
| Konstante | Gelö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 Paketabholung |
sbomgen.groups.EXTRA_ECOSYSTEMS |
"extra-ecosystems" |
Zusätzliche Ökosysteme (Curl, Nginx usw.) |
sbomgen.groups.CERTIFICATE |
"certificate" |
Scannen von Zertifikaten |
sbomgen.groups.CUSTOM |
"custom" |
Wird automatisch zu allen benutzerdefinierten Plugins hinzugefügt, die über geladen wurden --plugin-dir |
sbomgen.groups.MACHINE_LEARNING |
"machine-learning" |
Modellerkennung durch maschinelles Lernen |
Beispiel:
function get_scanner_groups() return {sbomgen.groups.PROGRAMMING_LANGUAGE, sbomgen.groups.PACKAGE_COLLECTOR} end
Konstanten für den Komponententyp
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, })
Plattformkonstanten
Konstanten zum 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 Artifact
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 --collect-licenses aktiviert hat.
sbomgen.get_env_vars()
Gibt Umgebungsvariablen aus dem Artefakt als Tabelle mit {key, value} Einträgen zurück.
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."C:") aus der Umgebung des Artefakts zurück. Liest die SystemDrive Umgebungsvariable und verwendet standardmäßig diese, "C:" falls sie nicht gesetzt ist. Dies ist das Lua-Äquivalent von. strutils.GetSystemDriverLetter()
local drive = sbomgen.get_system_drive() local program_files = drive .. "/Program Files/"
Informationen zum System
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() |
Name des Betriebssystems (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 integrierten Mustern von Lua fehlen Funktionen wie Alternation (|), Quantifier Ranges ({n,}) und Lookahead. Um diese Lücke zu schließen, stellt sbomgen das Paket von Go direkt zur Verfügung. regexp Diese Funktionen verwenden die Go-Regex-Syntax (RE2), keine Lua-Muster.
sbomgen.regex_find(str, pattern)
Gibt die erste Übereinstimmung mit einem Go-Regex-Muster 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, pattern)
Gibt Capture-Gruppen aus dem ersten Spiel zurück. Index 1 ist die vollständige Übereinstimmung, 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, pattern [, n])
Gibt alle Treffer zurück, die sich nicht überschneiden. An n das Limit der Ergebnisse übergeben (Standardeinstellung: alle).
-
Gibt zurück:
{string, ...}|nil, err
local versions = sbomgen.regex_find_all(content, "\\d+\\.\\d+\\.\\d+")
sbomgen.regex_replace(str, pattern, replacement)
Ersetzt alle Treffer. Die Ersatzzeichenfolge kann $1$2, usw. für Erfassungsgruppenverweise verwenden.
-
Gibt zurück:
string, err
local cleaned = sbomgen.regex_replace(raw_version, "(1[6-9]\\d{8,}|buildkitsandbox.*)$", "")
Wann sollten Regex- und Lua-Muster verwendet werden
Verwenden Sie das in Lua integriertestring.match/string.findfür einfache Muster — sie sind schneller und erfordern keine maskierten Backslashes. Verwenden Sie sbomgen.regex_* es, wenn Sie Folgendes benötigen:
-
Abwechslung:
(foo|bar) -
Bereiche des Quantifizierers:
\d{8,} -
Komplexe Zeichenklassen, die in Lua-Mustern nicht ausgedrückt werden können
Strukturiertes Parsen
Sbomgen stellt einfache Hilfsprogramme 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-Zeichenfolge in eine Lua-Tabelle.
-
Gibt zurück:
table|nil, err
XML-Werte haben 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 schreibgeschützten Zugriff auf die Windows-Registrierung. Gibt bei Nicht-Windows-Artefakten einen Fehler registry_open_key zurück. Der Registrierungs-Accessor wird bei der ersten Verwendung verzögert initialisiert und unterstützt sowohl Live-Windows-API-Zugriff (Localhost-Scans unter Windows) als auch dateibasiertes REGF-Hive-Parsing (Container-/Volume-Scans).
sbomgen.registry_open_key(path)
Ö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(key, value_name)
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(key, value_name)
Liest einen Integer-Wert aus einem geöffneten Registrierungsschlüssel.
-
Gibt zurück:
number, err
sbomgen.registry_get_strings(key, value_name)
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(key)
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(key)
Schließt ein Registrierungsschlüssel-Handle. Schlüsselhandles werden ebenfalls automatisch vom Garbage-Collector geschlossen, es wird jedoch empfohlen, sie explizit zu schließen.
Protokollierung
Protokollnachrichten werden in die Konsolenausgabe von sbomgen geschrieben. Jeder Nachricht, die von einem Plugin ausgegeben wird, 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 — erfordert --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(message)
Druckt message nach stderr und blockiert die Ausführung, bis der Benutzer die Eingabetaste drückt. Wenn nicht angegeben, message wird eine Standardnachricht gedruckt.
Verwenden Sie dies als einfachen Debugger, indem Sie Breakpoints an wichtigen Punkten in Ihrem Plugin platzieren und mit ausführen, um die umliegende 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 Plugin-Testdateien (*_test.lua) verfügbar, die von geladen wurdeninspector-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 beispielsweise sbomgen.read_file() ein Artefakt erfordern, führen nur dann zu aussagekräftigen Ergebnissen, wenn sie innerhalb eines Scans aufgerufen werden. Eine ausführliche Anleitung finden Sie in derLeitfaden zum Testen von Plugins.
Funktionen scannen
Jede Scanfunktion erzeugt ein Artefakt der angegebenen Art, führt die Discovery→Collection-Pipeline des aktuellen Plugins anhand dieses Artefakts durch 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 Suchtabelle projiziert nur die unten aufgeführten Felder. Insbesondere namespace und purl_type werden nicht separat projiziert — sie sind in der gesamten purl Zeichenfolge enthalten.
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 fehl, wenn value es false oder istnil. |
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) |
Scheitert, wenn value es so istnil. |
testing.assert_contains |
(haystack: string, needle: string, message?: string) |
Schlägt fehl, wenn haystack es nicht enthält needle (Teilzeichenfolge entspricht). |
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 identisch. expected |
Kontrollfluss
| Funktion | Signature | Beschreibung |
|---|---|---|
testing.fail |
(message: string) |
Schlägt den aktuellen Test sofort mit der angegebenen Nachricht fehl. |
testing.skip |
(message: string) |
Überspringt den aktuellen Test. Das Ergebnis wird als übersprungen und nicht als Fehlschlag gemeldet. |
Testen Sie die Entdeckung
Jede globale Lua-Funktion, deren Name test_ in einem Dateiabgleich mit „beginnt“, *_test.lua wird als Test behandelt. Die Testdatei muss neben und in der normalen {phase}/{platform}/{category}/{ecosystem}/ Tiefe liegen. init.lua Die Fixture-Daten werden _testdata/ neben der Testdatei eingegeben — der Runner rutscht nicht hinein, _testdata/ wenn er nach Testdateien sucht.
Fehlerbehandlung
API-Funktionen, die fehlschlagen können, geben zwei Werte zurück:. value, err Bei Erfolg err istnil. Bei einem Fehler 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.