From 27b711008f9cca31efc0af22d5f18c5a398a50c6 Mon Sep 17 00:00:00 2001 From: Roman Babenko Date: Mon, 7 Nov 2022 09:18:18 +0200 Subject: [PATCH] Deep scan enchancement (#235) * Encoded data might be decoded * apply file type when not None * fix * Separated test for docx * Encoded test * Improved encode test research * fix * refuzzed * Commited forgotten sample * Update credsweeper/file_handler/data_content_provider.py Co-authored-by: ShinHyung Choi * Update credsweeper/app.py Co-authored-by: ShinHyung Choi * Apply test assertion * Use common code for reduce duplicate code * Line umeration * fix * make the method private again * rename methods Co-authored-by: ShinHyung Choi --- credsweeper/app.py | 50 ++++++++++++++---- credsweeper/file_handler/content_provider.py | 2 +- .../file_handler/data_content_provider.py | 44 +++++++++++++++ .../file_handler/string_content_provider.py | 8 ++- credsweeper/utils/util.py | 31 +++++++---- .../05d0262facb829f463770b7b5bebfa0ae2b91cd1 | Bin 0 -> 381 bytes .../0777795a181b88fe85300ebb1ca828c3577efa36 | Bin 1564 -> 0 bytes .../096ec2ed3a11a2c4422fe445f86fc03963adf350 | Bin 0 -> 492 bytes .../0ecc008ed467be8c0da17ae7d2d322f908c1fb1d | Bin 1028 -> 0 bytes ... 1188838daba5b306b8c7bf4142b0e33e19567be1} | Bin 1661 -> 1549 bytes .../14d8263bf66c425a3ae0ecf300fd7fa5b061d3af | Bin 1647 -> 0 bytes ... 1d8bb62634f5d8a78ce9fd622a03eb1ea1fea2e5} | Bin 1615 -> 1556 bytes .../1df555ea6ab8f834626d3002c2d3eaf7746450ae | 1 + .../2023cf6be65f362b3892de9f6f1f8b7eec51d3ef | Bin 0 -> 167 bytes .../24cbd99c8c5b3d2c50bece1bc77dc009ac13129b | Bin 364 -> 0 bytes .../2bc2e50780867fcce228c61c332e93862a7b8716 | Bin 0 -> 323 bytes .../335fee890ad661dd597dd6971d542ae418328c85 | Bin 0 -> 1304 bytes ... 3b5955751f9abbb7e0d7001ccea24de9d21d9277} | 2 +- .../3ebe8f32e019804bbe8713e71a21a431981c7046 | Bin 0 -> 151 bytes .../42620722b0ddabd16f0d20138d4cdde7fc3bbba5 | Bin 196 -> 0 bytes .../50127775b46b8b432f85928ab5d21cc9a5b9916a | 5 ++ .../5cfd0fefcc75a3f0af8cc66ecc20b39327f1f652 | Bin 0 -> 1645 bytes .../6b78a49f2f81c15b54c1bc271903f8c721e7667e | Bin 0 -> 1596 bytes ... 6b8737b1e00c72a699151913c883a2a5df41dd76} | Bin 1815 -> 1781 bytes .../6c37a89b82b2ffdfe81a84cbed9a91118d8ed921 | Bin 303 -> 0 bytes ... 7b328d9887fccefef2d299580e2d8d4b9ba3d901} | Bin 21 -> 20 bytes ... 7f8d87717cb91d8cf1cd50b6d14d7cd81b8669bc} | Bin 649 -> 581 bytes .../8124e9492a8c5cce81a48c33d194d24d9531e462 | Bin 1537 -> 0 bytes .../826bcabe227bcaf79bf5238c84be3fcf93827222 | Bin 0 -> 1564 bytes .../849bcca66a92239cfcff641d4523a0f20830c402 | Bin 1633 -> 0 bytes .../975fdd1334d060021eb071d80d16a40bded8d137 | Bin 0 -> 196 bytes .../a181c1c675795013e019988caaa2893337cd2e86 | Bin 250 -> 0 bytes .../a8a995a2268f7ddf86776988ead26a6109883042 | Bin 389 -> 0 bytes .../ab47261a9a73813e3c1292c5b00a456c565ac2aa | 1 - .../b28e39b4ea7b47b72e80a4cc1f5568700bb2ca35 | Bin 1644 -> 0 bytes .../b90eaaafa7e5fcfaae144789007d58b767dd5d62 | Bin 670 -> 0 bytes .../b9c8aa807a927cee3b6f4ec1475679385db74f9a | Bin 0 -> 1615 bytes ... bfdf543f7ed0b3357ea9412c4f348ff187e4675b} | Bin 1552 -> 1548 bytes .../c28561680557d4ff1ed68711ae40bad13da1c153 | Bin 482 -> 0 bytes .../ccf24291cf3b79fdb76f5167ce906d88fc4f8f6d | Bin 0 -> 22 bytes .../d70ab28b9ce57ee55b6604f84972cea6255093e4 | Bin 1644 -> 0 bytes .../e245e2f884af2d01bea253673200a29f51363fa2 | Bin 0 -> 628 bytes ... e37d1023facd1a69aba512862e3a17b645a272f8} | Bin 1600 -> 1541 bytes ... e82b7fbdf33f60dbc111d5b05b1f5f9b0e93c1c0} | Bin 1549 -> 1549 bytes ... eaacd823db36dbd3ca4241c26eaf311de7528af4} | Bin 1540 -> 1540 bytes .../eeaaa652952fef8117a481d1d7d2438fc815f646 | Bin 0 -> 1547 bytes ... f1576ad4c302fb698373747fcffbb0b0a2df6c29} | Bin 1562 -> 1562 bytes .../f5c6f72bb13ac6c1095bb73e7c4192430935b9bd | Bin 645 -> 0 bytes ... fb21fb8e72d920be23bc8ab42434cb6aee4bfdfa} | Bin 1564 -> 1564 bytes .../fba154b0fcd3f4895b5582a1baaa550376e1a210 | Bin 1591 -> 0 bytes .../fd8463c8426b79d944d2ff54554982c98617c3c8 | Bin 0 -> 981 bytes tests/__init__.py | 8 +-- .../test_data_content_provider.py | 5 +- .../test_string_content_provider.py | 43 +++++++++++---- tests/samples/encoded | 7 +++ tests/samples/password.docx | Bin 0 -> 4306 bytes tests/test_main.py | 36 +++++++++++++ 57 files changed, 203 insertions(+), 40 deletions(-) create mode 100644 fuzz/corpus/05d0262facb829f463770b7b5bebfa0ae2b91cd1 delete mode 100644 fuzz/corpus/0777795a181b88fe85300ebb1ca828c3577efa36 create mode 100644 fuzz/corpus/096ec2ed3a11a2c4422fe445f86fc03963adf350 delete mode 100644 fuzz/corpus/0ecc008ed467be8c0da17ae7d2d322f908c1fb1d rename fuzz/corpus/{1489301be66a04408530ef4a42653bfe73530f57 => 1188838daba5b306b8c7bf4142b0e33e19567be1} (61%) delete mode 100644 fuzz/corpus/14d8263bf66c425a3ae0ecf300fd7fa5b061d3af rename fuzz/corpus/{885f4055ef5cdba0026ebaf69d5ca046404542fe => 1d8bb62634f5d8a78ce9fd622a03eb1ea1fea2e5} (57%) create mode 100644 fuzz/corpus/1df555ea6ab8f834626d3002c2d3eaf7746450ae create mode 100644 fuzz/corpus/2023cf6be65f362b3892de9f6f1f8b7eec51d3ef delete mode 100644 fuzz/corpus/24cbd99c8c5b3d2c50bece1bc77dc009ac13129b create mode 100644 fuzz/corpus/2bc2e50780867fcce228c61c332e93862a7b8716 create mode 100644 fuzz/corpus/335fee890ad661dd597dd6971d542ae418328c85 rename fuzz/corpus/{d4b0733705909d11a644c3a0c59b097ac596c427 => 3b5955751f9abbb7e0d7001ccea24de9d21d9277} (95%) create mode 100644 fuzz/corpus/3ebe8f32e019804bbe8713e71a21a431981c7046 delete mode 100644 fuzz/corpus/42620722b0ddabd16f0d20138d4cdde7fc3bbba5 create mode 100644 fuzz/corpus/50127775b46b8b432f85928ab5d21cc9a5b9916a create mode 100644 fuzz/corpus/5cfd0fefcc75a3f0af8cc66ecc20b39327f1f652 create mode 100644 fuzz/corpus/6b78a49f2f81c15b54c1bc271903f8c721e7667e rename fuzz/corpus/{a87b785a5d1a969876ffd9b2e2d4d1bd116360ed => 6b8737b1e00c72a699151913c883a2a5df41dd76} (56%) delete mode 100644 fuzz/corpus/6c37a89b82b2ffdfe81a84cbed9a91118d8ed921 rename fuzz/corpus/{b3b0555fb7d610245d0e2984a9bc4d67d0b27085 => 7b328d9887fccefef2d299580e2d8d4b9ba3d901} (66%) rename fuzz/corpus/{ed49b7a22c92a02676487da63615aa0f740d1a23 => 7f8d87717cb91d8cf1cd50b6d14d7cd81b8669bc} (53%) delete mode 100644 fuzz/corpus/8124e9492a8c5cce81a48c33d194d24d9531e462 create mode 100644 fuzz/corpus/826bcabe227bcaf79bf5238c84be3fcf93827222 delete mode 100644 fuzz/corpus/849bcca66a92239cfcff641d4523a0f20830c402 create mode 100644 fuzz/corpus/975fdd1334d060021eb071d80d16a40bded8d137 delete mode 100644 fuzz/corpus/a181c1c675795013e019988caaa2893337cd2e86 delete mode 100644 fuzz/corpus/a8a995a2268f7ddf86776988ead26a6109883042 delete mode 100644 fuzz/corpus/ab47261a9a73813e3c1292c5b00a456c565ac2aa delete mode 100644 fuzz/corpus/b28e39b4ea7b47b72e80a4cc1f5568700bb2ca35 delete mode 100644 fuzz/corpus/b90eaaafa7e5fcfaae144789007d58b767dd5d62 create mode 100644 fuzz/corpus/b9c8aa807a927cee3b6f4ec1475679385db74f9a rename fuzz/corpus/{f2e152e92bc24a81ab1991c522d153d4df991f08 => bfdf543f7ed0b3357ea9412c4f348ff187e4675b} (60%) delete mode 100644 fuzz/corpus/c28561680557d4ff1ed68711ae40bad13da1c153 create mode 100644 fuzz/corpus/ccf24291cf3b79fdb76f5167ce906d88fc4f8f6d delete mode 100644 fuzz/corpus/d70ab28b9ce57ee55b6604f84972cea6255093e4 create mode 100644 fuzz/corpus/e245e2f884af2d01bea253673200a29f51363fa2 rename fuzz/corpus/{252af097b44b1c571e2fec486bf9d43b0de83e67 => e37d1023facd1a69aba512862e3a17b645a272f8} (68%) rename fuzz/corpus/{bc9797a20ed98191b62330efbd4766317202c7a1 => e82b7fbdf33f60dbc111d5b05b1f5f9b0e93c1c0} (63%) rename fuzz/corpus/{912a269cbd5f5e6298600b56bb9687c98058ea46 => eaacd823db36dbd3ca4241c26eaf311de7528af4} (54%) create mode 100644 fuzz/corpus/eeaaa652952fef8117a481d1d7d2438fc815f646 rename fuzz/corpus/{29229f0031d9d1c7c478872f9efeda629d65f46c => f1576ad4c302fb698373747fcffbb0b0a2df6c29} (90%) delete mode 100644 fuzz/corpus/f5c6f72bb13ac6c1095bb73e7c4192430935b9bd rename fuzz/corpus/{e6bd00e96e6c368c349dab060901d530645566b3 => fb21fb8e72d920be23bc8ab42434cb6aee4bfdfa} (91%) delete mode 100644 fuzz/corpus/fba154b0fcd3f4895b5582a1baaa550376e1a210 create mode 100644 fuzz/corpus/fd8463c8426b79d944d2ff54554982c98617c3c8 create mode 100644 tests/samples/encoded create mode 100644 tests/samples/password.docx diff --git a/credsweeper/app.py b/credsweeper/app.py index 95fb79223..e0699044c 100644 --- a/credsweeper/app.py +++ b/credsweeper/app.py @@ -20,6 +20,7 @@ from credsweeper.file_handler.diff_content_provider import DiffContentProvider from credsweeper.file_handler.file_path_extractor import FilePathExtractor from credsweeper.file_handler.files_provider import FilesProvider +from credsweeper.file_handler.string_content_provider import StringContentProvider from credsweeper.file_handler.text_content_provider import TextContentProvider from credsweeper.scanner import Scanner from credsweeper.utils import Util @@ -250,19 +251,30 @@ def file_scan(self, content_provider: ContentProvider) -> List[Candidate]: content_provider.file_type, content_provider.info) candidates.append(dummy_candidate) - elif self.config.depth > 0 and isinstance(content_provider, TextContentProvider): - # Feature to scan files which might be containers - data = Util.read_data(content_provider.file_path) - if data: - data_provider = DataContentProvider(data=data, - file_path=content_provider.file_path, - info=content_provider.file_path) - candidates = self.data_scan(data_provider, self.config.depth, RECURSIVE_SCAN_LIMITATION) - else: # Regular file scanning - analysis_targets = content_provider.get_analysis_target() - candidates = self.scanner.scan(analysis_targets) + if content_provider.file_type not in self.config.exclude_containers: + analysis_targets = content_provider.get_analysis_target() + candidates.extend(self.scanner.scan(analysis_targets)) + + if self.config.depth and isinstance(content_provider, TextContentProvider): + # Feature to scan files which might be containers + data = Util.read_data(content_provider.file_path) + if data: + data_provider = DataContentProvider(data=data, + file_path=content_provider.file_path, + file_type=content_provider.file_type, + info=content_provider.file_path) + extra_candidates = self.data_scan(data_provider, self.config.depth, RECURSIVE_SCAN_LIMITATION) + if extra_candidates: + # reduce duplicated credentials + found_values = set(line_data.value for candidate in candidates + for line_data in candidate.line_data_list) + for extra_candidate in extra_candidates: + for line_data in extra_candidate.line_data_list: + if line_data.value not in found_values: + candidates.append(extra_candidate) + break # finally return result from 'file_scan' return candidates @@ -336,6 +348,22 @@ def data_scan(self, data_provider: DataContentProvider, depth: int, recursive_li except Exception as gzip_exc: logger.error(f"{data_provider.file_path}:{gzip_exc}") + elif data_provider.represent_as_encoded(): + decoded_data_provider = DataContentProvider(data=data_provider.decoded, + file_path=data_provider.file_path, + file_type=data_provider.file_type, + info=f"{data_provider.info}|ENCODED") + new_limit = recursive_limit_size - len(decoded_data_provider.data) + candidates.extend(self.data_scan(decoded_data_provider, depth, new_limit)) + + elif data_provider.represent_as_xml(): + struct_data_provider = StringContentProvider(lines=data_provider.lines, + line_numbers=data_provider.line_numbers, + file_path=data_provider.file_path, + file_type=".xml", + info=f"{data_provider.info}|XML") + candidates.extend(self.file_scan(struct_data_provider)) + else: # finally try scan the data via byte content provider byte_content_provider = ByteContentProvider(content=data_provider.data, diff --git a/credsweeper/file_handler/content_provider.py b/credsweeper/file_handler/content_provider.py index cdf58afdd..82effa4fb 100644 --- a/credsweeper/file_handler/content_provider.py +++ b/credsweeper/file_handler/content_provider.py @@ -14,7 +14,7 @@ def __init__( file_type: Optional[str] = None, # info: Optional[str] = None) -> None: self.file_path: str = file_path - self.file_type: str = file_type if file_type else Util.get_extension(file_path) + self.file_type: str = file_type if file_type is not None else Util.get_extension(file_path) self.info: str = info @abstractmethod diff --git a/credsweeper/file_handler/data_content_provider.py b/credsweeper/file_handler/data_content_provider.py index cf2a6716b..efa21263a 100644 --- a/credsweeper/file_handler/data_content_provider.py +++ b/credsweeper/file_handler/data_content_provider.py @@ -1,7 +1,14 @@ +import base64 +import logging +import string from typing import List, Optional +from credsweeper.common.constants import DEFAULT_ENCODING from credsweeper.file_handler.analysis_target import AnalysisTarget from credsweeper.file_handler.content_provider import ContentProvider +from credsweeper.utils import Util + +logger = logging.getLogger(__name__) class DataContentProvider(ContentProvider): @@ -21,6 +28,9 @@ def __init__( info: Optional[str] = None) -> None: super().__init__(file_path=file_path, file_type=file_type, info=info) self.data = data + self.decoded: Optional[bytes] = None + self.lines: List[str] = [] + self.line_numbers: List[int] = [] @property def data(self) -> bytes: @@ -32,6 +42,40 @@ def data(self, data: bytes) -> None: """data setter""" self.__data = data + def represent_as_xml(self) -> bool: + """Tries to read data as xml + + Return: + True if reading was successful + + """ + try: + xml_text = self.data.decode(encoding=DEFAULT_ENCODING).splitlines() + self.lines, self.line_numbers = Util.get_xml_from_lines(xml_text) + except Exception as exc: + logger.debug("Cannot parse as XML:%s %s", exc, self.data) + return False + return bool(self.lines and self.line_numbers) + + def represent_as_encoded(self) -> bool: + """Encodes data from base64. Stores result in decoded + + Return: + True if the data correctly parsed and verified + + """ + if len(self.data) < 12 or (b"=" in self.data and b"=" != self.data[-1]): + logger.debug("Weak data to decode from base64: %s", self.data) + try: + self.decoded = base64.b64decode( # + self.data.decode(encoding="ascii", errors="strict"). # + translate(str.maketrans("", "", string.whitespace)), # + validate=True) # + except Exception as exc: + logger.debug("Cannot decoded as base64:%s %s", exc, self.data) + return False + return self.decoded is not None and 0 < len(self.decoded) + def get_analysis_target(self) -> List[AnalysisTarget]: """Return nothing. The class provides only data storage. diff --git a/credsweeper/file_handler/string_content_provider.py b/credsweeper/file_handler/string_content_provider.py index 158390487..b5349b9c9 100644 --- a/credsweeper/file_handler/string_content_provider.py +++ b/credsweeper/file_handler/string_content_provider.py @@ -16,11 +16,15 @@ class StringContentProvider(ContentProvider): def __init__( self, # lines: List[str], # + line_numbers: Optional[List[int]] = None, # file_path: Optional[str] = None, # file_type: Optional[str] = None, # info: Optional[str] = None) -> None: super().__init__(file_path=file_path, file_type=file_type, info=info) self.lines = lines + # fill line numbers only when amounts are equal + self.line_numbers = line_numbers if line_numbers and len(self.lines) == len(line_numbers) \ + else (list(range(1, 1 + len(self.lines))) if self.lines else []) def get_analysis_target(self) -> List[AnalysisTarget]: """Return lines to scan. @@ -30,6 +34,6 @@ def get_analysis_target(self) -> List[AnalysisTarget]: """ return [ - AnalysisTarget(line, i + 1, self.lines, self.file_path, self.file_type, self.info) - for i, line in enumerate(self.lines) + AnalysisTarget(line, line_number, self.lines, self.file_path, self.file_type, self.info) + for line_number, line in zip(self.line_numbers, self.lines) ] diff --git a/credsweeper/utils/util.py b/credsweeper/utils/util.py index ce4b88d00..d99364a37 100644 --- a/credsweeper/utils/util.py +++ b/credsweeper/utils/util.py @@ -272,6 +272,27 @@ def read_data(path: str) -> Optional[bytes]: logger.error(f"Unexpected Error: Can not read '{path}'. Error message: '{exc}'") return None + @staticmethod + def get_xml_from_lines(xml_lines: List[str]) -> Tuple[Optional[List[str]], Optional[List[int]]]: + """Parse xml data from list of string and return List of str. + + Args: + xml_lines: list of lines of xml data + + Return: + List of formatted string(f"{root.tag} : {root.text}") + + """ + lines = [] + line_nums = [] + tree = etree.fromstringlist(xml_lines) + for element in tree.iter(): + tag = Util._extract_element_data(element, "tag") + text = Util._extract_element_data(element, "text") + lines.append(f"{tag} : {text}") + line_nums.append(element.sourceline) + return lines, line_nums + @staticmethod def get_xml_data(file_path: str) -> Tuple[Optional[List[str]], Optional[List[int]]]: """Read xml data and return List of str. @@ -285,21 +306,13 @@ def get_xml_data(file_path: str) -> Tuple[Optional[List[str]], Optional[List[int List of formatted string(f"{root.tag} : {root.text}") """ - lines = [] - line_nums = [] try: with open(file_path, "r") as f: xml_lines = f.readlines() - tree = etree.fromstringlist(xml_lines) - for element in tree.iter(): - tag = Util._extract_element_data(element, "tag") - text = Util._extract_element_data(element, "text") - lines.append(f"{tag} : {text}") - line_nums.append(element.sourceline) + return Util.get_xml_from_lines(xml_lines) except Exception as exc: logger.error(f"Cannot parse '{file_path}' to xml {exc}") return None, None - return lines, line_nums @staticmethod def _extract_element_data(element, attr) -> str: diff --git a/fuzz/corpus/05d0262facb829f463770b7b5bebfa0ae2b91cd1 b/fuzz/corpus/05d0262facb829f463770b7b5bebfa0ae2b91cd1 new file mode 100644 index 0000000000000000000000000000000000000000..c638cbcc45b17aa0edbb05b73cafb95e4f20b955 GIT binary patch literal 381 zcmcD?$$XcsP?S0k6BMT=8yT7!qewJAYh7$)XrOPU^(IvzvsfW7-`z7l$kjjI+24O# ze2D*lY{1*qPr+6}$<@*Ei-Kc#umaadE-n;x1)1*?3-S#ztr80|85ux8Tn)uqFh>hh z2t!2Q3Z!?l!_!Vwm%7%G>H-D^eSNH^>FaYj00Y32fuW)@(efV@Ad7-L02BZBPYena Rl0o7?prD`-?_3M=F#u)zw#EPe literal 0 HcmV?d00001 diff --git a/fuzz/corpus/0777795a181b88fe85300ebb1ca828c3577efa36 b/fuzz/corpus/0777795a181b88fe85300ebb1ca828c3577efa36 deleted file mode 100644 index 812fffbed87aff9dda773fdcc6c7d46ce5cbbd81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmeHH&2G~`5T4vBpSU4$qJ@S+6?+~3#5O`WNF=RNvm&U;vztNFMk@ldG`(wf0Sb z-~m(FrY#yTpO5-nKm+cj@`SESr_1z8j}~F#J8L4ryemtcjg4DTbuH>{dqgbA1>d(w z6E{d=AYQb+CU&b+!(S&#)1`qP1&_><5tu=#o#ahTZ-iGT6H8-Nt#2SKyxl#!3lsmfhKw6)L8M0 zVhSGD+Nm9#Qb_Qwg?E|`z2iA9L)ZjB!2S{5*b2yx;4-U!8s;&$E>XB<8J_~z3=^iM zPW};Gjv>M?0McX?>)3WQ9jSFBsgiByHM#C8uB%{#^@5I(?kbX^W2_;`m2520W2C93 zlGR++ZnV|@chnpmH6bTiWhA`*3kxYd{dCO8C&mnIQr1eVj56;cZh6w5Z%5G{N0V diff --git a/fuzz/corpus/096ec2ed3a11a2c4422fe445f86fc03963adf350 b/fuzz/corpus/096ec2ed3a11a2c4422fe445f86fc03963adf350 new file mode 100644 index 0000000000000000000000000000000000000000..786b2d26d2393ba06d64cd8d3a15d254ed5038ed GIT binary patch literal 492 zcmbu5NovC|6o%ccPhqmiTJoTwkcC4VNTJj;w4s4wBuAEo2f5BroI~_lU1r-`Qw>K7y{x5vmRawBIpK`6m{KWu-b{F$7 zHVJ&R%J(^aQ2{H}WwU1HmD-S?WRJJ?w2Tg~yXlid2|?J487Fkjy~t+Nb{QaR0^`ZU Y4zKDQ73!qbsfDy0re;N3hX<*OPX}JWV*mgE literal 0 HcmV?d00001 diff --git a/fuzz/corpus/0ecc008ed467be8c0da17ae7d2d322f908c1fb1d b/fuzz/corpus/0ecc008ed467be8c0da17ae7d2d322f908c1fb1d deleted file mode 100644 index e0ffa4251545e270cc693c3644e68f4db99c279d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 zcmeZ#ws)y(kiWa9bC9F6w~wp4XOOGEyW)SXvefwW%%ar%^vvX<#AHiDLnA{IuA=;k z%Iwri1zQD2PcAU9Ny<;Dw2RCyRY)vKRY*$B%u83WN#wFCnmr$=JGmq^h0BnOE2E^O zpx7$N@&AA4#DYwHeSIsSDOL~@aFAC(z%e-6&>*>(fdRY4?w+X*`R=n?N!&J&)HOW?S^xm(_bhk- diff --git a/fuzz/corpus/1489301be66a04408530ef4a42653bfe73530f57 b/fuzz/corpus/1188838daba5b306b8c7bf4142b0e33e19567be1 similarity index 61% rename from fuzz/corpus/1489301be66a04408530ef4a42653bfe73530f57 rename to fuzz/corpus/1188838daba5b306b8c7bf4142b0e33e19567be1 index c55ea8a6fe7bee858524bd17ac602070d1527a4b..0b5d5d90ff47cff671bb57b7a1ba2f5abb78fd2a 100644 GIT binary patch delta 38 ucmey%)626Vf^l*Hqxj^%Od*U`n}e9e87Jy!Zf;~`VrI_|Ezh%6Pyhh(g$p$R delta 444 zcmeC>`OC8*f^njb=4KXVCg%D}3_y@s;ASh7X~o6Gb@tr(3*`>^wxJC2-5eacTS?}o-nD{wa z+af6HTe7!;u7mS`LnC{8K6_nldpKa2oX?`F{~rS2qF{z1hy>XkYW3gV-u(MNpc&t) z{{OGco?OT*SMOX@n4F!H>Yf>tny=*O?Fqt;?w(4il?qh~iHxq!L5|K&KCbR?hG&qg zzZMX5pAs*~tOA;A8=9B-KCuAkb!2Y>eF>De{BiMx0|Nu&L0d)!U>GQXKqZ6sd7V!E zljr@;25;~P4e&az<8@X+!M{LU-%8&~tE9vrCo@mH!2i6Do|n(LbDph1ZEnZfmZd#w zo5t4Gc1*1;?U`7cR}8~K(+{uBfnjL{bc4ZJpl4(xfN=n}0zx<_IOKljA6h5z>*t$9sq7dwh?MrMaQd5*hR*@>Ds;UksJ=p7jx_0{ecY?PvOR-I1OGUcf`hy)(HXR@EDIaio$a#|4s_IemVaQk*k==}>9(y4M3a7jI%$ckAW~zNt ztwBv{)4#RGhIah%)$3-%bqREl?l+;2kwq-%1{!o>%P@WH1%YLm8uDFinz*IImfIvg z4w`Oou~+mfd*#lonVK_S^V{bC>f^kMyD~24NTh3d+t6g+_4n8wuCHL^!g792-vKZZ z2PV^Wetn1Md9l9?6ovhp_5Ajo(x6Ls{==ZbiPWAN|Ci&p7mXim#Mq69!kH4#*jK!W U7PharV}%bfSGFhlfco3=Pq^;X8vp&WN}6z#ubz6n6)>DGDjzJdxRwv2LTENA{l{k4fv+?GWj8cq~^%=#1!Y(qdzDiu$3JN9p zc?z})O6i$Jsrl)d$^VNIjg8DEA7oO3Dzu(FpSgJQPZs{kDJ(+T3?RVBz)+xRrReVI z7#{5H8fj?c?iu9j@96F62xhp06){ZS%_2KFfk|%?D+f@k`s4|$>YF#Qh%*`+nwps# nS{fJ{8k-oJnOhkCM+FvKiC{ba|Nr;@e?5>{tyDbuB&#<7TvJH= diff --git a/fuzz/corpus/1df555ea6ab8f834626d3002c2d3eaf7746450ae b/fuzz/corpus/1df555ea6ab8f834626d3002c2d3eaf7746450ae new file mode 100644 index 000000000..6ac557290 --- /dev/null +++ b/fuzz/corpus/1df555ea6ab8f834626d3002c2d3eaf7746450ae @@ -0,0 +1 @@ + diff --git a/fuzz/corpus/2023cf6be65f362b3892de9f6f1f8b7eec51d3ef b/fuzz/corpus/2023cf6be65f362b3892de9f6f1f8b7eec51d3ef new file mode 100644 index 0000000000000000000000000000000000000000..492ed74aee7a9faaa46f2684a0a2ed3517db9b14 GIT binary patch literal 167 zcmWIWW@hnX0D+tUm(V3{PordjY!K!IlEo#JIjMTd#l@i^oD9r+ZdoU9%}y`MFU?D_ zQY+8MEJ?NIstxdFWRhd%0vUm9hNGjmQ)q@^m|3P_va5SRl7)GOsb5uiL`GGpd1{D( lEtf73fJ`i{;AUWCdBM!U044&wS=m5FF#@4Kkd6m&7yt-tC&&N* literal 0 HcmV?d00001 diff --git a/fuzz/corpus/24cbd99c8c5b3d2c50bece1bc77dc009ac13129b b/fuzz/corpus/24cbd99c8c5b3d2c50bece1bc77dc009ac13129b deleted file mode 100644 index 59fad14e5433adeff8ec88cc97f5332317711c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeZ#ws&cetG~OabC9F6w~wp4Cy1vA<^KQA1q5a$2ATT$`c_&XkXotW=vkE*TxpPO zY-wg{Y?chv02Ej0J|$j|nU`1qR?5HtjX_)NmUXWyAkzwjr6&{gM6>6RuVqj~S{Nm(E06&;+djJ3c diff --git a/fuzz/corpus/2bc2e50780867fcce228c61c332e93862a7b8716 b/fuzz/corpus/2bc2e50780867fcce228c61c332e93862a7b8716 new file mode 100644 index 0000000000000000000000000000000000000000..976ae7a0a41354d4679f6cc7b72c39685777932b GIT binary patch literal 323 zcmaiwv1-FW5JZ($Utv&-tK*QcjAUZ+)&2rQj)V|**=iPs zna7lm-DT}WbX}hwilW%$BeCT=_EY-MKBh(Im}DUtC(U2f`Ry~#?{SLh+@I%Bj~k6u ze_F5#(t@@ego5z{TTn1+m;zCa&Cp;y09h8STJ(m46RBPBBjE6n48b+|a30Cn4yP;z(!9@>vkb$(&Uo*8;aop&*pAEMH|?#y*2X>DZ}I z=pM3U2>l8D1%)p85$#`a*YqsgNCGMG(g%Wf-}`j;-n;LeWqW<%dY0{VaGRK}>v(Tn zhxDXVNhVl80}?L+m6{m)=6Rbw*;^D`R4vvIVvDusK8?mfeg$iF2$Hby?tltw30*cM zklOQ&dm_HS>-9Q?0r*~M06fZ)cK)}U1;sYD?7mN>ib*WHCq3&&;Av%RbOOM!7A)V_ zb>!>kP#re)f^Ev7T$bXft3vzp`AZ@GAXr(&E5F+5zU$f!*_1)tVFQ(?vyJ4Ex}Usn z(1V$52}SwTTG=D+4mB0lHOR(v#Olj#*PO9%_Td#=^_p69GV$5i7_rIjmL3oMp%4kw z8#+WSC_Jr^I!y$t%Y|B#(=_}UQxwHejN=!at7jc!dN%EFf&Nl{CNSqPWtV!nrWBR_ zU#=pn)kCF#_oEyO;P>SZ zAUbr)=gZ(zmH@z>l8uwsGI%LTJl<}b|6#W}ObUkx;V4l;GQRh=q+AH4IxtR-Dk{=+ W+MV$Rx*%sRyKw zlR*Mx6aym=H#CA+#U+(Fsd~x9#i1dr49t6OStplPa5FHnykKTv022Y;tZX2Kj6moQ Jq~k#x1^{(4B{Bd2 literal 0 HcmV?d00001 diff --git a/fuzz/corpus/42620722b0ddabd16f0d20138d4cdde7fc3bbba5 b/fuzz/corpus/42620722b0ddabd16f0d20138d4cdde7fc3bbba5 deleted file mode 100644 index b679b7afe2a6f8d2f9c583a264ee93c369acccdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmWIWW@h1H0D+tUm(V3{PordjY!K!IlEo#JIjMTd#l@i^oD9r+ZdoU91>({QZU#n{ z7t9O{U?M3$rBb1qi!&)PIXk^5zceq!N})U>vn17;t2V%!kx7mjmjx0adl?vkxS + cackl/City> + peace_for_ukraine + + \ No newline at end of file diff --git a/fuzz/corpus/5cfd0fefcc75a3f0af8cc66ecc20b39327f1f652 b/fuzz/corpus/5cfd0fefcc75a3f0af8cc66ecc20b39327f1f652 new file mode 100644 index 0000000000000000000000000000000000000000..cace89b532c347fa776f52abd5f8294190ef6f7f GIT binary patch literal 1645 zcmds&y>HV%6u>X5C#H6Fr6M2@`7U6iIo+o*bp0AIHyTTL@27n#9PkKdhhOc@9XrlcSo6uUN6@wx&$lw z`6oynYXHzW|A6!5dISSW?s8Gk>9*`Hukj^)4>!8d6bo`rl+D18Z9mR2$i^ zKb=KVPDW4q{j_7pX48m+mhGS333n|<#{PbO-s1#8P;WEyG(REQs?YAk`8Z_93n~Ep zq1@mw03bEcYkf_EoJFio(7~A{ER%^nE>nil0Nf}DQ!jIJa2}6@uXj2d(mlqLpnbz( zFhcx(!N?2>KR$ddGQMLil_X_^z>pJY5Z+SfDtc+HQ7u14*+HyJRlPJ!<-iKuyqqZ^ zQj-9u-zG?GQ}7$oI1!viG&2I5Sg9Fdv*p>t1!YB~$OU>s$vYaH?t(cK+ z)4&wDcFXYSGuv=!WCt!ay|tB!5?ed-3b)rGdWhhH*6?*RPc?5#zg~8>i|d(PZNJla zL^|<(J?m}|7|O+s($m_5yfO!uBj+wDH`cY zpUJp1=CR-gf$P}@ySKsW-q@va)9`mZ&tSe=)W>lU@#L>o8vQ+CSb~S|U%XVZgxHA4 zqNN}U%LTiDhyxKpc`0XM({T!g9F#4Bb2*$BQJyHag&l=B;|Uk1C!FQ`+O&qcq`A_) zkAJAf@zno=V!ToH(i<0{4^?YY_J0E0lMm{7wD#o z9wpFo^a{>4oix~EgCJ?4rHeio^z`PN(VI_i@?tj4s##vl#_1>}DA?*2aoRZJFRKX0f!C%iVql#2axw z+-E*_;`@h>o%(}fZ@pN{!Fcj!Qk2=<5wgk>e&C?v<-k+rs4ds0TQvN+@l(0Msw{?AJOO1it=n z{ma6Oc>5E5(o%2RAG)JH=wqbTcedi5^5r? j5kgoZkjoRol+@AyO~`NGDc_7eR(^ROCjBrC(=zx0B~u$l literal 0 HcmV?d00001 diff --git a/fuzz/corpus/a87b785a5d1a969876ffd9b2e2d4d1bd116360ed b/fuzz/corpus/6b8737b1e00c72a699151913c883a2a5df41dd76 similarity index 56% rename from fuzz/corpus/a87b785a5d1a969876ffd9b2e2d4d1bd116360ed rename to fuzz/corpus/6b8737b1e00c72a699151913c883a2a5df41dd76 index 8bb328382317b27bcbfecaf1bf3655a0f06d1f3f..41e69ddf5e5227f79450ecf82d69386386eccb62 100644 GIT binary patch delta 288 zcmbQv_my{od3|1DL8iXGz7+!yh!aOGpIDG@8=9A?n8%fu43!P?clUI44svvM z@^N*CF)ZY}Io@ZRB^er|XO_g5KV< zib_*!!SW(pTuu;$Fg09SS`#mtZOr#zWcmN!F=+BZMw!VM7}+M@WmMSwfoTz=Lz=0D zp`~$}iFsm@xmmJ>v5}#%xq*?9S!!akSyEDpnWc%PS(>?7YFe6cvT0&Unz^Ngxv{yi qv5ARMVw#yn;^avzdl~&V2e6hhiYp+2%;ciP7HYzf(^D delta 235 zcmey$JDqQW`Q&&;o6RhYE{rU??v6o|1DRweCor*2&SO#l((FDA75Np3x^6y^KAzsL zj_#g8uKsEBEV)9>Q$q}FxpYCm)z3vCDA-XUAjm57y#ff7C?r)Xlw>59faRTB-97z4 zDkdv1%i9_zyD}6oh-X^<;Ntp^Di1WlGt4o>Rl(aeQdid$D9PpP=@}g1=;`L@=M1qEn=Kpz_OR|;$}V8QpU*~i~{UjU|=?R7n?Nzy8A!$ diff --git a/fuzz/corpus/6c37a89b82b2ffdfe81a84cbed9a91118d8ed921 b/fuzz/corpus/6c37a89b82b2ffdfe81a84cbed9a91118d8ed921 deleted file mode 100644 index b9d0901b29dfe623638d453c5d9de8c7946d5f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmWIWW@h1H0D(tNe?#mR^B6m=J@ozjyYQqX$^qVtOmfV~vT7NkK$SrJn}b0Dtcwvy zZfRs-2rOVoEG{n3FG>jwVP#<6k@q;Mw1S&~k>v$50|S^qHZ8h@DfH0>-EUWz805P- zIJ#GVN@8FxNX?D6tIo+b)yT2y`l8kB$;hBp=O*LktCy!>3o`T`_e<=CiU1wK0rr3< zi%9Tqki(c57(}2>1aY@CmH^#R0Ci$~X-S%)nO;F+Npc252x};I=d!YabTR|sUm(4g H1;hgY|4B(r diff --git a/fuzz/corpus/b3b0555fb7d610245d0e2984a9bc4d67d0b27085 b/fuzz/corpus/7b328d9887fccefef2d299580e2d8d4b9ba3d901 similarity index 66% rename from fuzz/corpus/b3b0555fb7d610245d0e2984a9bc4d67d0b27085 rename to fuzz/corpus/7b328d9887fccefef2d299580e2d8d4b9ba3d901 index c0c6cdc9d4b1dfe2d832a2bbc0e5a1f4dd0e3a3a..8f14ba41b3f8b9d4faff532e1f2d329e6a6beed1 100644 GIT binary patch literal 20 acmWIWJ~*3Mhl>FS1ZQ*UDz<-PU;qF!dIYin literal 21 acmWIWJ~*3Mhl>FO1ZQ(CRc!snzyJU^a|I{> diff --git a/fuzz/corpus/ed49b7a22c92a02676487da63615aa0f740d1a23 b/fuzz/corpus/7f8d87717cb91d8cf1cd50b6d14d7cd81b8669bc similarity index 53% rename from fuzz/corpus/ed49b7a22c92a02676487da63615aa0f740d1a23 rename to fuzz/corpus/7f8d87717cb91d8cf1cd50b6d14d7cd81b8669bc index e0fc843c3ec0af844810e56546f5668f9386fdbc..2cb9ba30e1fa000693a81430f0da1c1ea62bc54b 100644 GIT binary patch delta 39 vcmeBVJ<2k{eWJ(gjZat^Co3^|iYAs9$7iQjs)cYeFz?8FoHT>cpCKIp8w(AF delta 101 zcmX@g(#bl(ozZck`)tPKjgMFv?KBNlO$Cpbm@RS8q5<+-`NXMt=G y=4Oy#NGvao&rYq>tI8}W4dG;9Ucmh_X~E<~M$yTPO!^!Qnm}dj3^J4TnZy85fEeWf diff --git a/fuzz/corpus/8124e9492a8c5cce81a48c33d194d24d9531e462 b/fuzz/corpus/8124e9492a8c5cce81a48c33d194d24d9531e462 deleted file mode 100644 index c47b360c2a146df5c4c31d5ae00b2562a3d07a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmeHHO^ee&7>?KZ1HG1ldsuBJlaI+HQbJtXPrHRQBn|!8b(MnNd?93#f%lo`dER-B?n#>xA!kdg2FEW>p0^uS6=2@1c7KDt;oluBy5xh!+B@=PR<3=)cKYp5wPYt#8 zFnQw_;^g@;;LWiEd(eV3;g)p_;jXOBJ8Glj9~Mt;?$?ff+4eoy)6(mbJV@5|Lf`YH z07%k(DYrF1H%1TLLA%(a$~0MuKHyTxuz31l64UtYih^51RP1(PAEYw>^PBeB&f5hc+b{BvC| diff --git a/fuzz/corpus/826bcabe227bcaf79bf5238c84be3fcf93827222 b/fuzz/corpus/826bcabe227bcaf79bf5238c84be3fcf93827222 new file mode 100644 index 0000000000000000000000000000000000000000..5e97fe3732cd0e90674b6c5edd246654c889ff8b GIT binary patch literal 1564 zcmbtUOK;mo5MJK`o_Y(=lTtKoYC$F`iVv|cU`nQFS+q#&;fF5nk|L?K#E10`FZ}^U z5B>vzed=%Mtw?aJ^#1HuX}^B-F@7rYVd|SdetY1C-kJ*oB%XbC_Vf%A6rIf|sAl;JQeI=kCrOeN z0k|C?;jf>cr&lpj{|y|=u%_<;VsJv4gCL_wHBBkY#hO$ssIrnQ9(^e*<(jO;fxdXQ z1RS&=NtHsgL+x>hHf1F+1fj!L!~KI!*yODSwN7MW$kokMtuCeXnuuO3=Xzt%rI1my zoZy2u0wlQUU}~O7c~5G{sfvvBO*9bn0PgMFF9c>d85Is0ZMS<|52`90@vZwV7kX?a z&E=a;IG)&AwXr{x+q-R{*h#B2BntDieG0&pAU z^Qs!n(JeA{HAmO@aYG-6dy+rYH0E=I_ce9PVEdDnF6a{1a>s7|Y?ja6lhG#h3bgZ*yDq8zVGRd!`9%t$YZkt zooDPE4-K9(1tv=~JeAFI7Bo4-Xmj~op0jz*vTep>VcX{O0?+UalgnkH%?a>I-uX?V z>Eu4#dgYqmO7`2(#yv-KEJq7@8n1Hf%LOmcnbCmCen4C!=|ECk9S*6DlIU%CrJ?0J z$U)fjnEaL$=Qdh=^!4l%*YUbzxm>jJJ4FYckM1;~M*y$_;%1Ir|9Se=z?3Rw3HRFh z`T3&M6wx-?Q-2CGCCC|yoz(BW1}jjbaG^)2a&D>3LEUGL)5%sw=`Jqw?4 zEITH?0RRQ!ApUyOLod7!m(m=mY9T;rCpg~vl%7`k9Phdi^~?@(6RmRp(h9qbnWSTa zKLo_xIqC0b7ZG>pSU4$qJ@S+6?+{&V!NtvkVsmk%Au$r#KAc0N4AL{suPGJj{JdK zIHKglZ{UWCA`l43r4pzDBqT&{`~5MzVKyXFZ;oZ@wvYIc{I;vgGw1 z#OH<|inneUm&jAOe*65h&mSLqU7z*L5NrLr{r$elKt7)<<4rp#|)l%JN8&}aS+Gkh~qd7fU_aa1NJ~?Ds+FP zbrk^r4pr%<#cR)>4ttDG0`8{rfUFC%WpbrUiZJ$_)zf(YY=NA9Qxw`88`r|>TG-ik zF<%f1o@e4Fs^i3f-Ee!2?^Gv-Q&)@BjAVOQ0jQTWU-wI`q>PlKC?geFwxUA01_fELth^%D9LaGc1d&=$5mX&XkW_>e zC^&+J1ab@&S(mbkL(?Ly_P=!$6E#lXQDbuAWlF-8pIAuf>7}zuJT|LHlhRgNrj&UT zGK=H>d_5eEhH-olPI#AgtzooKJsFc^T1IimxV zF4-Gz?9^%)r4#eP6a>HkGXsEOFcBlKVij+blsD3~ORdYZ=q{q+TD3y4T86}-z6Ga# z6lImeXx{gQN6Y8QuW}FPj4u}$Q|>KEK?(cMAhah0wcUXS8x@zbo&Si_bxy^RvoYas dig!0lLkPpR>BJoxK$;36fIk9LJ8l2~ literal 0 HcmV?d00001 diff --git a/fuzz/corpus/a181c1c675795013e019988caaa2893337cd2e86 b/fuzz/corpus/a181c1c675795013e019988caaa2893337cd2e86 deleted file mode 100644 index 56c4409e7bbfffc066de704d27a9a86c3661fbfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmeYaa`kuj%umluE{adjEJ}3@54JEeNjByx&W_K?EYnE^i-P47lY_Gj6U~y&pHDM4 zOYh6D$TmwdG)T`Zi7&~|PR&!WRZs$%ke|+l1YG^AmGXi7$8&aaB^G4bmK2qy)^d4* zZB0%uN{`Ra1lyXLA6}WRADf;7HjgXgTKf9PY7|hwe_X%|T>|QW8wl-q+>u$7o|+$CnVuh;o|B$g5?@lEotmeR3URGz z+WX!6iwyEj%qmOVGlNp|-3__8GD=DcimmkZlQRwU()07v4RcaUi&Kk|^YcnF^TZ4M z-FNH@5B4@UQPL?WPf-B-(+ccQafZ|2kU{dVIvx)roUejlB3No|X$t4gUqA>bI4C&e LhnDBrDkuN|!l90V diff --git a/fuzz/corpus/ab47261a9a73813e3c1292c5b00a456c565ac2aa b/fuzz/corpus/ab47261a9a73813e3c1292c5b00a456c565ac2aa deleted file mode 100644 index b4e210cca..000000000 --- a/fuzz/corpus/ab47261a9a73813e3c1292c5b00a456c565ac2aa +++ /dev/null @@ -1 +0,0 @@ -PKGITTTċċċċċċċċċċċċċċċċ&ċċċċċċċċċReoc \ No newline at end of file diff --git a/fuzz/corpus/b28e39b4ea7b47b72e80a4cc1f5568700bb2ca35 b/fuzz/corpus/b28e39b4ea7b47b72e80a4cc1f5568700bb2ca35 deleted file mode 100644 index cabe2f12a0b4bd2d4d08f409ad9700f8b56733be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmcIkyKdA#6m=wu$Ul(Q4Gof$d5MYeP2j<|!e;%&aH70!2=Ckv3b zXatN_0>9!6VU9A@F@zhgAX1P}L>Q094KtuP4nYjFU8KnN#7;Os>ENo;vXcT{)lRmUrpZpY6?x5Q z-}k9Kbe|+idoN7Z#)RO%5SrOz#rRsFFYhf>aVcJ3+THWUt$dODahSH^Bw9_w)y8@h z|6Y{uQVDB~Xmg+Ie(pcCx!1Y_qFcJ-=`Gw*cb5gdWrNn_RqkmmzLx7h4KQ~OV18K4 zoliV;FHV>|-@NaS-Fkx)?(!T{W$J>>TK}K>cSnEw&a>QKd8TR-u*_f~7%?nU3JWT@ z5sDBFC1il3AjkrfK@9;4AYq+OpcQ9AD8>LLIJoIANW$c)sf2c8$N6bJ`@oJ)hhgL{ z&QE5kEh3}Mv$L~lwQ;_?SXeBLq#|~PYNa?(Qey-F(=ALOf`-{MqhTGTENjY%>1#j) zwFHd4d8JJ4F=p#O#p2kiGXY}6(z(M}nlh?-W92mG0YQ{f+n!-2NlW&htqx}* zOL98f#P!$Oj?yg0XoE+wj=}N5W8ts}b39+$NR)~gQMSs`OhN_0>}XEx=OibzOiFW7 zmR$C2JEhxOgfWuisl*~>MTrZ<>7eU+zGY5=(cDQpy?aqOREXiuFx+|Y5JoFS|M`xR zHy>|vda45t3;GRlrr+y@sdL%3-8YmdkKW}UthMdam-~j%`Y>o2Dii?VZu>pQbvs?x z4_pl<3`d!ZyyJ_D7rsZ{PJ+xkcAdH)mf->nfTihV#B2!MKeL!Re}4Dg)BsB{#peyX zQkO1GJA7oBcL69_BP~rUfjVvPe*n9sDOA!dU~Ns;f%sQlRAmbGYM$Y_q9Ke=(Y4*& zZ|_E34*)fwmSOOX{(2OvcHD!{+;-in;a(grdbV~l3{##sspQwtNeWMJ`D?G#cvcU7 z!`5={{(-F(ZMAaKQ_KBxm6yMr+@HJ3Q_HHlDuIdA6ts-0`d(G9m3n5$5|vYF^{pX% zdI(1c$u4{x!(D6B!a^{Syu?x>f|bL;1OqPEjE?abgim6iN1RGPiy6x4c*{Ef0VKiG AGXMYp literal 0 HcmV?d00001 diff --git a/fuzz/corpus/f2e152e92bc24a81ab1991c522d153d4df991f08 b/fuzz/corpus/bfdf543f7ed0b3357ea9412c4f348ff187e4675b similarity index 60% rename from fuzz/corpus/f2e152e92bc24a81ab1991c522d153d4df991f08 rename to fuzz/corpus/bfdf543f7ed0b3357ea9412c4f348ff187e4675b index 155027a5b76bcb90bc9d4abd3e116897471f43d2..d44617e74506744e0b2ff6d04486727ff8dcf2ba 100644 GIT binary patch delta 131 zcmbQh)5Ei2EhA&)@#&dGsgB{g!4^g)24-fSL9YJk|0gRjU7GC2s5E&S zv&`fIrY0!+C0{^BAXhq?3gA8!@bPNyn Zc8xSNGFH-=T+gh<;m-g8lV`J*0svA+DEt5b delta 125 zcmeC-nZUDQE#qV^R)NWT8GR?lrcW+rYMgAt(mYw8(Q)!M=9fU)-TeQ5|Npio23#pg zDT;Yqd5Hy?`uh4-3=HB0mYElSyl`M(U_5Bc$dIX+rvL>EATU{qRe$0~8)47vtN^!g VBe$ZATyOWpqzX?bzsb{CO94e?C$azl diff --git a/fuzz/corpus/c28561680557d4ff1ed68711ae40bad13da1c153 b/fuzz/corpus/c28561680557d4ff1ed68711ae40bad13da1c153 deleted file mode 100644 index 05b2b043aadd1f505e97069c7b06185494f1bd22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482 zcma)&K~BRk5JlY`@`@uk*|4FF)1*#QDT@GUl}#&Ap{`Km7{{>^*;VSo0&xY7z%@8V zPXJdbX}bv$2);BL&1f|L&7`-zPwcMM{*<(|?x=zQ^nl|yll|U8)PF0kl36;3aBv0= zk`0en%lGlnXCB;CSuGzgc_!MnK7^30k)wgoTGV{I;SJNua7EWL@?8?xupGznvT`ZO zce^4W;&P@){sMbIS_&cLj)Er@NeeAQ`~@uUlL7z$ diff --git a/fuzz/corpus/ccf24291cf3b79fdb76f5167ce906d88fc4f8f6d b/fuzz/corpus/ccf24291cf3b79fdb76f5167ce906d88fc4f8f6d new file mode 100644 index 0000000000000000000000000000000000000000..62a03cb3a1826a4e9214c962e4074d5b6840ccb3 GIT binary patch literal 22 ecmWIWW@U5te7cB{QAzsg#-~pim^m+5vjG57F9&=8 literal 0 HcmV?d00001 diff --git a/fuzz/corpus/d70ab28b9ce57ee55b6604f84972cea6255093e4 b/fuzz/corpus/d70ab28b9ce57ee55b6604f84972cea6255093e4 deleted file mode 100644 index 01e9ad53e357b4db71b78a6a9816e84fc3860b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmcgs%}&BV5U$td0lYTG6G>@7ia=sQ!DX`nK`Wr%tfaz5WUG_}(H9^bd;{Xkc=6`R zC*Z=xt2f*(f-Bf4Bszy~yYu(Wbmqe*EFw(TBuOHsO%Vx4wzQDtIKy6#(ptlAx9r(n zD^#QGg4(slb(J<2Z8 z=D>4)drX0NNk4%2B=wJ>#lpH*j8BYYGN|G?pk5EY;_(l%T;XE1i1pi(ZQUAtD^iDc zEG3&i$>SU}IL7lq0+hGylC}dBPheqJHV+MX-%OHM*%MbjyOG_x<#K%*B3zhQj7Fnk zkV*e(-637eAv>UHjmN60K0YKRM_MO|Hvq=-ZYHi6B`D|MiK6IC3HC5PJT`FFFmmZ~ zJzR;Aa1|owEFQ1xh3?UDy}LX>UV)G(I!p9?&r*Tbl~!#z3NlPKs4!z1nRFha*^4($ zyfoHLW_v2y@}{i**j(Lp>bWpX|2EZgi@D^E-2It+(#Eg0?~{;xcDRT2`zq+i*?bVz}`RX*n!C diff --git a/fuzz/corpus/e245e2f884af2d01bea253673200a29f51363fa2 b/fuzz/corpus/e245e2f884af2d01bea253673200a29f51363fa2 new file mode 100644 index 0000000000000000000000000000000000000000..cf8ca01e03a324dabc6a8ceb32eefcf50bdc9016 GIT binary patch literal 628 zcma*fxt5wx00v-dUSL}4aOQxD0&~t3$_`h!vbapgBC_d4ya-xPmpZK{?~x)^nmk7; zn`zUTWYVR|*Z#}I)F=9EDY3H8+i*T}wb6>Gg5$A8bxi8Rlc_K;NqC#OQ0HR-gf`;K zc)KoKi`f|?cD4}PPynD1hc00I4tMh4>9Uw0Y^xK;R&`k<-@be$|Ht)u?RBUN9u=?# zx+zc8AD>?BP7NNlk$j^<&d&FUAq(u*7_%Yjm-+#ap49;b%70p7ZUHqC(6kPaA_jo~!W zl#j$rt8%{|SGBPVQip=dY>AS5u$Sn=It5C^t`;C#?i|*kG_>)?BFCI&&Jbya^a7f) zE1N2au%`28No`P3I=I3~OxXg%hnf|`@M6xFU0KnEo1eJEQ#3sFwo%S9b$IG;jkwut zOTI0vA#M3Fi=`q7U6vDs4AJLAqI?1Hbq*r0FF-@$giY0HR1W7r97k<9EVIixDG`Td q!#&o0+8VmH+0L=Xfb+nQ4nDu(QMybaWb97TmBVo~p2yhf6Tbk;a>+IT literal 0 HcmV?d00001 diff --git a/fuzz/corpus/252af097b44b1c571e2fec486bf9d43b0de83e67 b/fuzz/corpus/e37d1023facd1a69aba512862e3a17b645a272f8 similarity index 68% rename from fuzz/corpus/252af097b44b1c571e2fec486bf9d43b0de83e67 rename to fuzz/corpus/e37d1023facd1a69aba512862e3a17b645a272f8 index 41952b898f4d747ba3a2c62fd32a6dff0e27c92b..d45ddca7850c01e4133f4f754d7875ef6af917c5 100644 GIT binary patch delta 183 zcmX@W)549shOdLr6HJQ zXl`MsTUu;rq%@h4MRoE4My|=WjB*n*@~L1Px# delta 167 zcmZqWIlwdF`sDM>(Ua#hb5Ay4N}VjgA~jiok!A7%X5PsMn3R;~5eAdBSd+vE63#TOp2Q&nV&NO$7kgR7A!A diff --git a/fuzz/corpus/bc9797a20ed98191b62330efbd4766317202c7a1 b/fuzz/corpus/e82b7fbdf33f60dbc111d5b05b1f5f9b0e93c1c0 similarity index 63% rename from fuzz/corpus/bc9797a20ed98191b62330efbd4766317202c7a1 rename to fuzz/corpus/e82b7fbdf33f60dbc111d5b05b1f5f9b0e93c1c0 index e03ecc55c51776d9dba9701034e7a0bda37f36d1..ef458cdf8a368aedb5d601c60ad4f0397e0bd56a 100644 GIT binary patch delta 68 zcmeC>>E+pw%E)+pay^sx=8cTgn7GpO^V4%uON&#BCL1zqPUd6epS+zhV6q~k3q;lA Vjf^3a_p++9a56A3On$+t3IHGl71jU% delta 341 zcmeC>>E+pw$~d`>$!BsVYslpN%%Yp6m~@#YpJ(Bk%+4e{*@8(lNP%)-W@>DfoS(g(%UF))Z1WLo~X_`(6JoeT;J`LXFa z>6s<*CGWFS^Av0ql+x7<Etf@$(YX0^%kEJ~aAu<$a1IGg2Jo-zUeyP^us delta 283 zcmZqSY2lgRlU&TmQ0$#rsbH(%=vkE*T$z)amtK-#k!Y4=Xpm-ZW@3<%lu}`kY@BS6 zW@%<>YHWriRpIXG7#?h7Xkuz+Xklq+Xq2gd44fPty`4fc3?|QKG=z(X>gOdU<)kW< zFPZBEtAjW43=!hlF9juGCaDvx?H}Vp3V`Do=!k13xW>V=o7&-`2ef= HBsLZR^=MEr diff --git a/fuzz/corpus/eeaaa652952fef8117a481d1d7d2438fc815f646 b/fuzz/corpus/eeaaa652952fef8117a481d1d7d2438fc815f646 new file mode 100644 index 0000000000000000000000000000000000000000..043d2955bd5acdfa75401e8a6d7c43ffd9704a5e GIT binary patch literal 1547 zcmdUv&u-d45XRH1U!d2BLoT$kH^%llQq>v*!Nz6{=D$>-wJ~dB%sR&4;5W#nQXi-1 zs_HRM(dVGhM2MtPTPbO!&S`fKGqdyk<~w_FatKNSH^DB?EW`0USbJjtxj4KsQN_%V75GfZij17;9z z^LeK>GP_nDMU6}BTx;d#ioLl>Q*iP5)0dCT0>=T%vKLB2Q#7+*DOI}=SuNA93j-#` z%VkEB$*IP#8#T_FP9ZAh#mzD_%6CI zQiS--ktj0ij*w)3N37S!YHgogtsP0=oCks^0ht4UF9A`4+<}_A17z@yrN^_ht$|rb zLhEU>{Jluuexa%RpZC9K@_FWX$0U8kv+t=cKf8=dg4EhjA8F`m)g$s8r9*B z^unt@w+eLc#VZyGvw^*Gdja-3$dJ@r4_@tYOM73$}K}z4eIf%3np=*M<*vQ&)#v#c1syX#(w)d D$k-j9 literal 0 HcmV?d00001 diff --git a/fuzz/corpus/29229f0031d9d1c7c478872f9efeda629d65f46c b/fuzz/corpus/f1576ad4c302fb698373747fcffbb0b0a2df6c29 similarity index 90% rename from fuzz/corpus/29229f0031d9d1c7c478872f9efeda629d65f46c rename to fuzz/corpus/f1576ad4c302fb698373747fcffbb0b0a2df6c29 index ea67880ed384900c01a3c51e1f69f964d193bb83..34d165884db34ef65e4da55ed27f679a9839312c 100644 GIT binary patch delta 34 lcmbQmGmB@!EXJsbjWUzvSy&l0H|{NC;m~7%fXUXZ_W`YH2(A=IH zh82G1Cg!=hiJ3W88JW2p3=oi#m}X#TWN2n;W@uq)2xOUG=$qh9Fni z7Ubn;Dux0b12PokKJEXEAWPteU$_7?|3yKj5tSW{Vs30=LB4Hh9>kB}a3Up8AOXw3 zAYQ7aEHugkv$!5E%Yk1;BvXP*P&x;AWNQkmptc Ti9)OR_>$y|_~-fA@eB+AQrH5n diff --git a/fuzz/corpus/e6bd00e96e6c368c349dab060901d530645566b3 b/fuzz/corpus/fb21fb8e72d920be23bc8ab42434cb6aee4bfdfa similarity index 91% rename from fuzz/corpus/e6bd00e96e6c368c349dab060901d530645566b3 rename to fuzz/corpus/fb21fb8e72d920be23bc8ab42434cb6aee4bfdfa index 817b0868314c3a502aa8d08074175b4d0c8e607a..6fa4085909f646322e995656f892d579acf12674 100644 GIT binary patch delta 77 zcmV~$!3}^Q3Us@!S;2042< cD9mOJ6mcjkq|O)}KxT<p>9fY~l;(KYAP2A6mALx6ZmzVdxpZ9s6bR@yVz!uWu z!T%#3)U&K_H#%t1Y*@%MsSfhc?wDj`nRu>e;rmv{LO~@6lJ&GL+fq~D|1LHV_5277g$_F* zlNH9LoS^W6kQD_fms4VG10u7KC{9G0r^CF+vqsZc#>+4@Ni+zN>l-f_#-^{+(bx4y z;50A*#0G6g1`W(%2`&VlA?qy{*=A1#C9MxAJA7OS?Fr354(g9p|XbxUp~Z#v=L0b(k5=f zU;3C*zqg~;K&n^{g$y}gYHV;w+A?QK$M7l+mQj|Z4HY@7hJ`}z_Z}&+(+|U*eX{Fi zZ-FMXis~ljN;QrCNM!Yf&cm*iB}=QA9Q zI}IG`vZx&dSd@CK7ls!x!z@ShE~5V4%!#>qmP9ccrPa|O;EMsiF@W7@kVoIw)`CD# zH(tMc#@6Vf(V)OE&cO;n4aww-DBi3P`W)D>>t^nGZVoXXv9o51z(A~H+^kdGc*_4ZSJ!p_L|5q7{5 j?sg0SI~}|Pf;RGjXD)P2KL7y+`nM None: with open(os.path.join(dirpath, filename), "rb") as input_file: output_file.write(input_file.read()) samples_file_count += 1 - assert samples_file_count == SAMPLES_FILES_COUNT + self.assertEqual(SAMPLES_FILES_COUNT, samples_file_count) content_provider = TextProvider([zip_file_path]) file_extractors = content_provider.get_scannable_files(cs.config) assert len(file_extractors) == 1 # single extractor zip_scan_results = cs.file_scan(file_extractors[0]) + self.assertEqual(len_samples_scan_results, len(zip_scan_results)) + cs.credential_manager.set_credentials(zip_scan_results) cs.post_processing() cs.export_results() - assert len_samples_scan_results == len(zip_scan_results) assert os.path.isfile(report_path_1) with open(report_path_1) as f: report = json.load(f) diff --git a/tests/file_handler/test_string_content_provider.py b/tests/file_handler/test_string_content_provider.py index 1570706f5..5fa885c98 100644 --- a/tests/file_handler/test_string_content_provider.py +++ b/tests/file_handler/test_string_content_provider.py @@ -1,22 +1,47 @@ -from typing import List - -import pytest - from credsweeper.file_handler.analysis_target import AnalysisTarget from credsweeper.file_handler.string_content_provider import StringContentProvider class TestStringContentProvider: - @pytest.mark.parametrize("lines", [["line one", "password='in_line_2'"]]) - def test_get_analysis_target_p(self, lines: List[str]) -> None: + def test_get_analysis_target_p(self) -> None: """Evaluate that lines data correctly extracted from file""" + lines = ["line one", "password='in_line_2'"] content_provider = StringContentProvider(lines) analysis_targets = content_provider.get_analysis_target() + assert len(analysis_targets) == len(lines) + expected_target = AnalysisTarget(lines[0], 1, lines, "", "", "") + assert analysis_targets[0] == expected_target + # check second target and line numeration + expected_target = AnalysisTarget(lines[1], 2, lines, "", "", "") + assert analysis_targets[1] == expected_target - assert len(analysis_targets) == len(lines) + # specific line numeration + content_provider = StringContentProvider(lines, [42, -1]) + analysis_targets = content_provider.get_analysis_target() + assert analysis_targets[0].line_num == 42 + assert analysis_targets[1].line_num == -1 - target = analysis_targets[0] - assert target == expected_target + def test_get_analysis_target_n(self) -> None: + """Negative cases check""" + # empty list + content_provider = StringContentProvider([]) + analysis_targets = content_provider.get_analysis_target() + assert len(analysis_targets) == 0 + + # mismatched amount of lists + content_provider = StringContentProvider(["a", "b", "c"], [2, 3]) + analysis_targets = content_provider.get_analysis_target() + assert len(analysis_targets) == 3 + assert analysis_targets[0].line_num == 1 + assert analysis_targets[1].line_num == 2 + assert analysis_targets[2].line_num == 3 + + content_provider = StringContentProvider(["a", "b", "c"], [5, 3, 4, 5]) + analysis_targets = content_provider.get_analysis_target() + assert len(analysis_targets) == 3 + assert analysis_targets[0].line_num == 1 + assert analysis_targets[1].line_num == 2 + assert analysis_targets[2].line_num == 3 diff --git a/tests/samples/encoded b/tests/samples/encoded new file mode 100644 index 000000000..20a58a227 --- /dev/null +++ b/tests/samples/encoded @@ -0,0 +1,7 @@ + +XG5naXRfdG9rZW4gPSAiZ2lyZW9naWNyYWNrbGVjcmFja2xlMTIzMTU2NzE5MDEx + + MzQxMzk4MSJc + +blxuCg== + diff --git a/tests/samples/password.docx b/tests/samples/password.docx new file mode 100644 index 0000000000000000000000000000000000000000..6d6db3a52ef375600d13248073e819f4949baed2 GIT binary patch literal 4306 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 None: # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + def test_encoded_p(self) -> None: + # test for finding credentials in docx + content_provider: FilesProvider = TextProvider([SAMPLES_DIR / "encoded"]) + # depth must be set in constructor to remove .zip as ignored extension + cred_sweeper = CredSweeper(depth=5) + cred_sweeper.run(content_provider=content_provider) + found_credentials = cred_sweeper.credential_manager.get_credentials() + assert len(found_credentials) == 2 + assert {"Token", "Github Old Token"} == set(i.rule_name for i in found_credentials) + assert found_credentials[0].line_data_list[0].value == "gireogicracklecrackle1231567190113413981" + + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + def test_docx_p(self) -> None: + # test for finding credentials in docx + content_provider: FilesProvider = TextProvider([SAMPLES_DIR / "password.docx"]) + # depth must be set in constructor to remove .zip as ignored extension + cred_sweeper = CredSweeper(depth=5) + cred_sweeper.run(content_provider=content_provider) + found_credentials = cred_sweeper.credential_manager.get_credentials() + assert len(found_credentials) == 1 + assert found_credentials[0].line_data_list[0].value == "Xdj@jcN834b." + + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + def test_docx_n(self) -> None: + # test docx - no credential should be found without 'depth' + content_provider: FilesProvider = TextProvider([SAMPLES_DIR / "password.docx"]) + # depth must be set in constructor to remove .zip as ignored extension + cred_sweeper = CredSweeper() + cred_sweeper.run(content_provider=content_provider) + found_credentials = cred_sweeper.credential_manager.get_credentials() + assert len(found_credentials) == 0 + + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + def test_exclude_value_p(self) -> None: cred_sweeper = CredSweeper(use_filters=True, exclude_values=["cackle!"]) files = [SAMPLES_DIR / "password"]