I am attempting to parse following json file: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2017.json.gz
I am trying to iterate over one nested field, but it throws error. How can I iterate properly over the the objects in "configurations"?
Partial example of the json file:
{
"CVE_data_type" : "CVE",
"CVE_data_format" : "MITRE",
"CVE_data_version" : "4.0",
"CVE_data_numberOfCVEs" : "4337",
"CVE_data_timestamp" : "2018-06-06T07:00Z",
"CVE_Items" : [ {
"cve" : {
"data_type" : "CVE",
"data_format" : "MITRE",
"data_version" : "4.0",
"CVE_data_meta" : {
"ID" : "CVE-2018-0001",
"ASSIGNER" : "cve@mitre.org"
},
"affects" : {
"vendor" : {
"vendor_data" : [ {
"vendor_name" : "juniper",
"product" : {
"product_data" : [ {
"product_name" : "junos",
"version" : {
"version_data" : [ {
"version_value" : "12.1x46"
}, {
"version_value" : "12.3"
}, {
"version_value" : "12.3x48"
}, {
"version_value" : "14.1"
}, {
"version_value" : "14.1x53"
}, {
"version_value" : "14.2"
}, {
"version_value" : "15.1"
}, {
"version_value" : "15.1x49"
}, {
"version_value" : "15.1x53"
} ]
}
} ]
}
} ]
}
},
"problemtype" : {
"problemtype_data" : [ {
"description" : [ {
"lang" : "en",
"value" : "CWE-416"
} ]
} ]
},
"references" : {
"reference_data" : [ {
"url" : "http://www.securityfocus.com/bid/103092",
"name" : "103092",
"refsource" : "BID"
}, {
"url" : "http://www.securitytracker.com/id/1040180",
"name" : "1040180",
"refsource" : "SECTRACK"
}, {
"url" : "https://kb.juniper.net/JSA10828",
"name" : "https://kb.juniper.net/JSA10828",
"refsource" : "CONFIRM"
} ]
},
"description" : {
"description_data" : [ {
"lang" : "en",
"value" : "A remote, unauthenticated attacker may be able to execute code by exploiting a use-after-free defect found in older versions of PHP through injection of crafted data via specific PHP URLs within the context of the J-Web process. Affected releases are Juniper Networks Junos OS: 12.1X46 versions prior to 12.1X46-D67; 12.3 versions prior to 12.3R12-S5; 12.3X48 versions prior to 12.3X48-D35; 14.1 versions prior to 14.1R8-S5, 14.1R9; 14.1X53 versions prior to 14.1X53-D44, 14.1X53-D50; 14.2 versions prior to 14.2R7-S7, 14.2R8; 15.1 versions prior to 15.1R3; 15.1X49 versions prior to 15.1X49-D30; 15.1X53 versions prior to 15.1X53-D70."
} ]
}
},
"configurations" : {
"CVE_data_version" : "4.0",
"nodes" : [ {
"operator" : "OR",
"cpe" : [ {
"vulnerable" : true,
"cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d10",
"cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d10:*:*:*:*:*:*"
}, {
"vulnerable" : true,
"cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d15",
"cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d15:*:*:*:*:*:*"
}, {
"vulnerable" : true,
"cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d20",
"cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d20:*:*:*:*:*:*"
}, {
"vulnerable" : true,
"cpe22Uri" : "cpe:/o:juniper:junos:12.1x46:d25",
"cpe23Uri" : "cpe:2.3:o:juniper:junos:12.1x46:d25:*:*:*:*:*:*"
}, {
"vulnerable" : true,
Python code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import json
def main():
if len(sys.argv) > 1:
input_file = sys.argv[1]
else:
print 'Usage: %s <nvd-xml-file>' % sys.argv[0]
sys.exit(1)
fh = open(input_file)
json_data = json.load(fh)
for m in json_data['CVE_Items']:
stuff = m['configurations']
for n in stuff['nodes']:
oper = n['operator']
cpe = n['cpe']
print oper, cpe
if __name__ == '__main__':
main()
I am getting following output and error:
$python parsingconf.py nvdcve-1.0-2018.json
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d30:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d35', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d35:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d40', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d40:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d45', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d45:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d50', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d50:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d55', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d55:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d60', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d60:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.1x46:d65', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.1x46:d65:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3x48:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3x48:d30:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x49:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x49:d30:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d20', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d20:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d21', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d21:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d30', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d30:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d32', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d32:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d33', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d33:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d34', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d34:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d60', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d60:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d61', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d61:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d62', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d62:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1x53:d63', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1x53:d63:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r8:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1:r9', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1:r9:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r5', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r5:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r7', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r7:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.2:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.2:r8:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:15.1:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:15.1:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:15.1:r2:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:12.3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r1', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r1:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r2', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r2:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r3', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r3:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r4', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r4:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r5', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r5:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r6', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r6:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r7', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r7:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r8', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r8:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:12.3:r9', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:12.3:r9:*:*:*:*:*:*', u'vulnerable': True}]
OR [{u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:*:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d10', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d10:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d15', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d15:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d16', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d16:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d25', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d25:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d26', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d26:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d27', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d27:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d35', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d35:*:*:*:*:*:*', u'vulnerable': True}, {u'cpe22Uri': u'cpe:/o:juniper:junos:14.1x53:d50', u'cpe23Uri': u'cpe:2.3:o:juniper:junos:14.1x53:d50:*:*:*:*:*:*', u'vulnerable': True}]
Traceback (most recent call last):
File "parsingconf.py", line 23, in <module>
main()
File "parsingconf.py", line 19, in main
cpe = n['cpe']
KeyError: 'cpe'
As @L3viathan commented, one of the entries of node does not have the key cpe. If they all should have this key no matter what, the data response may have been corrupted or incomplete. Just wrap the response in a try block.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import json
def main():
if len(sys.argv) > 1:
input_file = sys.argv[1]
else:
print 'Usage: %s <nvd-xml-file>' % sys.argv[0]
sys.exit(1)
fh = open(input_file)
json_data = json.load(fh)
for m in json_data['CVE_Items']:
stuff = m['configurations']
for n in stuff['nodes']:
try:
oper = n['operator']
cpe = n['cpe']
print oper, cpe
except KeyError, e:
print 'I got a KeyError - reason "%s"' % str(e)
if __name__ == '__main__':
main()
It is always a good practice to use cpe = n.get('cpe', 'some default value')
when you are not sure about the validity of data you are parsing.
cpe = n['cpe']
will give key error if 'cpe' is not there for any of the nodes.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.