@@ -85,6 +85,8 @@ def add_thread(self, thread):
85
85
def workstation (sql , tablename , jsonElement ):
86
86
try :
87
87
# PyMySQL has thread-safety while a per, So It needs to new connect.
88
+ # The variable name is very important.
89
+ # Because the python interpreter checks name and matchs each of the table columns.
88
90
new_db = initialize (sql .user , sql .password , sql .host , sql .port )
89
91
base = Nvdnist (new_db )
90
92
base .use_database (sql .database )
@@ -98,17 +100,17 @@ def workstation(sql, tablename, jsonElement):
98
100
data_format = str (jsonElement ['data_format' ])
99
101
data_version = str (jsonElement ['data_version' ])
100
102
cve_data_version = str (jsonElement ['CVE_data_version' ])
101
- reference = ""
102
- description = ""
103
+ reference_url = ""
104
+ description_value = ""
103
105
problemtype = ""
104
106
105
107
for r in base .find_key (jsonElement , r"reference_.+$" ):
106
- reference += jsonElement [r ] + " | "
107
- reference = reference [:- 3 ]
108
+ reference_url += jsonElement [r ] + " | "
109
+ reference_url = reference_url [:- 3 ]
108
110
109
111
for d in base .find_key (jsonElement , r"desc_(.+)" ):
110
- description += jsonElement [d ] + " | "
111
- description = description [:- 3 ]
112
+ description_value += jsonElement [d ] + " | "
113
+ description_value = description_value [:- 3 ]
112
114
113
115
for d in base .find_key (jsonElement , r"cwe_\d" ):
114
116
problemtype += jsonElement [d ] + " | "
@@ -137,7 +139,7 @@ def workstation(sql, tablename, jsonElement):
137
139
baseMetricV3_vectorString = str (jsonElement .get ('baseMetricV3.vectorString' , '' ))
138
140
baseMetricV3_attackVector = str (jsonElement .get ('baseMetricV3.attackVector' , '' ))
139
141
baseMetricV3_attackComplexity = str (jsonElement .get ('baseMetricV3.attackComplexity' , '' ))
140
- baseMetricV3_privillegesRequired = str (jsonElement .get ('baseMetricV3.privillegesRequired ' , '' ))
142
+ baseMetricV3_privilegesRequired = str (jsonElement .get ('baseMetricV3.privilegesRequired ' , '' ))
141
143
baseMetricV3_userInteraction = str (jsonElement .get ('baseMetricV3.userInteraction' , '' ))
142
144
143
145
baseMetricV3_scope = str (jsonElement .get ('baseMetricV3.scope' , '' ))
@@ -153,35 +155,40 @@ def workstation(sql, tablename, jsonElement):
153
155
lastModifiedDate = str (jsonElement .get ('lastModifiedDate' , '' ))
154
156
155
157
cpe_list = []
156
- r = base .find_key (jsonElement , r"cpe_\d_vulnderable " )
158
+ r = base .find_key (jsonElement , r"cpe_[0-9]+_vulnderable " )
157
159
if len (r ) != 0 :
158
160
for index , c in enumerate (r ):
159
161
cpe_list .append (str (jsonElement [c ]) + "||" )
160
162
161
- for index , c in enumerate (base .find_key (jsonElement , r"cpe_\d_cpe22uri " )):
163
+ for index , c in enumerate (base .find_key (jsonElement , r"cpe_[0-9]+_cpe22uri " )):
162
164
cpe_list [index ] += (str (jsonElement [c ])) + "||"
163
165
164
166
165
- for index , c in enumerate (base .find_key (jsonElement , r"cpe_\d_cpe23uri" )):
167
+ for index , c in enumerate (base .find_key (jsonElement , r"cpe_[0-9]+_cpe23uri" )):
168
+ cpe_list [index ] += (str (jsonElement [c ])) + "||"
169
+
170
+ for index , c in enumerate (base .find_key (jsonElement , r"cpe_[0-9]+_number" )):
166
171
cpe_list [index ] += (str (jsonElement [c ]))
167
172
168
173
# each of affect data.
169
- for index , c in enumerate (base .find_key (jsonElement , r"affect_\d " )):
170
- r = jsonElement [c ].split ('| ' )
171
- affect_vendor_name = r [0 ]
172
- affect_product_name = r [1 ]
173
- affect_version_value = r [2 ]
174
+ for index , c in enumerate (base .find_key (jsonElement , r"affect_[0-9]+ " )):
175
+ r = jsonElement [c ].split (' || ' )
176
+ affects_vendor_name = r [0 ]
177
+ affects_product_name = r [1 ]
178
+ affects_version_value = r [2 ]
174
179
175
180
nodes_cpe_vulnerable = None
176
181
nodes_cpe_cpe22uri = None
177
182
nodes_cpe_cpe23uri = None
183
+ nodes_cpe = None
178
184
179
185
if len (cpe_list ) != 0 :
180
186
for c in cpe_list :
181
187
r = c .split ('||' )
182
188
nodes_cpe_vulnerable = r [0 ]
183
189
nodes_cpe_cpe22uri = r [1 ]
184
190
nodes_cpe_cpe23uri = r [2 ]
191
+ nodes_cpe = r [3 ]
185
192
a = None
186
193
r = None
187
194
d = None
@@ -197,9 +204,11 @@ def workstation(sql, tablename, jsonElement):
197
204
execute (base , sql , tablename , v )
198
205
base .disconnect ()
199
206
except KeyboardInterrupt :
207
+ sql ._threadList .kill = True
200
208
sys .exit (0 )
201
209
202
210
except SystemExit :
211
+ sql ._threadList .kill = True
203
212
sys .exit (0 )
204
213
205
214
def execute (base , sql , tablename , v ):
@@ -226,9 +235,10 @@ def execute(base, sql, tablename, v):
226
235
class Nvdnist (CVEDatabase ):
227
236
def __init__ (self , mysql_base ):
228
237
super ().__init__ (mysql_base )
238
+ self ._threadList = None
229
239
230
240
231
- def export (self , export_path_name , export_type , tablename , option = "ORDER BY ID" ):
241
+ def export (self , export_path_name , export_type , tablename , option = "ORDER BY ID, nodes_cpe " ):
232
242
return super ().export (export_path_name , export_type , tablename , option )
233
243
234
244
def load (self , obj ):
@@ -358,13 +368,13 @@ def default_table_column(self):
358
368
a6 = TableColumn ("data_format" , "VARCHAR(10)" )
359
369
a7 = TableColumn ("data_version" , "VARCHAR(5)" )
360
370
361
- a8 = TableColumn ("affect_vendor_name " , "TEXT" )
362
- aa8 = TableColumn ("affect_product_name " , "TEXT" )
363
- ab8 = TableColumn ("affect_version_value " , "TEXT" )
371
+ a8 = TableColumn ("affects_vendor_name " , "TEXT" )
372
+ aa8 = TableColumn ("affects_product_name " , "TEXT" )
373
+ ab8 = TableColumn ("affects_version_value " , "TEXT" )
364
374
365
375
ac8 = TableColumn ("problemtype" , "VARCHAR(25)" )
366
- a9 = TableColumn ("description " , "TEXT" )
367
- a10 = TableColumn ("reference " , "TEXT" )
376
+ a9 = TableColumn ("description_value " , "TEXT" )
377
+ a10 = TableColumn ("reference_url " , "TEXT" )
368
378
a11 = TableColumn ("cve_data_version" , "VARCHAR(5)" )
369
379
370
380
cpe1 = TableColumn ("nodes_operator" , "VARCHAR(5)" )
@@ -400,7 +410,7 @@ def default_table_column(self):
400
410
a35 = TableColumn ('baseMetricV3_impactScore' , "VARCHAR(10)" )
401
411
a36 = TableColumn ('baseMetricV3_attackVector' , "VARCHAR(36)" )
402
412
a37 = TableColumn ('baseMetricV3_attackComplexity' , "VARCHAR(10)" )
403
- a38 = TableColumn ('baseMetricV3_privillegesRequired ' , "VARCHAR(10)" )
413
+ a38 = TableColumn ('baseMetricV3_privilegesRequired ' , "VARCHAR(10)" )
404
414
aa38 = TableColumn ('baseMetricV3_userInteraction' , "VARCHAR(10)" )
405
415
a39 = TableColumn ('baseMetricV3_baseSeverity' , "VARCHAR(10)" )
406
416
a40 = TableColumn ('baseMetricV3_scope' , "VARCHAR(10)" )
@@ -421,6 +431,7 @@ def find_key(self, element, pattern):
421
431
422
432
def table_insert (self , tablename , jsonCollection ):
423
433
threadlist = ThreadList (thread_count )
434
+ self ._threadList = threadlist
424
435
print ("Inserting value ..." )
425
436
426
437
# Singlethreading-based
@@ -558,7 +569,8 @@ def metadata(self, cve):
558
569
cve_assigner = cve ['CVE_data_meta' ]['ASSIGNER' ]
559
570
return [cve_id , cve_assigner , cve_data_type , cve_data_format , cve_data_version ]
560
571
561
- def cve_configuration (self , nodes , ref = None ):
572
+ def cve_configuration (self , nodes , ref = None , number = 0 , isChildren = False ):
573
+ n = number
562
574
node_list = None
563
575
if ref is not None :
564
576
node_list = ref
@@ -573,9 +585,9 @@ def cve_configuration(self, nodes, ref=None):
573
585
574
586
if operator == 'AND' :
575
587
try :
576
- self .cve_configuration (node ['children' ], node_list )
588
+ self .cve_configuration (node ['children' ], node_list , n , True )
577
589
except KeyError :
578
- self .cve_configuration (node ['cpe' ], node_list )
590
+ self .cve_configuration (node ['cpe' ], node_list , n , True )
579
591
580
592
elif operator == 'OR' :
581
593
keys = node .get ('cpe' , None )
@@ -584,36 +596,39 @@ def cve_configuration(self, nodes, ref=None):
584
596
if keys is None :
585
597
return
586
598
for cpe in keys :
599
+
587
600
chk = cpe .get ('cpe' , None )
588
601
if chk is not None :
589
602
cpe = chk [0 ]
603
+
590
604
vulnerable = cpe ['vulnerable' ]
591
605
cpe22uri = cpe ['cpe22Uri' ]
592
606
cpe23uri = cpe ['cpe23Uri' ]
593
- node_list .append (CPENode (vulnerable , cpe22uri , cpe23uri ))
607
+ node_list .append (CPENode (vulnerable , cpe22uri , cpe23uri , n ))
594
608
else :
595
609
for node in nodes :
596
610
vulnerable = node ['vulnerable' ]
597
611
cpe22uri = node ['cpe22Uri' ]
598
612
cpe23uri = node ['cpe23Uri' ]
599
- node_list .append (CPENode (vulnerable , cpe22uri , cpe23uri ))
613
+ node_list .append (CPENode (vulnerable , cpe22uri , cpe23uri , n ))
614
+ n = n + 1
600
615
return node_list
601
616
602
617
def reference_data (self , references ):
603
618
reference_list = []
604
619
for data in references ['reference_data' ]:
605
620
url = data ['url' ]
606
- name = data ['name' ]
607
- refsource = data ['refsource' ]
608
- reference_list .append (Reference (url , name , refsource ))
621
+ # name = data['name']
622
+ # refsource = data['refsource']
623
+ reference_list .append (Reference (url ))
609
624
return reference_list
610
625
611
626
def description_data (self , descriptions ):
612
627
description_list = []
613
628
for data in descriptions ['description_data' ]:
614
- lang = data ['lang' ]
629
+ # lang = data['lang']
615
630
value = data ['value' ]
616
- description_list .append (DescriptionType (lang , value ))
631
+ description_list .append (DescriptionType (value ))
617
632
return description_list
618
633
619
634
def problemtype_data (self , cve_problemtype ):
@@ -636,7 +651,7 @@ def affect_vendor_data(self, cve_affects):
636
651
product_name = product_info ['product_name' ]
637
652
for version in product_info ['version' ]['version_data' ]:
638
653
version_value = version
639
- product_flag .append (product_name + "| " + version_value .get ('version_value' , 'invaild' ))
654
+ product_flag .append (product_name + " || " + version_value .get ('version_value' , 'invaild' ))
640
655
affect = Affect (vendor_name , product_flag )
641
656
vendor_list .append (affect )
642
657
except :
@@ -700,12 +715,12 @@ def serialize(self, jsonDefault, o):
700
715
value .serialize (jsonDefault , o )
701
716
702
717
class Metricv3 (AbstractMetric ):
703
- def __init__ (self , version , vectorString , attackVector , attackComplexity , privillegesRequired , userInteraction , scope , confidentialityImpact , integrityImpact , availabilityImpact , baseScore , baseSeverity , cvss ):
718
+ def __init__ (self , version , vectorString , attackVector , attackComplexity , privilegesRequired , userInteraction , scope , confidentialityImpact , integrityImpact , availabilityImpact , baseScore , baseSeverity , cvss ):
704
719
super ().__init__ (version , vectorString , confidentialityImpact , integrityImpact , availabilityImpact , baseScore , cvss )
705
720
self .attackVector = attackVector
706
721
self .attackComplexity = attackComplexity
707
722
self .scope = scope
708
- self .privillegesRequired = privillegesRequired
723
+ self .privilegesRequired = privilegesRequired
709
724
self .userInteraction = userInteraction
710
725
self .baseSeverity = baseSeverity
711
726
@@ -721,15 +736,17 @@ def serialize(self, jsonDefault, o):
721
736
722
737
class CPENode :
723
738
__dbcolumn__ = "cpe"
724
- def __init__ (self , vulnerable , cpe22uri , cpe23uri ):
739
+ def __init__ (self , vulnerable , cpe22uri , cpe23uri , cpe = - 1 ):
725
740
self .vulnerable = vulnerable
726
741
self .cpe22uri = cpe22uri
727
742
self .cpe23uri = cpe23uri
743
+ self .cpe = cpe
728
744
729
745
def serialize (self , jsonDefault , o ):
730
746
jsonDefault ["cpe_" + str (o ) + "_vulnderable" ] = self .vulnerable
731
747
jsonDefault ["cpe_" + str (o ) + "_cpe22uri" ] = self .cpe22uri
732
748
jsonDefault ["cpe_" + str (o ) + "_cpe23uri" ] = self .cpe23uri
749
+ jsonDefault ["cpe_" + str (o ) + "_number" ] = self .cpe
733
750
734
751
735
752
class Affect :
@@ -739,29 +756,27 @@ def __init__(self, vendor_name, product_flag):
739
756
740
757
def serialize (self , jsonDefault , o ):
741
758
for index , flag in enumerate (self .product_flag ):
742
- jsonDefault ['affect_{n}' .format (n = index )] = str (self .vendor_name + "| " + flag )
759
+ jsonDefault ['affect_{n}' .format (n = index )] = str (self .vendor_name + " || " + flag )
743
760
744
761
class DescriptionType :
745
762
__dbcolumn__ = "Description"
746
- def __init__ (self , lang , value ):
747
- self .lang = lang
763
+ def __init__ (self , value ):
748
764
self .value = value
749
765
750
766
def serialize (self , jsonDefault , o ):
751
- jsonDefault ["desc_" + str (id (self ))] = self .lang + ", " + self . value
767
+ jsonDefault ["desc_" + str (id (self ))] = self .value
752
768
753
769
class ProblemType (DescriptionType ):
754
770
def __init__ (self , lang , value ):
755
- super ().__init__ (lang , value )
771
+ super ().__init__ (value )
772
+ self .lang = lang
756
773
757
774
def serialize (self , jsonDefault , o ):
758
775
jsonDefault ["cwe_" + str (id (self ))] = self .lang + ", " + self .value
759
776
760
777
class Reference :
761
- def __init__ (self , url , name , refsource ):
778
+ def __init__ (self , url ):
762
779
self .url = url
763
- self .name = name
764
- self .refsource = refsource
765
780
766
781
def serialize (self , jsonDefault , o ):
767
- jsonDefault ["reference_" + self . name ] = self .url + ", " + self . refsource
782
+ jsonDefault ["reference_" + id ( self ) ] = self .url
0 commit comments