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.
- guarddog/analyzer/analyzer.py +51 -23
- guarddog/analyzer/metadata/__init__.py +2 -0
- guarddog/analyzer/metadata/bundled_binary.py +6 -6
- guarddog/analyzer/metadata/deceptive_author.py +3 -1
- guarddog/analyzer/metadata/detector.py +7 -2
- guarddog/analyzer/metadata/empty_information.py +8 -3
- guarddog/analyzer/metadata/go/typosquatting.py +17 -9
- guarddog/analyzer/metadata/npm/bundled_binary.py +7 -2
- guarddog/analyzer/metadata/npm/deceptive_author.py +1 -1
- guarddog/analyzer/metadata/npm/direct_url_dependency.py +2 -1
- guarddog/analyzer/metadata/npm/empty_information.py +10 -7
- guarddog/analyzer/metadata/npm/potentially_compromised_email_domain.py +4 -3
- guarddog/analyzer/metadata/npm/release_zero.py +13 -5
- guarddog/analyzer/metadata/npm/typosquatting.py +44 -13
- guarddog/analyzer/metadata/npm/unclaimed_maintainer_email_domain.py +3 -2
- guarddog/analyzer/metadata/npm/utils.py +4 -5
- guarddog/analyzer/metadata/potentially_compromised_email_domain.py +8 -4
- guarddog/analyzer/metadata/pypi/__init__.py +12 -6
- guarddog/analyzer/metadata/pypi/bundled_binary.py +7 -2
- guarddog/analyzer/metadata/pypi/deceptive_author.py +1 -1
- guarddog/analyzer/metadata/pypi/empty_information.py +16 -5
- guarddog/analyzer/metadata/pypi/potentially_compromised_email_domain.py +4 -3
- guarddog/analyzer/metadata/pypi/release_zero.py +16 -6
- guarddog/analyzer/metadata/pypi/repository_integrity_mismatch.py +53 -27
- guarddog/analyzer/metadata/pypi/single_python_file.py +9 -4
- guarddog/analyzer/metadata/pypi/typosquatting.py +73 -26
- guarddog/analyzer/metadata/pypi/unclaimed_maintainer_email_domain.py +6 -2
- guarddog/analyzer/metadata/pypi/utils.py +1 -4
- guarddog/analyzer/metadata/release_zero.py +1 -1
- guarddog/analyzer/metadata/repository_integrity_mismatch.py +10 -3
- guarddog/analyzer/metadata/resources/top_pypi_packages.json +29998 -29986
- guarddog/analyzer/metadata/typosquatting.py +12 -8
- guarddog/analyzer/metadata/unclaimed_maintainer_email_domain.py +7 -2
- guarddog/analyzer/metadata/utils.py +1 -1
- guarddog/analyzer/sourcecode/__init__.py +34 -7
- guarddog/analyzer/sourcecode/api-obfuscation.yml +42 -0
- guarddog/analyzer/sourcecode/code-execution.yml +1 -0
- guarddog/analyzer/sourcecode/dll-hijacking.yml +5 -0
- guarddog/analyzer/sourcecode/shady-links.yml +1 -1
- guarddog/analyzer/sourcecode/suspicious_passwd_access_linux.yar +12 -0
- guarddog/analyzer/sourcecode/unicode.yml +75 -0
- guarddog/ecosystems.py +3 -0
- guarddog/scanners/__init__.py +5 -0
- guarddog/scanners/extension_scanner.py +152 -0
- guarddog/scanners/github_action_scanner.py +6 -2
- guarddog/scanners/go_project_scanner.py +1 -1
- guarddog/scanners/npm_package_scanner.py +12 -4
- guarddog/scanners/pypi_package_scanner.py +9 -3
- guarddog/scanners/pypi_project_scanner.py +9 -12
- guarddog/scanners/scanner.py +1 -0
- guarddog/utils/archives.py +134 -9
- guarddog/utils/config.py +24 -2
- guarddog/utils/package_info.py +3 -1
- {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/METADATA +10 -9
- guarddog-2.7.1.dist-info/RECORD +100 -0
- {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/WHEEL +1 -1
- guarddog-2.6.0.dist-info/RECORD +0 -96
- {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info}/entry_points.txt +0 -0
- {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info/licenses}/LICENSE +0 -0
- {guarddog-2.6.0.dist-info → guarddog-2.7.1.dist-info/licenses}/LICENSE-3rdparty.csv +0 -0
- {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
|
|
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
|
-
|
|
115
|
-
|
|
114
|
+
for req_line in req:
|
|
115
|
+
if not req_line.strip():
|
|
116
|
+
continue
|
|
116
117
|
try:
|
|
117
|
-
yield
|
|
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.
|
|
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.
|
|
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.
|
|
171
|
+
dep = Dependency(name=requirement.name, versions=set())
|
|
175
172
|
dependencies.append(dep)
|
|
176
173
|
|
|
177
174
|
dep.versions.update(dep_versions)
|
guarddog/scanners/scanner.py
CHANGED
guarddog/utils/archives.py
CHANGED
|
@@ -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(
|
|
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.
|
|
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,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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))
|
guarddog/utils/package_info.py
CHANGED
|
@@ -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(
|
|
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.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: guarddog
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: GuardDog is a CLI tool
|
|
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.
|
|
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.
|
|
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 (
|
|
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,,
|
guarddog-2.6.0.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|