Hello,
Thank you for posting this. After having a look at the current NVD
situation, I think that the removal of this file is premature,
because of the adding of the 2.0 JSON feeds
https://nvd.nist.gov/vuln/data-feeds#divJson20Feeds

So for people who want to use the NVD data directly from the source still,
I think it makes sense to implement the download
of the JSON 2.0 feeds (should be closer to the nvd-native than nvd2-native,
and *faster*) and then decommission both nvd1
and the current nvd2 (API based).

Kind regards,
Marta

On Tue, Nov 4, 2025 at 9:38 AM Niko Mauno <[email protected]> wrote:

>
>
> On 11/3/25 17:26, Marko, Peter wrote:
> > This should be commented on by Marta, I'm not sure if she brought this
> back even though it was not working anymore.
> > In case it's accepted, contribution to yocto-docs should follow.
> >
> > Peter
> >
>
> Thanks for pointing this out Peter, I'll make a note to submit also
> relevant changes to yocto-docs as needed.
> -Niko
>
> >> -----Original Message-----
> >> From: Niko Mauno <[email protected]>
> >> Sent: Monday, November 3, 2025 15:32
> >> To: [email protected]
> >> Cc: [email protected]; [email protected]; Marko, Peter (FT D EU SK
> >> BFS1) <[email protected]>; Niko Mauno <[email protected]>
> >> Subject: [PATCH 3/5] cve-update: Drop obsolete NVD1 support
> >>
> >> Since enabling NVD1 as NVD_DB_VERSION nowadays leads to BitBake failure
> >>
> >>    WARNING: cve-update-db-native-1.0-r0 do_fetch: Failed to fetch CVE
> data (HTTP
> >> Error 403: Forbidden)
> >>    WARNING: cve-update-db-native-1.0-r0 do_fetch: Host IPs are
> 172.65.90.26,
> >> 172.65.90.25, 172.65.90.24, 172.65.90.27, 2606:4700:78::90:0:180,
> >> 2606:4700:78::90:0:183, 2606:4700:78::90:0:181, 2606:4700:78::90:0:182
> >>    WARNING: cve-update-db-native-1.0-r0 do_fetch: CVE database update
> failed
> >>    ERROR: cve-update-db-native-1.0-r0 do_unpack: Error executing a
> python
> >> function in exec_func_python() autogenerated:
> >>
> >> Remove the support for obsolete NVD1.
> >>
> >> Signed-off-by: Niko Mauno <[email protected]>
> >> ---
> >>   meta/classes/cve-check.bbclass                |  8 +-
> >>   .../recipes-core/meta/cve-update-db-native.bb | 87
> +++----------------
> >>   2 files changed, 15 insertions(+), 80 deletions(-)
> >>
> >> diff --git a/meta/classes/cve-check.bbclass
> b/meta/classes/cve-check.bbclass
> >> index c63ebd56e1..259c699af2 100644
> >> --- a/meta/classes/cve-check.bbclass
> >> +++ b/meta/classes/cve-check.bbclass
> >> @@ -31,11 +31,11 @@
> >>   CVE_PRODUCT ??= "${BPN}"
> >>   CVE_VERSION ??= "${PV}"
> >>
> >> -# Possible database sources: NVD1, NVD2, FKIE
> >> +# Possible database sources: NVD2, FKIE
> >>   NVD_DB_VERSION ?= "FKIE"
> >>
> >>   # Use different file names for each database source, as they
> synchronize at
> >> different moments, so may be slightly different
> >> -CVE_CHECK_DB_FILENAME ?= "${@'nvdcve_2-2.db' if
> >> d.getVar('NVD_DB_VERSION') == 'NVD2' else 'nvdcve_1-3.db' if
> >> d.getVar('NVD_DB_VERSION') == 'NVD1' else 'nvdfkie_1-1.db'}"
> >> +CVE_CHECK_DB_FILENAME ?= "${@'nvdcve_2-2.db' if
> >> d.getVar('NVD_DB_VERSION') == 'NVD2' else 'nvdfkie_1-1.db'}"
> >>   CVE_CHECK_DB_FETCHER ?= "${@'cve-update-nvd2-native' if
> >> d.getVar('NVD_DB_VERSION') == 'NVD2' else 'cve-update-db-native'}"
> >>   CVE_CHECK_DB_DIR ?= "${STAGING_DIR}/CVE_CHECK"
> >>   CVE_CHECK_DB_FILE ?=
> >> "${CVE_CHECK_DB_DIR}/${CVE_CHECK_DB_FILENAME}"
> >> @@ -108,8 +108,8 @@ python () {
> >>       extend_cve_status(d)
> >>
> >>       nvd_database_type = d.getVar("NVD_DB_VERSION")
> >> -    if nvd_database_type not in ("NVD1", "NVD2", "FKIE"):
> >> -        bb.erroronce("Malformed NVD_DB_VERSION, must be one of: NVD1,
> >> NVD2, FKIE. Defaulting to NVD2")
> >> +    if nvd_database_type not in ("NVD2", "FKIE"):
> >> +        bb.erroronce("Malformed NVD_DB_VERSION, must be one of: NVD2,
> >> FKIE. Defaulting to NVD2")
> >>           d.setVar("NVD_DB_VERSION", "NVD2")
> >>   }
> >>
> >> diff --git a/meta/recipes-core/meta/cve-update-db-native.bb
> b/meta/recipes-
> >> core/meta/cve-update-db-native.bb
> >> index 3a6dc95580..4423216be5 100644
> >> --- a/meta/recipes-core/meta/cve-update-db-native.bb
> >> +++ b/meta/recipes-core/meta/cve-update-db-native.bb
> >> @@ -11,7 +11,6 @@ deltask do_compile
> >>   deltask do_install
> >>   deltask do_populate_sysroot
> >>
> >> -NVDCVE_URL ?= "https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-";
> >>   FKIE_URL ?= "https://github.com/fkie-cad/nvd-json-data-
> >> feeds/releases/latest/download/CVE-"
> >>
> >>   # CVE database update interval, in seconds. By default: once a day
> (23*60*60).
> >> @@ -108,30 +107,12 @@ def cleanup_db_download(db_tmp_file):
> >>       if os.path.exists(db_tmp_file):
> >>           os.remove(db_tmp_file)
> >>
> >> -def db_file_names(d, year, is_nvd):
> >> -    if is_nvd:
> >> -        year_url = d.getVar('NVDCVE_URL') + str(year)
> >> -        meta_url = year_url + ".meta"
> >> -        json_url = year_url + ".json.gz"
> >> -        return json_url, meta_url
> >> +def db_file_names(d, year):
> >>       year_url = d.getVar('FKIE_URL') + str(year)
> >>       meta_url = year_url + ".meta"
> >>       json_url = year_url + ".json.xz"
> >>       return json_url, meta_url
> >>
> >> -def host_db_name(d, is_nvd):
> >> -    if is_nvd:
> >> -        return "nvd.nist.gov"
> >> -    return "github.com"
> >> -
> >> -def db_decompress(d, data, is_nvd):
> >> -    import gzip, lzma
> >> -
> >> -    if is_nvd:
> >> -        return gzip.decompress(data).decode('utf-8')
> >> -    # otherwise
> >> -    return lzma.decompress(data)
> >> -
> >>   def update_db_file(db_tmp_file, d):
> >>       """
> >>       Update the given database file
> >> @@ -139,12 +120,12 @@ def update_db_file(db_tmp_file, d):
> >>       import bb.progress
> >>       import bb.utils
> >>       from datetime import date
> >> +    import lzma
> >>       import sqlite3
> >>       import urllib
> >>
> >>       YEAR_START = 2002
> >>       cve_socket_timeout = int(d.getVar("CVE_SOCKET_TIMEOUT"))
> >> -    is_nvd = d.getVar("NVD_DB_VERSION") == "NVD1"
> >>
> >>       # Connect to database
> >>       conn = sqlite3.connect(db_tmp_file)
> >> @@ -155,7 +136,7 @@ def update_db_file(db_tmp_file, d):
> >>           for i, year in enumerate(range(YEAR_START, date.today().year
> + 1)):
> >>               bb.note("Updating %d" % year)
> >>               ph.update((float(i + 1) / total_years) * 100)
> >> -            json_url, meta_url = db_file_names(d, year, is_nvd)
> >> +            json_url, meta_url = db_file_names(d, year)
> >>
> >>               # Retrieve meta last modified date
> >>               try:
> >> @@ -164,7 +145,7 @@ def update_db_file(db_tmp_file, d):
> >>                   cve_f.write('Warning: CVE db update error, Unable to
> fetch CVE
> >> data.\n\n')
> >>                   bb.warn("Failed to fetch CVE data (%s)" % e)
> >>                   import socket
> >> -                result = socket.getaddrinfo(host_db_name(d, is_nvd),
> 443,
> >> proto=socket.IPPROTO_TCP)
> >> +                result = socket.getaddrinfo("github.com", 443,
> >> proto=socket.IPPROTO_TCP)
> >>                   bb.warn("Host IPs are %s" % (", ".join(t[4][0] for t
> in result)))
> >>                   return False
> >>
> >> @@ -192,7 +173,7 @@ def update_db_file(db_tmp_file, d):
> >>                   try:
> >>                       response = urllib.request.urlopen(json_url,
> >> timeout=cve_socket_timeout)
> >>                       if response:
> >> -                        update_db(d, conn, db_decompress(d,
> response.read(), is_nvd))
> >> +                        update_db(conn,
> lzma.decompress(response.read()))
> >>                       conn.execute("insert or replace into META values
> (?, ?)", [year,
> >> last_modified]).close()
> >>                   except urllib.error.URLError as e:
> >>                       cve_f.write('Warning: CVE db update error, CVE
> data is
> >> outdated.\n\n')
> >> @@ -224,17 +205,14 @@ def initialize_db(conn):
> >>
> >>           c.close()
> >>
> >> -def parse_node_and_insert(conn, node, cveId, is_nvd):
> >> +def parse_node_and_insert(conn, node, cveId):
> >>       # Parse children node if needed
> >>       for child in node.get('children', ()):
> >> -        parse_node_and_insert(conn, child, cveId, is_nvd)
> >> +        parse_node_and_insert(conn, child, cveId)
> >>
> >> -    def cpe_generator(is_nvd):
> >> +    def cpe_generator():
> >>           match_string = "cpeMatch"
> >>           cpe_string = 'criteria'
> >> -        if is_nvd:
> >> -            match_string = "cpe_match"
> >> -            cpe_string = 'cpe23Uri'
> >>
> >>           for cpe in node.get(match_string, ()):
> >>               if not cpe['vulnerable']:
> >> @@ -290,44 +268,7 @@ def parse_node_and_insert(conn, node, cveId,
> is_nvd):
> >>                       # Save processing by representing as -.
> >>                       yield [cveId, vendor, product, '-', '', '', '']
> >>
> >> -    conn.executemany("insert into PRODUCTS values (?, ?, ?, ?, ?, ?,
> ?)",
> >> cpe_generator(is_nvd)).close()
> >> -
> >> -def update_db_nvdjson(conn, jsondata):
> >> -    import json
> >> -    root = json.loads(jsondata)
> >> -
> >> -    for elt in root['CVE_Items']:
> >> -        if not elt['impact']:
> >> -            continue
> >> -
> >> -        accessVector = None
> >> -        vectorString = None
> >> -        cvssv2 = 0.0
> >> -        cvssv3 = 0.0
> >> -        cvssv4 = 0.0
> >> -        cveId = elt['cve']['CVE_data_meta']['ID']
> >> -        cveDesc =
> elt['cve']['description']['description_data'][0]['value']
> >> -        date = elt['lastModifiedDate']
> >> -        try:
> >> -            accessVector =
> elt['impact']['baseMetricV2']['cvssV2']['accessVector']
> >> -            vectorString =
> elt['impact']['baseMetricV2']['cvssV2']['vectorString']
> >> -            cvssv2 =
> elt['impact']['baseMetricV2']['cvssV2']['baseScore']
> >> -        except KeyError:
> >> -            cvssv2 = 0.0
> >> -        try:
> >> -            accessVector = accessVector or
> >> elt['impact']['baseMetricV3']['cvssV3']['attackVector']
> >> -            vectorString = vectorString or
> >> elt['impact']['baseMetricV3']['cvssV3']['vectorString']
> >> -            cvssv3 =
> elt['impact']['baseMetricV3']['cvssV3']['baseScore']
> >> -        except KeyError:
> >> -            accessVector = accessVector or "UNKNOWN"
> >> -            cvssv3 = 0.0
> >> -
> >> -        conn.execute("insert or replace into NVD values (?, ?, ?, ?,
> ?, ?, ?, ?)",
> >> -                [cveId, cveDesc, cvssv2, cvssv3, cvssv4, date,
> accessVector,
> >> vectorString]).close()
> >> -
> >> -        configurations = elt['configurations']['nodes']
> >> -        for config in configurations:
> >> -            parse_node_and_insert(conn, config, cveId, True)
> >> +    conn.executemany("insert into PRODUCTS values (?, ?, ?, ?, ?, ?,
> ?)",
> >> cpe_generator()).close()
> >>
> >>   def get_metric_entry(metric):
> >>       primaries = [c for c in metric if c['type'] == "Primary"]
> >> @@ -338,7 +279,7 @@ def get_metric_entry(metric):
> >>           return secondaries[0]
> >>       return None
> >>
> >> -def update_db_fkie(conn, jsondata):
> >> +def update_db(conn, jsondata):
> >>       import json
> >>       root = json.loads(jsondata)
> >>
> >> @@ -403,13 +344,7 @@ def update_db_fkie(conn, jsondata):
> >>           for config in elt['configurations']:
> >>               # This is suboptimal as it doesn't handle AND/OR and
> negate, but is
> >> better than nothing
> >>               for node in config.get("nodes") or []:
> >> -                parse_node_and_insert(conn, node, cveId, False)
> >> -
> >> -def update_db(d, conn, jsondata):
> >> -    if (d.getVar("NVD_DB_VERSION") == "FKIE"):
> >> -        return update_db_fkie(conn, jsondata)
> >> -    else:
> >> -        return update_db_nvdjson(conn, jsondata)
> >> +                parse_node_and_insert(conn, node, cveId)
> >>
> >>   do_fetch[nostamp] = "1"
> >>
> >> --
> >> 2.47.3
> >
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#226122): 
https://lists.openembedded.org/g/openembedded-core/message/226122
Mute This Topic: https://lists.openembedded.org/mt/116098345/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to