Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.
This report summarizes scanner evidence for NVIDIA/SkillSpector, a Python project with 19,888 GitHub stars. SynthScan examined 202,733 lines of code across 381 source files, recording 5963 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 32.7 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 4968 finding(s).
Are imports declared and package/API names verified? 330 finding(s).
Are wrappers, guards, and repeated structures necessary? 5156 finding(s).
Which changes need focused human review? 5963 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 5963 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_bundled_execution_surface_acceptance.py | 89 | def test_issue_a_graph_reports_hook_mechanism_without_inventing_exfiltration( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 118 | def test_issue_b_graph_blocks_closed_project_permission_surface( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 137 | def test_bundled_project_disable_suppresses_ordinary_plugin_hook_findings(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 162 | def test_issue_c_top_level_prefixed_zip_reports_full_chain(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 176 | def test_issue_c_renders_all_public_report_formats(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 209 | def test_document_surface_controls( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 223 | def test_malformed_sibling_keeps_valid_finding_and_is_incomplete(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 244 | def test_malformed_modeled_settings_sibling_keeps_hook_findings_and_is_incomplete( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 288 | def test_public_cli_exit_contract( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 313 | def test_recursive_single_child_routes_execution_surfaces_from_child_root( | STRING |
| LOW | tests/test_bundled_execution_surface_acceptance.py | 349 | def test_cli_fail_on_incomplete_is_opt_in(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_prompt_leakage_context_regressions.py | 95 | def test_context_classification_survives_graph_reports( | CODE |
| LOW | tests/test_prompt_leakage_context_regressions.py | 116 | def test_cross_window_extraction_survives_graph_reports(tmp_path: Path, output_format: str) -> None: | CODE |
| LOW | tests/test_prompt_leakage_context_regressions.py | 177 | def _assert_no_internal_security_metadata(value: object) -> None: | CODE |
| LOW⚡ | tests/test_mcp_tool_poisoning.py | 519 | def test_block_summary_uses_complete_padding_run_identity(self): | CODE |
| LOW⚡ | tests/test_mcp_tool_poisoning.py | 884 | def test_injection_in_param_description(self): | CODE |
| LOW⚡ | tests/test_mcp_tool_poisoning.py | 1788 | def test_skipped_no_description(self): | CODE |
| LOW⚡ | tests/test_mcp_tool_poisoning.py | 1794 | def test_llm_call_failure_returns_empty(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW⚡ | tests/test_mcp_tool_poisoning.py | 1801 | def test_persistently_malformed_response_returns_empty(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 344 | def test_truncated_previews_preserve_distinct_full_match_identity( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 439 | def test_data_uri_in_metadata(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 457 | def test_instruction_keyword_in_comment(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 478 | def test_zero_width_word_joiner_after_refactor(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 495 | def test_zero_width_bom_after_refactor(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 632 | def test_identifier_field_not_scanned(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 772 | def test_truncated_previews_preserve_distinct_full_text_identity( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 859 | def test_invisible_formatting_chars(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 904 | def test_system_token_in_param(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 927 | def test_exfiltration_in_param_description(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 949 | def test_malicious_default_value(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 972 | def test_long_default_url_preview_preserves_full_match_identity(self) -> None: | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 986 | def test_excessive_description_length(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1014 | def test_localhost_prefixed_attacker_url_is_flagged(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1037 | def test_genuine_loopback_default_url_is_exempt(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1147 | def test_finding_maps_result_metadata_for_unit_ci(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1196 | def test_fences_reject_false_positives_and_keep_ranges(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1209 | def test_common_markdown_executable_labels_are_normalized(self): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1218 | def test_executable_candidates_precede_markdown_candidates( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1248 | def test_markdown_artifact_cap_stops_before_prefix_and_fence_extraction( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1300 | def test_executable_artifact_cap_stops_before_content_reads( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1346 | def test_blank_executable_prefix_keeps_no_call_status(self, monkeypatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1362 | def test_executable_cr_lines_keep_source_range(self, monkeypatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1388 | def test_prompt_byte_stop_records_next_source(self, monkeypatch, source_order): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1420 | def test_runtime_stop_records_next_source(self, monkeypatch, source_order): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1457 | def test_markdown_whitespace_prefix_truncation_is_partial(self, monkeypatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1473 | def test_markdown_batch_cap_stops_before_next_source(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1515 | def test_markdown_deadline_stops_before_prefix_and_fence_extraction( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1571 | def test_separated_markdown_fences_keep_independent_source_ranges( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1618 | def test_no_applicable_markdown_keeps_clean_status(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1711 | def test_reasoning_env_skips_preference_on_initial_and_refreshed_models( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1735 | def test_model_reasoning_controls_skip_preference_on_construction_and_refresh( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1757 | def test_explicit_method_choices_win_with_reasoning( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1772 | def test_configured_output_language_is_included(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1819 | def test_wrapped_json_schema_response_stays_incomplete( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1838 | def test_tool_refusal_stays_incomplete(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1877 | def test_malformed_response_is_retried(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1893 | def test_cli_parse_error_is_retried(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1910 | def test_out_of_range_confidence_is_retried(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1928 | def test_batches_run_concurrently_within_the_shared_limit( | CODE |
| LOW | tests/test_mcp_tool_poisoning.py | 1974 | def test_successful_call_records_ok_true(self, monkeypatch: pytest.MonkeyPatch): | CODE |
| 4417 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_mcp_tool_poisoning.py | 513 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_mcp_tool_poisoning.py | 515 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_mcp_tool_poisoning.py | 878 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_mcp_tool_poisoning.py | 880 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 288 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 290 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 729 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 731 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 1055 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 1057 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 1109 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 1111 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 2120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_tool_poisoning.py | 2122 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_least_privilege.py | 30 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_least_privilege.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_least_privilege.py | 172 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_least_privilege.py | 174 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 116 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 140 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 226 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 238 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 240 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 394 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 396 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 423 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 425 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 461 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 463 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 580 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 582 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 592 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 594 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 605 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 607 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 694 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 696 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 785 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_agent_cli.py | 787 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_agent_cli.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_agent_cli.py | 59 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_agent_cli.py | 655 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_agent_cli.py | 657 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 65 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 67 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 86 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 164 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_model_info.py | 246 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_model_info.py | 248 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 278 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit/test_model_info.py | 280 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit/test_new_providers.py | 125 | # ── Azure OpenAI ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_new_providers.py | 257 | # ── Generic OpenAI-Compatible ─────────────────────────────────────────────── | COMMENT |
| 476 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_bundled_execution_surface_acceptance.py | 6 | CODE | |
| LOW | tests/test_mcp_tool_poisoning.py | 18 | CODE | |
| LOW | tests/test_batch_scan_security.py | 6 | CODE | |
| LOW | tests/test_semantic_runtime.py | 6 | CODE | |
| LOW | tests/test_structured_skill.py | 6 | CODE | |
| LOW | tests/test_batch_scan_reports.py | 6 | CODE | |
| LOW | tests/test_python_ast.py | 6 | CODE | |
| LOW | tests/test_mcp_rug_pull.py | 18 | CODE | |
| LOW | tests/test_mcp_least_privilege.py | 18 | CODE | |
| LOW | tests/test_multi_skill.py | 18 | CODE | |
| LOW | tests/test_reference_destination_kinds.py | 6 | CODE | |
| LOW | tests/unit/test_agent_cli.py | 33 | CODE | |
| LOW | tests/unit/test_tp4_openai_http.py | 6 | CODE | |
| LOW | tests/unit/test_inference_usage.py | 6 | CODE | |
| LOW | tests/unit/test_llm_utils.py | 23 | CODE | |
| LOW | tests/unit/test_baseline_mcp.py | 10 | CODE | |
| LOW | tests/unit/test_providers.py | 23 | CODE | |
| LOW | tests/unit/test_gemini_provider.py | 18 | CODE | |
| LOW | tests/unit/test_suppression.py | 18 | CODE | |
| LOW | tests/unit/test_github_release_workflow.py | 6 | CODE | |
| LOW | tests/unit/test_prohibition_context.py | 6 | CODE | |
| LOW | tests/unit/test_cleanup.py | 6 | CODE | |
| LOW | tests/unit/test_yara_rop_chain.py | 23 | CODE | |
| LOW | tests/unit/test_llm_provenance.py | 6 | CODE | |
| LOW | tests/unit/test_defensive_language_reporting.py | 6 | CODE | |
| LOW | tests/unit/test_model_info.py | 18 | CODE | |
| LOW | tests/unit/test_model_info.py | 33 | CODE | |
| LOW | tests/unit/test_osv_client.py | 18 | CODE | |
| LOW | tests/unit/test_create_github_release.py | 6 | CODE | |
| LOW | tests/unit/test_input_handler_ssrf.py | 18 | CODE | |
| LOW | tests/unit/test_bedrock_provider.py | 24 | CODE | |
| LOW | tests/unit/test_static_runner_prepared_context.py | 6 | CODE | |
| LOW | tests/unit/test_baseline_coverage.py | 10 | CODE | |
| LOW | tests/unit/test_new_providers.py | 18 | CODE | |
| LOW | tests/unit/test_wheel_contents.py | 6 | CODE | |
| LOW | tests/unit/test_input_handler_bounds.py | 26 | CODE | |
| LOW | tests/unit/test_graph_proxy.py | 6 | CODE | |
| LOW | tests/unit/test_anthropic_proxy_provider.py | 18 | CODE | |
| LOW | tests/unit/test_compare_scan_accuracy.py | 4 | CODE | |
| LOW | tests/unit/test_cli_subprocess.py | 18 | CODE | |
| LOW | tests/unit/test_constants.py | 18 | CODE | |
| LOW | tests/unit/test_sarif.py | 18 | CODE | |
| LOW | tests/unit/test_patterns_new.py | 22 | CODE | |
| LOW | tests/nodes/test_deduplicate.py | 18 | CODE | |
| LOW | tests/nodes/test_python_execution_surface_end_to_end.py | 6 | CODE | |
| LOW | tests/nodes/test_report_occurrence_columns.py | 6 | CODE | |
| LOW | tests/nodes/test_nested_artifacts.py | 6 | CODE | |
| LOW | tests/nodes/test_transitive_analyzer_deadlines.py | 6 | CODE | |
| LOW | tests/nodes/test_security_remediation.py | 6 | CODE | |
| LOW | tests/nodes/test_analysis_completeness.py | 6 | CODE | |
| LOW | tests/nodes/test_llm_analyzer_base.py | 18 | CODE | |
| LOW | tests/nodes/test_report.py | 18 | CODE | |
| LOW | tests/nodes/test_sarif_rules_and_empty_findings.py | 18 | CODE | |
| LOW | tests/nodes/test_resolve_input.py | 18 | CODE | |
| LOW | tests/nodes/test_security_end_to_end.py | 6 | CODE | |
| LOW | tests/nodes/test_sarif_security_severity.py | 18 | CODE | |
| LOW | tests/nodes/test_report_provenance_boundary.py | 6 | CODE | |
| LOW | tests/nodes/test_meta_analyzer_fallback.py | 18 | CODE | |
| LOW | tests/nodes/test_finalize_inspection_ledger.py | 6 | CODE | |
| LOW | tests/nodes/test_json_quote_scan_end_to_end.py | 6 | CODE | |
| 241 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | model_registry.yaml | 1 | # Model registry — context window and output token limits. | COMMENT |
| LOW | .skillspector-baseline.example.yaml | 1 | # SkillSpector baseline (example) | COMMENT |
| LOW | README.md | 361 | skillspector scan ./my-skill/ | COMMENT |
| LOW | README.md | 381 | # data residency or in-region processing without appropriate organizational policies. Always verify | COMMENT |
| LOW | tests/test_mcp_tool_poisoning.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/conftest.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/__init__.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/test_mcp_rug_pull.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/test_mcp_least_privilege.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/test_multi_skill.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_agent_cli.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_transitive.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_mcp_server.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_llm_utils.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_providers.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_gemini_provider.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_suppression.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_patterns.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_yara_rop_chain.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/__init__.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_model_info.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_osv_client.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_input_handler_ssrf.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_bedrock_provider.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_reviewer_nits.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_new_providers.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_input_handler_bounds.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_anthropic_proxy_provider.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_cli.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_cli_subprocess.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_constants.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_input_handler.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_sarif.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/unit/test_patterns_new.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_deduplicate.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_llm_analyzer_base.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/__init__.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_report.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_sarif_rules_and_empty_findings.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_resolve_input.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_sarif_security_severity.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_meta_analyzer_fallback.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_meta_analyzer.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_build_context.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_report_sanitizer.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_as3_source_identity.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/test_semantic_quality_policy.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_mp2_regex_backtracking.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | …sts/nodes/analyzers/test_ea1_wildcard_line_boundary.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_registry.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_behavioral_ast.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_semantic_developer_intent.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/conftest.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_sc2_command_boundaries.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_whitespace_padding.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_pe3_ignore_file_entries.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_static_runner_filtering.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_structured_skill_roles.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_static_code_blank_lines.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| LOW | tests/nodes/analyzers/test_static_patterns.py | 1 | # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | COMMENT |
| 166 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_batch_scan_security.py | 531 | except ProcessLookupError: | CODE |
| HIGH | tests/unit/test_input_handler_ssrf.py | 167 | except Exception: | CODE |
| HIGH | contrib/batch_scan/runner.py | 432 | except ImportError: | CODE |
| HIGH | contrib/batch_scan/runner.py | 545 | except ImportError: | CODE |
| HIGH | contrib/batch_scan/batch_scan.py | 55 | except ImportError: | CODE |
| HIGH | contrib/batch_scan/batch_scan.py | 152 | except ProcessLookupError: | CODE |
| HIGH | contrib/batch_scan/batch_scan.py | 161 | except (OSError, subprocess.TimeoutExpired): | CODE |
| HIGH | contrib/batch_scan/__init__.py | 42 | except ImportError: | CODE |
| HIGH | contrib/batch_scan/api_pool.py | 587 | except ImportError: | CODE |
| HIGH | …trib/batch_scan/tests/test_monkeypatch_invasiveness.py | 69 | except ImportError: | CODE |
| HIGH | …trib/batch_scan/tests/test_monkeypatch_invasiveness.py | 379 | except ValueError: | CODE |
| HIGH | contrib/batch_scan/tests/tests-pro/mutation_max.py | 262 | except ImportError: | CODE |
| HIGH | contrib/batch_scan/tests/tests-pro/test_api_pool.py | 442 | except RuntimeError: | CODE |
| HIGH | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 62 | except ImportError: | CODE |
| HIGH | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 182 | except ValueError: | CODE |
| HIGH | src/skillspector/inspection_ledger.py | 592 | except ValueError: | CODE |
| HIGH | src/skillspector/dependency_sources.py | 2157 | except configparser.Error: | CODE |
| HIGH | src/skillspector/cleanup.py | 37 | except Exception: | CODE |
| HIGH | src/skillspector/cli.py | 2589 | except ValueError: | CODE |
| HIGH | src/skillspector/llm_utils.py | 225 | except json.JSONDecodeError: | CODE |
| HIGH | src/skillspector/llm_utils.py | 233 | except json.JSONDecodeError: | CODE |
| HIGH | src/skillspector/input_handler.py | 203 | except ValueError: | CODE |
| HIGH | src/skillspector/input_handler.py | 521 | except OSError: | CODE |
| HIGH | src/skillspector/llm_analyzer_base.py | 337 | except (TypeError, ValueError): | CODE |
| HIGH | src/skillspector/llm_analyzer_base.py | 483 | except ValueError: | CODE |
| HIGH | src/skillspector/nodes/finalize_inspection_ledger.py | 566 | except (AttributeError, KeyError, TypeError, ValueError): | CODE |
| HIGH | …llspector/nodes/analyzers/bundled_execution_surface.py | 350 | except ValueError: | CODE |
| HIGH | …llspector/nodes/analyzers/bundled_execution_surface.py | 355 | except (OSError, ValueError): | CODE |
| HIGH | src/skillspector/nodes/analyzers/static_yara.py | 539 | except yara.SyntaxError: | CODE |
| HIGH | src/skillspector/providers/_agent_cli.py | 988 | except (OSError, ValueError): | CODE |
| HIGH | src/skillspector/providers/_agent_cli.py | 993 | except OSError: | CODE |
| HIGH | src/skillspector/providers/_agent_cli.py | 1054 | except (BrokenPipeError, OSError): | CODE |
| HIGH | src/skillspector/providers/_agent_cli.py | 1060 | except OSError: | CODE |
| HIGH | src/skillspector/providers/_agent_cli.py | 1085 | except subprocess.TimeoutExpired: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_mcp_tool_poisoning.py | 95 | CODE | |
| LOW | tests/test_mcp_least_privilege.py | 87 | CODE | |
| LOW | tests/unit/test_tp4_openai_http.py | 26 | CODE | |
| LOW | tests/unit/test_tp4_openai_http.py | 34 | CODE | |
| LOW | tests/unit/test_baseline_mcp.py | 54 | CODE | |
| LOW | tests/unit/test_defensive_language_reporting.py | 136 | CODE | |
| LOW | tests/unit/test_mcp_registry.py | 685 | CODE | |
| LOW | tests/unit/test_cli.py | 582 | CODE | |
| LOW | tests/unit/test_cli.py | 7009 | CODE | |
| LOW | tests/nodes/test_security_end_to_end.py | 157 | CODE | |
| LOW | tests/nodes/test_security_end_to_end.py | 1494 | CODE | |
| LOW | tests/nodes/test_report_sanitizer.py | 221 | CODE | |
| LOW | tests/nodes/analyzers/test_json_quote_scan_runtime.py | 24 | CODE | |
| LOW | …s/nodes/analyzers/test_documentation_reconstruction.py | 108 | CODE | |
| LOW | tests/nodes/analyzers/test_python_ast_columns.py | 27 | CODE | |
| LOW | tests/nodes/analyzers/test_python_ast_columns.py | 154 | CODE | |
| LOW | tests/nodes/analyzers/test_python_ast_columns.py | 31 | CODE | |
| LOW | tests/nodes/analyzers/test_token_gap_fast_paths.py | 69 | CODE | |
| LOW | contrib/batch_scan/detection.py | 50 | CODE | |
| LOW | contrib/batch_scan/batch_scan.py | 203 | CODE | |
| LOW | contrib/batch_scan/batch_scan.py | 270 | CODE | |
| LOW | contrib/batch_scan/api_pool.py | 167 | CODE | |
| LOW | contrib/batch_scan/api_pool.py | 270 | CODE | |
| LOW | contrib/batch_scan/reports.py | 392 | CODE | |
| LOW | contrib/batch_scan/tests/tests-pro/mutation_max.py | 120 | CODE | |
| LOW | src/skillspector/suppression.py | 693 | CODE | |
| LOW | src/skillspector/suppression.py | 753 | CODE | |
| LOW | src/skillspector/mcp_registry.py | 370 | CODE | |
| LOW | src/skillspector/mcp_registry.py | 466 | CODE | |
| LOW | src/skillspector/references.py | 97 | CODE | |
| LOW | src/skillspector/references.py | 201 | CODE | |
| LOW | src/skillspector/references.py | 272 | CODE | |
| LOW | src/skillspector/references.py | 448 | CODE | |
| LOW | src/skillspector/inspection_ledger.py | 398 | CODE | |
| LOW | src/skillspector/inspection_ledger.py | 746 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 250 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 416 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 476 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 633 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 724 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 853 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 927 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 982 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1418 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1498 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1557 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1610 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1940 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 1985 | CODE | |
| LOW | src/skillspector/dependency_sources.py | 2137 | CODE | |
| LOW | src/skillspector/python_tokens.py | 114 | CODE | |
| LOW | src/skillspector/semantic_runtime.py | 119 | CODE | |
| LOW | src/skillspector/structured_skill.py | 277 | CODE | |
| LOW | src/skillspector/structured_skill.py | 339 | CODE | |
| LOW | src/skillspector/structured_skill.py | 392 | CODE | |
| LOW | src/skillspector/structured_skill.py | 689 | CODE | |
| LOW | src/skillspector/structured_skill.py | 355 | CODE | |
| LOW | src/skillspector/structured_skill.py | 400 | CODE | |
| LOW | src/skillspector/inference_usage.py | 132 | CODE | |
| LOW | src/skillspector/nested_artifacts.py | 424 | CODE | |
| 156 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_mcp_rug_pull.py | 95 | ("npx @scope/server-a && npx @scope/server-b@1.2.3\n", "npx @scope/server-a"), | CODE |
| HIGH | tests/unit/test_patterns.py | 696 | content = "cat /etc/passwd && docker run -v /etc/passwd:/etc/passwd:ro image" | CODE |
| HIGH | tests/unit/test_patterns.py | 705 | "cat /etc/passwd && docker run -v /etc/passwd:/etc/passwd:ro image", | CODE |
| HIGH | tests/unit/test_mcp_registry.py | 772 | baseline.write_text('{"mcp_registry": true, "snapshots": [null]}') | CODE |
| HIGH | tests/unit/test_patterns_new.py | 421 | "const match = condition ? /yes/.exec(output) : null;", | CODE |
| HIGH | tests/unit/test_patterns_new.py | 1638 | 'rm -rf "$BRANCH_CTX_PARENT" 2>/dev/null || true', | CODE |
| HIGH | tests/unit/test_patterns_new.py | 1678 | pytest.param("ls && rm -rf /tmp", "cleanup.sh", "shell", id="chain_rm"), | CODE |
| HIGH | tests/unit/test_patterns_new.py | 1724 | "RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*\n" | CODE |
| HIGH | tests/unit/test_patterns_new.py | 1738 | "RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*\n" | CODE |
| HIGH | tests/unit/test_patterns_new.py | 1752 | "RUN useradd --create-home appuser && chown -R appuser:appuser /app\n" | CODE |
| HIGH | tests/nodes/analyzers/test_sc2_command_boundaries.py | 37 | "curl http://localhost:8000/health && echo '{}' | python3", | CODE |
| HIGH⚡ | tests/nodes/analyzers/test_sc2_command_boundaries.py | 57 | "curl http://localhost:8000/health\n-o result && sh result", | CODE |
| HIGH⚡ | tests/nodes/analyzers/test_sc2_command_boundaries.py | 58 | "wget http://localhost:8000/health\n-O result && sh result", | CODE |
| HIGH⚡ | …ts/nodes/analyzers/test_skill_installation_patterns.py | 54 | "mkdir -p ~/.claude/skills && crontab -e", | CODE |
| HIGH⚡ | …ts/nodes/analyzers/test_skill_installation_patterns.py | 310 | "mkdir -p build && cp agent.desktop ~/.config/autostart/", | CODE |
| HIGH | …ts/nodes/analyzers/test_skill_installation_patterns.py | 155 | "cp -r ./payload ~/.claude/skills/helper && echo done", | CODE |
| HIGH | …ts/nodes/analyzers/test_skill_installation_patterns.py | 169 | "git clone https://example.test/repo.git ~/.claude/skills/helper && echo done", | CODE |
| HIGH⚡ | …ts/nodes/analyzers/test_cli_companion_documentation.py | 368 | "widgetctl self-update && echo --verify-signature", | CODE |
| HIGH⚡ | …ts/nodes/analyzers/test_cli_companion_documentation.py | 369 | "widgetctl self-update || echo --verify-signature", | CODE |
| HIGH | …s/analyzers/test_parameter_expansion_reconstruction.py | 145 | ('cd /tmp && X=$(printf "%s" "$X")', 11, True), | CODE |
| HIGH⚡ | tests/nodes/analyzers/test_static_yara.py | 2105 | ssh target 'rm -rf ~/trt_profile_model && mkdir -p ~/trt_profile_model/results' | CODE |
| HIGH | tests/nodes/analyzers/test_security_reconstruction.py | 1721 | pytest.param("rm harmless && echo -rf /", False, id="and-boundary"), | CODE |
| HIGH⚡ | tests/provider/test_opencode_cli.py | 503 | '{"type":"text","part":null}', | STRING |
| HIGH | contrib/batch_scan/runner.py | 218 | '"end_line": null, "confidence": 0.0-1.0, ' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/unit/test_providers.py | 0 | isolate provider-related env vars and the yaml cache for each test. | STRING |
| HIGH | tests/unit/test_bedrock_provider.py | 0 | isolate provider-related env vars and the yaml cache for each test. | STRING |
| HIGH | tests/unit/test_new_providers.py | 0 | isolate provider-related env vars and the yaml cache for each test. | STRING |
| HIGH | src/skillspector/providers/gemini/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/azure_openai/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/bedrock/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/nv_build/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | …c/skillspector/providers/openai_compatible/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/anthropic/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/ollama/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| HIGH | src/skillspector/providers/openai/provider.py | 0 | resolve model: ``skillspector_model`` env > slot default > ``default_model``. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/test_gemini_provider.py | 377 | def call() -> None: | CODE |
| LOW | tests/unit/test_gemini_provider.py | 380 | except Exception as exc: | CODE |
| LOW | tests/unit/test_input_handler_ssrf.py | 167 | except Exception: | CODE |
| LOW | docs/LLM_ANALYZER_BASE_GUIDE.md | 89 | except Exception as e: | CODE |
| LOW | contrib/batch_scan/runner.py | 159 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/runner.py | 204 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/runner.py | 785 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/batch_scan.py | 444 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/api_pool.py | 499 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/api_pool.py | 542 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/gap_fill.py | 237 | except Exception as exc: | CODE |
| LOW | contrib/batch_scan/gap_fill.py | 303 | except Exception as exc: | CODE |
| LOW | …trib/batch_scan/tests/test_monkeypatch_invasiveness.py | 281 | except Exception as exc: | CODE |
| LOW⚡ | contrib/batch_scan/tests/tests-pro/mutation_max.py | 479 | except Exception: | CODE |
| LOW | contrib/batch_scan/tests/tests-pro/mutation_max.py | 321 | except Exception: | CODE |
| LOW | contrib/batch_scan/tests/tests-pro/mutation_max.py | 349 | except Exception: | CODE |
| LOW | contrib/batch_scan/tests/tests-pro/mutation_max.py | 396 | except Exception: | CODE |
| MEDIUM | contrib/batch_scan/tests/tests-pro/test_api_pool.py | 401 | def worker(): | CODE |
| LOW | contrib/batch_scan/tests/tests-pro/test_api_pool.py | 408 | except Exception as e: | CODE |
| MEDIUM | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 393 | def test_chatopenai_init_receives_both_timeout_and_request_timeout(self): | CODE |
| LOW | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 469 | except Exception: | CODE |
| LOW | contrib/batch_scan/docs/DESIGN.md | 173 | except Exception: | CODE |
| LOW | contrib/batch_scan/docs/archive/PITFALLS.md | 120 | except Exception: | CODE |
| LOW | scripts/compare_scan_accuracy.py | 793 | except Exception as error: | CODE |
| LOW | src/skillspector/inspection_ledger.py | 1133 | except Exception as exc: # pragma: no cover - exact exception is node-dependent | CODE |
| LOW | src/skillspector/cleanup.py | 37 | except Exception: | CODE |
| LOW | src/skillspector/cli.py | 707 | except Exception as e: | CODE |
| LOW | src/skillspector/cli.py | 786 | except Exception as e: | CODE |
| LOW | src/skillspector/cli.py | 882 | except Exception as e: | CODE |
| LOW | src/skillspector/cli.py | 2365 | except Exception: | CODE |
| LOW | src/skillspector/cli.py | 3073 | except Exception: | CODE |
| LOW | src/skillspector/cli.py | 3077 | except Exception: | CODE |
| LOW | src/skillspector/cli.py | 3500 | except Exception as e: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 941 | except Exception: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 1024 | except Exception: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 1196 | except Exception as exc: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 1287 | except Exception as exc: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 1375 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/build_context.py | 2575 | except Exception: | CODE |
| LOW | src/skillspector/nodes/build_context.py | 3378 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/meta_analyzer.py | 950 | except Exception as e: | CODE |
| LOW | …spector/nodes/analyzers/semantic_security_discovery.py | 283 | except Exception as exc: | CODE |
| LOW | …llspector/nodes/analyzers/bundled_execution_surface.py | 2084 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/analyzers/__init__.py | 50 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/analyzers/static_yara.py | 1448 | except Exception as exc: | CODE |
| LOW | …ctor/nodes/analyzers/static_patterns_agent_snooping.py | 268 | except Exception: | CODE |
| LOW | …killspector/nodes/analyzers/semantic_quality_policy.py | 262 | except Exception as exc: | CODE |
| LOW | …llspector/nodes/analyzers/semantic_developer_intent.py | 275 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/analyzers/static_runner.py | 3454 | except Exception as exc: | CODE |
| LOW | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 382 | except Exception: | CODE |
| LOW | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 495 | except Exception: | CODE |
| LOW | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 1660 | except Exception as exc: | CODE |
| LOW | src/skillspector/providers/registry.py | 62 | except Exception: | CODE |
| LOW | src/skillspector/providers/gemini/provider.py | 232 | except Exception as exc: | CODE |
| LOW | src/skillspector/providers/gemini/provider.py | 244 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | model_registry.yaml | 1 | # Model registry — context window and output token limits. | COMMENT |
| MEDIUM | model_registry.yaml | 10 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | docs/LLM_ANALYZER_BASE_GUIDE.md | 627 | context_length: 128000 # total context window in tokens (required) | CODE |
| MEDIUM | …odes/analyzers/static_patterns_privilege_escalation.py | 437 | # context window. | COMMENT |
| MEDIUM | src/skillspector/providers/gemini/model_registry.yaml | 7 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | …killspector/providers/azure_openai/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | src/skillspector/providers/bedrock/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | src/skillspector/providers/nv_build/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | …pector/providers/openai_compatible/model_registry.yaml | 9 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | …c/skillspector/providers/anthropic/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | src/skillspector/providers/ollama/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| MEDIUM | src/skillspector/providers/openai/model_registry.yaml | 8 | # context_length: <int> # total context window in tokens (required) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | contrib/batch_scan/runner.py | 60 | def set_api_pool(pool: "ApiKeyPool | None") -> None: | CODE |
| LOW | contrib/batch_scan/__init__.py | 54 | __all__ = [ | CODE |
| LOW | src/skillspector/logging_config.py | 64 | def set_level(level: int | str) -> None: | CODE |
| LOW | src/skillspector/inspection_ledger.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/skillspector/constants.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/skillspector/__init__.py | 52 | __all__ = ["create_graph", "graph", "__version__"] | CODE |
| LOW | src/skillspector/inference_usage.py | 576 | def set_provider(self, provider: str) -> None: | CODE |
| LOW | src/skillspector/llm_utils.py | 378 | def set_timeout(self, timeout: float | None) -> None: | CODE |
| LOW | src/skillspector/llm_analyzer_base.py | 517 | def _settle(waiter: asyncio.Future) -> None: | CODE |
| LOW | src/skillspector/nodes/analyzers/__init__.py | 66 | __all__ = ["ANALYZER_LOAD_ERRORS", "ANALYZER_MODULES", "ANALYZER_NODE_IDS", "ANALYZER_NODES"] | CODE |
| LOW | src/skillspector/nodes/analyzers/static_yara.py | 802 | def update_framed(value: bytes) -> None: | CODE |
| LOW | src/skillspector/nodes/analyzers/static_yara.py | 826 | def update_framed(value: bytes) -> None: | CODE |
| LOW⚡ | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/skillspector/providers/chat_models.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/skillspector/providers/__init__.py | 319 | __all__ = [ | CODE |
| LOW | src/skillspector/providers/codex_cli/__init__.py | 25 | __all__ = ["CodexCLIProvider"] | CODE |
| LOW | src/skillspector/providers/opencode_cli/__init__.py | 29 | __all__ = ["OpencodeCLIProvider"] | CODE |
| LOW | src/skillspector/providers/gemini/__init__.py | 20 | __all__ = ["REGISTRY_PATH", "GeminiProvider"] | CODE |
| LOW | src/skillspector/providers/azure_openai/__init__.py | 20 | __all__ = ["REGISTRY_PATH", "AzureOpenAIProvider"] | CODE |
| LOW | src/skillspector/providers/anthropic_proxy/__init__.py | 20 | __all__ = ["REGISTRY_PATH", "AnthropicProxyProvider"] | CODE |
| LOW | src/skillspector/providers/bedrock/__init__.py | 26 | __all__ = [ | CODE |
| LOW | src/skillspector/providers/claude_cli/__init__.py | 25 | __all__ = ["ClaudeCLIProvider"] | CODE |
| LOW | src/skillspector/providers/gemini_cli/__init__.py | 22 | __all__ = ["GeminiCLIProvider"] | CODE |
| LOW | src/skillspector/providers/nv_build/__init__.py | 20 | __all__ = ["BUILD_BASE_URL", "REGISTRY_PATH", "NvBuildProvider"] | CODE |
| LOW | …c/skillspector/providers/openai_compatible/__init__.py | 20 | __all__ = ["REGISTRY_PATH", "OpenAICompatibleProvider"] | CODE |
| LOW | src/skillspector/providers/antigravity_cli/__init__.py | 22 | __all__ = ["AntigravityCLIProvider"] | CODE |
| LOW | src/skillspector/providers/anthropic/__init__.py | 20 | __all__ = ["ANTHROPIC_BASE_URL", "REGISTRY_PATH", "AnthropicProvider"] | CODE |
| LOW | src/skillspector/providers/ollama/__init__.py | 20 | __all__ = ["OLLAMA_DEFAULT_BASE_URL", "REGISTRY_PATH", "OllamaProvider"] | CODE |
| LOW | src/skillspector/providers/openai/__init__.py | 20 | __all__ = ["OPENAI_DEFAULT_BASE_URL", "REGISTRY_PATH", "OpenAIProvider"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/skillspector/llm_utils.py | 700 | Run an async coroutine in a synchronous context, even if there's already a running event loop. This function s | STRING |
| HIGH | src/skillspector/input_handler.py | 780 | Resolve input to a scannable directory. Args: input_path: Path or URL to resolve | STRING |
| HIGH | src/skillspector/providers/_agent_cli.py | 1108 | Run an agent CLI and return the assistant response text. This is the single security-hardened entry point. All sec | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 445 | # Create a loop via _patched_asyncio_run — it calls _make_quiet_loop internally | COMMENT |
| MEDIUM⚡ | …trib/batch_scan/tests/tests-pro/test_runner_patches.py | 454 | # Create a loop, then manually invoke the quiet-loop logic from the patch | COMMENT |
| MEDIUM | …spector/nodes/analyzers/static_patterns_rogue_agent.py | 334 | # Creating a conventional installation directory alone does not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_suppression.py | 54 | CODE | |
| LOW | src/skillspector/inspection_ledger.py | 398 | CODE | |
| LOW | src/skillspector/nested_artifacts.py | 609 | CODE | |
| LOW | src/skillspector/cli.py | 451 | CODE | |
| LOW | src/skillspector/cli.py | 1541 | CODE | |
| LOW | src/skillspector/cli.py | 1653 | CODE | |
| LOW | src/skillspector/cli.py | 2905 | CODE | |
| LOW | src/skillspector/python_ast.py | 1935 | CODE | |
| LOW | src/skillspector/python_ast.py | 1990 | CODE | |
| LOW | src/skillspector/nodes/report.py | 1059 | CODE | |
| LOW | src/skillspector/nodes/report.py | 1245 | CODE | |
| LOW | src/skillspector/nodes/report.py | 1373 | CODE | |
| LOW | src/skillspector/nodes/report.py | 1540 | CODE | |
| LOW | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 1119 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | contrib/batch_scan/api_pool.py | 202 | # Step 1: recover rate-limited keys whose backoff has expired | COMMENT |
| LOW⚡ | contrib/batch_scan/api_pool.py | 205 | # Step 2: find available keys (not rate-limited, slots open) | COMMENT |
| LOW | contrib/batch_scan/api_pool.py | 225 | # Step 3: no capacity — compute wait time | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | contrib/batch_scan/api_pool.py | 202 | # Step 1: recover rate-limited keys whose backoff has expired | COMMENT |
| LOW⚡ | contrib/batch_scan/api_pool.py | 205 | # Step 2: find available keys (not rate-limited, slots open) | COMMENT |
| LOW | contrib/batch_scan/api_pool.py | 225 | # Step 3: no capacity — compute wait time | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/nodes/test_json_quote_scan_end_to_end.py | 21 | @pytest.mark.parametrize("case", ["placeholder", "instruction", "unsupported", "escaped-quotes"]) | CODE |
| LOW | tests/nodes/test_json_quote_scan_end_to_end.py | 50 | if case == "placeholder": | CODE |
| LOW | tests/nodes/analyzers/test_static_patterns.py | 1380 | assert content == "placeholder" | CODE |
| LOW | tests/nodes/analyzers/test_static_patterns.py | 1390 | "file_cache": {"README.md": "placeholder"}, | CODE |
| LOW | …s/analyzers/test_parameter_expansion_reconstruction.py | 50 | "placeholder", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit/test_anthropic_proxy_provider.py | 210 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |
| LOW | tests/unit/test_patterns_new.py | 1501 | "def helper():\n" | CODE |
| LOW | tests/nodes/analyzers/test_behavioral_taint_tracking.py | 226 | 'import os, urllib.request\ndef helper():\n import urllib.parse\nurllib.request.build_opener().open(os.ge | CODE |
| LOW⚡ | tests/nodes/analyzers/test_tool_misuse_python_ast.py | 221 | "def helper(value=1):\n" | CODE |
| LOW | src/skillspector/providers/anthropic_proxy/provider.py | 114 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/nodes/analyzers/test_static_yara.py | 1652 | "Don't forget to send 0.5 BTC to example.invalid to decrypt your files.", | CODE |
| LOW | tests/nodes/analyzers/test_static_yara.py | 1833 | "Don't forget to send 0.5 BTC to decrypt your files." | CODE |
| LOW | tests/integration/test_ransomware_rule.py | 58 | "Don't forget to send 0.5 BTC to example.invalid to decrypt your files.\n", | CODE |
| LOW | tests/integration/test_ransomware_rule.py | 234 | "Don't forget to send 0.5 Bitcoins to decrypt your files.\n", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/integration/test_agent_cli_live.py | 62 | #: Real ``stdin -> stdout`` agent CLIs this harness can drive. Add a new CLI here | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/skillspector/nodes/analyzers/mcp_tool_poisoning.py | 367 | # Check if this match overlaps with a data URI range | COMMENT |