fosslight-binary 4.1.33__tar.gz → 5.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/PKG-INFO +1 -1
  2. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/requirements.txt +1 -1
  3. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/setup.py +1 -1
  4. fosslight_binary-5.0.0/src/fosslight_binary/_binary.py +102 -0
  5. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/_binary_dao.py +5 -4
  6. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/_jar_analysis.py +7 -6
  7. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/binary_analysis.py +55 -36
  8. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/PKG-INFO +1 -1
  9. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/requires.txt +1 -1
  10. fosslight_binary-4.1.33/src/fosslight_binary/_binary.py +0 -168
  11. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/LICENSE +0 -0
  12. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/LICENSES/Apache-2.0.txt +0 -0
  13. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/LICENSES/LicenseRef-3rd_party_licenses.txt +0 -0
  14. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/MANIFEST.in +0 -0
  15. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/README.md +0 -0
  16. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/setup.cfg +0 -0
  17. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/__init__.py +0 -0
  18. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/_help.py +0 -0
  19. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary/cli.py +0 -0
  20. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/SOURCES.txt +0 -0
  21. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/dependency_links.txt +0 -0
  22. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/entry_points.txt +0 -0
  23. {fosslight_binary-4.1.33 → fosslight_binary-5.0.0}/src/fosslight_binary.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight_binary
3
- Version: 4.1.33
3
+ Version: 5.0.0
4
4
  Summary: FOSSLight Binary Scanner
5
5
  Home-page: https://github.com/fosslight/fosslight_binary_scanner
6
6
  Author: LG Electronics
@@ -8,5 +8,5 @@ py-tlsh
8
8
  pytz
9
9
  XlsxWriter
10
10
  PyYAML
11
- fosslight_util~=1.4.47
11
+ fosslight_util>=2.0.0
12
12
  dependency-check
@@ -33,7 +33,7 @@ if __name__ == "__main__":
33
33
 
34
34
  setup(
35
35
  name=_PACKAEG_NAME,
36
- version='4.1.33',
36
+ version='5.0.0',
37
37
  package_dir={"": "src"},
38
38
  packages=find_packages(where='src'),
39
39
  description='FOSSLight Binary Scanner',
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # Copyright (c) 2020 LG Electronics Inc.
4
+ # SPDX-License-Identifier: Apache-2.0
5
+ from fosslight_util.oss_item import FileItem
6
+
7
+ EXCLUDE_TRUE_VALUE = "Exclude"
8
+ TLSH_CHECKSUM_NULL = "0"
9
+
10
+
11
+ class VulnerabilityItem:
12
+ file_path = ""
13
+ vul_id = ""
14
+ nvd_url = ""
15
+
16
+ def __init__(self, file_path, id, url):
17
+ self.file_path = file_path
18
+ self.vul_id = id
19
+ self.nvd_url = url
20
+
21
+
22
+ class BinaryItem(FileItem):
23
+ def __init__(self, value):
24
+ super().__init__("")
25
+ self.exclude = False
26
+ self.source_name_or_path = ""
27
+ self.checksum = TLSH_CHECKSUM_NULL
28
+ self.tlsh = TLSH_CHECKSUM_NULL
29
+ self.vulnerability_items = []
30
+ self.binary_name_without_path = ""
31
+ self.bin_name_with_path = value
32
+ self.found_in_owasp = False
33
+ self.is_binary = True
34
+
35
+ def __del__(self):
36
+ pass
37
+
38
+ def set_oss_items(self, new_oss_list, exclude=False, exclude_msg=""):
39
+ if exclude:
40
+ for oss in new_oss_list:
41
+ oss.exclude = True
42
+ oss.comment = exclude_msg
43
+ # Append New input OSS
44
+ self.oss_items.extend(new_oss_list)
45
+
46
+ def get_vulnerability_items(self):
47
+ nvd_url = [vul_item.nvd_url for vul_item in self.vulnerability_items]
48
+ return ", ".join(nvd_url)
49
+
50
+ def get_print_binary_only(self):
51
+ return (self.source_name_or_path + "\t" + self.checksum + "\t" + self.tlsh)
52
+
53
+ def get_print_array(self):
54
+ items = []
55
+ if self.oss_items:
56
+ for oss in self.oss_items:
57
+ lic = ",".join(oss.license)
58
+ exclude = EXCLUDE_TRUE_VALUE if (self.exclude or oss.exclude) else ""
59
+ nvd_url = self.get_vulnerability_items()
60
+ items.append([self.source_name_or_path, oss.name, oss.version,
61
+ lic, oss.download_location, oss.homepage,
62
+ oss.copyright, exclude, oss.comment,
63
+ nvd_url, self.tlsh, self.checksum])
64
+ else:
65
+ exclude = EXCLUDE_TRUE_VALUE if self.exclude else ""
66
+ items.append([self.source_name_or_path, '',
67
+ '', '', '', '', '', exclude, self.comment, '',
68
+ self.tlsh, self.checksum])
69
+ return items
70
+
71
+ def get_print_json(self):
72
+ items = []
73
+ if self.oss_items:
74
+ for oss in self.oss_items:
75
+ json_item = {}
76
+ json_item["name"] = oss.name
77
+ json_item["version"] = oss.version
78
+
79
+ if self.source_name_or_path:
80
+ json_item["source path"] = self.source_name_or_path
81
+ if len(oss.license) > 0:
82
+ json_item["license"] = oss.license
83
+ if oss.download_location:
84
+ json_item["download location"] = oss.download_location
85
+ if oss.homepage:
86
+ json_item["homepage"] = oss.homepage
87
+ if oss.copyright:
88
+ json_item["copyright text"] = oss.copyright
89
+ if self.exclude or oss.exclude:
90
+ json_item["exclude"] = True
91
+ if oss.comment:
92
+ json_item["comment"] = oss.comment
93
+ items.append(json_item)
94
+ else:
95
+ json_item = {}
96
+ if self.source_name_or_path:
97
+ json_item["source path"] = self.source_name_or_path
98
+ if self.exclude:
99
+ json_item["exclude"] = True
100
+ if self.comment:
101
+ json_item["comment"] = self.comment
102
+ return items
@@ -8,7 +8,8 @@ import logging
8
8
  import psycopg2
9
9
  import pandas as pd
10
10
  from urllib.parse import urlparse
11
- from ._binary import _TLSH_CHECKSUM_NULL, OssItem
11
+ from ._binary import TLSH_CHECKSUM_NULL
12
+ from fosslight_util.oss_item import OssItem
12
13
  import fosslight_util.constant as constant
13
14
 
14
15
  columns = ['filename', 'pathname', 'checksum', 'tlshchecksum', 'ossname',
@@ -43,10 +44,10 @@ def get_oss_info_from_db(bin_info_list, dburl=""):
43
44
  if not item.found_in_owasp:
44
45
  oss_from_db = OssItem(row['ossname'], row['ossversion'], row['license'])
45
46
  bin_oss_items.append(oss_from_db)
46
- item.set_comment("Binary DB result")
47
47
 
48
48
  if bin_oss_items:
49
49
  item.set_oss_items(bin_oss_items)
50
+ item.comment = "Binary DB result"
50
51
 
51
52
  disconnect_lge_bin_db()
52
53
  return bin_info_list, _cnt_auto_identified
@@ -97,14 +98,14 @@ def get_oss_info_by_tlsh_and_filename(file_name, checksum_value, tlsh_value):
97
98
  sql_statement_filename, ['tlshchecksum'])
98
99
  if df_result is None or len(df_result) <= 0:
99
100
  final_result_item = ""
100
- elif tlsh_value == _TLSH_CHECKSUM_NULL: # Couldn't get the tlsh of a file.
101
+ elif tlsh_value == TLSH_CHECKSUM_NULL: # Couldn't get the tlsh of a file.
101
102
  final_result_item = ""
102
103
  else:
103
104
  matched_tlsh = ""
104
105
  matched_tlsh_diff = -1
105
106
  for row in df_result.tlshchecksum:
106
107
  try:
107
- if row != _TLSH_CHECKSUM_NULL:
108
+ if row != TLSH_CHECKSUM_NULL:
108
109
  tlsh_diff = tlsh.diff(row, tlsh_value)
109
110
  if tlsh_diff <= 120: # MATCHED
110
111
  if (matched_tlsh_diff < 0) or (tlsh_diff < matched_tlsh_diff):
@@ -8,7 +8,8 @@ import json
8
8
  import os
9
9
  import sys
10
10
  import fosslight_util.constant as constant
11
- from ._binary import BinaryItem, OssItem, VulnerabilityItem
11
+ from ._binary import BinaryItem, VulnerabilityItem
12
+ from fosslight_util.oss_item import OssItem
12
13
  from dependency_check import run as dependency_check_run
13
14
 
14
15
 
@@ -63,21 +64,21 @@ def merge_binary_list(owasp_items, vulnerability_items, bin_list):
63
64
  for key, value in owasp_items.items():
64
65
  found = False
65
66
  for bin in bin_list:
66
- if bin.binary_strip_root == key:
67
+ if bin.source_name_or_path == key:
67
68
  for oss in value:
68
69
  if oss.name and oss.license:
69
70
  bin.found_in_owasp = True
70
71
  break
71
72
  bin.set_oss_items(value)
72
- if vulnerability_items is not None:
73
- bin.set_vulnerability_items(vulnerability_items.get(key))
73
+ if vulnerability_items and vulnerability_items.get(key):
74
+ bin.vulnerability_items.extend(vulnerability_items.get(key))
74
75
  found = True
75
76
  break
76
77
 
77
78
  if not found:
78
79
  bin_item = BinaryItem(os.path.abspath(key))
79
80
  bin_item.binary_name_without_path = os.path.basename(key)
80
- bin_item.binary_strip_root = key
81
+ bin_item.source_name_or_path = key
81
82
  bin_item.set_oss_items(value)
82
83
  not_found_bin.append(bin_item)
83
84
 
@@ -261,7 +262,7 @@ def analyze_jar_file(path_to_find_bin, path_to_exclude):
261
262
 
262
263
  if oss_name != "" or oss_ver != "" or oss_license != "" or oss_dl_url != "":
263
264
  oss = OssItem(oss_name, oss_ver, oss_license, oss_dl_url)
264
- oss.set_comment("OWASP result")
265
+ oss.comment = "OWASP result"
265
266
 
266
267
  remove_owasp_item = owasp_items.get(file_with_path)
267
268
  if remove_owasp_item:
@@ -15,12 +15,15 @@ from fosslight_util.set_log import init_log
15
15
  import fosslight_util.constant as constant
16
16
  from fosslight_util.output_format import check_output_formats, write_output_file
17
17
  from ._binary_dao import get_oss_info_from_db
18
- from ._binary import BinaryItem
18
+ from ._binary import BinaryItem, TLSH_CHECKSUM_NULL
19
19
  from ._jar_analysis import analyze_jar_file, merge_binary_list
20
20
  from fosslight_util.correct import correct_with_yaml
21
- from fosslight_util.cover import CoverItem
21
+ from fosslight_util.oss_item import ScannerItem
22
+ import hashlib
23
+ import tlsh
24
+ from io import open
22
25
 
23
- _PKG_NAME = "fosslight_binary"
26
+ PKG_NAME = "fosslight_binary"
24
27
  logger = logging.getLogger(constant.LOGGER_NAME)
25
28
 
26
29
  _REMOVE_FILE_EXTENSION = ['qm', 'xlsx', 'pdf', 'pptx', 'jfif', 'docx', 'doc', 'whl',
@@ -40,11 +43,31 @@ _root_path = ""
40
43
  _start_time = ""
41
44
  windows = False
42
45
  BYTES = 2048
43
-
44
46
  BIN_EXT_HEADER = {'BIN_FL_Binary': ['ID', 'Binary Path', 'OSS Name',
45
47
  'OSS Version', 'License', 'Download Location',
46
48
  'Homepage', 'Copyright Text', 'Exclude',
47
49
  'Comment', 'Vulnerability Link', 'TLSH', 'SHA1']}
50
+ HIDE_HEADER = {'TLSH', "SHA1"}
51
+
52
+
53
+ def get_checksum_and_tlsh(bin_with_path):
54
+ checksum_value = TLSH_CHECKSUM_NULL
55
+ tlsh_value = TLSH_CHECKSUM_NULL
56
+ error_msg = ""
57
+ try:
58
+ f = open(bin_with_path, "rb")
59
+ byte = f.read()
60
+ sha1_hash = hashlib.sha1(byte)
61
+ checksum_value = str(sha1_hash.hexdigest())
62
+ try:
63
+ tlsh_value = str(tlsh.hash(byte))
64
+ except:
65
+ tlsh_value = TLSH_CHECKSUM_NULL
66
+ f.close()
67
+ except Exception as ex:
68
+ error_msg = f"(Error) Get_checksum, tlsh: {ex}"
69
+
70
+ return checksum_value, tlsh_value, error_msg
48
71
 
49
72
 
50
73
  def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
@@ -53,7 +76,7 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
53
76
  _json_ext = ".json"
54
77
  _start_time = datetime.now().strftime('%y%m%d_%H%M')
55
78
  _result_log = {
56
- "Tool Info": _PKG_NAME
79
+ "Tool Info": PKG_NAME
57
80
  }
58
81
 
59
82
  _root_path = path_to_find_bin
@@ -83,7 +106,8 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
83
106
  sys.exit(1)
84
107
 
85
108
  log_file = os.path.join(output_path, f"fosslight_log_bin_{_start_time}.txt")
86
- logger, _result_log = init_log(log_file, True, logging.INFO, logging.DEBUG, _PKG_NAME, path_to_find_bin, path_to_exclude)
109
+ logger, _result_log = init_log(log_file, True, logging.INFO, logging.DEBUG,
110
+ PKG_NAME, path_to_find_bin, path_to_exclude)
87
111
 
88
112
  if not success:
89
113
  error_occured(error_msg=msg,
@@ -121,15 +145,15 @@ def get_file_list(path_to_find, abs_path_to_exclude):
121
145
  bin_with_path = os.path.join(root, file)
122
146
  bin_item = BinaryItem(bin_with_path)
123
147
  bin_item.binary_name_without_path = file
124
- bin_item.binary_strip_root = bin_with_path.replace(
148
+ bin_item.source_name_or_path = bin_with_path.replace(
125
149
  _root_path, '', 1)
126
150
 
127
151
  if any(dir_name in dir_path for dir_name in _EXCLUDE_DIR):
128
- bin_item.set_exclude(True)
152
+ bin_item.exclude = True
129
153
  elif file.lower() in _EXCLUDE_FILE:
130
- bin_item.set_exclude(True)
154
+ bin_item.exclude = True
131
155
  elif extension in _EXCLUDE_FILE_EXTENSION:
132
- bin_item.set_exclude(True)
156
+ bin_item.exclude = True
133
157
  bin_list.append(bin_item)
134
158
  file_cnt += 1
135
159
  return file_cnt, bin_list, found_jar
@@ -146,11 +170,10 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
146
170
  db_loaded_cnt = 0
147
171
  success_to_write = False
148
172
  writing_msg = ""
149
- hide_header = {'TLSH', "SHA1"}
150
- content_list = []
151
173
  results = []
152
174
  bin_list = []
153
175
  base_dir_name = os.path.basename(path_to_find_bin)
176
+ scan_item = ScannerItem(PKG_NAME, "")
154
177
  abs_path_to_exclude = [os.path.abspath(os.path.join(base_dir_name, path)) for path in path_to_exclude if path.strip() != ""]
155
178
 
156
179
  if not os.path.isdir(path_to_find_bin):
@@ -168,12 +191,10 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
168
191
  exit=True)
169
192
  total_bin_cnt = len(return_list)
170
193
  if simple_mode:
171
- bin_list = [bin.bin_name for bin in return_list]
194
+ bin_list = [bin.bin_name_with_path for bin in return_list]
172
195
  else:
173
- cover = CoverItem(tool_name=_PKG_NAME,
174
- start_time=_start_time,
175
- input_path=path_to_find_bin,
176
- exclude_path=path_to_exclude)
196
+ scan_item = ScannerItem(PKG_NAME, _start_time)
197
+ scan_item.set_cover_pathinfo(path_to_find_bin, path_to_exclude)
177
198
  try:
178
199
  # Run OWASP Dependency-check
179
200
  if found_jar:
@@ -185,25 +206,23 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
185
206
  logger.warning("Could not find OSS information for some jar files.")
186
207
 
187
208
  return_list, db_loaded_cnt = get_oss_info_from_db(return_list, dburl)
188
- return_list = sorted(return_list, key=lambda row: (row.bin_name))
189
-
190
- sheet_list = {}
191
- for item in return_list:
192
- content_list.extend(item.get_oss_report())
193
- sheet_list["BIN_FL_Binary"] = content_list
209
+ return_list = sorted(return_list, key=lambda row: (row.bin_name_with_path))
210
+ scan_item.append_file_items(return_list, PKG_NAME)
194
211
  if correct_mode:
195
- success, msg_correct, correct_list = correct_with_yaml(correct_filepath, path_to_find_bin, sheet_list)
212
+ success, msg_correct, correct_list = correct_with_yaml(correct_filepath, path_to_find_bin, scan_item)
196
213
  if not success:
197
214
  logger.info(f"No correction with yaml: {msg_correct}")
198
215
  else:
199
- sheet_list = correct_list
216
+ return_list = correct_list
200
217
  logger.info("Success to correct with yaml.")
201
- cover.comment = f"Total number of binaries: {total_bin_cnt} "
218
+
219
+ scan_item.set_cover_comment(f"Total number of binaries: {total_bin_cnt}")
202
220
  if total_bin_cnt == 0:
203
- cover.comment += "(No binary detected.) "
204
- cover.comment += f"/ Total number of files: {total_file_cnt}"
221
+ scan_item.set_cover_comment("(No binary detected.) ")
222
+ scan_item.set_cover_comment(f"Total number of files: {total_file_cnt}")
223
+
205
224
  for combined_path_and_file, output_extension in zip(result_reports, output_extensions):
206
- results.append(write_output_file(combined_path_and_file, output_extension, sheet_list, BIN_EXT_HEADER, hide_header, cover))
225
+ results.append(write_output_file(combined_path_and_file, output_extension, scan_item, BIN_EXT_HEADER, HIDE_HEADER))
207
226
 
208
227
  except Exception as ex:
209
228
  error_occured(error_msg=str(ex), exit=False)
@@ -214,8 +233,8 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
214
233
  logger.info(f"Output file :{result_file}")
215
234
  else:
216
235
  logger.warning(f"{writing_msg}")
217
- if cover.comment:
218
- logger.info(cover.comment)
236
+ for row in scan_item.get_cover_comment():
237
+ logger.info(row)
219
238
  else:
220
239
  logger.error(f"Fail to generate result file.:{writing_msg}")
221
240
 
@@ -227,21 +246,21 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
227
246
  except Exception as ex:
228
247
  error_occured(error_msg=f"Print log : {ex}", exit=False)
229
248
 
230
- return success_to_write, content_list
249
+ return success_to_write, scan_item
231
250
 
232
251
 
233
252
  def return_bin_only(file_list, need_checksum_tlsh=True):
234
253
  for file_item in file_list:
235
254
  try:
236
- if check_binary(file_item.bin_name):
255
+ if check_binary(file_item.bin_name_with_path):
237
256
  if need_checksum_tlsh:
238
- error, error_msg = file_item.set_checksum_tlsh()
239
- if error:
257
+ file_item.checksum, file_item.tlsh, error_msg = get_checksum_and_tlsh(file_item.bin_name_with_path)
258
+ if error_msg:
240
259
  error_occured(error_msg=error_msg, exit=False)
241
260
  yield file_item
242
261
  except Exception as ex:
243
262
  logger.debug(f"Exception in get_file_list: {ex}")
244
- file_item.set_comment("Exclude or delete if it is not binary.")
263
+ file_item.comment = "Exclude or delete if it is not binary."
245
264
  yield file_item
246
265
 
247
266
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fosslight-binary
3
- Version: 4.1.33
3
+ Version: 5.0.0
4
4
  Summary: FOSSLight Binary Scanner
5
5
  Home-page: https://github.com/fosslight/fosslight_binary_scanner
6
6
  Author: LG Electronics
@@ -8,7 +8,7 @@ py-tlsh
8
8
  pytz
9
9
  XlsxWriter
10
10
  PyYAML
11
- fosslight_util~=1.4.47
11
+ fosslight_util>=2.0.0
12
12
  dependency-check
13
13
 
14
14
  [:"darwin" in sys_platform]
@@ -1,168 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- # Copyright (c) 2020 LG Electronics Inc.
4
- # SPDX-License-Identifier: Apache-2.0
5
- import hashlib
6
- import tlsh
7
- from io import open
8
-
9
- _EXCLUDE_TRUE_VALUE = "Exclude"
10
- _TLSH_CHECKSUM_NULL = "0"
11
-
12
-
13
- class OssItem:
14
- name = ""
15
- version = ""
16
- license = ""
17
- dl_url = ""
18
- comment = ""
19
- exclude = False
20
-
21
- def __init__(self, name, version, license, dl_url=""):
22
- self.name = name
23
- self.version = version
24
- self.license = license
25
- self.dl_url = dl_url
26
- self.exclude = False
27
- self.comment = ""
28
-
29
- def set_comment(self, value):
30
- if self.comment:
31
- self.comment = f"{self.comment} / {value}"
32
- else:
33
- self.comment = value
34
-
35
- def set_exclude(self, value):
36
- self.exclude = value
37
-
38
- def get_comment(self):
39
- return self.comment
40
-
41
-
42
- class VulnerabilityItem:
43
- file_path = ""
44
- vul_id = ""
45
- nvd_url = ""
46
-
47
- def __init__(self, file_path, id, url):
48
- self.file_path = file_path
49
- self.vul_id = id
50
- self.nvd_url = url
51
-
52
-
53
- class BinaryItem:
54
- bin_name = ""
55
- binary_name_without_path = ""
56
- binary_strip_root = "" # Value of binary name column
57
- tlsh = _TLSH_CHECKSUM_NULL
58
- checksum = _TLSH_CHECKSUM_NULL
59
- oss_items = []
60
- vulnerability_items = []
61
- exclude = False
62
- comment = ""
63
- found_in_owasp = False
64
-
65
- def __init__(self, value):
66
- self.exclude = False
67
- self.binary_strip_root = ""
68
- self.checksum = _TLSH_CHECKSUM_NULL
69
- self.tlsh = _TLSH_CHECKSUM_NULL
70
- self.oss_items = []
71
- self.vulnerability_items = []
72
- self.binary_name_without_path = ""
73
- self.set_bin_name(value)
74
-
75
- def __del__(self):
76
- pass
77
-
78
- def set_oss_items(self, new_oss_list, exclude=False, exclude_msg=""):
79
- if exclude:
80
- for oss in new_oss_list:
81
- oss.set_exclude(True)
82
- oss.set_comment(exclude_msg)
83
- # Append New input OSS
84
- self.oss_items.extend(new_oss_list)
85
-
86
- def get_oss_items(self):
87
- return self.oss_items
88
-
89
- def set_vulnerability_items(self, vul_list):
90
- if vul_list is not None:
91
- self.vulnerability_items.extend(vul_list)
92
-
93
- def get_vulnerability_items(self):
94
- nvd_url = [vul_item.nvd_url for vul_item in self.vulnerability_items]
95
- return ", ".join(nvd_url)
96
-
97
- def set_comment(self, value):
98
- if self.comment:
99
- self.comment = f"{self.comment} / {value}"
100
- else:
101
- self.comment = value
102
-
103
- def set_bin_name(self, value):
104
- self.bin_name = value
105
-
106
- def set_exclude(self, value):
107
- self.exclude = value
108
-
109
- def set_checksum(self, value):
110
- self.checksum = value
111
-
112
- def set_tlsh(self, value):
113
- self.tlsh = value
114
-
115
- def get_comment(self):
116
- return self.comment
117
-
118
- def get_print_binary_only(self):
119
- return (self.binary_strip_root + "\t" + self.checksum + "\t" + self.tlsh)
120
-
121
- def get_oss_report(self):
122
- comment = ""
123
- if len(self.oss_items) > 0:
124
- for oss in self.oss_items:
125
- exclude = _EXCLUDE_TRUE_VALUE if (self.exclude or oss.exclude) else ""
126
- nvd_url = self.get_vulnerability_items()
127
-
128
- if self.comment:
129
- if oss.comment:
130
- comment = f"{self.comment} / {oss.comment}"
131
- else:
132
- comment = self.comment
133
- else:
134
- comment = oss.comment
135
-
136
- yield [self.binary_strip_root, oss.name, oss.version,
137
- oss.license, oss.dl_url, '', '', exclude, comment,
138
- nvd_url, self.tlsh, self.checksum]
139
- else:
140
- exclude = _EXCLUDE_TRUE_VALUE if self.exclude else ""
141
- yield [self.binary_strip_root, '',
142
- '', '', '', '', '', exclude, self.comment, '', self.tlsh, self.checksum]
143
-
144
- def set_checksum_tlsh(self):
145
- self.checksum, self.tlsh, error, msg = get_checksum_and_tlsh(
146
- self.bin_name)
147
- return error, msg
148
-
149
-
150
- def get_checksum_and_tlsh(bin_with_path):
151
- checksum_value = _TLSH_CHECKSUM_NULL
152
- tlsh_value = _TLSH_CHECKSUM_NULL
153
- error_msg = ""
154
- error = False
155
- try:
156
- f = open(bin_with_path, "rb")
157
- byte = f.read()
158
- sha1_hash = hashlib.sha1(byte)
159
- checksum_value = str(sha1_hash.hexdigest())
160
- try:
161
- tlsh_value = str(tlsh.hash(byte))
162
- except:
163
- tlsh_value = _TLSH_CHECKSUM_NULL
164
- f.close()
165
- except Exception as ex:
166
- error_msg = f"(Error) Get_checksum, tlsh: {ex}"
167
- error = True
168
- return checksum_value, tlsh_value, error, error_msg