guarddog 2.6.0__py3-none-any.whl → 2.7.1__py3-none-any.whl

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 (61) hide show
  1. guarddog/analyzer/analyzer.py +51 -23
  2. guarddog/analyzer/metadata/__init__.py +2 -0
  3. guarddog/analyzer/metadata/bundled_binary.py +6 -6
  4. guarddog/analyzer/metadata/deceptive_author.py +3 -1
  5. guarddog/analyzer/metadata/detector.py +7 -2
  6. guarddog/analyzer/metadata/empty_information.py +8 -3
  7. guarddog/analyzer/metadata/go/typosquatting.py +17 -9
  8. guarddog/analyzer/metadata/npm/bundled_binary.py +7 -2
  9. guarddog/analyzer/metadata/npm/deceptive_author.py +1 -1
  10. guarddog/analyzer/metadata/npm/direct_url_dependency.py +2 -1
  11. guarddog/analyzer/metadata/npm/empty_information.py +10 -7
  12. guarddog/analyzer/metadata/npm/potentially_compromised_email_domain.py +4 -3
  13. guarddog/analyzer/metadata/npm/release_zero.py +13 -5
  14. guarddog/analyzer/metadata/npm/typosquatting.py +44 -13
  15. guarddog/analyzer/metadata/npm/unclaimed_maintainer_email_domain.py +3 -2
  16. guarddog/analyzer/metadata/npm/utils.py +4 -5
  17. guarddog/analyzer/metadata/potentially_compromised_email_domain.py +8 -4
  18. guarddog/analyzer/metadata/pypi/__init__.py +12 -6
  19. guarddog/analyzer/metadata/pypi/bundled_binary.py +7 -2
  20. guarddog/analyzer/metadata/pypi/deceptive_author.py +1 -1
  21. guarddog/analyzer/metadata/pypi/empty_information.py +16 -5
  22. guarddog/analyzer/metadata/pypi/potentially_compromised_email_domain.py +4 -3
  23. guarddog/analyzer/metadata/pypi/release_zero.py +16 -6
  24. guarddog/analyzer/metadata/pypi/repository_integrity_mismatch.py +53 -27
  25. guarddog/analyzer/metadata/pypi/single_python_file.py +9 -4
  26. guarddog/analyzer/metadata/pypi/typosquatting.py +73 -26
  27. guarddog/analyzer/metadata/pypi/unclaimed_maintainer_email_domain.py +6 -2
  28. guarddog/analyzer/metadata/pypi/utils.py +1 -4
  29. guarddog/analyzer/metadata/release_zero.py +1 -1
  30. guarddog/analyzer/metadata/repository_integrity_mismatch.py +10 -3
  31. guarddog/analyzer/metadata/resources/top_pypi_packages.json +29998 -29986
  32. guarddog/analyzer/metadata/typosquatting.py +12 -8
  33. guarddog/analyzer/metadata/unclaimed_maintainer_email_domain.py +7 -2
  34. guarddog/analyzer/metadata/utils.py +1 -1
  35. guarddog/analyzer/sourcecode/__init__.py +34 -7
  36. guarddog/analyzer/sourcecode/api-obfuscation.yml +42 -0
  37. guarddog/analyzer/sourcecode/code-execution.yml +1 -0
  38. guarddog/analyzer/sourcecode/dll-hijacking.yml +5 -0
  39. guarddog/analyzer/sourcecode/shady-links.yml +1 -1
  40. guarddog/analyzer/sourcecode/suspicious_passwd_access_linux.yar +12 -0
  41. guarddog/analyzer/sourcecode/unicode.yml +75 -0
  42. guarddog/ecosystems.py +3 -0
  43. guarddog/scanners/__init__.py +5 -0
  44. guarddog/scanners/extension_scanner.py +152 -0
  45. guarddog/scanners/github_action_scanner.py +6 -2
  46. guarddog/scanners/go_project_scanner.py +1 -1
  47. guarddog/scanners/npm_package_scanner.py +12 -4
  48. guarddog/scanners/pypi_package_scanner.py +9 -3
  49. guarddog/scanners/pypi_project_scanner.py +9 -12
  50. guarddog/scanners/scanner.py +1 -0
  51. guarddog/utils/archives.py +134 -9
  52. guarddog/utils/config.py +24 -2
  53. guarddog/utils/package_info.py +3 -1
  54. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/METADATA +10 -9
  55. guarddog-2.7.1.dist-info/RECORD +100 -0
  56. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/WHEEL +1 -1
  57. guarddog-2.6.0.dist-info/RECORD +0 -96
  58. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/entry_points.txt +0 -0
  59. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info/licenses}/LICENSE +0 -0
  60. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info/licenses}/LICENSE-3rdparty.csv +0 -0
  61. {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info/licenses}/NOTICE +0 -0
@@ -3,7 +3,7 @@ import os
3
3
  import re
4
4
  from typing import List
5
5
 
6
- import pkg_resources
6
+ from packaging.requirements import Requirement
7
7
  import requests
8
8
  from packaging.specifiers import Specifier, Version
9
9
 
@@ -111,12 +111,11 @@ class PypiRequirementsScanner(ProjectScanner):
111
111
  """
112
112
  This helper function yields one valid requirement line at a time
113
113
  """
114
- parsed = pkg_resources.parse_requirements(req)
115
- while True:
114
+ for req_line in req:
115
+ if not req_line.strip():
116
+ continue
116
117
  try:
117
- yield next(parsed)
118
- except StopIteration:
119
- break
118
+ yield Requirement(req_line)
120
119
  except Exception as e:
121
120
  log.error(
122
121
  f"Error when parsing requirements, received error {str(e)}. This entry will be "
@@ -130,7 +129,7 @@ class PypiRequirementsScanner(ProjectScanner):
130
129
  continue
131
130
 
132
131
  versions = get_matched_versions(
133
- find_all_versions(requirement.project_name),
132
+ find_all_versions(requirement.name),
134
133
  (
135
134
  requirement.url
136
135
  if requirement.url
@@ -139,9 +138,7 @@ class PypiRequirementsScanner(ProjectScanner):
139
138
  )
140
139
 
141
140
  if len(versions) == 0:
142
- log.error(
143
- f"Package/Version {requirement.project_name} not on PyPI\n"
144
- )
141
+ log.error(f"Package/Version {requirement.name} not on PyPI\n")
145
142
  continue
146
143
 
147
144
  idx = next(
@@ -165,13 +162,13 @@ class PypiRequirementsScanner(ProjectScanner):
165
162
  # find the dep with the same name or create a new one
166
163
  dep = next(
167
164
  filter(
168
- lambda d: d.name == requirement.project_name,
165
+ lambda d: d.name == requirement.name,
169
166
  dependencies,
170
167
  ),
171
168
  None,
172
169
  )
173
170
  if not dep:
174
- dep = Dependency(name=requirement.project_name, versions=set())
171
+ dep = Dependency(name=requirement.name, versions=set())
175
172
  dependencies.append(dep)
176
173
 
177
174
  dep.versions.update(dep_versions)
@@ -59,6 +59,7 @@ class Dependency:
59
59
  name (str): The name of the dependency. e.g., "requests"
60
60
  versions (Set[DependencyVersion]): A set of identified versions of the dependency.
61
61
  """
62
+
62
63
  name: str
63
64
  versions: Set[DependencyVersion]
64
65
 
@@ -1,10 +1,17 @@
1
1
  import logging
2
2
  import os
3
+ import pathlib
3
4
  import stat
4
5
  import zipfile
5
6
 
6
7
  import tarsafe # type:ignore
7
8
 
9
+ from guarddog.utils.config import (
10
+ MAX_UNCOMPRESSED_SIZE,
11
+ MAX_COMPRESSION_RATIO,
12
+ MAX_FILE_COUNT,
13
+ )
14
+
8
15
  log = logging.getLogger("guarddog")
9
16
 
10
17
 
@@ -20,6 +27,7 @@ def is_supported_archive(path: str) -> bool:
20
27
  bool: Represents the decision reached for the file
21
28
 
22
29
  """
30
+
23
31
  def is_tar_archive(path: str) -> bool:
24
32
  tar_exts = [".bz2", ".bzip2", ".gz", ".gzip", ".tgz", ".xz"]
25
33
 
@@ -31,7 +39,10 @@ def is_supported_archive(path: str) -> bool:
31
39
  return is_tar_archive(path) or is_zip_archive(path)
32
40
 
33
41
 
34
- def safe_extract(source_archive: str, target_directory: str) -> None:
42
+ def safe_extract(
43
+ source_archive: str,
44
+ target_directory: str,
45
+ ) -> None:
35
46
  """
36
47
  safe_extract safely extracts archives to a target directory.
37
48
 
@@ -42,15 +53,99 @@ def safe_extract(source_archive: str, target_directory: str) -> None:
42
53
 
43
54
  @param source_archive: The archive to extract
44
55
  @param target_directory: The directory where to extract the archive to
45
- @raise ValueError If the archive type is unsupported
56
+ @raise ValueError If the archive type is unsupported or exceeds safety limits
46
57
 
47
58
  """
59
+
60
+ def _check_compression_bomb(
61
+ file_count: int,
62
+ total_size: int,
63
+ archive_size: int,
64
+ ) -> None:
65
+ """
66
+ Checks for compression bombs and file descriptor exhaustion attacks.
67
+
68
+ @param file_count: Number of files in the archive
69
+ @param total_size: Total uncompressed size in bytes
70
+ @param archive_size: Compressed archive size in bytes
71
+ @raise ValueError: If any safety limit is exceeded
72
+ """
73
+ if file_count > MAX_FILE_COUNT:
74
+ raise ValueError(
75
+ f"Archive contains {file_count} files, exceeding maximum allowed "
76
+ f"count ({MAX_FILE_COUNT}). Possible file descriptor exhaustion attack."
77
+ )
78
+
79
+ if total_size > MAX_UNCOMPRESSED_SIZE:
80
+ raise ValueError(
81
+ f"Archive uncompressed size ({total_size} bytes) exceeds maximum allowed "
82
+ f"size ({MAX_UNCOMPRESSED_SIZE} bytes). Possible compression bomb."
83
+ )
84
+
85
+ if archive_size > 0:
86
+ compression_ratio = total_size / archive_size
87
+ if compression_ratio > MAX_COMPRESSION_RATIO:
88
+ raise ValueError(
89
+ f"Archive compression ratio ({compression_ratio:.1f}:1) exceeds maximum "
90
+ f"allowed ratio ({MAX_COMPRESSION_RATIO}:1). Possible compression bomb."
91
+ )
92
+
93
+ def _is_unsafe_symlink(
94
+ zip_info: zipfile.ZipInfo, zip_file: zipfile.ZipFile
95
+ ) -> bool:
96
+ """
97
+ Check if a zip entry is a symlink pointing outside the target directory.
98
+
99
+ Follows the same logic as tarsafe: reads the symlink target and checks if
100
+ the resolved path would be outside the extraction directory.
101
+
102
+ @param zip_info: The ZipInfo object to check
103
+ @param zip_file: The ZipFile object to read the symlink target
104
+ @return: True if the symlink is unsafe, False otherwise
105
+ """
106
+ # Check if this is a symlink
107
+ # external_attr stores Unix file mode in upper 16 bits
108
+ attr = zip_info.external_attr >> 16
109
+ # Mask with 0o170000 to get just the file type bits
110
+ # 0o120000 = symbolic link
111
+ if (attr & 0o170000) != 0o120000:
112
+ return False
113
+
114
+ linkname = zip_file.read(zip_info).decode("utf-8")
115
+
116
+ symlink_file = pathlib.Path(
117
+ os.path.normpath(os.path.join(target_directory, linkname))
118
+ )
119
+ if not os.path.abspath(os.path.join(target_directory, symlink_file)).startswith(
120
+ target_directory
121
+ ):
122
+ return True
123
+
124
+ return False
125
+
126
+ def _is_device(zip_info: zipfile.ZipInfo) -> bool:
127
+ """
128
+ Check if a zip entry is a device file (character or block device).
129
+
130
+ @param zip_info: The ZipInfo object to check
131
+ @return: True if this is a device file, False otherwise
132
+ """
133
+ # external_attr stores Unix file mode in upper 16 bits
134
+ # Mask with 0o170000 to get just the file type bits
135
+ attr = zip_info.external_attr >> 16
136
+ file_type = attr & 0o170000
137
+ # Check for character device (0o020000) or block device (0o060000)
138
+ return file_type == 0o020000 or file_type == 0o060000
139
+
48
140
  log.debug(f"Extracting archive {source_archive} to directory {target_directory}")
141
+
142
+ archive_size = os.path.getsize(source_archive)
143
+
49
144
  if tarsafe.is_tarfile(source_archive):
50
145
 
51
146
  def add_exec(path):
52
147
  st = os.stat(path)
53
- os.chmod(path, st.st_mode | stat.S_IEXEC)
148
+ os.chmod(path, st.st_mode | stat.S_IXUSR)
54
149
 
55
150
  def add_read(path):
56
151
  st = os.stat(path)
@@ -64,15 +159,45 @@ def safe_extract(source_archive: str, target_directory: str) -> None:
64
159
  for f in files:
65
160
  add_read(os.path.join(root, f))
66
161
 
162
+ # Check uncompressed size for tar archives by inspecting members
163
+ with tarsafe.open(source_archive) as tar:
164
+ members = [member for member in tar.getmembers() if member.isfile()]
165
+ file_count = len(members)
166
+ total_size = sum(member.size for member in members)
167
+
168
+ _check_compression_bomb(file_count, total_size, archive_size)
169
+
67
170
  tarsafe.open(source_archive).extractall(target_directory)
68
171
  recurse_add_perms(target_directory)
69
172
 
70
173
  elif zipfile.is_zipfile(source_archive):
71
- with zipfile.ZipFile(source_archive, 'r') as zip:
72
- for file in zip.namelist():
73
- # Note: zip.extract cleans up any malicious file name
74
- # such as directory traversal attempts This is not the
75
- # case of zipfile.extractall
76
- zip.extract(file, path=os.path.join(target_directory, file))
174
+ with zipfile.ZipFile(source_archive, "r") as zip_file:
175
+ # Check uncompressed size for zip archives
176
+ files = [info for info in zip_file.infolist() if not info.is_dir()]
177
+ file_count = len(files)
178
+ total_size = sum(info.file_size for info in files)
179
+
180
+ _check_compression_bomb(file_count, total_size, archive_size)
181
+
182
+ # Validate and extract each file safely
183
+ for member in zip_file.infolist():
184
+ # Check for unsafe symlinks (zip don't supports hardlinks)
185
+ if _is_unsafe_symlink(member, zip_file):
186
+ # we avoid unsafe files extraction but scan the rest of the package
187
+ log.warning(
188
+ f"Archived file {member.filename} is an unsafe symlink. Skipping extraction"
189
+ )
190
+ continue
191
+
192
+ # Check for device files
193
+ if _is_device(member):
194
+ # we avoid unsafe files extraction but scan the rest of the package
195
+ log.warning(
196
+ f"Archived file {member.filename} is a device file type. Skipping extraction"
197
+ )
198
+ continue
199
+
200
+ # Extract file safely using zip.extract which handles path sanitization
201
+ zip_file.extract(member, path=target_directory)
77
202
  else:
78
203
  raise ValueError(f"unsupported archive extension: {source_archive}")
guarddog/utils/config.py CHANGED
@@ -32,10 +32,32 @@ TOP_PACKAGES_CACHE_LOCATION: str = os.environ.get(
32
32
  """
33
33
  This parameter specifies comman separated file extentions that YARA rules will not run against
34
34
  - Default: ini,md,rst,txt,lock,json,yaml,yml,toml,xml,html,rst,csv,sql,pdf,doc,docx,ppt,
35
- pptx,xls,xlsx,odt,changelog,readme,makefile,dockerfile,pkg-info
35
+ pptx,xls,xlsx,odt,changelog,readme,makefile,dockerfile,pkg-info,d.ts
36
36
  """
37
37
  YARA_EXT_EXCLUDE: list[str] = os.environ.get(
38
38
  "GUARDDOG_YARA_EXT_EXCLUDE",
39
39
  "ini,md,rst,txt,lock,json,yaml,yml,toml,xml,html,rst,csv,sql,pdf,doc,docx,ppt,"
40
- "pptx,xls,xlsx,odt,changelog,readme,makefile,dockerfile,pkg-info",
40
+ "pptx,xls,xlsx,odt,changelog,readme,makefile,dockerfile,pkg-info,d.ts",
41
41
  ).split(",")
42
+
43
+ """
44
+ This parameter specifies the maximum uncompressed size allowed for archive extraction
45
+ - Default: 2 GB in bytes
46
+ """
47
+ MAX_UNCOMPRESSED_SIZE: int = int(
48
+ os.environ.get("GUARDDOG_MAX_UNCOMPRESSED_SIZE", 2 * 1024 * 1024 * 1024)
49
+ )
50
+
51
+ """
52
+ This parameter specifies the maximum compression ratio allowed for archive extraction
53
+ - Default: 100 (100:1 ratio)
54
+ """
55
+ MAX_COMPRESSION_RATIO: float = float(
56
+ os.environ.get("GUARDDOG_MAX_COMPRESSION_RATIO", 100)
57
+ )
58
+
59
+ """
60
+ This parameter specifies the maximum number of files allowed in an archive
61
+ - Default: 100000
62
+ """
63
+ MAX_FILE_COUNT: int = int(os.environ.get("GUARDDOG_MAX_FILE_COUNT", 100000))
@@ -25,7 +25,9 @@ def get_package_info(name: str) -> dict:
25
25
 
26
26
  # Check if package file exists
27
27
  if response.status_code != 200:
28
- raise Exception("Received status code: " + str(response.status_code) + " from PyPI")
28
+ raise Exception(
29
+ "Received status code: " + str(response.status_code) + " from PyPI"
30
+ )
29
31
 
30
32
  data = response.json()
31
33
 
@@ -1,8 +1,11 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: guarddog
3
- Version: 2.6.0
4
- Summary: GuardDog is a CLI tool to Identify malicious PyPI packages
3
+ Version: 2.7.1
4
+ Summary: GuardDog is a CLI tool for identifying malicious open source packages
5
5
  License: Apache-2.0
6
+ License-File: LICENSE
7
+ License-File: LICENSE-3rdparty.csv
8
+ License-File: NOTICE
6
9
  Author: Ellen Wang
7
10
  Requires-Python: >=3.10,<4
8
11
  Classifier: License :: OSI Approved :: Apache Software License
@@ -11,23 +14,21 @@ Classifier: Programming Language :: Python :: 3.10
11
14
  Classifier: Programming Language :: Python :: 3.11
12
15
  Classifier: Programming Language :: Python :: 3.12
13
16
  Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
14
18
  Requires-Dist: click (>=8.1.3,<9.0.0)
15
- Requires-Dist: click-option-group (>=0.5.5,<0.6.0)
16
- Requires-Dist: colorama (>=0.4.6,<0.5.0)
17
19
  Requires-Dist: configparser (>=5.3,<8.0)
18
20
  Requires-Dist: disposable-email-domains (>=0.0.103,<0.0.121)
19
21
  Requires-Dist: prettytable (>=3.6.0,<4.0.0)
20
- Requires-Dist: pygit2 (>=1.11,<1.18)
22
+ Requires-Dist: pygit2 (>=1.11,<1.19)
21
23
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
22
24
  Requires-Dist: python-whois (>=0.8,<0.10)
23
25
  Requires-Dist: pyyaml (>=6.0,<7.0)
24
26
  Requires-Dist: requests (>=2.29.0,<3.0.0)
25
27
  Requires-Dist: semantic-version (>=2.10.0,<3.0.0)
26
- Requires-Dist: semgrep (>=1.102.0,<2.0.0)
27
- Requires-Dist: setuptools (>=70.3,<77.0)
28
+ Requires-Dist: semgrep (>=1.147.0,<2.0.0)
28
29
  Requires-Dist: tarsafe (>=0.0.5,<0.0.6)
29
30
  Requires-Dist: termcolor (>=2.1.0,<3.0.0)
30
- Requires-Dist: urllib3 (==2.3.0)
31
+ Requires-Dist: urllib3 (>=2.5.0,<3.0.0)
31
32
  Requires-Dist: yara-python (>=4.5.1,<5.0.0)
32
33
  Project-URL: Repository, https://github.com/DataDog/guarddog
33
34
  Description-Content-Type: text/x-rst
@@ -0,0 +1,100 @@
1
+ guarddog/__init__.py,sha256=reb53KZG9b1nFmsDxj2fropaOceOCyM9bVMUdmZ2wS8,227
2
+ guarddog/__main__.py,sha256=GEdfW6I6g2c3H7bS0G43E4C-g7kXGUswzDCPFSwPgHY,246
3
+ guarddog/analyzer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ guarddog/analyzer/analyzer.py,sha256=eeWbazqGWFJBeT_OHHmEndH3hG_6PMxUajof6T9jutM,15413
5
+ guarddog/analyzer/metadata/__init__.py,sha256=tQTwWanifLsxfCdXIytPCO3chEIiTZ583uqKiQXQOog,855
6
+ guarddog/analyzer/metadata/bundled_binary.py,sha256=Tfgbc-exhbfvYjpgFH_Aa5KtT4ugJhrTV9SavZw1pHs,2594
7
+ guarddog/analyzer/metadata/deceptive_author.py,sha256=CLwntpSNBO4Bji3IEw2lctvNCMLiOxz0pG7KSEzIynM,2811
8
+ guarddog/analyzer/metadata/detector.py,sha256=dFhmoPVtxoed-Lz3Bd8GXZhorOVajvo5sIl9Iw8oCOM,641
9
+ guarddog/analyzer/metadata/empty_information.py,sha256=qswYDOrL3MxJ4VYq893Eiev5y56fgXrk5-CTKVXbkeA,1199
10
+ guarddog/analyzer/metadata/github_action/__init__.py,sha256=hOtiXKW-v5slzYW2M3k35M_YFfuLm8CNv5MwNSdFYMM,311
11
+ guarddog/analyzer/metadata/go/__init__.py,sha256=apwPnP9D4WEqgtR4RY0YIuFN7oNJXxJE_vYlp0ffRvQ,391
12
+ guarddog/analyzer/metadata/go/typosquatting.py,sha256=ZouptuX7a015XGjvYP6TFYgsOfYOxEm9jxYHKoCqwA4,4208
13
+ guarddog/analyzer/metadata/npm/__init__.py,sha256=j1Ng74bb1yD9XHFoYmJPzWL7vYMmLt6c2Lbc8lCqnUI,1326
14
+ guarddog/analyzer/metadata/npm/bundled_binary.py,sha256=vxJLhaTS7wymbktvmfJsF3whz3DWisjdD4wqHlNXvhg,392
15
+ guarddog/analyzer/metadata/npm/deceptive_author.py,sha256=RIBCWK3NjZiTf7tiz2V0ECy2Zr6Uwb69RQwIcWku380,366
16
+ guarddog/analyzer/metadata/npm/direct_url_dependency.py,sha256=hjjTLIT0UVudSf9A9Hory2OAqUkdxoXfKGXDgMtnNso,2449
17
+ guarddog/analyzer/metadata/npm/empty_information.py,sha256=Vpjr5Xe8JB4RIPzM0-BNmiqYiuY42LUbml7Yjig7Rcs,791
18
+ guarddog/analyzer/metadata/npm/npm_metadata_mismatch.py,sha256=Fj9MT7XlO2iXis4Da-_0CmM0weQiv8bVzKUoSm8ntYU,4428
19
+ guarddog/analyzer/metadata/npm/potentially_compromised_email_domain.py,sha256=Sm7fBfzayrbYXOpU5XzeCGKNfcX40hMOCSjKjhKwz-g,1719
20
+ guarddog/analyzer/metadata/npm/release_zero.py,sha256=FNHYfxl52i0V3HydccspcfF82T5L9d3ZyE-_J-UVoS0,633
21
+ guarddog/analyzer/metadata/npm/typosquatting.py,sha256=0vazzHPJOhjoxlv1O3-qVH-yQKLKefkXlK90D4JoPCQ,4143
22
+ guarddog/analyzer/metadata/npm/unclaimed_maintainer_email_domain.py,sha256=B8olfxXiaSM8c47dyftIgxmMVuwg4s7dMuVxrMS0GNE,953
23
+ guarddog/analyzer/metadata/npm/utils.py,sha256=QirjkoXhDcrGfoteh-V717TGq1xpXmvuC9dEp_5bt2s,454
24
+ guarddog/analyzer/metadata/potentially_compromised_email_domain.py,sha256=p2KCIByv4dBNM8h_1xPJgAOL197LLDvSLalZQpsvadg,2960
25
+ guarddog/analyzer/metadata/pypi/__init__.py,sha256=ef2tKnVzJPVy2eLgvBDII77t-zKOCPBOC6dmTCl_XBc,1381
26
+ guarddog/analyzer/metadata/pypi/bundled_binary.py,sha256=J5FqMYPTYnmb2MX9BFextVM5P0IzR522fhWV8TuTYMg,393
27
+ guarddog/analyzer/metadata/pypi/deceptive_author.py,sha256=KRbi7xfGYnEiq0p5HFazjV00a-3tIGe2ogXRvPhz9tI,367
28
+ guarddog/analyzer/metadata/pypi/empty_information.py,sha256=Ppaa_aEIlFJ5VpRtcm2ozlBoRHrTs6CWpPyh82sTM7g,814
29
+ guarddog/analyzer/metadata/pypi/potentially_compromised_email_domain.py,sha256=8zncGNsyfhWe04HRDF54rfP8y--_6l9ze-F-gH97pWo,1774
30
+ guarddog/analyzer/metadata/pypi/release_zero.py,sha256=UNUAFeB34B88N0LRe-tnmoZ3Y4x4AVZbe7m0i9Q3W7U,789
31
+ guarddog/analyzer/metadata/pypi/repository_integrity_mismatch.py,sha256=RB-Wf5Cbuh8KswkcCCHk7BVWvmOJccdHyb4mBjxiLhk,11903
32
+ guarddog/analyzer/metadata/pypi/single_python_file.py,sha256=L-YlmlP1TYA9XBeTHBPfECWgVIPTenUWRRnqwCMyh-o,1402
33
+ guarddog/analyzer/metadata/pypi/typosquatting.py,sha256=Bzx_vjIiuugeRdyR-ABg7S-6J7Udm7stM8CUU8WUafg,6042
34
+ guarddog/analyzer/metadata/pypi/unclaimed_maintainer_email_domain.py,sha256=zfT0qTyN83O-7Yevc6tYIjmCAgh8Y_dhE6oZlKdNmm0,421
35
+ guarddog/analyzer/metadata/pypi/utils.py,sha256=UtG2JVep8bSOMz5LkrhXqS5Oy7Na19nHVct4IQMsQik,177
36
+ guarddog/analyzer/metadata/release_zero.py,sha256=F0I8coYivya7zns0XI1xNY4LLtTDQXoBUmze1wjwW4g,439
37
+ guarddog/analyzer/metadata/repository_integrity_mismatch.py,sha256=WGvck9JV2iCB8xaOc6X5cEGiu59juSWFfwbf6uEah3E,792
38
+ guarddog/analyzer/metadata/resources/placeholder_email_domains.txt,sha256=o3mm9u6vuaVeN4wRgDTidR5oL6ufLTCrE9ISVYbOGUc,11
39
+ guarddog/analyzer/metadata/resources/top_go_packages.json,sha256=HHOTcuWTGqlpXDOUgF7ejgmr8sGF_T5l7NQYdXmHcKQ,104044
40
+ guarddog/analyzer/metadata/resources/top_npm_packages.json,sha256=eeqVkFNW8ltYcGbjAJBzZrdxBEKezxa6AVVYoEpFazs,192960
41
+ guarddog/analyzer/metadata/resources/top_pypi_packages.json,sha256=hDQZUuG6BS4h7yNTAQ191l8_N6jaqezO9n2vdsZPKhA,1474298
42
+ guarddog/analyzer/metadata/typosquatting.py,sha256=6xmqsB0oKwrsXfTJ9DE1z8-nUW8ukgk1ZSS32iJmapk,4587
43
+ guarddog/analyzer/metadata/unclaimed_maintainer_email_domain.py,sha256=e-K9mSdph3y33fP_W7LNOlC7AnUVk28a1VfQJtG9vxo,2375
44
+ guarddog/analyzer/metadata/utils.py,sha256=li7AGB8c_G4ytX0MvvyzVTFNPneK78uMp1h-pT__2qE,1772
45
+ guarddog/analyzer/sourcecode/__init__.py,sha256=031VVi-DqTHxeYiI2mf2AuI76GaNUUyra_t0pRVqo5k,4631
46
+ guarddog/analyzer/sourcecode/api-obfuscation.yml,sha256=y_m6PSh8CfF6nxMulj2Yx4XYxS1T5OO0Eos9WJiDR74,2137
47
+ guarddog/analyzer/sourcecode/clipboard-access.yml,sha256=B36E7xKtAVgwZ29UWtvZa1AJcyfrhvehbLo6tlJqffk,524
48
+ guarddog/analyzer/sourcecode/cmd-overwrite.yml,sha256=l-tE3_G-LqCuCZnHab6v0PpCdMpoHPutBYcijeMZEA0,682
49
+ guarddog/analyzer/sourcecode/code-execution.yml,sha256=YyWBMhcXGzrM6JbXzRTBBFCs7bnoNGPFJJ_FIV2OYtc,5028
50
+ guarddog/analyzer/sourcecode/dll-hijacking.yml,sha256=_lkYp0P4545aiGazC5lRBeCcMHhGWzaK-95zu5MfRLY,3721
51
+ guarddog/analyzer/sourcecode/download-executable.yml,sha256=VuSNkpVh3DxHG7wfep3eAErGsOY9EL_268sNULYbfW4,3361
52
+ guarddog/analyzer/sourcecode/exec-base64.yml,sha256=Wg1jI_ff9I58Xq8gt8wXOQMrwHcPnzkAPyAURxnKHgw,2371
53
+ guarddog/analyzer/sourcecode/exfiltrate-sensitive-data.yml,sha256=hUxQEsJ4qF_25oMF8pdzAFOzq59m6k28WKz280uyaMg,2264
54
+ guarddog/analyzer/sourcecode/go-exec-base64.yml,sha256=Y5TUfLrmU1e5FTYW2zRKwn8yluBARHSXPr6Mr5vMVOY,1554
55
+ guarddog/analyzer/sourcecode/go-exec-download.yml,sha256=ZaZOvn3Xojsd2m8MQGLW1H7p28bPdpEbmDd37q2ZiX4,2931
56
+ guarddog/analyzer/sourcecode/go-exfiltrate-sensitive-data.yml,sha256=sb5GI-523zgE1nxNCrnRVjBSeOp7IfPy7qTQPBJMkco,3697
57
+ guarddog/analyzer/sourcecode/npm-dll-hijacking.yml,sha256=1TvI6UtCGCOMy4Ii-kM_oICYbMRGeOYdgXrG7-zmJ_Y,3460
58
+ guarddog/analyzer/sourcecode/npm-exec-base64.yml,sha256=zc5w2FTlHoZ7ot1flzlmYBkQu1I8eG1E63S5Aki7Goc,814
59
+ guarddog/analyzer/sourcecode/npm-exfiltrate-sensitive-data.yml,sha256=UYWXdkAab-dg_6UwVjiauHmy-9nlKiF86qcyxAwUoXg,3488
60
+ guarddog/analyzer/sourcecode/npm-install-script.yml,sha256=6BLe_V0SGEi1C79Y-FEIcMYHl4vLOOz8bLPrCU5jre8,1329
61
+ guarddog/analyzer/sourcecode/npm-obfuscation.yml,sha256=UxR5ezKr9sFcXEh2JKa20IYqq25J0JDfje82O3jUYMg,2174
62
+ guarddog/analyzer/sourcecode/npm-serialize-environment.yml,sha256=gFpr58INp44ZwxYZlIHyzpOgbVMDLv1ZRPTGAczX5dw,835
63
+ guarddog/analyzer/sourcecode/npm-silent-process-execution.yml,sha256=qnJHGesNPNpxGa8n2kQMpttLGck-6vZjI_SsweDyk7M,3513
64
+ guarddog/analyzer/sourcecode/npm-steganography.yml,sha256=XH0udcriAQq_6WOHAG4TpIedw8GgKyWx9gsG_Q_Fki8,915
65
+ guarddog/analyzer/sourcecode/obfuscation.yml,sha256=dp0BeCYShcTS8QiijSa9U53r6jkCjrFBW5jjNVoXdUU,1224
66
+ guarddog/analyzer/sourcecode/shady-links.yml,sha256=H-QdBfK30PK9JRWJXk2SlFFiSSkMkuKZF0mWoCjwQ5w,3222
67
+ guarddog/analyzer/sourcecode/silent-process-execution.yml,sha256=b6RjenMv7si7lXGak3uMmD7PMtQRuKPeJFggPW6UDNI,418
68
+ guarddog/analyzer/sourcecode/steganography.yml,sha256=3ceO6SJhu4XpZEjfwelLdOxeZ4Ho1OgUjbcacwtOhR0,606
69
+ guarddog/analyzer/sourcecode/suspicious_passwd_access_linux.yar,sha256=kplidsJ-ctg6W58VlYtLq10saZbcD1pm5_Xh4sqmHwk,422
70
+ guarddog/analyzer/sourcecode/unicode.yml,sha256=7fAygEtYwJ1iNKsyCjmLAEu15CLMWApfWXx_t_W3sOA,5596
71
+ guarddog/cli.py,sha256=Pk4WUD5a_TlPRpq2G4v_6FDGWu8IriXQPQ_ft8RXm5o,10692
72
+ guarddog/ecosystems.py,sha256=I1XPAhPuv7OnfZT3z0xcgEecUY1tFJdrklV07sMYffg,582
73
+ guarddog/reporters/__init__.py,sha256=lHNa5ZDsaIpjzS7SmheD5_GGAimGitXU-DNk-Wn97bI,749
74
+ guarddog/reporters/human_readable.py,sha256=WEyjOPdBE8adxC-tdFgwxcyDijsppLk4gIiZOUO69O0,4548
75
+ guarddog/reporters/json.py,sha256=gpbucxGoXBA6s7fNRzhQwZ4P6gWyz7BowsmQrnm4x6U,802
76
+ guarddog/reporters/reporter_factory.py,sha256=JUagC2UFkN2TZGpZIkI1MwMHEbwT9Ja1goQP95-k9SM,1465
77
+ guarddog/reporters/sarif.py,sha256=diOHJcN3CkSBxBDDg6l9DiZ3ebtUNCw0Rwd7QxCpM9k,7691
78
+ guarddog/scanners/__init__.py,sha256=dyBzyKANxTQvyd-oTjgm43gPwRMqB80eOzZ6UFNOuO8,2157
79
+ guarddog/scanners/extension_scanner.py,sha256=YdZ7Ai4U-MC83RJcnoo63m_aylAf3VnylwgvhGK3ktU,4915
80
+ guarddog/scanners/github_action_project_scanner.py,sha256=ISoBqUurwN0lMBtXwcNoalo3ghlbOJkZs9vSNZOT0kk,4216
81
+ guarddog/scanners/github_action_scanner.py,sha256=6lriTel3U7vNmCWBf0SWti9sLCv88RPlP8SVoAgpKJs,1781
82
+ guarddog/scanners/go_package_scanner.py,sha256=OdCbwtjJow9AxEv34z7WBfgTamqKj5DxJh7dly_1NuY,2926
83
+ guarddog/scanners/go_project_scanner.py,sha256=2suZJWvYBhiiBMIQXs38SR04E_Ast50jO44X27gEG10,3349
84
+ guarddog/scanners/npm_package_scanner.py,sha256=ciOvpRViMIQvNFupe5-hdXv65QLU5ObmacRkR2pgp18,2056
85
+ guarddog/scanners/npm_project_scanner.py,sha256=liz5Fyscab53IiSPg0T21Z0vT5eotcHPc_W5Xam4A88,4957
86
+ guarddog/scanners/pypi_package_scanner.py,sha256=ZkuRRbNejnpfFpIHJJ42GH34khiG8CUKWEPvVh_M_uk,2449
87
+ guarddog/scanners/pypi_project_scanner.py,sha256=O91c1UP2iZju84_N7cSE7pWGrY6rKapeUqXEVyKld3A,6435
88
+ guarddog/scanners/scanner.py,sha256=F7FhN-BQWtcTvh_gdhvj-rXYLMslzeTNxPbJsw1he2s,13695
89
+ guarddog/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
+ guarddog/utils/archives.py,sha256=s1AXn6r8kD8hy5JxEOTzdHTgDpgSTImj_mFHfAI34IM,7417
91
+ guarddog/utils/config.py,sha256=LfXghBsSeB_UH333C3zvh46UpG0doOW6MaZ7GG7_0Z8,2047
92
+ guarddog/utils/exceptions.py,sha256=23Kzl3exqYK6X-bcGUeb8wPmSglWNX3GIDPkJ6lQzo4,54
93
+ guarddog/utils/package_info.py,sha256=6fHJPeLn6-tHhKHw0Soedfv2ruPd8zhW2kbhlc3Aem0,975
94
+ guarddog-2.7.1.dist-info/METADATA,sha256=rxvp3useQx0sBa_HFyCeg9cBFhnjimNEplUvC2yJics,1446
95
+ guarddog-2.7.1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
96
+ guarddog-2.7.1.dist-info/entry_points.txt,sha256=vX2fvhnNdkbEL4pDzrH2NqjWVxeOaEYi0sJYmNgS2-s,45
97
+ guarddog-2.7.1.dist-info/licenses/LICENSE,sha256=w1aNZxHyoyOPJ4fSdiyrr06tCJZbTjCsH9K1uqeDVyU,11377
98
+ guarddog-2.7.1.dist-info/licenses/LICENSE-3rdparty.csv,sha256=cS61ONZL_xlXaTMvQXyBEi3J3es-40Gg6G-6idoa5Qk,314
99
+ guarddog-2.7.1.dist-info/licenses/NOTICE,sha256=nlyNt2IjG8IBoQkb7n6jszwAvmREpKAx0POzFO1s2JM,140
100
+ guarddog-2.7.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,96 +0,0 @@
1
- guarddog/__init__.py,sha256=reb53KZG9b1nFmsDxj2fropaOceOCyM9bVMUdmZ2wS8,227
2
- guarddog/__main__.py,sha256=GEdfW6I6g2c3H7bS0G43E4C-g7kXGUswzDCPFSwPgHY,246
3
- guarddog/analyzer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- guarddog/analyzer/analyzer.py,sha256=9R6AlRulH87YuF-4Ed2Z6GZUYqxgb8QivXJy7hewM7E,15009
5
- guarddog/analyzer/metadata/__init__.py,sha256=xaN-DlSHgudKDjKkfpNFue8ANmq1QUmEoAvU_Bc2OUo,749
6
- guarddog/analyzer/metadata/bundled_binary.py,sha256=8i5ZPnyPyaLv6MG3KNMDVAElv5bDCOlnlsDt9SGUFsg,2596
7
- guarddog/analyzer/metadata/deceptive_author.py,sha256=nuFyQqKpOuBKAJxpgbcjwXt3FVLzdmOg2mioUZ1D2TI,2789
8
- guarddog/analyzer/metadata/detector.py,sha256=6yGyOK6BW_J-yrInoRlbaKNTC0HudezZABzkn2MnDJc,609
9
- guarddog/analyzer/metadata/empty_information.py,sha256=etCU6LUdIzE4dS90vin45cjtVGPt963nFPJ_OzikwI4,1166
10
- guarddog/analyzer/metadata/github_action/__init__.py,sha256=hOtiXKW-v5slzYW2M3k35M_YFfuLm8CNv5MwNSdFYMM,311
11
- guarddog/analyzer/metadata/go/__init__.py,sha256=apwPnP9D4WEqgtR4RY0YIuFN7oNJXxJE_vYlp0ffRvQ,391
12
- guarddog/analyzer/metadata/go/typosquatting.py,sha256=8Ln-DoGWto6tnihUPNaQ6qITp7z0tmFVf1BMC6hdMUo,4004
13
- guarddog/analyzer/metadata/npm/__init__.py,sha256=j1Ng74bb1yD9XHFoYmJPzWL7vYMmLt6c2Lbc8lCqnUI,1326
14
- guarddog/analyzer/metadata/npm/bundled_binary.py,sha256=i02ynI2VoK0O9I4w8k1cgOORqpn16XsUy5WlWgQgcSs,360
15
- guarddog/analyzer/metadata/npm/deceptive_author.py,sha256=CZLdVqjumQr2z0OWg6cZvqDpacHf8cuM3Q6ZMBGMHk4,367
16
- guarddog/analyzer/metadata/npm/direct_url_dependency.py,sha256=b_IdauLTm6LioZVIb82q4EVu777shEaYAplGlzPwHgU,2449
17
- guarddog/analyzer/metadata/npm/empty_information.py,sha256=dPWHQP1R_8MFiQyzo2OGu3keKL_6MqMZFE7OLErQPzI,793
18
- guarddog/analyzer/metadata/npm/npm_metadata_mismatch.py,sha256=Fj9MT7XlO2iXis4Da-_0CmM0weQiv8bVzKUoSm8ntYU,4428
19
- guarddog/analyzer/metadata/npm/potentially_compromised_email_domain.py,sha256=MKuF4xUpjL8D_rsCX1lOLoBYJB3PVahVlrdd7-P-cpU,1717
20
- guarddog/analyzer/metadata/npm/release_zero.py,sha256=YH2dn1ePjpYQ7U2utU0JdV9JipbmWaGoPQcW8EhKXP4,578
21
- guarddog/analyzer/metadata/npm/typosquatting.py,sha256=CubGaYnh3yewrqh6Hsnvx4xWwHUW_hLcAkR3tlv8d0Y,3147
22
- guarddog/analyzer/metadata/npm/unclaimed_maintainer_email_domain.py,sha256=tbSJQvFXDUjxEcBDOesXTkUqdHFI9hz-16f2y2DKj8A,950
23
- guarddog/analyzer/metadata/npm/utils.py,sha256=pYAPbJG2X7VbE_HparNg9eHqINtXPnD-_2k8ortrhUE,461
24
- guarddog/analyzer/metadata/potentially_compromised_email_domain.py,sha256=nqIL2SjP_odV1n_xascVoosxN_FsbzXF0t4xuWEBUVU,2876
25
- guarddog/analyzer/metadata/pypi/__init__.py,sha256=UVsr2N-98J7Nf1Jn5wH2MiaU7cLaoaaEy_NUz9mZD20,1357
26
- guarddog/analyzer/metadata/pypi/bundled_binary.py,sha256=aMXVnMbkNDqxsc08Nnuupv2DiZf57QfYE_A6uIpbEKk,361
27
- guarddog/analyzer/metadata/pypi/deceptive_author.py,sha256=AyGA8aQRGrI-oZbzhJeYVIFZcW72rKmuLz5ltz3buWI,368
28
- guarddog/analyzer/metadata/pypi/empty_information.py,sha256=spNSBZFcfrWTmmYLQgVS56_YTP8sjeFLTC_s8FTsYBM,723
29
- guarddog/analyzer/metadata/pypi/potentially_compromised_email_domain.py,sha256=3viTx5mzYocDl5CirXcrCqb2pQPIl4at9QPPjFcJFgM,1772
30
- guarddog/analyzer/metadata/pypi/release_zero.py,sha256=GSHap4VSVF9_s3gD95kUD_5eZDHxrqQQoV5aFTgzrCw,716
31
- guarddog/analyzer/metadata/pypi/repository_integrity_mismatch.py,sha256=HNVEOj3cz43qHD47Chul05vpX_9uhfaPgjo6Q-fuCfA,11635
32
- guarddog/analyzer/metadata/pypi/single_python_file.py,sha256=CLAWaOJ_JNofGmtuCOT-37saryHeZzZAjfJQp31H6jU,1369
33
- guarddog/analyzer/metadata/pypi/typosquatting.py,sha256=Lk0MoIfsMw557PrpUxLAynqNhWSjZDSVI7GJPdyvoG8,4718
34
- guarddog/analyzer/metadata/pypi/unclaimed_maintainer_email_domain.py,sha256=4u3s4Jq51arMznv-_0NwZst40x7jGtLJQIEd3Pp2U30,406
35
- guarddog/analyzer/metadata/pypi/utils.py,sha256=7ipsnFN1KHcFwU9u1GK8wqINKDCXJ1vQEpTwwZfJFp4,199
36
- guarddog/analyzer/metadata/release_zero.py,sha256=7cIdReF3TU3XJq6ALemK81tqaG3Cz1HNwwtH65Y9uPU,438
37
- guarddog/analyzer/metadata/repository_integrity_mismatch.py,sha256=riAvZYSV64sYNBsQv_nZtCoHcUAHYDkWELlxPQs3f2E,743
38
- guarddog/analyzer/metadata/resources/placeholder_email_domains.txt,sha256=o3mm9u6vuaVeN4wRgDTidR5oL6ufLTCrE9ISVYbOGUc,11
39
- guarddog/analyzer/metadata/resources/top_go_packages.json,sha256=HHOTcuWTGqlpXDOUgF7ejgmr8sGF_T5l7NQYdXmHcKQ,104044
40
- guarddog/analyzer/metadata/resources/top_npm_packages.json,sha256=eeqVkFNW8ltYcGbjAJBzZrdxBEKezxa6AVVYoEpFazs,192960
41
- guarddog/analyzer/metadata/resources/top_pypi_packages.json,sha256=7tN8yUTqbpq3HvNePK9IKrTIEeYblTMHXhUzyOdVN-w,1479906
42
- guarddog/analyzer/metadata/typosquatting.py,sha256=EMtHwKWWEYUs7ikyaPNtXH0FGPNDPDc2IFMZSDiv3Mg,4560
43
- guarddog/analyzer/metadata/unclaimed_maintainer_email_domain.py,sha256=qy8AZqbVxD1U3Q--h0FYV7lKPFNlhSzfZK0GwjvQxdQ,2343
44
- guarddog/analyzer/metadata/utils.py,sha256=bOrkELPza4ScUx1DfQxlqU-9DQeA5weISF42c0QCtls,1768
45
- guarddog/analyzer/sourcecode/__init__.py,sha256=6TsFMVYmL3nuAJjBplbAInQp7coldAxz1qdrZvZGcBc,3960
46
- guarddog/analyzer/sourcecode/clipboard-access.yml,sha256=B36E7xKtAVgwZ29UWtvZa1AJcyfrhvehbLo6tlJqffk,524
47
- guarddog/analyzer/sourcecode/cmd-overwrite.yml,sha256=l-tE3_G-LqCuCZnHab6v0PpCdMpoHPutBYcijeMZEA0,682
48
- guarddog/analyzer/sourcecode/code-execution.yml,sha256=gbnbvpnmSCY3Q5BANziWCRA-JXIH2LQ8-5ZaFralqbM,5002
49
- guarddog/analyzer/sourcecode/dll-hijacking.yml,sha256=SH1lJ_-EoPfZKrsut9smnEmKPOiXc1c5qzqEBo6ubgQ,3497
50
- guarddog/analyzer/sourcecode/download-executable.yml,sha256=VuSNkpVh3DxHG7wfep3eAErGsOY9EL_268sNULYbfW4,3361
51
- guarddog/analyzer/sourcecode/exec-base64.yml,sha256=Wg1jI_ff9I58Xq8gt8wXOQMrwHcPnzkAPyAURxnKHgw,2371
52
- guarddog/analyzer/sourcecode/exfiltrate-sensitive-data.yml,sha256=hUxQEsJ4qF_25oMF8pdzAFOzq59m6k28WKz280uyaMg,2264
53
- guarddog/analyzer/sourcecode/go-exec-base64.yml,sha256=Y5TUfLrmU1e5FTYW2zRKwn8yluBARHSXPr6Mr5vMVOY,1554
54
- guarddog/analyzer/sourcecode/go-exec-download.yml,sha256=ZaZOvn3Xojsd2m8MQGLW1H7p28bPdpEbmDd37q2ZiX4,2931
55
- guarddog/analyzer/sourcecode/go-exfiltrate-sensitive-data.yml,sha256=sb5GI-523zgE1nxNCrnRVjBSeOp7IfPy7qTQPBJMkco,3697
56
- guarddog/analyzer/sourcecode/npm-dll-hijacking.yml,sha256=1TvI6UtCGCOMy4Ii-kM_oICYbMRGeOYdgXrG7-zmJ_Y,3460
57
- guarddog/analyzer/sourcecode/npm-exec-base64.yml,sha256=zc5w2FTlHoZ7ot1flzlmYBkQu1I8eG1E63S5Aki7Goc,814
58
- guarddog/analyzer/sourcecode/npm-exfiltrate-sensitive-data.yml,sha256=UYWXdkAab-dg_6UwVjiauHmy-9nlKiF86qcyxAwUoXg,3488
59
- guarddog/analyzer/sourcecode/npm-install-script.yml,sha256=6BLe_V0SGEi1C79Y-FEIcMYHl4vLOOz8bLPrCU5jre8,1329
60
- guarddog/analyzer/sourcecode/npm-obfuscation.yml,sha256=UxR5ezKr9sFcXEh2JKa20IYqq25J0JDfje82O3jUYMg,2174
61
- guarddog/analyzer/sourcecode/npm-serialize-environment.yml,sha256=gFpr58INp44ZwxYZlIHyzpOgbVMDLv1ZRPTGAczX5dw,835
62
- guarddog/analyzer/sourcecode/npm-silent-process-execution.yml,sha256=qnJHGesNPNpxGa8n2kQMpttLGck-6vZjI_SsweDyk7M,3513
63
- guarddog/analyzer/sourcecode/npm-steganography.yml,sha256=XH0udcriAQq_6WOHAG4TpIedw8GgKyWx9gsG_Q_Fki8,915
64
- guarddog/analyzer/sourcecode/obfuscation.yml,sha256=dp0BeCYShcTS8QiijSa9U53r6jkCjrFBW5jjNVoXdUU,1224
65
- guarddog/analyzer/sourcecode/shady-links.yml,sha256=uDYVWDh0u20oy2zbXTJns64lvrQzLi95CLWgnftvX6Y,3222
66
- guarddog/analyzer/sourcecode/silent-process-execution.yml,sha256=b6RjenMv7si7lXGak3uMmD7PMtQRuKPeJFggPW6UDNI,418
67
- guarddog/analyzer/sourcecode/steganography.yml,sha256=3ceO6SJhu4XpZEjfwelLdOxeZ4Ho1OgUjbcacwtOhR0,606
68
- guarddog/cli.py,sha256=Pk4WUD5a_TlPRpq2G4v_6FDGWu8IriXQPQ_ft8RXm5o,10692
69
- guarddog/ecosystems.py,sha256=1-emct9cGLU3V0drEdNmGFEmxMEmJHEQOuyOiuuoCGA,489
70
- guarddog/reporters/__init__.py,sha256=lHNa5ZDsaIpjzS7SmheD5_GGAimGitXU-DNk-Wn97bI,749
71
- guarddog/reporters/human_readable.py,sha256=WEyjOPdBE8adxC-tdFgwxcyDijsppLk4gIiZOUO69O0,4548
72
- guarddog/reporters/json.py,sha256=gpbucxGoXBA6s7fNRzhQwZ4P6gWyz7BowsmQrnm4x6U,802
73
- guarddog/reporters/reporter_factory.py,sha256=JUagC2UFkN2TZGpZIkI1MwMHEbwT9Ja1goQP95-k9SM,1465
74
- guarddog/reporters/sarif.py,sha256=diOHJcN3CkSBxBDDg6l9DiZ3ebtUNCw0Rwd7QxCpM9k,7691
75
- guarddog/scanners/__init__.py,sha256=KNZcGjKNPOs60qpOE8Hr_HsiaRIpJLNzA8qbyvebRIk,1924
76
- guarddog/scanners/github_action_project_scanner.py,sha256=ISoBqUurwN0lMBtXwcNoalo3ghlbOJkZs9vSNZOT0kk,4216
77
- guarddog/scanners/github_action_scanner.py,sha256=GxhUSetLvT8YxKUIZue9MWOE_IVugM2MdiluOy4f068,1745
78
- guarddog/scanners/go_package_scanner.py,sha256=OdCbwtjJow9AxEv34z7WBfgTamqKj5DxJh7dly_1NuY,2926
79
- guarddog/scanners/go_project_scanner.py,sha256=LqhoD1iShdlTO_hkmN2jckeTWARPOfCTkkizmRC6mbM,3348
80
- guarddog/scanners/npm_package_scanner.py,sha256=qBU0tCbW2pTL3cy5Y4JVAJyAGdvb-HY69qSQmjWbPxU,1968
81
- guarddog/scanners/npm_project_scanner.py,sha256=liz5Fyscab53IiSPg0T21Z0vT5eotcHPc_W5Xam4A88,4957
82
- guarddog/scanners/pypi_package_scanner.py,sha256=Tg7M837vhNZim3Jy9OMJSQY2C_m9C75UDy0S_5WKT6M,2375
83
- guarddog/scanners/pypi_project_scanner.py,sha256=hKA0LkokPQ9W-y96TS1rSdi5ergIMcuBuorRbCqEBQg,6522
84
- guarddog/scanners/scanner.py,sha256=RQ00CUg7i5nM6t9LZSXeQrRA9cdWy1ou0QW-VuO55zk,13694
85
- guarddog/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
- guarddog/utils/archives.py,sha256=jOXAhxZx-mTtpDidGGKxQg052CvaQOAVklvOeUn9HTQ,2593
87
- guarddog/utils/config.py,sha256=Msz7altsmNKry0vBPtL2BJ_VdBXsBFZX5ksLvXc2ix4,1403
88
- guarddog/utils/exceptions.py,sha256=23Kzl3exqYK6X-bcGUeb8wPmSglWNX3GIDPkJ6lQzo4,54
89
- guarddog/utils/package_info.py,sha256=TFjE1xsGNf60SuHlIeDV2pzMUbogl5TKJdSzswat6jI,953
90
- guarddog-2.6.0.dist-info/LICENSE,sha256=w1aNZxHyoyOPJ4fSdiyrr06tCJZbTjCsH9K1uqeDVyU,11377
91
- guarddog-2.6.0.dist-info/LICENSE-3rdparty.csv,sha256=cS61ONZL_xlXaTMvQXyBEi3J3es-40Gg6G-6idoa5Qk,314
92
- guarddog-2.6.0.dist-info/METADATA,sha256=RkFhL1I97xJuzxpLsEMDwyHroPphmmG6AfSPRznXgiU,1432
93
- guarddog-2.6.0.dist-info/NOTICE,sha256=nlyNt2IjG8IBoQkb7n6jszwAvmREpKAx0POzFO1s2JM,140
94
- guarddog-2.6.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
95
- guarddog-2.6.0.dist-info/entry_points.txt,sha256=vX2fvhnNdkbEL4pDzrH2NqjWVxeOaEYi0sJYmNgS2-s,45
96
- guarddog-2.6.0.dist-info/RECORD,,