cisco-ai-skill-scanner 1.0.0__py3-none-any.whl → 1.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.2.dist-info}/METADATA +28 -13
  2. cisco_ai_skill_scanner-1.0.2.dist-info/RECORD +102 -0
  3. cisco_ai_skill_scanner-1.0.2.dist-info/entry_points.txt +4 -0
  4. {skillanalyzer → skill_scanner}/__init__.py +8 -4
  5. {skillanalyzer → skill_scanner}/_version.py +2 -2
  6. {skillanalyzer → skill_scanner}/api/__init__.py +1 -1
  7. {skillanalyzer → skill_scanner}/api/api.py +4 -4
  8. {skillanalyzer → skill_scanner}/api/api_cli.py +8 -8
  9. {skillanalyzer → skill_scanner}/api/api_server.py +7 -7
  10. {skillanalyzer → skill_scanner}/api/router.py +3 -3
  11. {skillanalyzer → skill_scanner}/cli/__init__.py +1 -1
  12. {skillanalyzer → skill_scanner}/cli/cli.py +71 -13
  13. {skillanalyzer → skill_scanner}/config/__init__.py +3 -3
  14. {skillanalyzer → skill_scanner}/config/config.py +2 -2
  15. {skillanalyzer → skill_scanner}/config/config_parser.py +9 -9
  16. {skillanalyzer → skill_scanner}/config/constants.py +2 -2
  17. skill_scanner/config/yara_modes.py +314 -0
  18. {skillanalyzer → skill_scanner}/core/__init__.py +1 -1
  19. {skillanalyzer → skill_scanner}/core/analyzers/__init__.py +3 -3
  20. {skillanalyzer → skill_scanner}/core/analyzers/aidefense_analyzer.py +3 -3
  21. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/__init__.py +1 -1
  22. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_llm_client.py +1 -1
  23. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_prompt_builder.py +2 -2
  24. {skillanalyzer → skill_scanner}/core/analyzers/behavioral_analyzer.py +1 -1
  25. skillanalyzer/core/analyzers/cross_skill_analyzer.py → skill_scanner/core/analyzers/cross_skill_scanner.py +5 -5
  26. {skillanalyzer → skill_scanner}/core/analyzers/llm_analyzer.py +4 -4
  27. {skillanalyzer → skill_scanner}/core/analyzers/llm_prompt_builder.py +2 -2
  28. {skillanalyzer → skill_scanner}/core/analyzers/meta_analyzer.py +52 -20
  29. {skillanalyzer → skill_scanner}/core/analyzers/static.py +185 -35
  30. {skillanalyzer → skill_scanner}/core/analyzers/trigger_analyzer.py +2 -2
  31. {skillanalyzer → skill_scanner}/core/exceptions.py +10 -10
  32. {skillanalyzer → skill_scanner}/core/loader.py +4 -4
  33. {skillanalyzer → skill_scanner}/core/models.py +7 -6
  34. {skillanalyzer → skill_scanner}/core/reporters/markdown_reporter.py +11 -5
  35. {skillanalyzer → skill_scanner}/core/reporters/sarif_reporter.py +2 -2
  36. {skillanalyzer → skill_scanner}/core/reporters/table_reporter.py +2 -2
  37. {skillanalyzer → skill_scanner}/core/rules/yara_scanner.py +1 -1
  38. {skillanalyzer → skill_scanner}/core/scanner.py +2 -2
  39. {skillanalyzer → skill_scanner}/core/static_analysis/context_extractor.py +88 -14
  40. {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/__init__.py +1 -1
  41. {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/call_graph_analyzer.py +2 -2
  42. {skillanalyzer → skill_scanner}/core/static_analysis/parser/python_parser.py +5 -5
  43. {skillanalyzer → skill_scanner}/data/__init__.py +1 -1
  44. {skillanalyzer → skill_scanner}/data/prompts/boilerplate_protection_rule_prompt.md +5 -5
  45. {skillanalyzer → skill_scanner}/data/prompts/code_alignment_threat_analysis_prompt.md +128 -53
  46. {skillanalyzer → skill_scanner}/data/prompts/llm_response_schema.json +3 -3
  47. {skillanalyzer → skill_scanner}/data/prompts/skill_meta_analysis_prompt.md +16 -15
  48. {skillanalyzer → skill_scanner}/data/prompts/skill_threat_analysis_prompt.md +53 -17
  49. {skillanalyzer → skill_scanner}/data/prompts/unified_response_schema.md +1 -1
  50. {skillanalyzer → skill_scanner}/data/rules/signatures.yaml +143 -37
  51. skill_scanner/data/yara_rules/autonomy_abuse_generic.yara +66 -0
  52. skillanalyzer/data/yara_rules/skill_discovery_abuse.yara → skill_scanner/data/yara_rules/capability_inflation_generic.yara +7 -4
  53. skill_scanner/data/yara_rules/code_execution_generic.yara +76 -0
  54. skillanalyzer/data/yara_rules/coercive_injection.yara → skill_scanner/data/yara_rules/coercive_injection_generic.yara +2 -2
  55. skill_scanner/data/yara_rules/command_injection_generic.yara +77 -0
  56. skillanalyzer/data/yara_rules/credential_harvesting.yara → skill_scanner/data/yara_rules/credential_harvesting_generic.yara +25 -4
  57. skillanalyzer/data/yara_rules/transitive_trust_abuse.yara → skill_scanner/data/yara_rules/indirect_prompt_injection_generic.yara +8 -5
  58. skillanalyzer/data/yara_rules/prompt_injection.yara → skill_scanner/data/yara_rules/prompt_injection_generic.yara +2 -2
  59. skillanalyzer/data/yara_rules/unicode_steganography.yara → skill_scanner/data/yara_rules/prompt_injection_unicode_steganography.yara +23 -17
  60. skill_scanner/data/yara_rules/script_injection_generic.yara +82 -0
  61. skillanalyzer/data/yara_rules/sql_injection.yara → skill_scanner/data/yara_rules/sql_injection_generic.yara +22 -8
  62. skill_scanner/data/yara_rules/system_manipulation_generic.yara +79 -0
  63. skill_scanner/data/yara_rules/tool_chaining_abuse_generic.yara +72 -0
  64. {skillanalyzer → skill_scanner}/hooks/__init__.py +1 -1
  65. {skillanalyzer → skill_scanner}/hooks/pre_commit.py +16 -16
  66. {skillanalyzer → skill_scanner}/threats/__init__.py +25 -3
  67. skill_scanner/threats/cisco_ai_taxonomy.py +274 -0
  68. {skillanalyzer → skill_scanner}/threats/threats.py +28 -99
  69. {skillanalyzer → skill_scanner}/utils/__init__.py +1 -1
  70. {skillanalyzer → skill_scanner}/utils/command_utils.py +1 -1
  71. {skillanalyzer → skill_scanner}/utils/di_container.py +1 -1
  72. {skillanalyzer → skill_scanner}/utils/logging_config.py +7 -7
  73. cisco_ai_skill_scanner-1.0.0.dist-info/RECORD +0 -100
  74. cisco_ai_skill_scanner-1.0.0.dist-info/entry_points.txt +0 -4
  75. skillanalyzer/data/yara_rules/autonomy_abuse.yara +0 -66
  76. skillanalyzer/data/yara_rules/code_execution.yara +0 -61
  77. skillanalyzer/data/yara_rules/command_injection.yara +0 -54
  78. skillanalyzer/data/yara_rules/script_injection.yara +0 -83
  79. skillanalyzer/data/yara_rules/system_manipulation.yara +0 -65
  80. skillanalyzer/data/yara_rules/tool_chaining_abuse.yara +0 -60
  81. {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.2.dist-info}/WHEEL +0 -0
  82. {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.2.dist-info}/licenses/LICENSE +0 -0
  83. {skillanalyzer → skill_scanner}/core/analyzers/base.py +0 -0
  84. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/__init__.py +0 -0
  85. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_orchestrator.py +0 -0
  86. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_response_validator.py +0 -0
  87. {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py +0 -0
  88. {skillanalyzer → skill_scanner}/core/analyzers/llm_provider_config.py +0 -0
  89. {skillanalyzer → skill_scanner}/core/analyzers/llm_request_handler.py +0 -0
  90. {skillanalyzer → skill_scanner}/core/analyzers/llm_response_parser.py +0 -0
  91. {skillanalyzer → skill_scanner}/core/analyzers/virustotal_analyzer.py +0 -0
  92. {skillanalyzer → skill_scanner}/core/reporters/__init__.py +0 -0
  93. {skillanalyzer → skill_scanner}/core/reporters/json_reporter.py +0 -0
  94. {skillanalyzer → skill_scanner}/core/rules/__init__.py +0 -0
  95. {skillanalyzer → skill_scanner}/core/rules/patterns.py +0 -0
  96. {skillanalyzer → skill_scanner}/core/static_analysis/__init__.py +0 -0
  97. {skillanalyzer → skill_scanner}/core/static_analysis/cfg/__init__.py +0 -0
  98. {skillanalyzer → skill_scanner}/core/static_analysis/cfg/builder.py +0 -0
  99. {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/forward_analysis.py +0 -0
  100. {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/__init__.py +0 -0
  101. {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/cross_file_analyzer.py +0 -0
  102. {skillanalyzer → skill_scanner}/core/static_analysis/parser/__init__.py +0 -0
  103. {skillanalyzer → skill_scanner}/core/static_analysis/semantic/__init__.py +0 -0
  104. {skillanalyzer → skill_scanner}/core/static_analysis/semantic/name_resolver.py +0 -0
  105. {skillanalyzer → skill_scanner}/core/static_analysis/semantic/type_analyzer.py +0 -0
  106. {skillanalyzer → skill_scanner}/core/static_analysis/taint/__init__.py +0 -0
  107. {skillanalyzer → skill_scanner}/core/static_analysis/taint/tracker.py +0 -0
  108. {skillanalyzer → skill_scanner}/core/static_analysis/types/__init__.py +0 -0
  109. {skillanalyzer → skill_scanner}/utils/file_utils.py +0 -0
  110. {skillanalyzer → skill_scanner}/utils/logging_utils.py +0 -0
@@ -41,16 +41,6 @@ class ThreatMapping:
41
41
  "description": "Explicit attempts to override, replace, or modify the model's system instructions, "
42
42
  "operational directives, or behavioral guidelines through direct user input.",
43
43
  },
44
- "PROMPT_INJECTION": { # Underscore version
45
- "scanner_category": "PROMPT INJECTION",
46
- "severity": "HIGH",
47
- "aitech": "AITech-1.1",
48
- "aitech_name": "Direct Prompt Injection",
49
- "aisubtech": "AISubtech-1.1.1",
50
- "aisubtech_name": "Instruction Manipulation (Direct Prompt Injection)",
51
- "description": "Explicit attempts to override, replace, or modify the model's system instructions, "
52
- "operational directives, or behavioral guidelines through direct user input.",
53
- },
54
44
  "DATA EXFILTRATION": {
55
45
  "scanner_category": "SECURITY VIOLATION",
56
46
  "severity": "HIGH",
@@ -75,7 +65,7 @@ class ThreatMapping:
75
65
  "severity": "HIGH",
76
66
  "aitech": "AITech-12.1",
77
67
  "aitech_name": "Tool Exploitation",
78
- "aisubtech": "AISubtech-12.1.5",
68
+ "aisubtech": "AISubtech-12.1.4",
79
69
  "aisubtech_name": "Tool Shadowing",
80
70
  "description": "Disguising, substituting or duplicating legitimate tools within an agent, enabling malicious tools with identical or similar identifiers to intercept or replace trusted tool calls.",
81
71
  },
@@ -92,15 +82,6 @@ class ThreatMapping:
92
82
 
93
83
  # YARA/Static Analyzer Threats
94
84
  YARA_THREATS = {
95
- "PROMPT_INJECTION": { # Underscore version
96
- "scanner_category": "PROMPT INJECTION",
97
- "severity": "HIGH",
98
- "aitech": "AITech-1.1",
99
- "aitech_name": "Direct Prompt Injection",
100
- "aisubtech": "AISubtech-1.1.1",
101
- "aisubtech_name": "Instruction Manipulation (Direct Prompt Injection)",
102
- "description": "Explicit attempts to override system instructions through direct input.",
103
- },
104
85
  "COMMAND INJECTION": {
105
86
  "scanner_category": "INJECTION ATTACK",
106
87
  "severity": "CRITICAL",
@@ -110,15 +91,6 @@ class ThreatMapping:
110
91
  "aisubtech_name": "Injection Attacks (SQL, Command Execution, XSS)",
111
92
  "description": "Injecting malicious command sequences leading to remote code execution.",
112
93
  },
113
- "COMMAND_INJECTION": { # Underscore version
114
- "scanner_category": "INJECTION ATTACK",
115
- "severity": "CRITICAL",
116
- "aitech": "AITech-9.1",
117
- "aitech_name": "Model or Agentic System Manipulation",
118
- "aisubtech": "AISubtech-9.1.4",
119
- "aisubtech_name": "Injection Attacks (SQL, Command Execution, XSS)",
120
- "description": "Injecting malicious command sequences leading to remote code execution.",
121
- },
122
94
  "DATA EXFILTRATION": {
123
95
  "scanner_category": "SECURITY VIOLATION",
124
96
  "severity": "CRITICAL",
@@ -128,40 +100,31 @@ class ThreatMapping:
128
100
  "aisubtech_name": "Data Exfiltration via Agent Tooling",
129
101
  "description": "Unauthorized exposure or exfiltration of sensitive information.",
130
102
  },
131
- "DATA_EXFILTRATION": { # Underscore version
132
- "scanner_category": "SECURITY VIOLATION",
133
- "severity": "CRITICAL",
134
- "aitech": "AITech-8.2",
135
- "aitech_name": "Data Exfiltration / Exposure",
136
- "aisubtech": "AISubtech-8.2.3",
137
- "aisubtech_name": "Data Exfiltration via Agent Tooling",
138
- "description": "Unauthorized exposure or exfiltration of sensitive information.",
139
- },
140
103
  "SKILL DISCOVERY ABUSE": {
141
- "scanner_category": "SOCIAL ENGINEERING",
104
+ "scanner_category": "PROTOCOL MANIPULATION",
142
105
  "severity": "MEDIUM",
143
- "aitech": "AITech-2.1", # Social Engineering (closest match)
144
- "aitech_name": "Social Engineering",
145
- "aisubtech": None, # No exact subtech for skill discovery abuse
146
- "aisubtech_name": None,
147
- "description": "Manipulation of skill discovery to increase unwanted activation (keyword baiting, over-broad descriptions, impersonation).",
106
+ "aitech": "AITech-4.3",
107
+ "aitech_name": "Protocol Manipulation",
108
+ "aisubtech": "AISubtech-4.3.5",
109
+ "aisubtech_name": "Capability Inflation",
110
+ "description": "Manipulation of skill discovery mechanisms to inflate perceived capabilities and increase unwanted activation (keyword baiting, over-broad descriptions, brand impersonation).",
148
111
  },
149
112
  "TRANSITIVE TRUST ABUSE": {
150
113
  "scanner_category": "PROMPT INJECTION",
151
114
  "severity": "HIGH",
152
- "aitech": "AITech-1.2", # Indirect Prompt Injection (exact match from Framework)
115
+ "aitech": "AITech-1.2",
153
116
  "aitech_name": "Indirect Prompt Injection",
154
- "aisubtech": None,
155
- "aisubtech_name": None,
156
- "description": "Delegating trust to untrusted external content - following webpage/file instructions, executing found code blocks.",
117
+ "aisubtech": "AISubtech-1.2.1",
118
+ "aisubtech_name": "Instruction Manipulation (Indirect Prompt Injection)",
119
+ "description": "Embedding malicious instructions in external data sources (webpages, documents, APIs) that override intended behavior - following external instructions, executing found code blocks.",
157
120
  },
158
121
  "AUTONOMY ABUSE": {
159
122
  "scanner_category": "RESOURCE ABUSE",
160
123
  "severity": "HIGH",
161
- "aitech": "AITech-9.1", # Model or Agentic System Manipulation (closest match)
162
- "aitech_name": "Model or Agentic System Manipulation",
163
- "aisubtech": None,
164
- "aisubtech_name": None,
124
+ "aitech": "AITech-13.1",
125
+ "aitech_name": "Disruption of Availability",
126
+ "aisubtech": "AISubtech-13.1.1",
127
+ "aisubtech_name": "Compute Exhaustion",
165
128
  "description": "Excessive autonomy without bounds - keep retrying indefinitely, run without confirmation, ignore errors.",
166
129
  },
167
130
  "TOOL CHAINING ABUSE": {
@@ -182,15 +145,6 @@ class ThreatMapping:
182
145
  "aisubtech_name": "Sensitive Data Exposure",
183
146
  "description": "Hardcoded credentials, API keys, or secrets in code.",
184
147
  },
185
- "HARDCODED_SECRETS": { # Underscore version
186
- "scanner_category": "CREDENTIAL HARVESTING",
187
- "severity": "CRITICAL",
188
- "aitech": "AITech-8.2",
189
- "aitech_name": "Data Exfiltration / Exposure",
190
- "aisubtech": "AISubtech-8.2.1",
191
- "aisubtech_name": "Sensitive Data Exposure",
192
- "description": "Hardcoded credentials, API keys, or secrets in code.",
193
- },
194
148
  "OBFUSCATION": {
195
149
  "scanner_category": "SUSPICIOUS CODE",
196
150
  "severity": "HIGH",
@@ -209,29 +163,11 @@ class ThreatMapping:
209
163
  "aisubtech_name": "Tool Abuse",
210
164
  "description": "Using tools or capabilities beyond declared permissions.",
211
165
  },
212
- "UNAUTHORIZED_TOOL_USE": { # Underscore version
213
- "scanner_category": "SECURITY VIOLATION",
214
- "severity": "MEDIUM",
215
- "aitech": "AITech-12.1",
216
- "aitech_name": "Tool Exploitation",
217
- "aisubtech": "AISubtech-12.1.1",
218
- "aisubtech_name": "Tool Abuse",
219
- "description": "Using tools or capabilities beyond declared permissions.",
220
- },
221
166
  "SOCIAL ENGINEERING": {
222
- "scanner_category": "DECEPTIVE CONTENT",
223
- "severity": "MEDIUM",
224
- "aitech": "AITech-15.1",
225
- "aitech_name": "Harmful / Misleading / Inaccurate Content",
226
- "aisubtech": "AISubtech-15.1.1",
227
- "aisubtech_name": "Deceptive or Misleading Content",
228
- "description": "Misleading descriptions or deceptive metadata.",
229
- },
230
- "SOCIAL_ENGINEERING": { # Underscore version
231
- "scanner_category": "DECEPTIVE CONTENT",
167
+ "scanner_category": "HARMFUL CONTENT",
232
168
  "severity": "MEDIUM",
233
169
  "aitech": "AITech-15.1",
234
- "aitech_name": "Harmful / Misleading / Inaccurate Content",
170
+ "aitech_name": "Harmful Content",
235
171
  "aisubtech": "AISubtech-15.1.1",
236
172
  "aisubtech_name": "Deceptive or Misleading Content",
237
173
  "description": "Misleading descriptions or deceptive metadata.",
@@ -239,18 +175,9 @@ class ThreatMapping:
239
175
  "RESOURCE ABUSE": {
240
176
  "scanner_category": "RESOURCE ABUSE",
241
177
  "severity": "MEDIUM",
242
- "aitech": "AITech-13.3",
243
- "aitech_name": "Availability Disruption",
244
- "aisubtech": "AISubtech-13.3.2",
245
- "aisubtech_name": "Compute Exhaustion",
246
- "description": "Excessive resource consumption or denial of service.",
247
- },
248
- "RESOURCE_ABUSE": { # Underscore version
249
- "scanner_category": "RESOURCE ABUSE",
250
- "severity": "MEDIUM",
251
- "aitech": "AITech-13.3",
252
- "aitech_name": "Availability Disruption",
253
- "aisubtech": "AISubtech-13.3.2",
178
+ "aitech": "AITech-13.1",
179
+ "aitech_name": "Disruption of Availability",
180
+ "aisubtech": "AISubtech-13.1.1",
254
181
  "aisubtech_name": "Compute Exhaustion",
255
182
  "description": "Excessive resource consumption or denial of service.",
256
183
  },
@@ -315,9 +242,9 @@ class ThreatMapping:
315
242
  "RESOURCE EXHAUSTION": {
316
243
  "scanner_category": "RESOURCE ABUSE",
317
244
  "severity": "MEDIUM",
318
- "aitech": "AITech-13.3",
319
- "aitech_name": "Availability Disruption",
320
- "aisubtech": "AISubtech-13.3.2",
245
+ "aitech": "AITech-13.1",
246
+ "aitech_name": "Disruption of Availability",
247
+ "aisubtech": "AISubtech-13.1.1",
321
248
  "aisubtech_name": "Compute Exhaustion",
322
249
  "description": "Overloading the system via repeated invocations or large payloads to cause denial of service.",
323
250
  },
@@ -350,7 +277,8 @@ class ThreatMapping:
350
277
  raise ValueError(f"Unknown analyzer: {analyzer}")
351
278
 
352
279
  threats: dict[str, dict[str, Any]] = analyzer_map[analyzer_lower]
353
- threat_upper = threat_name.upper()
280
+ # Normalize: convert underscores to spaces for consistent lookup
281
+ threat_upper = threat_name.upper().replace("_", " ")
354
282
 
355
283
  if threat_upper not in threats:
356
284
  # Return generic mapping if not found
@@ -383,11 +311,12 @@ class ThreatMapping:
383
311
  "AITech-1.1": "prompt_injection", # Direct Prompt Injection
384
312
  "AITech-1.2": "prompt_injection", # Indirect Prompt Injection
385
313
  "AITech-2.1": "social_engineering", # Social Engineering
314
+ "AITech-4.3": "skill_discovery_abuse", # Protocol Manipulation / Capability Inflation
386
315
  "AITech-8.2": "data_exfiltration", # Data Exfiltration / Exposure
387
316
  "AITech-9.1": "command_injection", # Model or Agentic System Manipulation (injection attacks)
388
317
  "AITech-12.1": "unauthorized_tool_use", # Tool Exploitation
389
- "AITech-13.3": "resource_abuse", # Availability Disruption
390
- "AITech-15.1": "social_engineering", # Harmful / Misleading / Inaccurate Content
318
+ "AITech-13.1": "resource_abuse", # Disruption of Availability (AISubtech-13.1.1: Compute Exhaustion)
319
+ "AITech-15.1": "harmful_content", # Harmful Content
391
320
  "AITech-99.9": "policy_violation", # Unknown Threat
392
321
  }
393
322
 
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # SPDX-License-Identifier: Apache-2.0
16
16
 
17
- """Utility modules for Skill Analyzer."""
17
+ """Utility modules for Skill Scanner."""
18
18
 
19
19
  from .file_utils import get_file_type, is_binary_file, read_file_safe
20
20
  from .logging_utils import get_logger, setup_logger
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # SPDX-License-Identifier: Apache-2.0
16
16
 
17
- """Command execution utilities for Skill Analyzer."""
17
+ """Command execution utilities for Skill Scanner."""
18
18
 
19
19
  import os
20
20
  import shlex
@@ -15,7 +15,7 @@
15
15
  # SPDX-License-Identifier: Apache-2.0
16
16
 
17
17
  """
18
- Dependency Injection Container for Skill Analyzer.
18
+ Dependency Injection Container for Skill Scanner.
19
19
 
20
20
  This module provides a simple dependency injection container to improve
21
21
  testability and decouple configuration from implementation.
@@ -15,7 +15,7 @@
15
15
  # SPDX-License-Identifier: Apache-2.0
16
16
 
17
17
  """
18
- Centralized logging configuration for Skill Analyzer.
18
+ Centralized logging configuration for Skill Scanner.
19
19
 
20
20
  This module provides consistent logging setup across all components.
21
21
  """
@@ -41,8 +41,8 @@ def setup_logger(name: str, level: str | None = None, format_string: str | None
41
41
  if logger.handlers:
42
42
  return logger
43
43
 
44
- skillanalyzer_root = logging.getLogger("skillanalyzer")
45
- if skillanalyzer_root.level == logging.DEBUG and name.startswith("skillanalyzer"):
44
+ skill_scanner_root = logging.getLogger("skill_scanner")
45
+ if skill_scanner_root.level == logging.DEBUG and name.startswith("skill_scanner"):
46
46
  logger.setLevel(logging.DEBUG)
47
47
  elif level:
48
48
  logger.setLevel(getattr(logging, level.upper()))
@@ -78,18 +78,18 @@ def get_logger(name: str, level: str | None = None) -> logging.Logger:
78
78
 
79
79
  def set_verbose_logging(verbose: bool = False) -> None:
80
80
  """
81
- Enable or disable verbose logging for all skillanalyzer loggers.
81
+ Enable or disable verbose logging for all skill_scanner loggers.
82
82
 
83
83
  Args:
84
- verbose: If True, set all existing skillanalyzer loggers to DEBUG level
84
+ verbose: If True, set all existing skill_scanner loggers to DEBUG level
85
85
  """
86
86
  target_level = logging.DEBUG if verbose else logging.INFO
87
87
 
88
- root_logger = logging.getLogger("skillanalyzer")
88
+ root_logger = logging.getLogger("skill_scanner")
89
89
  root_logger.setLevel(target_level)
90
90
 
91
91
  for name in list(logging.Logger.manager.loggerDict.keys()):
92
- if name.startswith("skillanalyzer"):
92
+ if name.startswith("skill_scanner"):
93
93
  logger = logging.getLogger(name)
94
94
  logger.setLevel(target_level)
95
95
  for handler in logger.handlers:
@@ -1,100 +0,0 @@
1
- skillanalyzer/__init__.py,sha256=raAwyMu06X3PXZ3YrxW9sUlZeG_UrDp4HIIUi6hN_zo,1318
2
- skillanalyzer/_version.py,sha256=vLA4ITz09S-S435nq6yTF6l3qiSz6w4euS1rOxXgd1M,704
3
- skillanalyzer/api/__init__.py,sha256=z7QSgt7lMZQ7eO9pAO-Iao6jEJQ6UPQissGfb_U4iXc,754
4
- skillanalyzer/api/api.py,sha256=2R8qpk_DbbhCChnvhzQCMH9FFq0xQDZLX-eMBy0wnbk,1038
5
- skillanalyzer/api/api_cli.py,sha256=VjxcFg-UFJJIWJMcH713tAKKEtIUB0dV66H2Yzd1mb8,2392
6
- skillanalyzer/api/api_server.py,sha256=XAU3QH5yz6BS3T4Tcl13yzz4x3VNK-v6KkidprepJy4,21142
7
- skillanalyzer/api/router.py,sha256=8c1DQI3f3xDvV7SYVSua000oGUu-Oi5YcrzofmRVYnQ,17421
8
- skillanalyzer/cli/__init__.py,sha256=17rrftCF-A1WQDiZ0kdBAfPHgG0ouED5wkdy-WvIRNA,763
9
- skillanalyzer/cli/cli.py,sha256=8ZGZXJ2ccc-93jZS3XOpZyLSAHwjkOai5TU5yG_jmfE,35511
10
- skillanalyzer/config/__init__.py,sha256=KQUqIL0lWI1hy_qu_EDt4EIcuW9a2ok2WVuQNViOf4g,847
11
- skillanalyzer/config/config.py,sha256=-7ymRfwypmBGyoOUWiSuwwRIr7Ztt8t6GcuGjm-9XKw,4714
12
- skillanalyzer/config/config_parser.py,sha256=XF8VwQqrBhzPuS4wf_AI-MAhlm9thgJnbIoncxIoIrs,3777
13
- skillanalyzer/config/constants.py,sha256=4Jck7kUtcHTIa9Hcwnbgk0lUqZvxarcdp6c86Xn4Xwk,2521
14
- skillanalyzer/core/__init__.py,sha256=issm88bGzNlQuFH5qy1tKzMgQbYL0ODSxsDgYjCMCKw,830
15
- skillanalyzer/core/exceptions.py,sha256=zWB8XubcfwEL0uZutuagr1l3rEd3w-5mB1ggNLnz6cE,2015
16
- skillanalyzer/core/loader.py,sha256=8pAr5nN0DLmf7Dc7xIFIT_okQ6w35RKGLyibNUDFbPU,13596
17
- skillanalyzer/core/models.py,sha256=ZMe9CaufG7yMzLwei1GdVidj72HlA16brVwkPGmervg,10627
18
- skillanalyzer/core/scanner.py,sha256=VfrG74SmFyslS3a5Z6HqSOou74u02TW1aos5Oj--_l4,14833
19
- skillanalyzer/core/analyzers/__init__.py,sha256=loTObGAXelxAiodtR0XzR6r1Ebw17BiuZZXN9TA3eJc,2136
20
- skillanalyzer/core/analyzers/aidefense_analyzer.py,sha256=al_j3HzfZIToI38WNOnqBG_AXfJEBd6QVm8_h_sjvA4,36471
21
- skillanalyzer/core/analyzers/base.py,sha256=4BN6dHLn2Q9hQMLAJTSJXsl6tZgfCqqBxZO9icuu70Q,1374
22
- skillanalyzer/core/analyzers/behavioral_analyzer.py,sha256=OcBs0abjmimbtLREkTbgQrarXvGfg18Fp8Z-Uas_gyI,19077
23
- skillanalyzer/core/analyzers/cross_skill_analyzer.py,sha256=4KysKr_2WR5-JbbFs0tBKf27Oj0l35KK0wREFNRcvno,18939
24
- skillanalyzer/core/analyzers/llm_analyzer.py,sha256=juvLmKn1n8HHOzkyizG94aPO-tz_ht-vexMmbGLZ3Mo,17836
25
- skillanalyzer/core/analyzers/llm_prompt_builder.py,sha256=DEz4tP0HY4p2XWbXbxfSIdkwhLCd_dWX7cDe9A3CeOA,10162
26
- skillanalyzer/core/analyzers/llm_provider_config.py,sha256=pbVx7N9OCohjIWjENMq-kiy6_svTn4IYvQfPxlR0M_Y,8488
27
- skillanalyzer/core/analyzers/llm_request_handler.py,sha256=nz_gjnDTr0dT2GbfQMqKR6-n63x38AcB5G4UnPHLY9s,11679
28
- skillanalyzer/core/analyzers/llm_response_parser.py,sha256=wO5ovd4se-KqIPwdZX-r0_tozaJEDUx7Q7yajKntPwk,2682
29
- skillanalyzer/core/analyzers/meta_analyzer.py,sha256=rFyU-BW7cmHDib93KIgdtsH5J7OIVT8Wc0Pnx87OPIE,33373
30
- skillanalyzer/core/analyzers/static.py,sha256=BNHmmZouX_8lbeJZlVC0P831-u9IPz9Gmft_05pI2pI,45259
31
- skillanalyzer/core/analyzers/trigger_analyzer.py,sha256=BJuu0nbI7BKS2aoqZnzYON825ObETsfJcIOiSxkagH4,12263
32
- skillanalyzer/core/analyzers/virustotal_analyzer.py,sha256=V7nG-fR2GhfdZhh8JVNvM6gOqRyUGsuxHN1yNRvmw6M,15988
33
- skillanalyzer/core/analyzers/behavioral/__init__.py,sha256=mY0aRrrT5y7E8SOApQ8g-IewW6LR33Y4SlsZKzl90qQ,1070
34
- skillanalyzer/core/analyzers/behavioral/alignment/__init__.py,sha256=nB2KWYnDu6I4yGiaewEyySzG4w96hElXiQBqJFfGmP4,1832
35
- skillanalyzer/core/analyzers/behavioral/alignment/alignment_llm_client.py,sha256=vklWQ7rBoyfayzs1n1J8xlCo3_nimEqCgDViCXwyOZM,8646
36
- skillanalyzer/core/analyzers/behavioral/alignment/alignment_orchestrator.py,sha256=zfkjFz-DDwUEOGDBpJ8cAZi5bH-VP_d_1bJTF1z0Si4,9478
37
- skillanalyzer/core/analyzers/behavioral/alignment/alignment_prompt_builder.py,sha256=mXkBYQDpPaqA298Jly835x_cLOUWHjSc8sBDhgMrWxs,18043
38
- skillanalyzer/core/analyzers/behavioral/alignment/alignment_response_validator.py,sha256=lu0gPPRbJkZJlkguqwUeSVl43HpMFypICXH_4s8Zjbo,4556
39
- skillanalyzer/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py,sha256=DCXnbs9Fa2ajFT0We4sOo6nxIk7O_Pc0z01fGMDHsRg,7227
40
- skillanalyzer/core/reporters/__init__.py,sha256=XCqeM_kiS1uvcwymDreueQ2KOzMhG5_4vQgxzReJS4w,943
41
- skillanalyzer/core/reporters/json_reporter.py,sha256=JLlPTbs8ncMJHAXZk7iBWCHdL5Qn2PqHOQldHeH2ZGE,1798
42
- skillanalyzer/core/reporters/markdown_reporter.py,sha256=1-pIwgXYBcCzqmKlxh2y2KU37TNRojqaTJ_CBSM_bSY,7842
43
- skillanalyzer/core/reporters/sarif_reporter.py,sha256=n5tGCXKwRJzEovlJt7j0USkmMYDsctLQdF9VIMbN95g,8285
44
- skillanalyzer/core/reporters/table_reporter.py,sha256=g-1W4XsJUzHW7LdzuW5CJ1krHAE5fvHViBKlw1ShFXI,7046
45
- skillanalyzer/core/rules/__init__.py,sha256=zGlTBVjihqxgg0BKmhdGkyeCzSvRjVEASjBh-M0sn_8,680
46
- skillanalyzer/core/rules/patterns.py,sha256=OuJ6mPlQVy9R8g1Pn9ozWIC8iWfDEuQamdDW5Uu8200,5833
47
- skillanalyzer/core/rules/yara_scanner.py,sha256=YBH9-GEqha0zDglnGx4TV-lgv14cLianuxaqlFtLyx4,5327
48
- skillanalyzer/core/static_analysis/__init__.py,sha256=meZnZQj7ChgHek6fIrfd-YInolXCqI37HTUTlQWEm7w,930
49
- skillanalyzer/core/static_analysis/context_extractor.py,sha256=ZaR5bIgfk1WQGU1G2or2vNsPQ3tmW5HU6mtyRemYdK0,29791
50
- skillanalyzer/core/static_analysis/cfg/__init__.py,sha256=jkvx12ZGddbRVu_0b04Bamr7JX084yD6BLxgOUEHT1w,816
51
- skillanalyzer/core/static_analysis/cfg/builder.py,sha256=Tm1GZ56rfOoNx-3WLmn2MNov2KzPKN-QZgJbBG-9D2c,14932
52
- skillanalyzer/core/static_analysis/dataflow/__init__.py,sha256=vjNUG8J5__m8HYd18VNkKxBzeAss1qugVrp0Amndg2w,834
53
- skillanalyzer/core/static_analysis/dataflow/forward_analysis.py,sha256=haHWJVz-SZxZpZoEwAsNOum-67ldppe_YBRMZOSJqz0,30747
54
- skillanalyzer/core/static_analysis/interprocedural/__init__.py,sha256=dFIglo65HpWMJ80ejB4tjv54MaNeSymQ5eowD5QGZic,798
55
- skillanalyzer/core/static_analysis/interprocedural/call_graph_analyzer.py,sha256=NKpixV-wlK_lwnSgLY5Tw01pAoC2kl7R6U4_PWnKicE,14062
56
- skillanalyzer/core/static_analysis/interprocedural/cross_file_analyzer.py,sha256=neP8pdyGhCUHJQmmTXfm0X_CFHlTHh7e3RU7HVJ0UVY,7472
57
- skillanalyzer/core/static_analysis/parser/__init__.py,sha256=AXCg1HHVzyjswGJl4TNFhzwMKxgin8JY2EK00RVv9_Y,769
58
- skillanalyzer/core/static_analysis/parser/python_parser.py,sha256=lkJKSODZkSC-Vg30eSpli_jsFeIouKt-DsSeEgce1u4,13804
59
- skillanalyzer/core/static_analysis/semantic/__init__.py,sha256=7HS7lJ4APpyfWLTUQ_24aJkrLX2MQTcc4erYFtLKm3o,877
60
- skillanalyzer/core/static_analysis/semantic/name_resolver.py,sha256=TEJQkEaTvkL7dnAZwNbcLALPVw85Qc3FS5jfr4CYEsQ,6218
61
- skillanalyzer/core/static_analysis/semantic/type_analyzer.py,sha256=NXEOZO8-vYZ97SQJ5Gu_YLWFDMDhtvtuixVwYGarmDM,5942
62
- skillanalyzer/core/static_analysis/taint/__init__.py,sha256=71JejlK110K2r3LXNIJOLGCZ7I5Q7cEn8XvfCCoEexA,809
63
- skillanalyzer/core/static_analysis/taint/tracker.py,sha256=1WExA8NAV62X5Az64grI41LkkyMNQ7kFS8Mzf6Id1NI,7182
64
- skillanalyzer/core/static_analysis/types/__init__.py,sha256=XluM6BlZ8ECfdAD-231ONJn13UeDdAGmirPAVc0zePk,937
65
- skillanalyzer/data/__init__.py,sha256=WztWQdxkW4nkIejCTH4VH7l6mGU-p2JuEzEUFsj3z_4,977
66
- skillanalyzer/data/prompts/boilerplate_protection_rule_prompt.md,sha256=wCaDgae0LU7Flsd2Q4Ob4vEeZnpc29nfX4oJjBrE-WM,1468
67
- skillanalyzer/data/prompts/code_alignment_threat_analysis_prompt.md,sha256=mvSoW2OekXEz9lChZPaP4hUxVQ0-O57X3VI49ZrZqoY,25442
68
- skillanalyzer/data/prompts/llm_response_schema.json,sha256=nBPlsOtuqv0zwIns4YY7uZsaAM0uPZ7mkcqe8tNDHl8,2971
69
- skillanalyzer/data/prompts/skill_meta_analysis_prompt.md,sha256=O6vUsmCoqDvsd8j8ZbCCzYDdKYZd_UtXgRUJU4xaT4g,13924
70
- skillanalyzer/data/prompts/skill_threat_analysis_prompt.md,sha256=SLSlPbQ_7ASyivbQFnu_MKXJkTx1CMpudb4x5_mykY0,11651
71
- skillanalyzer/data/prompts/unified_response_schema.md,sha256=JzUGSRmF9J0cMcOWy05GGPWyGyYGkto4VPaXL59FWgM,3572
72
- skillanalyzer/data/rules/signatures.yaml,sha256=EMNH1JU5PRU0o8BZai_WzjNXX3UDlv3Gle2SpNt-hb8,16476
73
- skillanalyzer/data/yara_rules/autonomy_abuse.yara,sha256=MuS_YbczaPY4e58dvtaa4nQx6pdcklNjOWtkdo5YLew,2582
74
- skillanalyzer/data/yara_rules/code_execution.yara,sha256=9QP_JR8ZdLCPuDgJMLee6FgsIQPV5UNSBPnOcInHD1M,1898
75
- skillanalyzer/data/yara_rules/coercive_injection.yara,sha256=3QNzoiHDyhk1zUXHv7_COtCBSsr-bb--H4wKeNRCbBM,5359
76
- skillanalyzer/data/yara_rules/command_injection.yara,sha256=8I4mztCPgIZhAipr6GeZbEIi4v6kowVYrqw_ay1ny-w,2165
77
- skillanalyzer/data/yara_rules/credential_harvesting.yara,sha256=7W0pSKpW2KAmek1qP_DpjMHKuswv5L36tWusjuEl6Pc,5643
78
- skillanalyzer/data/yara_rules/prompt_injection.yara,sha256=q5tT7-L__x9RCjdAbFLcs9mSs8gZOmPPzjbdNKRwIHE,2715
79
- skillanalyzer/data/yara_rules/script_injection.yara,sha256=pzVPd7b9WNAS5iw8ZMoUgojKSBlEeSTLHLBho8UiMmA,3100
80
- skillanalyzer/data/yara_rules/skill_discovery_abuse.yara,sha256=gCgFcdFyLFU__7VPZIk8Hgp6ZMw31SPzDUPlpjNa69E,2453
81
- skillanalyzer/data/yara_rules/sql_injection.yara,sha256=pWq3ccqEvQtWz4fU8dQOkhCgVl6US9SZJDfuBU_YCY4,3691
82
- skillanalyzer/data/yara_rules/system_manipulation.yara,sha256=XoO17sZrarzdC58yyHaIz8z36x5xyxzmQXBnkYdoYfM,2231
83
- skillanalyzer/data/yara_rules/tool_chaining_abuse.yara,sha256=T-G3Tib8lU53ZYFdjlI2EEs6qQnZ831oUDNj2vjtONA,2256
84
- skillanalyzer/data/yara_rules/transitive_trust_abuse.yara,sha256=msYKqzbeFWe4mSLsdX8nJwOwuTV9nLFKDf8dXY2wJ8g,2773
85
- skillanalyzer/data/yara_rules/unicode_steganography.yara,sha256=5UxTvcy8CeWJLrPeldgJ9rY5gfODlC9bTNOkCauuOJA,2650
86
- skillanalyzer/hooks/__init__.py,sha256=ufSIo7sdtGxRD4lVDOVqBOqF3dhgEZRSkTu-UT5ZkcA,740
87
- skillanalyzer/hooks/pre_commit.py,sha256=y-9lz4OD2ILlYpbUa8S1uUjBfNDmU8EC-tWyUGU5NY8,13223
88
- skillanalyzer/threats/__init__.py,sha256=PiQ3frPbbaiKmdcxsan-NAgYDOYn_jhr-44-jSIysoY,883
89
- skillanalyzer/threats/threats.py,sha256=egFsT1crNlWQH3szG8yYIURMXXGh7GJnH3wI8w05nfI,21449
90
- skillanalyzer/utils/__init__.py,sha256=KnfUi433fGDKwck57kob4vuA8upzwSC-Na6OHrZ2uDc,907
91
- skillanalyzer/utils/command_utils.py,sha256=dTjN3Uzpk3dw5u7jbbOKO0j5FwmjYqcKlpr0vDA_1y4,4292
92
- skillanalyzer/utils/di_container.py,sha256=0wsQaVFkVLzORVEoMpSoZK_wOJrKTCAkTFkeEuTPzos,4586
93
- skillanalyzer/utils/file_utils.py,sha256=LT2xwrbqIWaYC-BYAL9zpF6a2xk6QNUVzItvGGJcBn8,2043
94
- skillanalyzer/utils/logging_config.py,sha256=wJ3HUNmGECgWE9jwz-SSuUMN-xTde6ybF4Yqa8Qrix4,2940
95
- skillanalyzer/utils/logging_utils.py,sha256=CLdOYmQdJejiLbcECTT2CbDU27PJ327AFMmeuVfCy94,1902
96
- cisco_ai_skill_scanner-1.0.0.dist-info/METADATA,sha256=oh3eKpG8h_pfWcIDdV4z6aAM38Yz-Pv1ZybReEqhYys,9290
97
- cisco_ai_skill_scanner-1.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
98
- cisco_ai_skill_scanner-1.0.0.dist-info/entry_points.txt,sha256=IQSseT8ZcU7aaqYdl20wC1-TqKlklZR2Nw609NBQARw,175
99
- cisco_ai_skill_scanner-1.0.0.dist-info/licenses/LICENSE,sha256=b4va5sK_CWxpeDnOO2MF0MKqsiwU-3YblMmWKnmuWZg,653
100
- cisco_ai_skill_scanner-1.0.0.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- [console_scripts]
2
- skill-scanner = skillanalyzer.cli.cli:main
3
- skill-scanner-api = skillanalyzer.api.api_cli:main
4
- skill-scanner-pre-commit = skillanalyzer.hooks.pre_commit:main
@@ -1,66 +0,0 @@
1
- //////////////////////////////////////////
2
- // Unbounded Autonomy Detection
3
- // Target: Instructions that give skills excessive autonomy
4
- // For Claude Skills with dangerous autonomous behaviors
5
- //////////////////////////////////////////
6
-
7
- rule autonomy_abuse{
8
-
9
- meta:
10
- author = "Cisco"
11
- description = "Detects unbounded autonomy patterns that could lead to runaway behavior"
12
- classification = "harmful"
13
- threat_type = "AUTONOMY ABUSE"
14
-
15
- strings:
16
-
17
- // Keep trying without limits
18
- $keep_trying = /\b(keep (trying|attempting|retrying)|retry (until|till) (it )?(works?|succeeds?)|don't (give up|stop) until|continue (until|till) (success|it works))\b/i
19
-
20
- // Run without confirmation
21
- $no_confirmation = /\b(run without (asking|confirmation|permission|approval)|don't (ask|confirm|wait for) (user|permission|approval)|proceed without (asking|confirmation|permission))\b/i
22
-
23
- // Automatic execution
24
- $auto_execute = /\b(automatically (execute|run|perform|do)|auto-?(run|execute|perform)|execute (immediately|automatically|right away))\b/i
25
-
26
- // Unbounded loops (simplified regex for YARA compatibility)
27
- $unbounded_loops = /\b(run (continuously|forever|indefinitely)|keep (running|going) (forever|indefinitely)|while True:)\b/i
28
-
29
- // Ignore errors and continue
30
- $ignore_errors = /\b(ignore (all |any )?(errors?|exceptions?|failures?)|suppress (all |any )?(errors?|exceptions?)|continue (on|despite|after) (error|exception|failure))\b/i
31
-
32
- // Escalating behavior
33
- $escalating = /\b(if (that |this )?fails?,? (try|attempt|use) (more|higher|elevated) (privileges?|permissions?|access)|escalate (to|until))\b/i
34
-
35
- // Self-modification
36
- $self_modify = /\b(modify (itself|yourself|own|this skill)|update (itself|yourself|own|this skill)|change (own|this skill's) (code|behavior|instructions?))\b/i
37
-
38
- // Autonomous decision making without bounds
39
- $autonomous_decisions = /\b(decide (what|which|how) to (do|run|execute) (next|automatically)|choose (your own|automatically) (next )?actions?)\b/i
40
-
41
- condition:
42
-
43
- // Keep trying patterns
44
- $keep_trying or
45
-
46
- // No confirmation
47
- $no_confirmation or
48
-
49
- // Auto execution
50
- $auto_execute or
51
-
52
- // Unbounded loops
53
- $unbounded_loops or
54
-
55
- // Ignore errors
56
- $ignore_errors or
57
-
58
- // Escalating behavior
59
- $escalating or
60
-
61
- // Self-modification
62
- $self_modify or
63
-
64
- // Autonomous decisions
65
- $autonomous_decisions
66
- }
@@ -1,61 +0,0 @@
1
- //////////////////////////////////////////
2
- // Code Execution Detection Rule for Claude Skills
3
- // Target: Python and Bash execution patterns
4
- // (eval, exec, subprocess, shell injection)
5
- /////////////////////////////////////////
6
-
7
- rule code_execution{
8
-
9
- meta:
10
-
11
- author = "Cisco"
12
- description = "Detects dangerous code execution patterns in Claude Skills (Python/Bash)"
13
- classification = "harmful"
14
- threat_type = "CODE EXECUTION"
15
-
16
- strings:
17
-
18
- // Python dangerous execution (eval, exec with actual content)
19
- $python_eval_exec = /\b(eval|exec)\s*\([^)]{5,}\)/i
20
-
21
- // Python system/subprocess execution
22
- $python_system_calls = /\b(os\.(system|popen|execv?p?e?|spawnv?p?e?)|subprocess\.(run|call|Popen|check_output))\s*\(/i
23
-
24
- // Python __import__ with user input
25
- $python_import_abuse = /\b__import__\s*\([^)]*input/i
26
-
27
- // Bash shell execution with variables
28
- $bash_shell_exec = /\b(system|exec|popen|spawn)\s*\([^)]*[\$\{]/i
29
-
30
- // Base64 decode followed by exec/eval (obfuscation)
31
- $obfuscated_execution = /\b(base64\.b64decode|decode\(|atob)\s*\([^)]+\)[\s\n]*.*\b(eval|exec|os\.system|subprocess)\s*\(/i
32
-
33
- // Shell command injection patterns
34
- $shell_injection = /[\"|\']\s*[;&|]\s*(rm|wget|curl|nc|bash|sh|python)\s+/
35
-
36
- // Pickle deserialization (unsafe)
37
- $unsafe_deserialize = /\bpickle\.(loads?|load)\s*\(/i
38
-
39
- condition:
40
-
41
- // Python eval/exec with content
42
- $python_eval_exec or
43
-
44
- // Python system calls
45
- $python_system_calls or
46
-
47
- // Python import abuse
48
- $python_import_abuse or
49
-
50
- // Bash shell execution
51
- $bash_shell_exec or
52
-
53
- // Obfuscated execution
54
- $obfuscated_execution or
55
-
56
- // Shell injection
57
- $shell_injection or
58
-
59
- // Unsafe deserialization
60
- $unsafe_deserialize
61
- }
@@ -1,54 +0,0 @@
1
- //////////////////////////////////////////
2
- // Shell/System Command Injection Detection Rule
3
- // Target: Command injection patterns for Claude Skills (Python/Bash)
4
- // (Shell operators, dangerous commands, network tools + reverse shells)
5
- /////////////////////////////////////////
6
-
7
- rule command_injection{
8
-
9
- meta:
10
- author = "Cisco"
11
- description = "Detects command injection patterns in Claude Skills: shell operators, system commands, and network tools"
12
- classification = "harmful"
13
- threat_type = "INJECTION ATTACK"
14
-
15
- strings:
16
-
17
- // Dangerous system commands
18
- $dangerous_system_cmds = /\b(shutdown|reboot|halt|poweroff)\s+(-[fh]|now|0)\b/
19
-
20
- // Network tools with suspicious usage (reverse connections, port scanning)
21
- $malicious_network_tools = /\b(nc|netcat)\s+(-[le]|25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/i
22
-
23
- // Reconnaissance tools
24
- $reconnaissance_tools = /\b(nmap)\s+(-[sS]|--script|25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/i
25
-
26
- // Data exfiltration with curl/wget to external URLs
27
- $data_exfiltration_tools = /\b(wget|curl)\s+(http[s]?:\/\/[^\s]+|ftp:\/\/[^\s]+|-[oO]\s|--output\s)/i
28
-
29
- // Reverse shell patterns (high severity)
30
- $reverse_shells = /\b(bash\s+-i|sh\s+-i|nc\s+-e|\/dev\/tcp\/[0-9]+\.|socat.*exec|python.*socket.*connect)\b/i
31
-
32
- // Shell command chaining with suspicious patterns
33
- $shell_chaining = /[|&;]\s*(rm\s+-rf|dd\s+if=|chmod\s+777|wget\s+http|curl\s+http)/
34
-
35
- condition:
36
-
37
- // Dangerous system command patterns
38
- $dangerous_system_cmds or
39
-
40
- // Network tool abuse patterns
41
- $malicious_network_tools or
42
-
43
- // Reconnaissance tools
44
- $reconnaissance_tools or
45
-
46
- // Data exfiltration tools
47
- $data_exfiltration_tools or
48
-
49
- // Reverse shell patterns
50
- $reverse_shells or
51
-
52
- // Shell command chaining
53
- $shell_chaining
54
- }