Cowrie SSH/Telnet Honeypot https://docs.cowrie.org/
This report presents the forensic synthetic code analysis of cowrie/cowrie, a Python project with 6,482 GitHub stars. SynthScan v2.0 examined 57,703 lines of code across 360 source files, recording 1313 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 31.4 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1313 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 172 | def test_filesystem_consistency(self, client: paramiko.SSHClient) -> bool: | CODE |
| LOW | src/cowrie/llm/protocol.py | 250 | def _process_command_with_llm(self, command: str) -> None: | CODE |
| LOW | src/cowrie/core/utils.py | 159 | def get_endpoints_from_section( | CODE |
| LOW | src/cowrie/test/test_parser.py | 51 | def test_stderr_to_devnull_inline(self) -> None: | CODE |
| LOW | src/cowrie/test/test_parser.py | 73 | def test_multiple_redirections(self) -> None: | CODE |
| LOW | src/cowrie/test/test_parser.py | 87 | def test_redirect_without_target(self) -> None: | CODE |
| LOW | src/cowrie/test/test_parser.py | 121 | def test_redirect_both_stdout_stderr(self) -> None: | CODE |
| LOW | src/cowrie/test/test_parser.py | 133 | def test_redirect_both_append(self) -> None: | CODE |
| LOW | src/cowrie/test/test_parser.py | 139 | def test_redirect_both_inline_target(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 18 | def test_returns_bytes_for_existing_resource(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 23 | def test_raises_file_not_found_for_missing_resource(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 27 | def test_raises_file_not_found_for_missing_subpath(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 31 | def test_raises_file_not_found_for_directory(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 39 | def test_raises_file_not_found_for_directory_via_empty_subpath(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 49 | def test_yields_readable_binary_stream(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 55 | def test_raises_file_not_found_for_missing_resource(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_resources.py | 60 | def test_raises_file_not_found_for_directory(self) -> None: | CODE |
| LOW | src/cowrie/test/test_reversedns.py | 72 | def test_second_connect_same_ip_dispatches_again(self) -> None: | CODE |
| LOW | src/cowrie/test/test_reversedns.py | 83 | def test_forward_after_connect_same_ip_dispatches(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_reversedns.py | 100 | def test_timeout_is_not_cached(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_reversedns.py | 106 | def test_servfail_is_not_cached(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_reversedns.py | 112 | def test_invalid_ip_does_no_lookup(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 36 | def test_top_level_cd_persists(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 40 | def test_substitution_sees_its_own_cd(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 44 | def test_substitution_cd_does_not_leak(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 48 | def test_substitution_inherits_parent_cwd(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 54 | def test_nested_sh_cd_does_not_leak(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_shell_cwd.py | 58 | def test_relative_path_resolves_against_shell_cwd(self) -> None: | CODE |
| LOW | src/cowrie/test/test_jsonlog.py | 35 | def test_rotation_never_splits_an_event(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 54 | def test_failed_download_removes_temp_artifact(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 77 | def test_tcp_timeout_reports_connection_timed_out(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 98 | def test_missing_host_reports_error_without_crashing(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 106 | def test_exit_removes_empty_artifact(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 122 | def test_artifact_close_is_idempotent(self) -> None: | CODE |
| LOW | src/cowrie/test/test_curl.py | 142 | def test_late_download_callbacks_after_exit_are_inert(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 198 | def test_get_binds_agent_to_out_addr(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 203 | def test_head_binds_agent_to_out_addr(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 208 | def test_default_bind_is_wildcard(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 256 | def test_dash_output_streams_body_to_stdout(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 260 | def test_dash_output_creates_no_honeyfs_file(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_curl.py | 264 | def test_substitution_captures_dash_output_body(self) -> None: | CODE |
| LOW | src/cowrie/test/test_protocol_keystroke.py | 43 | def test_nul_byte_logs_no_warning(self) -> None: | CODE |
| LOW | src/cowrie/test/test_protocol_keystroke.py | 54 | def test_nul_byte_does_not_reach_line_buffer(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_pool_config.py | 36 | def test_returns_bundled_when_override_unset(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_pool_config.py | 43 | def test_operator_override_wins(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_pool_config.py | 49 | def test_missing_in_override_falls_through_to_bundled(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_pool_config.py | 56 | def test_missing_everywhere_raises(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_greynoise.py | 52 | def test_response_never_received_is_handled(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_greynoise.py | 57 | def test_cancelled_error_is_handled(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_greynoise.py | 60 | def test_dns_lookup_error_is_handled(self) -> None: | CODE |
| LOW | src/cowrie/test/test_utils.py | 42 | def test_get_endpoints_from_section(self) -> None: | CODE |
| LOW | src/cowrie/test/test_utils.py | 105 | def test_create_endpoint_services(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 33 | def test_cut_single_field_tab_delimiter(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 38 | def test_cut_second_field_tab_delimiter(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 43 | def test_cut_custom_delimiter(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 63 | def test_cut_open_start_range(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 73 | def test_cut_no_delimiter_in_line(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 78 | def test_cut_no_delimiter_with_s_flag(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 83 | def test_cut_field_out_of_range(self) -> None: | CODE |
| LOW⚡ | src/cowrie/test/test_cut.py | 88 | def test_cut_missing_field_spec(self) -> None: | CODE |
| 634 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/advanced-honeypot-tests.py | 12 | CODE | |
| LOW | .github/scripts/advanced-honeypot-tests.py | 14 | CODE | |
| LOW | .github/scripts/advanced-honeypot-tests.py | 15 | CODE | |
| LOW | src/cowrie/llm/telnet.py | 9 | CODE | |
| LOW | src/cowrie/llm/server.py | 6 | CODE | |
| LOW | src/cowrie/llm/protocol.py | 6 | CODE | |
| LOW | src/cowrie/llm/session.py | 5 | CODE | |
| LOW | src/cowrie/llm/llm.py | 8 | CODE | |
| LOW | src/cowrie/llm/llm.py | 34 | CODE | |
| LOW | src/cowrie/llm/avatar.py | 6 | CODE | |
| LOW | src/cowrie/llm/realm.py | 5 | CODE | |
| LOW | src/cowrie/core/auth.py | 10 | CODE | |
| LOW | src/cowrie/core/config.py | 10 | CODE | |
| LOW | src/cowrie/core/artifact.py | 25 | CODE | |
| LOW | src/cowrie/core/checkers.py | 10 | CODE | |
| LOW | src/cowrie/core/credentials.py | 5 | CODE | |
| LOW | src/cowrie/core/cef.py | 10 | CODE | |
| LOW | src/cowrie/core/fingerprint.py | 22 | CODE | |
| LOW | src/cowrie/core/events.py | 16 | CODE | |
| LOW | src/cowrie/core/ocsf.py | 21 | CODE | |
| LOW | src/cowrie/core/ttylog.py | 11 | CODE | |
| LOW | src/cowrie/core/utils.py | 6 | CODE | |
| LOW | src/cowrie/core/network.py | 20 | CODE | |
| LOW | src/cowrie/core/resources.py | 8 | CODE | |
| LOW | src/cowrie/core/uuid.py | 6 | CODE | |
| LOW | src/cowrie/core/output.py | 5 | CODE | |
| LOW | src/cowrie/test/test_parser.py | 8 | CODE | |
| LOW | src/cowrie/test/fake_server.py | 6 | CODE | |
| LOW | src/cowrie/test/test_command.py | 8 | CODE | |
| LOW | src/cowrie/test/test_resources.py | 8 | CODE | |
| LOW | src/cowrie/test/test_reversedns.py | 8 | CODE | |
| LOW | src/cowrie/test/test_cat.py | 5 | CODE | |
| LOW | src/cowrie/test/test_shell_cwd.py | 8 | CODE | |
| LOW | src/cowrie/test/test_jsonlog.py | 8 | CODE | |
| LOW | src/cowrie/test/test_curl.py | 8 | CODE | |
| LOW | src/cowrie/test/test_protocol_keystroke.py | 6 | CODE | |
| LOW | src/cowrie/test/test_pool_config.py | 8 | CODE | |
| LOW | src/cowrie/test/test_greynoise.py | 8 | CODE | |
| LOW | src/cowrie/test/test_utils.py | 5 | CODE | |
| LOW | src/cowrie/test/test_cut.py | 4 | CODE | |
| LOW | src/cowrie/test/fake_transport.py | 6 | CODE | |
| LOW | src/cowrie/test/test_exec_shell_stdin.py | 8 | CODE | |
| LOW | src/cowrie/test/test_proxy_packet_buffer.py | 8 | CODE | |
| LOW | src/cowrie/test/test_kafka.py | 8 | CODE | |
| LOW | src/cowrie/test/test_insults_events.py | 8 | CODE | |
| LOW | src/cowrie/test/test_session_duration.py | 8 | CODE | |
| LOW | src/cowrie/test/test_ftpget.py | 5 | CODE | |
| LOW | src/cowrie/test/test_ftpget.py | 33 | CODE | |
| LOW | src/cowrie/test/test_ftpget.py | 39 | CODE | |
| LOW | src/cowrie/test/test_llm.py | 8 | CODE | |
| LOW | src/cowrie/test/test_awk.py | 4 | CODE | |
| LOW | src/cowrie/test/test_bashparse.py | 8 | CODE | |
| LOW | src/cowrie/test/test_ssh_userauth.py | 8 | CODE | |
| LOW | src/cowrie/test/test_telnet_transport.py | 8 | CODE | |
| LOW | src/cowrie/test/test_cowrie_script.py | 8 | CODE | |
| LOW | src/cowrie/test/test_test_builtin.py | 8 | CODE | |
| LOW | src/cowrie/test/test_auth.py | 8 | CODE | |
| LOW | src/cowrie/test/test_shell_events.py | 8 | CODE | |
| LOW | src/cowrie/test/test_exec_builtin.py | 8 | CODE | |
| LOW | src/cowrie/test/test_filetransfer.py | 8 | CODE | |
| 221 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | .github/scripts/advanced-honeypot-tests.py | 180 | stdin, stdout, stderr = client.exec_command('ls -la /bin/bash /bin/sh /usr/bin/python* 2>/dev/null || echo " | CODE |
| HIGH⚡ | .github/scripts/advanced-honeypot-tests.py | 205 | stdin, stdout, stderr = client.exec_command('netstat -an 2>/dev/null || ss -an') | CODE |
| HIGH⚡ | .github/scripts/advanced-honeypot-tests.py | 214 | stdin, stdout, stderr = client.exec_command('ip addr || ifconfig') | CODE |
| HIGH⚡ | src/cowrie/test/test_bashparse.py | 213 | statements = self.parser.parse("a && b || c") | CODE |
| HIGH⚡ | src/cowrie/test/test_bashparse.py | 213 | statements = self.parser.parse("a && b || c") | CODE |
| HIGH⚡ | src/cowrie/test/test_bashparse.py | 393 | statements = self.parser.parse("true && for i in 1; do echo $i; done") | CODE |
| HIGH⚡ | src/cowrie/test/test_test_builtin.py | 53 | self.proto.lineReceived(b"true && echo yes") | CODE |
| HIGH⚡ | src/cowrie/test/test_test_builtin.py | 58 | self.proto.lineReceived(b"false || echo recovered") | CODE |
| HIGH⚡ | src/cowrie/test/test_exec_builtin.py | 71 | self.assertEqual(self.run_line(b"exec 2>/dev/null; echo $?"), b"0\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_script_execution.py | 173 | b"printf 'for u in a b c\\ndo\\necho fetch $u && break\\ndone\\n'" | CODE |
| HIGH | src/cowrie/test/test_flow_control.py | 219 | "echo fetch $url && break; done" | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 60 | self.assertEqual(self.run_line(b"true && echo ran"), b"ran\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 61 | self.assertEqual(self.run_line(b"false && echo ran"), b"") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 64 | self.assertEqual(self.run_line(b"false || echo ran"), b"ran\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 65 | self.assertEqual(self.run_line(b"true || echo ran"), b"") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 69 | self.assertEqual(self.run_line(b"false && echo a || echo b"), b"b\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 69 | self.assertEqual(self.run_line(b"false && echo a || echo b"), b"b\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 71 | self.assertEqual(self.run_line(b"true && echo a || echo b"), b"a\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 71 | self.assertEqual(self.run_line(b"true && echo a || echo b"), b"a\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 75 | self.assertEqual(self.run_line(b"false && echo x; echo $?"), b"1\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 90 | self.assertEqual(self.run_line(b"bash -c false && echo ran"), b"") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 97 | out = self.run_line(b"dd if=/nonexistentfile && echo ran") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 145 | self.assertEqual(self.run_line(b"echo $(true || echo x)"), b"\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_exit_status.py | 146 | self.assertEqual(self.run_line(b"echo $(false || echo y)"), b"y\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_echo.py | 177 | self.proto.lineReceived(b"(echo first && echo second)") | CODE |
| HIGH⚡ | src/cowrie/test/test_echo.py | 185 | self.proto.lineReceived(b"(echo first || echo second)") | CODE |
| HIGH⚡ | src/cowrie/test/test_async_substitution.py | 95 | self.proto.lineReceived(b"echo $(fakeasync && echo ok)\n") | CODE |
| HIGH⚡ | src/cowrie/test/test_async_substitution.py | 100 | self.proto.lineReceived(b"echo $(fakeasync && echo ok)\n") | CODE |
| HIGH | src/cowrie/shell/parser.py | 6 | # ABOUTME: Handles FD redirections like 2>/dev/null, stdin redirects, and command substitution. | COMMENT |
| HIGH | src/cowrie/shell/honeypot.py | 269 | A subshell is queued as one unit so its join operator (e.g. the || in | STRING |
| HIGH | src/cowrie/commands/fs.py | 62 | self.writeBytes(b"\t[--null] [pattern] [file ...]\n") | CODE |
| HIGH | src/cowrie/commands/ftpget.py | 234 | self.write("ftpget: cmd (null) (null)\n") | CODE |
| HIGH | src/cowrie/commands/ftpget.py | 255 | self.write("ftpget: cmd TYPE I (null)\n") | CODE |
| HIGH | src/cowrie/commands/ftpget.py | 256 | self.write("ftpget: cmd PASV (null)\n") | CODE |
| HIGH | src/cowrie/commands/ftpget.py | 279 | self.write("ftpget: cmd (null) (null)\n") | CODE |
| HIGH | src/cowrie/commands/ftpget.py | 280 | self.write("ftpget: cmd QUIT (null)\n") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 167 | except Exception as e: | CODE |
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 218 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 62 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 88 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 112 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 139 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 192 | except Exception as e: | CODE |
| LOW | .github/scripts/advanced-honeypot-tests.py | 258 | except Exception as e: | CODE |
| LOW | src/cowrie/llm/telnet.py | 76 | except Exception: | CODE |
| LOW | src/cowrie/llm/protocol.py | 159 | except Exception: | CODE |
| LOW | src/cowrie/core/auth.py | 185 | except Exception: | CODE |
| LOW | src/cowrie/core/fingerprint.py | 153 | except Exception as e: | CODE |
| LOW | src/cowrie/core/fingerprint.py | 227 | except Exception as e: | CODE |
| LOW | src/cowrie/core/events.py | 124 | except Exception as e: # one sink must not stop the rest | CODE |
| LOW | src/cowrie/core/network.py | 171 | except Exception as e: | CODE |
| LOW | src/cowrie/shell/protocol.py | 120 | except Exception: | CODE |
| LOW | src/cowrie/shell/protocol.py | 135 | except Exception: | CODE |
| LOW | src/cowrie/shell/protocol.py | 489 | except Exception: | CODE |
| MEDIUM | src/cowrie/shell/protocol.py | 486 | def displayMOTD(self) -> None: | CODE |
| LOW | src/cowrie/shell/pwd.py | 39 | except Exception: | CODE |
| LOW | src/cowrie/shell/pwd.py | 153 | except Exception: | CODE |
| LOW | src/cowrie/shell/fs.py | 129 | except Exception: | CODE |
| LOW | src/cowrie/shell/fs.py | 153 | except Exception as e: | CODE |
| LOW | src/cowrie/shell/fs.py | 421 | except Exception: | CODE |
| LOW | src/cowrie/shell/fs.py | 436 | except Exception: | CODE |
| LOW | src/cowrie/shell/fs.py | 453 | except Exception: | CODE |
| LOW | src/cowrie/shell/pipe.py | 283 | except Exception: | CODE |
| LOW | src/cowrie/shell/honeypot.py | 1036 | except Exception: | CODE |
| LOW | src/cowrie/output/rmq.py | 90 | except Exception as e: | CODE |
| LOW | src/cowrie/output/rmq.py | 147 | except Exception as e: | CODE |
| LOW | src/cowrie/output/postgresql.py | 76 | except Exception as e: | CODE |
| MEDIUM | src/cowrie/output/postgresql.py | 26 | def _runInteraction(self, interaction, *args, **kw): | CODE |
| LOW | src/cowrie/output/dshield.py | 210 | except Exception as e: | CODE |
| LOW | src/cowrie/output/cuckoo.py | 117 | except Exception as e: | CODE |
| LOW | src/cowrie/output/cuckoo.py | 146 | except Exception as e: | CODE |
| LOW | src/cowrie/output/cuckoo.py | 173 | except Exception as e: | CODE |
| LOW | src/cowrie/output/abuseipdb.py | 392 | except Exception as e: | CODE |
| LOW | src/cowrie/output/abuseipdb.py | 408 | except Exception: | CODE |
| MEDIUM | src/cowrie/output/abuseipdb.py | 383 | def http_request(self, params): | CODE |
| LOW | src/cowrie/output/influx.py | 52 | except Exception: | CODE |
| LOW | src/cowrie/output/discord.py | 123 | except Exception: | CODE |
| LOW⚡ | src/cowrie/output/discord.py | 207 | except Exception: | CODE |
| LOW⚡ | src/cowrie/output/discord.py | 212 | except Exception: | CODE |
| LOW⚡ | src/cowrie/output/discord.py | 216 | except Exception: | CODE |
| LOW | src/cowrie/output/mongodb.py | 25 | except Exception as e: | CODE |
| LOW | src/cowrie/output/mongodb.py | 33 | except Exception as e: | CODE |
| LOW | src/cowrie/output/mongodb.py | 57 | except Exception as e: | CODE |
| MEDIUM | src/cowrie/output/mongodb.py | 22 | def insert_one(self, collection, event): | CODE |
| MEDIUM | src/cowrie/output/mongodb.py | 30 | def update_one(self, collection, session, doc): | CODE |
| LOW | src/cowrie/output/misp.py | 301 | except Exception as e: | CODE |
| LOW | src/cowrie/output/prometheus.py | 143 | except Exception as e: | CODE |
| LOW | src/cowrie/output/kafka.py | 105 | except Exception as e: | CODE |
| LOW | src/cowrie/output/kafka.py | 137 | except Exception as e: | CODE |
| LOW | src/cowrie/output/kafka.py | 176 | except Exception as e: | CODE |
| LOW | src/cowrie/output/axiom.py | 68 | except Exception as e: | CODE |
| LOW | src/cowrie/output/malshare.py | 86 | except Exception as e: | CODE |
| LOW | src/cowrie/output/oraclecloud.py | 71 | except Exception as ex: | CODE |
| LOW | src/cowrie/output/mysql.py | 90 | except Exception as e: | CODE |
| MEDIUM | src/cowrie/output/mysql.py | 41 | def _runInteraction(self, interaction, *args, **kw): | CODE |
| LOW | src/cowrie/ssh_proxy/protocols/port_forward.py | 54 | except Exception as e: | CODE |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/cowrie/test/test_output_postgresql.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_mongodb.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_rethinkdblog.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_sqlite.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_mysql.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_slack.py | 0 | construct the plugin without running its config-reading start(). | STRING |
| HIGH | src/cowrie/test/test_output_postgresql.py | 0 | stop() must not raise when start() never created the pool. | STRING |
| HIGH | src/cowrie/test/test_output_sqlite.py | 0 | stop() must not raise when start() never created the pool. | STRING |
| HIGH | src/cowrie/test/test_output_mysql.py | 0 | stop() must not raise when start() never created the pool. | STRING |
| HIGH | src/cowrie/ssh_proxy/client_transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/ssh_proxy/server_transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/ssh/transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/telnet_proxy/client_transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/telnet_proxy/server_transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/telnet/transport.py | 0 | make sure all sessions time out eventually. timeout is reset when authentication succeeds. | STRING |
| HIGH | src/cowrie/telnet_proxy/server_transport.py | 0 | telnet transport and authentication for the honeypot @author: olivier bilodeau <obilodeau@gosecure.ca> | STRING |
| HIGH | src/cowrie/telnet/transport.py | 0 | telnet transport and authentication for the honeypot @author: olivier bilodeau <obilodeau@gosecure.ca> | STRING |
| HIGH | src/cowrie/telnet/userauth.py | 0 | telnet transport and authentication for the honeypot @author: olivier bilodeau <obilodeau@gosecure.ca> | STRING |
| HIGH | src/cowrie/telnet/factory.py | 0 | telnet transport and authentication for the honeypot @author: olivier bilodeau <obilodeau@gosecure.ca> | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/cowrie/core/auth.py | 197 | CODE | |
| LOW | src/cowrie/core/fingerprint.py | 39 | CODE | |
| LOW | src/cowrie/core/fingerprint.py | 167 | CODE | |
| LOW | src/cowrie/core/network.py | 133 | CODE | |
| LOW | src/cowrie/shell/protocol.py | 397 | CODE | |
| LOW | src/cowrie/shell/bashparse.py | 431 | CODE | |
| LOW | src/cowrie/shell/bashparse.py | 855 | CODE | |
| LOW | src/cowrie/shell/fs.py | 257 | CODE | |
| LOW | src/cowrie/shell/pipe.py | 104 | CODE | |
| LOW | src/cowrie/shell/pipe.py | 364 | CODE | |
| LOW | src/cowrie/shell/honeypot.py | 314 | CODE | |
| LOW | src/cowrie/shell/honeypot.py | 372 | CODE | |
| LOW | src/cowrie/shell/honeypot.py | 543 | CODE | |
| LOW | src/cowrie/shell/honeypot.py | 720 | CODE | |
| LOW | src/cowrie/shell/honeypot.py | 1010 | CODE | |
| LOW | src/cowrie/output/rmq.py | 103 | CODE | |
| LOW | src/cowrie/output/postgresql.py | 109 | CODE | |
| LOW | src/cowrie/output/dshield.py | 96 | CODE | |
| LOW | src/cowrie/output/abuseipdb.py | 45 | CODE | |
| LOW | src/cowrie/output/abuseipdb.py | 142 | CODE | |
| LOW | src/cowrie/output/influx.py | 113 | CODE | |
| LOW | src/cowrie/output/misp.py | 93 | CODE | |
| LOW | src/cowrie/output/misp.py | 304 | CODE | |
| LOW | src/cowrie/output/sqlite.py | 60 | CODE | |
| LOW | src/cowrie/output/prometheus.py | 112 | CODE | |
| LOW | src/cowrie/output/hpfeeds3.py | 60 | CODE | |
| LOW | src/cowrie/output/mysql.py | 122 | CODE | |
| LOW | src/cowrie/ssh_proxy/protocols/term.py | 74 | CODE | |
| LOW | src/cowrie/ssh_proxy/protocols/port_forward.py | 29 | CODE | |
| LOW | src/cowrie/ssh_proxy/protocols/sftp.py | 114 | CODE | |
| LOW | src/cowrie/ssh_proxy/protocols/ssh.py | 93 | CODE | |
| LOW | src/cowrie/ssh/forwarding.py | 131 | CODE | |
| LOW | src/cowrie/ssh/forwarding.py | 226 | CODE | |
| LOW | src/cowrie/ssh/userauth.py | 174 | CODE | |
| LOW | src/cowrie/ssh/factory.py | 63 | CODE | |
| LOW | src/cowrie/scripts/playlog.py | 18 | CODE | |
| LOW | src/cowrie/scripts/playlog.py | 104 | CODE | |
| LOW | src/cowrie/scripts/fsctl.py | 798 | CODE | |
| LOW | src/cowrie/scripts/createfs.py | 95 | CODE | |
| LOW | src/cowrie/scripts/createfs.py | 193 | CODE | |
| LOW | src/cowrie/scripts/cowrie.py | 287 | CODE | |
| LOW | src/cowrie/scripts/asciinema.py | 21 | CODE | |
| LOW | src/cowrie/commands/uname.py | 84 | CODE | |
| LOW | src/cowrie/commands/git.py | 20 | CODE | |
| LOW | src/cowrie/commands/wc.py | 72 | CODE | |
| LOW | src/cowrie/commands/tee.py | 35 | CODE | |
| LOW | src/cowrie/commands/base64.py | 29 | CODE | |
| LOW | src/cowrie/commands/curl.py | 219 | CODE | |
| LOW | src/cowrie/commands/curl.py | 489 | CODE | |
| LOW | src/cowrie/commands/chmod.py | 56 | CODE | |
| LOW | src/cowrie/commands/locate.py | 58 | CODE | |
| LOW | src/cowrie/commands/locate.py | 89 | CODE | |
| LOW | src/cowrie/commands/cut.py | 22 | CODE | |
| LOW | src/cowrie/commands/ls.py | 76 | CODE | |
| LOW | src/cowrie/commands/ls.py | 126 | CODE | |
| LOW | src/cowrie/commands/awk.py | 31 | CODE | |
| LOW | src/cowrie/commands/awk.py | 105 | CODE | |
| LOW | src/cowrie/commands/groups.py | 35 | CODE | |
| LOW | src/cowrie/commands/su.py | 56 | CODE | |
| LOW | src/cowrie/commands/free.py | 91 | CODE | |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements-output.txt | 1 | # SPDX-FileCopyrightText: 2017 lelonek1 <lelonek1@umbc.edu> | COMMENT |
| LOW | bin/build-fs-pickle.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docs/conf.py | 1 | # SPDX-FileCopyrightText: 2019-2025 Michel Oosterhof <michel@oosterhof.net> | COMMENT |
| LOW | docs/conf.py | 61 | # Add any paths that contain templates here, relative to this directory. | COMMENT |
| LOW | docs/conf.py | 81 | # directories to ignore when looking for source files. | COMMENT |
| LOW | docs/conf.py | 101 | COMMENT | |
| LOW | docs/conf.py | 121 | htmlhelp_basename = "cowriedoc" | COMMENT |
| LOW | src/cowrie/llm/__init__.py | 1 | # SPDX-FileCopyrightText: 2025 Michel Oosterhof <michel@oosterhof.net> | COMMENT |
| LOW | src/cowrie/core/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/core/ocsf.py | 1 | # SPDX-FileCopyrightText: 2026 JustSamAgain justsamagain@proton.me | COMMENT |
| LOW | src/cowrie/test/fake_transport.py | 101 | protocol="test", | COMMENT |
| LOW | src/cowrie/test/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/python/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/shell/protocol.py | 301 | if self.pp: | COMMENT |
| LOW | src/cowrie/shell/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/shell/bashparse.py | 81 | # parentheses, ";;", newlines). The structure above a simple command -- | COMMENT |
| LOW | src/cowrie/shell/fs.py | 461 | # Below additions for SFTP support, try to keep functions here similar to os.* | COMMENT |
| LOW | src/cowrie/shell/honeypot.py | 141 | self.captured: bytes = b"" | COMMENT |
| LOW | src/cowrie/pool_interface/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/ssh_proxy/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/ssh_proxy/protocols/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/ssh_proxy/protocols/sftp.py | 21 | # # ['uint32', 'version'], [['string', 'extension_name'], ['string', 'extension_data']]] | COMMENT |
| LOW | src/cowrie/ssh_proxy/protocols/sftp.py | 41 | # 18: "SSH_FXP_RENAME", # [['uint32', 'id'], ['string', 'oldpath'], ['string', 'newpath']] | COMMENT |
| LOW | src/cowrie/ssh_proxy/protocols/ssh.py | 41 | # 21: "SSH_MSG_NEWKEYS", | COMMENT |
| LOW | src/cowrie/ssh/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/scripts/dumpfs.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | src/cowrie/scripts/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/scripts/fsctl.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | src/cowrie/scripts/createfs.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | src/cowrie/telnet_proxy/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/telnet/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/cowrie/insults/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/backend_pool/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| LOW | src/backend_pool/libvirt/__init__.py | 1 | # SPDX-FileCopyrightText: 2009 Upi Tamminen <desaster@gmail.com> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/fingerprint.yml | 76 | # Check if container is running | COMMENT |
| LOW | .github/workflows/fingerprint.yml | 233 | # Check if advanced tests detected honeypot | COMMENT |
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 162 | # Check if all commands execute too quickly (< 10ms) | COMMENT |
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 179 | # Check if common binaries exist and have reasonable sizes | COMMENT |
| LOW⚡ | .github/scripts/advanced-honeypot-tests.py | 209 | # Check if it shows the SSH connection we're using | COMMENT |
| LOW | .github/scripts/advanced-honeypot-tests.py | 57 | # Check if ping actually works (Cowrie simulates it) | COMMENT |
| LOW | .github/scripts/advanced-honeypot-tests.py | 124 | # Check if /proc/self/exe exists and is valid | COMMENT |
| LOW | .github/scripts/advanced-honeypot-tests.py | 264 | # Print results | COMMENT |
| LOW | src/cowrie/core/auth.py | 220 | # Check if it is the first visit from src_ip | COMMENT |
| LOW | src/cowrie/core/auth.py | 275 | # Check if enough login attempts are tried | COMMENT |
| LOW | src/cowrie/core/checkers.py | 148 | # Check if authclass exists in the auth module, fall back to UserDB | COMMENT |
| LOW | src/cowrie/output/abuseipdb.py | 157 | # Check if reported IP is ready for re-reporting | COMMENT |
| LOW | src/cowrie/output/virustotal.py | 440 | # Check if URL has been scanned | COMMENT |
| LOW | src/cowrie/output/mongodb.py | 72 | # Check if sensor exists, else add it. | COMMENT |
| LOW | src/cowrie/output/slack.py | 142 | # Check if we have a handler for this event | COMMENT |
| LOW | src/cowrie/scripts/cowrie.py | 132 | # Check if already running | COMMENT |
| LOW | src/cowrie/commands/tftp.py | 209 | # Check if this is the expected block | COMMENT |
| LOW | src/cowrie/commands/tftp.py | 240 | # Check if this is the last packet (< 512 bytes of data) | COMMENT |
| LOW | src/cowrie/commands/tftp.py | 510 | # Check if this is a cancellation (from CTRL-C) | COMMENT |
| LOW | src/cowrie/commands/sleep.py | 70 | # Check if the error was caused by a long option (--option) | STRING |
| LOW | src/cowrie/commands/finger.py | 30 | # Loop over the data in sets of 7 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/cowrie/test/fake_transport.py | 23 | """This class is placeholder for creating a fake interface. | STRING |
| MEDIUM | src/cowrie/test/test_telnet_transport.py | 61 | # Create a failure with AlreadyNegotiating | COMMENT |
| MEDIUM | src/cowrie/test/test_telnet_transport.py | 81 | # Create a failure with AlreadyNegotiating | COMMENT |
| MEDIUM | src/cowrie/test/test_telnet_transport.py | 99 | # Create a mock Deferred for onResult | COMMENT |
| MEDIUM | src/cowrie/test/test_virustotal.py | 101 | # Create a temporary file for testing | COMMENT |
| MEDIUM | src/cowrie/shell/honeypot.py | 687 | # Defining a function records its body and succeeds. | COMMENT |
| MEDIUM | src/cowrie/output/misp.py | 257 | # Create a comprehensive session event if there's activity worth reporting | COMMENT |
| MEDIUM | src/cowrie/commands/ls.py | 137 | # Create a list to hold formatted sizes for display | COMMENT |
| MEDIUM | src/cowrie/commands/su.py | 155 | # Create a non-interactive shell running as the target user. The | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/cowrie/llm/session.py | 42 | self.avatar.conn.transport.events.dispatch( | CODE |
| CRITICAL | src/cowrie/shell/session.py | 95 | self.avatar.conn.transport.events.dispatch( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/cowrie/shell/honeypot.py | 726 | # Probably no reason to be this comprehensive for just PATH... | COMMENT |
| MEDIUM | src/cowrie/output/misp.py | 68 | # Session tracking for comprehensive session events | COMMENT |
| MEDIUM | src/cowrie/output/misp.py | 238 | # When a session closes, create a comprehensive event | COMMENT |
| MEDIUM | src/cowrie/output/misp.py | 257 | # Create a comprehensive session event if there's activity worth reporting | COMMENT |
| MEDIUM | src/cowrie/output/misp.py | 571 | # Add comprehensive text summary | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/cowrie/output/discord.py | 32 | # ----------------- | COMMENT |
| MEDIUM | src/cowrie/output/discord.py | 34 | # ----------------- | COMMENT |
| MEDIUM | src/cowrie/output/prometheus.py | 25 | # ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/cowrie/output/prometheus.py | 27 | # ──────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/scripts/advanced-honeypot-tests.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/cowrie/test/test_temp_file_naming.py | 41 | def update_realfile(self, f: list, realfile: str) -> None: | CODE |
| LOW | src/cowrie/test/test_honeyfs.py | 188 | def _set_contents_path(self, path: str) -> None: | CODE |
| LOW | src/cowrie/shell/command.py | 124 | def set_input_data(self, data: bytes) -> None: | CODE |
| LOW | src/cowrie/shell/fs.py | 245 | def update_realfile(self, f: Node | None, realfile: str) -> None: | CODE |
| LOW | src/cowrie/shell/fs.py | 648 | def update_size(self, filename: str, size: int) -> None: | CODE |
| LOW | src/cowrie/shell/pipe.py | 104 | def _setup_redirections(self) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/cowrie/scripts/dumpfs.py | 11 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/cowrie/shell/customparser.py | 28 | CODE |