assemblyline-core 4.5.0.38__tar.gz → 4.5.0.40__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.

Potentially problematic release.


This version of assemblyline-core might be problematic. Click here for more details.

Files changed (88) hide show
  1. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/PKG-INFO +1 -1
  2. assemblyline-core-4.5.0.40/assemblyline_core/VERSION +1 -0
  3. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/dispatcher.py +23 -4
  4. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/schedules.py +1 -1
  5. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/creator/run_worker.py +6 -4
  6. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/loader/run.py +3 -1
  7. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/loader/run_worker.py +9 -0
  8. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core.egg-info/PKG-INFO +1 -1
  9. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_dispatcher.py +3 -0
  10. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_replay.py +2 -2
  11. assemblyline-core-4.5.0.38/assemblyline_core/VERSION +0 -1
  12. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/LICENCE.md +0 -0
  13. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/README.md +0 -0
  14. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/__init__.py +0 -0
  15. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/alerter/__init__.py +0 -0
  16. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/alerter/processing.py +0 -0
  17. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/alerter/run_alerter.py +0 -0
  18. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/archiver/__init__.py +0 -0
  19. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/archiver/run_archiver.py +0 -0
  20. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/badlist_client.py +0 -0
  21. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/__init__.py +0 -0
  22. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/__main__.py +0 -0
  23. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/client.py +0 -0
  24. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/dispatching/timeout.py +0 -0
  25. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/expiry/__init__.py +0 -0
  26. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/expiry/run_expiry.py +0 -0
  27. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/ingester/__init__.py +0 -0
  28. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/ingester/__main__.py +0 -0
  29. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/ingester/constants.py +0 -0
  30. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/ingester/ingester.py +0 -0
  31. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/__init__.py +0 -0
  32. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/es_metrics.py +0 -0
  33. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  34. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/helper.py +0 -0
  35. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/metrics_server.py +0 -0
  36. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  37. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  38. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  39. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/plumber/__init__.py +0 -0
  40. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/plumber/run_plumber.py +0 -0
  41. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/__init__.py +0 -0
  42. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/client.py +0 -0
  43. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/creator/__init__.py +0 -0
  44. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/creator/run.py +0 -0
  45. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/loader/__init__.py +0 -0
  46. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/replay/replay.py +0 -0
  47. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/safelist_client.py +0 -0
  48. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/__init__.py +0 -0
  49. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/collection.py +0 -0
  50. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  51. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  52. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/controllers/interface.py +0 -0
  53. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  54. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/run_scaler.py +0 -0
  55. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/scaler/scaler_server.py +0 -0
  56. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/server_base.py +0 -0
  57. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/signature_client.py +0 -0
  58. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/submission_client.py +0 -0
  59. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/tasking_client.py +0 -0
  60. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/updater/__init__.py +0 -0
  61. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/updater/helper.py +0 -0
  62. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/updater/run_updater.py +0 -0
  63. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/__init__.py +0 -0
  64. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/crawler.py +0 -0
  65. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/department_map.py +0 -0
  66. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/safelist.py +0 -0
  67. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/stream_map.py +0 -0
  68. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/vacuum/worker.py +0 -0
  69. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/workflow/__init__.py +0 -0
  70. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core/workflow/run_workflow.py +0 -0
  71. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  72. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  73. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core.egg-info/requires.txt +0 -0
  74. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/assemblyline_core.egg-info/top_level.txt +0 -0
  75. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/setup.cfg +0 -0
  76. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/setup.py +0 -0
  77. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_alerter.py +0 -0
  78. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_badlist_client.py +0 -0
  79. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_expiry.py +0 -0
  80. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_plumber.py +0 -0
  81. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_safelist_client.py +0 -0
  82. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_scaler.py +0 -0
  83. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_scheduler.py +0 -0
  84. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_signature_client.py +0 -0
  85. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_simulation.py +0 -0
  86. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_vacuum.py +0 -0
  87. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_worker_ingest.py +0 -0
  88. {assemblyline-core-4.5.0.38 → assemblyline-core-4.5.0.40}/test/test_worker_submit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.38
3
+ Version: 4.5.0.40
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.5.0.40
@@ -60,9 +60,11 @@ AL_SHUTDOWN_QUIT = 60
60
60
  FINALIZING_WINDOW = max(AL_SHUTDOWN_GRACE - AL_SHUTDOWN_QUIT, 0)
61
61
  RESULT_BATCH_SIZE = int(os.environ.get('DISPATCHER_RESULT_BATCH_SIZE', '50'))
62
62
  ERROR_BATCH_SIZE = int(os.environ.get('DISPATCHER_ERROR_BATCH_SIZE', '50'))
63
- DYNAMIC_ANALYSIS_CATEGORY = 'Dynamic Analysis'
64
63
  DAY_IN_SECONDS = 24 * 60 * 60
65
64
 
65
+ # TODO: DYNAMIC_ANALYSIS_CATEGORY can be removed after assemblyline version 4.6+
66
+ DYNAMIC_ANALYSIS_CATEGORY = 'Dynamic Analysis'
67
+
66
68
 
67
69
  class Action(enum.IntEnum):
68
70
  start = 0
@@ -165,9 +167,16 @@ class SubmissionTask:
165
167
  service = scheduler.services.get(service)
166
168
  if not service:
167
169
  continue
170
+
171
+ # TODO: the following 2 lines can be removed when assemblyline changed to version 4.6+
168
172
  if service.category == DYNAMIC_ANALYSIS_CATEGORY:
169
173
  self.forbid_for_children(sha256, service.name)
170
174
 
175
+ prevented_services = scheduler.expand_categories(service.recursion_prevention)
176
+
177
+ for service_name in prevented_services:
178
+ self.forbid_for_children(sha256, service_name)
179
+
171
180
  # Replay the process of receiving results for dispatcher internal state
172
181
  for k, result in results.items():
173
182
  sha256, service, _ = k.split('.', 2)
@@ -204,6 +213,7 @@ class SubmissionTask:
204
213
  except KeyError:
205
214
  self._forbidden_services[sha256] = {service_name}
206
215
 
216
+
207
217
  def register_children(self, parent: str, children: list[str]):
208
218
  """
209
219
  Note for the purposes of dynamic recursion prevention which
@@ -658,7 +668,8 @@ class Dispatcher(ThreadedCoreBase):
658
668
 
659
669
  # If Dynamic Recursion Prevention is in effect and the file is not part of the bypass list,
660
670
  # Find the list of services this file is forbidden from being sent to.
661
- ignore_drp = submission.params.ignore_dynamic_recursion_prevention
671
+ # TODO: remove "or submission.params.ignore_dynamic_recursion_prevention" after assemblyline upgrade to version 4.6+
672
+ ignore_drp = submission.params.ignore_recursion_prevention or submission.params.ignore_dynamic_recursion_prevention
662
673
  if not ignore_drp and sha256 not in task.dynamic_recursion_bypass:
663
674
  forbidden_services = task.find_recursion_excluded_services(sha256)
664
675
 
@@ -753,10 +764,17 @@ class Dispatcher(ThreadedCoreBase):
753
764
  if service.uses_tag_scores:
754
765
  tag_fields.append('score')
755
766
 
756
- # Mark this routing for the purposes of dynamic recursion prevention
767
+ # Mark this routing for the purposes of recursion prevention
768
+ # TODO: The following 2 lines can be removed after assemblyline upgrade to version 4.6+
757
769
  if service.category == DYNAMIC_ANALYSIS_CATEGORY:
758
770
  task.forbid_for_children(sha256, service_name)
759
771
 
772
+ prevented_services = self.scheduler.expand_categories(service.recursion_prevention)
773
+
774
+ for service_name in prevented_services:
775
+ task.forbid_for_children(sha256, service_name)
776
+
777
+
760
778
  # Build the actual service dispatch message
761
779
  config = self.build_service_config(service, submission)
762
780
  service_task = ServiceTask(dict(
@@ -771,7 +789,8 @@ class Dispatcher(ThreadedCoreBase):
771
789
  max_files=task.submission.params.max_extracted,
772
790
  ttl=submission.params.ttl,
773
791
  ignore_cache=submission.params.ignore_cache,
774
- ignore_dynamic_recursion_prevention=submission.params.ignore_dynamic_recursion_prevention,
792
+ # TODO: remove "or submission.params.ignore_dynamic_recursion_prevention" after assemblyline upgrade to version 4.6+
793
+ ignore_recursion_prevention=submission.params.ignore_recursion_prevention or submission.params.ignore_dynamic_recursion_prevention ,
775
794
  ignore_filtering=ignore_filtering,
776
795
  tags=[{field: x[field] for field in tag_fields} for x in tags],
777
796
  temporary_submission_data=[
@@ -112,7 +112,7 @@ class Scheduler:
112
112
  # things that we need to evaluate, and mark this
113
113
  # group as having been seen.
114
114
  services.extend(categories[name])
115
- seen_categories.update(name)
115
+ seen_categories.add(name)
116
116
  continue
117
117
 
118
118
  # If it isn't a category, its a service
@@ -1,6 +1,9 @@
1
1
  import json
2
2
  import os
3
3
 
4
+ from cart import pack_stream
5
+ from io import BytesIO
6
+
4
7
  from assemblyline.filestore import FileStore
5
8
  from assemblyline.common.isotime import now_as_iso
6
9
  from assemblyline_core.replay.client import APIClient, DirectClient
@@ -107,11 +110,10 @@ class ReplayCreatorWorker(ReplayBase):
107
110
  os.makedirs(self.replay_config.creator.working_directory, exist_ok=True)
108
111
 
109
112
  # Create the JSON
110
- json_fn = f"{collection}_{now_as_iso()}.al_json"
111
- json_path = os.path.join(self.replay_config.creator.working_directory, json_fn)
112
- with open(json_path, "w") as fp:
113
- json.dump(batch, fp)
113
+ json_fn = f"{collection}_{now_as_iso()}.al_json.cart"
114
114
  json_path = os.path.join(self.replay_config.creator.working_directory, json_fn)
115
+ with open(json_path, "wb") as fp:
116
+ pack_stream(BytesIO(json.dumps(batch).encode()), fp)
115
117
 
116
118
  # Move the JSON
117
119
  self.filestore.upload(json_path, json_fn)
@@ -50,7 +50,9 @@ class ReplayLoader(ReplayBase):
50
50
  for root, _, files in os.walk(self.replay_config.loader.input_directory, topdown=False):
51
51
  for name in files:
52
52
  # Unexpected files that could be the result of external transfer mechanisms
53
- if name.startswith('.') or not (name.endswith('.al_bundle') or name.endswith('.al_json')):
53
+ if name.startswith('.') or not (name.endswith('.al_bundle') or \
54
+ name.endswith('.al_json') or \
55
+ name.endswith('.al_json.cart')):
54
56
  continue
55
57
 
56
58
  file_path = os.path.join(root, name)
@@ -1,6 +1,8 @@
1
1
  import shutil
2
2
  import os
3
3
 
4
+ from cart import unpack_file
5
+
4
6
  from assemblyline_core.replay.client import APIClient, DirectClient
5
7
  from assemblyline_core.replay.replay import ReplayBase
6
8
 
@@ -34,6 +36,13 @@ class ReplayLoaderWorker(ReplayBase):
34
36
  elif file_path.endswith(".al_json"):
35
37
  self.client.load_json(file_path)
36
38
 
39
+ elif file_path.endswith(".al_json.cart"):
40
+ cart_path = file_path
41
+ file_path = file_path[:-5]
42
+ unpack_file(cart_path, file_path)
43
+ self.client.load_json(file_path)
44
+ os.unlink(cart_path)
45
+
37
46
  if os.path.exists(file_path):
38
47
  os.unlink(file_path)
39
48
  except OSError as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.38
3
+ Version: 4.5.0.40
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -310,7 +310,10 @@ def test_dispatch_extracted_bypass_drp(clean_redis, clean_datastore):
310
310
  # Inject the fake submission
311
311
  submission = random_model_obj(Submission)
312
312
  submission.to_be_deleted = False
313
+
314
+ # the following 1 line can be removed after assemblyline upgrade to version 4.6+
313
315
  submission.params.ignore_dynamic_recursion_prevention = False
316
+ submission.params.ignore_recursion_prevention = False
314
317
  submission.params.services.selected = ['extract', 'sandbox']
315
318
  submission.files = [dict(name='./file', sha256=file_hash)]
316
319
  sid = submission.sid = 'first-submission'
@@ -251,8 +251,8 @@ def test_replay_single_data_collection(datastore, creator, creator_worker, loade
251
251
  getattr(creator_worker, f'process_{collection}')(once=True)
252
252
  assert creator_worker.client.queues[collection].length() == 0
253
253
  filename = os.path.join(output_dir,
254
- ([f for f in os.listdir(output_dir) if f.startswith(
255
- collection) and f.endswith('.al_json')] + ["not_found"])[0])
254
+ ([f for f in os.listdir(output_dir) if f.startswith(collection) \
255
+ and f.endswith('.al_json.cart')] + ["not_found"])[0])
256
256
  assert os.path.exists(filename)
257
257
 
258
258
  # Delete the item to test the loading process
@@ -1 +0,0 @@
1
- 4.5.0.38