cisco-ai-skill-scanner 1.0.0__py3-none-any.whl → 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/METADATA +13 -13
- cisco_ai_skill_scanner-1.0.1.dist-info/RECORD +100 -0
- cisco_ai_skill_scanner-1.0.1.dist-info/entry_points.txt +4 -0
- {skillanalyzer → skill_scanner}/__init__.py +8 -4
- {skillanalyzer → skill_scanner}/_version.py +2 -2
- {skillanalyzer → skill_scanner}/api/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/api/api.py +4 -4
- {skillanalyzer → skill_scanner}/api/api_cli.py +7 -7
- {skillanalyzer → skill_scanner}/api/api_server.py +6 -6
- {skillanalyzer → skill_scanner}/api/router.py +3 -3
- {skillanalyzer → skill_scanner}/cli/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/cli/cli.py +11 -11
- {skillanalyzer → skill_scanner}/config/__init__.py +3 -3
- {skillanalyzer → skill_scanner}/config/config.py +2 -2
- {skillanalyzer → skill_scanner}/config/config_parser.py +9 -9
- {skillanalyzer → skill_scanner}/config/constants.py +2 -2
- {skillanalyzer → skill_scanner}/core/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/__init__.py +3 -3
- {skillanalyzer → skill_scanner}/core/analyzers/aidefense_analyzer.py +3 -3
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_llm_client.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_prompt_builder.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral_analyzer.py +1 -1
- skillanalyzer/core/analyzers/cross_skill_analyzer.py → skill_scanner/core/analyzers/cross_skill_scanner.py +5 -5
- {skillanalyzer → skill_scanner}/core/analyzers/llm_analyzer.py +1 -1
- {skillanalyzer → skill_scanner}/core/analyzers/llm_prompt_builder.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/meta_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/analyzers/static.py +8 -8
- {skillanalyzer → skill_scanner}/core/analyzers/trigger_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/exceptions.py +10 -10
- {skillanalyzer → skill_scanner}/core/loader.py +4 -4
- {skillanalyzer → skill_scanner}/core/models.py +6 -6
- {skillanalyzer → skill_scanner}/core/reporters/markdown_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/reporters/sarif_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/reporters/table_reporter.py +2 -2
- {skillanalyzer → skill_scanner}/core/rules/yara_scanner.py +1 -1
- {skillanalyzer → skill_scanner}/core/scanner.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/context_extractor.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/call_graph_analyzer.py +2 -2
- {skillanalyzer → skill_scanner}/core/static_analysis/parser/python_parser.py +5 -5
- {skillanalyzer → skill_scanner}/data/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/data/prompts/boilerplate_protection_rule_prompt.md +5 -5
- {skillanalyzer → skill_scanner}/data/prompts/code_alignment_threat_analysis_prompt.md +25 -25
- {skillanalyzer → skill_scanner}/data/prompts/skill_meta_analysis_prompt.md +6 -6
- {skillanalyzer → skill_scanner}/data/prompts/skill_threat_analysis_prompt.md +11 -11
- {skillanalyzer → skill_scanner}/data/prompts/unified_response_schema.md +1 -1
- {skillanalyzer → skill_scanner}/data/rules/signatures.yaml +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/autonomy_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/code_execution.yara +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/command_injection.yara +2 -2
- {skillanalyzer → skill_scanner}/data/yara_rules/skill_discovery_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/tool_chaining_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/data/yara_rules/transitive_trust_abuse.yara +1 -1
- {skillanalyzer → skill_scanner}/hooks/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/hooks/pre_commit.py +16 -16
- {skillanalyzer → skill_scanner}/threats/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/utils/__init__.py +1 -1
- {skillanalyzer → skill_scanner}/utils/command_utils.py +1 -1
- {skillanalyzer → skill_scanner}/utils/di_container.py +1 -1
- {skillanalyzer → skill_scanner}/utils/logging_config.py +7 -7
- cisco_ai_skill_scanner-1.0.0.dist-info/RECORD +0 -100
- cisco_ai_skill_scanner-1.0.0.dist-info/entry_points.txt +0 -4
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/WHEEL +0 -0
- {cisco_ai_skill_scanner-1.0.0.dist-info → cisco_ai_skill_scanner-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/base.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_orchestrator.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/alignment_response_validator.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_provider_config.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_request_handler.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/llm_response_parser.py +0 -0
- {skillanalyzer → skill_scanner}/core/analyzers/virustotal_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/reporters/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/reporters/json_reporter.py +0 -0
- {skillanalyzer → skill_scanner}/core/rules/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/rules/patterns.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/cfg/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/cfg/builder.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/dataflow/forward_analysis.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/interprocedural/cross_file_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/parser/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/name_resolver.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/semantic/type_analyzer.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/taint/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/taint/tracker.py +0 -0
- {skillanalyzer → skill_scanner}/core/static_analysis/types/__init__.py +0 -0
- {skillanalyzer → skill_scanner}/data/prompts/llm_response_schema.json +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/coercive_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/credential_harvesting.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/prompt_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/script_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/sql_injection.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/system_manipulation.yara +0 -0
- {skillanalyzer → skill_scanner}/data/yara_rules/unicode_steganography.yara +0 -0
- {skillanalyzer → skill_scanner}/threats/threats.py +0 -0
- {skillanalyzer → skill_scanner}/utils/file_utils.py +0 -0
- {skillanalyzer → skill_scanner}/utils/logging_utils.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cisco-ai-skill-scanner
|
|
3
|
-
Version: 1.0.
|
|
4
|
-
Summary: Security scanner for
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Security scanner for Agent Skills packages - Detects prompt injection, data exfiltration, and malicious code
|
|
5
5
|
Project-URL: Homepage, https://github.com/cisco-ai-defense/skill-scanner
|
|
6
6
|
Project-URL: Documentation, https://github.com/cisco-ai-defense/skill-scanner#readme
|
|
7
7
|
Project-URL: Repository, https://github.com/cisco-ai-defense/skill-scanner
|
|
@@ -68,14 +68,14 @@ Description-Content-Type: text/markdown
|
|
|
68
68
|
|
|
69
69
|
A security scanner for AI Agent Skills that detects prompt injection, data exfiltration, and malicious code patterns. Combines **pattern-based detection** (YAML + YARA), **LLM-as-a-judge**, and **behavioral dataflow analysis** for comprehensive threat detection.
|
|
70
70
|
|
|
71
|
-
Supports [
|
|
71
|
+
Supports [OpenAI Codex Skills](https://openai.github.io/codex/) and [Cursor Agent Skills](https://docs.cursor.com/context/rules) formats following the [Agent Skills specification](https://agentskills.io).
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
75
|
## Highlights
|
|
76
76
|
|
|
77
77
|
- **Multi-Engine Detection** - Static analysis, behavioral dataflow, LLM semantic analysis, and cloud-based scanning
|
|
78
|
-
- **False Positive Filtering** - Meta-analyzer
|
|
78
|
+
- **False Positive Filtering** - Meta-analyzer significantly reduces noise while preserving detection capability
|
|
79
79
|
- **CI/CD Ready** - SARIF output for GitHub Code Scanning, exit codes for build failures
|
|
80
80
|
- **Extensible** - Plugin architecture for custom analyzers
|
|
81
81
|
|
|
@@ -151,29 +151,29 @@ export AI_DEFENSE_API_KEY="your_aidefense_api_key"
|
|
|
151
151
|
|
|
152
152
|
```bash
|
|
153
153
|
# Scan a single skill (static analyzer only)
|
|
154
|
-
skill-
|
|
154
|
+
skill-scanner scan /path/to/skill
|
|
155
155
|
|
|
156
156
|
# Scan with behavioral analyzer (dataflow analysis)
|
|
157
|
-
skill-
|
|
157
|
+
skill-scanner scan /path/to/skill --use-behavioral
|
|
158
158
|
|
|
159
159
|
# Scan with all engines
|
|
160
|
-
skill-
|
|
160
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
|
|
161
161
|
|
|
162
162
|
# Scan with meta-analyzer for false positive filtering
|
|
163
|
-
skill-
|
|
163
|
+
skill-scanner scan /path/to/skill --use-llm --enable-meta
|
|
164
164
|
|
|
165
165
|
# Scan multiple skills recursively
|
|
166
|
-
skill-
|
|
166
|
+
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
|
|
167
167
|
|
|
168
168
|
# CI/CD: Fail build if threats found
|
|
169
|
-
skill-
|
|
169
|
+
skill-scanner scan-all ./skills --fail-on-findings --format sarif --output results.sarif
|
|
170
170
|
```
|
|
171
171
|
|
|
172
172
|
### Python SDK
|
|
173
173
|
|
|
174
174
|
```python
|
|
175
|
-
from
|
|
176
|
-
from
|
|
175
|
+
from skill_scanner import SkillScanner
|
|
176
|
+
from skill_scanner.core.analyzers import StaticAnalyzer, BehavioralAnalyzer
|
|
177
177
|
|
|
178
178
|
# Create scanner with analyzers
|
|
179
179
|
scanner = SkillScanner(analyzers=[
|
|
@@ -221,7 +221,7 @@ print(f"Findings: {len(result.findings)}")
|
|
|
221
221
|
## Example Output
|
|
222
222
|
|
|
223
223
|
```
|
|
224
|
-
$ skill-
|
|
224
|
+
$ skill-scanner scan ./my-skill --use-behavioral
|
|
225
225
|
|
|
226
226
|
============================================================
|
|
227
227
|
Skill: my-skill
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
skill_scanner/__init__.py,sha256=QuGYhgc529C5Cjtk3Th5t7-Qkx9kxOv6E2GK6soGZQw,1383
|
|
2
|
+
skill_scanner/_version.py,sha256=JvmBpae6cHui8lSCsCcZQAxzawN2NERHGsr-rIUeJMo,704
|
|
3
|
+
skill_scanner/api/__init__.py,sha256=vhuGqXgBx70izjHQOa-cWm3cbHlKhkpEiRjpusQ49vo,746
|
|
4
|
+
skill_scanner/api/api.py,sha256=5fFYh1e1JE06pNtZw-7zMcQMc791ubNlck0VjWzskq8,1027
|
|
5
|
+
skill_scanner/api/api_cli.py,sha256=wMJHSrQWWSg5idCLaWa-irPqhigtt_o1QVukMKvpfGY,2372
|
|
6
|
+
skill_scanner/api/api_server.py,sha256=cjN2P4xHXitKAI9aLztn9bKcFyVxm-2rpsy1OaVxwQo,21110
|
|
7
|
+
skill_scanner/api/router.py,sha256=3u5qPWO48iF09oIm-3oxYkqqO4hT50jCaNQTr2TBfYc,17411
|
|
8
|
+
skill_scanner/cli/__init__.py,sha256=UOFAWN8z8nMviFLHiFrtlcHn4eGbbRZc4B2q8yWlTno,755
|
|
9
|
+
skill_scanner/cli/cli.py,sha256=rnV2C2X-lNqSxPM3rNJ6J9Gde1kap9IAiBnOtpmCbXY,35485
|
|
10
|
+
skill_scanner/config/__init__.py,sha256=S0hMvyq3Vi0wWET74XmbPQmBTBkLXtqFca5PcTYosUM,837
|
|
11
|
+
skill_scanner/config/config.py,sha256=SvK9lvTNjpygc80pamDaGDtOhh99qGBG3EJiFKfEVzc,4698
|
|
12
|
+
skill_scanner/config/config_parser.py,sha256=kGPawiniy35fyUoJvnwRsJsgtIiAjSXHhE3joUcZtn8,3772
|
|
13
|
+
skill_scanner/config/constants.py,sha256=re2KkOtvSnxSJgkamdIU0fjdQ-fUSHX1eQSEfKDXjTA,2512
|
|
14
|
+
skill_scanner/core/__init__.py,sha256=fC3n7lJs_G8CFz2Vg1gfGFe6b0pBiCUs7MRW4kCM1CY,822
|
|
15
|
+
skill_scanner/core/exceptions.py,sha256=F4k2RDXIxrrnNsAsHn7wR277i2dNOXdK-NK0r-m3nF0,2007
|
|
16
|
+
skill_scanner/core/loader.py,sha256=cIU7e5MZHxryr-7UiGwI76eM0Zbm-LrmRGI0mP1_17A,13541
|
|
17
|
+
skill_scanner/core/models.py,sha256=vWAhDpAm4y8Flqp18cH4R4Vh8eOKNHrAHmsx68jXyOk,10551
|
|
18
|
+
skill_scanner/core/scanner.py,sha256=zAtM3Hbs_NNbYV7iq-9W2BURO-H23uRJ-E14S2h_wek,14830
|
|
19
|
+
skill_scanner/core/analyzers/__init__.py,sha256=tctB8Q30gA5V4pdR5yoSpxyIKJZkFTJwowUq6UwddQo,2132
|
|
20
|
+
skill_scanner/core/analyzers/aidefense_analyzer.py,sha256=ws61J3KJsz1DiuucBPCdsWN8ACI_iurtDQzWtFqfCA8,36468
|
|
21
|
+
skill_scanner/core/analyzers/base.py,sha256=4BN6dHLn2Q9hQMLAJTSJXsl6tZgfCqqBxZO9icuu70Q,1374
|
|
22
|
+
skill_scanner/core/analyzers/behavioral_analyzer.py,sha256=dvdTdwUKHqnmEa1nsChcdlJ0V_WvcZrGyHX5uYe0clI,19076
|
|
23
|
+
skill_scanner/core/analyzers/cross_skill_scanner.py,sha256=MTedSXhLagZeXEtvkPV8m_48GqoHMWkh9rR9FR9puLQ,18934
|
|
24
|
+
skill_scanner/core/analyzers/llm_analyzer.py,sha256=6_b0DYTPSA0opLNnQzyuAoVfxgI8PFkEhJEeB-Ajd3w,17835
|
|
25
|
+
skill_scanner/core/analyzers/llm_prompt_builder.py,sha256=28OCgMUE0T-A6GkF5sUY0qPFvaKC1jhB6jPjVPbePsw,10160
|
|
26
|
+
skill_scanner/core/analyzers/llm_provider_config.py,sha256=pbVx7N9OCohjIWjENMq-kiy6_svTn4IYvQfPxlR0M_Y,8488
|
|
27
|
+
skill_scanner/core/analyzers/llm_request_handler.py,sha256=nz_gjnDTr0dT2GbfQMqKR6-n63x38AcB5G4UnPHLY9s,11679
|
|
28
|
+
skill_scanner/core/analyzers/llm_response_parser.py,sha256=wO5ovd4se-KqIPwdZX-r0_tozaJEDUx7Q7yajKntPwk,2682
|
|
29
|
+
skill_scanner/core/analyzers/meta_analyzer.py,sha256=oIMmRfIsS-LUa7qyTpS8HTrGu0TqpUbrrV6gUa5dugU,33371
|
|
30
|
+
skill_scanner/core/analyzers/static.py,sha256=JAUYefYH1Oa3qnFmk78Sw7OuzcCwC1d8BFX6Hoh0wtM,45208
|
|
31
|
+
skill_scanner/core/analyzers/trigger_analyzer.py,sha256=bmJjaGdSqsAyvOIehHbMjLrDWysd7YV9J9TXgMvTEe0,12268
|
|
32
|
+
skill_scanner/core/analyzers/virustotal_analyzer.py,sha256=V7nG-fR2GhfdZhh8JVNvM6gOqRyUGsuxHN1yNRvmw6M,15988
|
|
33
|
+
skill_scanner/core/analyzers/behavioral/__init__.py,sha256=aTuJyqDbylHE2Ags_LaYLbbOkkJxkTDP--VBU-KMPgs,1069
|
|
34
|
+
skill_scanner/core/analyzers/behavioral/alignment/__init__.py,sha256=nB2KWYnDu6I4yGiaewEyySzG4w96hElXiQBqJFfGmP4,1832
|
|
35
|
+
skill_scanner/core/analyzers/behavioral/alignment/alignment_llm_client.py,sha256=mRocjOvf8jM2UQ-_TzcHRQDVkEeoPXu87GjwKiuZ2Yw,8645
|
|
36
|
+
skill_scanner/core/analyzers/behavioral/alignment/alignment_orchestrator.py,sha256=zfkjFz-DDwUEOGDBpJ8cAZi5bH-VP_d_1bJTF1z0Si4,9478
|
|
37
|
+
skill_scanner/core/analyzers/behavioral/alignment/alignment_prompt_builder.py,sha256=oAGvbIBmCP6APYwYXKsVyh0jWBgaiM5N6Bo5YoHbJT8,18041
|
|
38
|
+
skill_scanner/core/analyzers/behavioral/alignment/alignment_response_validator.py,sha256=lu0gPPRbJkZJlkguqwUeSVl43HpMFypICXH_4s8Zjbo,4556
|
|
39
|
+
skill_scanner/core/analyzers/behavioral/alignment/threat_vulnerability_classifier.py,sha256=DCXnbs9Fa2ajFT0We4sOo6nxIk7O_Pc0z01fGMDHsRg,7227
|
|
40
|
+
skill_scanner/core/reporters/__init__.py,sha256=XCqeM_kiS1uvcwymDreueQ2KOzMhG5_4vQgxzReJS4w,943
|
|
41
|
+
skill_scanner/core/reporters/json_reporter.py,sha256=JLlPTbs8ncMJHAXZk7iBWCHdL5Qn2PqHOQldHeH2ZGE,1798
|
|
42
|
+
skill_scanner/core/reporters/markdown_reporter.py,sha256=SPLztJIhOVi0knocvSCCByWdsXWp3rQ1E63VGHaxgm8,7840
|
|
43
|
+
skill_scanner/core/reporters/sarif_reporter.py,sha256=8BUUerHX-gpE-5HYAipfCLH3GdlVuul43ZItHDAB7Bw,8289
|
|
44
|
+
skill_scanner/core/reporters/table_reporter.py,sha256=sotaDM2VzaX4vCR-OrF3GyIX_yv7wWhzS_doyc1I1XE,7044
|
|
45
|
+
skill_scanner/core/rules/__init__.py,sha256=zGlTBVjihqxgg0BKmhdGkyeCzSvRjVEASjBh-M0sn_8,680
|
|
46
|
+
skill_scanner/core/rules/patterns.py,sha256=OuJ6mPlQVy9R8g1Pn9ozWIC8iWfDEuQamdDW5Uu8200,5833
|
|
47
|
+
skill_scanner/core/rules/yara_scanner.py,sha256=U-qYrb92n3664cTt7ynRTMVGGsxhfrSU0OOYV-BnxKc,5326
|
|
48
|
+
skill_scanner/core/static_analysis/__init__.py,sha256=meZnZQj7ChgHek6fIrfd-YInolXCqI37HTUTlQWEm7w,930
|
|
49
|
+
skill_scanner/core/static_analysis/context_extractor.py,sha256=bUOmrkwzUxAVD1_64TZt4eHOhzH42db1W39VPibdmk8,29785
|
|
50
|
+
skill_scanner/core/static_analysis/cfg/__init__.py,sha256=jkvx12ZGddbRVu_0b04Bamr7JX084yD6BLxgOUEHT1w,816
|
|
51
|
+
skill_scanner/core/static_analysis/cfg/builder.py,sha256=Tm1GZ56rfOoNx-3WLmn2MNov2KzPKN-QZgJbBG-9D2c,14932
|
|
52
|
+
skill_scanner/core/static_analysis/dataflow/__init__.py,sha256=eVdTh0JOvQvtKG96gqs_1VvIU0_sRNkV6sXZz6X9o7I,833
|
|
53
|
+
skill_scanner/core/static_analysis/dataflow/forward_analysis.py,sha256=haHWJVz-SZxZpZoEwAsNOum-67ldppe_YBRMZOSJqz0,30747
|
|
54
|
+
skill_scanner/core/static_analysis/interprocedural/__init__.py,sha256=dFIglo65HpWMJ80ejB4tjv54MaNeSymQ5eowD5QGZic,798
|
|
55
|
+
skill_scanner/core/static_analysis/interprocedural/call_graph_analyzer.py,sha256=3azYWJ8A5-I39gc5zK4Iz6g0AAUX_uos4CNh1sVQNQA,14060
|
|
56
|
+
skill_scanner/core/static_analysis/interprocedural/cross_file_analyzer.py,sha256=neP8pdyGhCUHJQmmTXfm0X_CFHlTHh7e3RU7HVJ0UVY,7472
|
|
57
|
+
skill_scanner/core/static_analysis/parser/__init__.py,sha256=AXCg1HHVzyjswGJl4TNFhzwMKxgin8JY2EK00RVv9_Y,769
|
|
58
|
+
skill_scanner/core/static_analysis/parser/python_parser.py,sha256=Imlv4PO6XZKQpdCRZ6jV5uBAySuBN6XnHAqH4LEvvGE,13773
|
|
59
|
+
skill_scanner/core/static_analysis/semantic/__init__.py,sha256=7HS7lJ4APpyfWLTUQ_24aJkrLX2MQTcc4erYFtLKm3o,877
|
|
60
|
+
skill_scanner/core/static_analysis/semantic/name_resolver.py,sha256=TEJQkEaTvkL7dnAZwNbcLALPVw85Qc3FS5jfr4CYEsQ,6218
|
|
61
|
+
skill_scanner/core/static_analysis/semantic/type_analyzer.py,sha256=NXEOZO8-vYZ97SQJ5Gu_YLWFDMDhtvtuixVwYGarmDM,5942
|
|
62
|
+
skill_scanner/core/static_analysis/taint/__init__.py,sha256=71JejlK110K2r3LXNIJOLGCZ7I5Q7cEn8XvfCCoEexA,809
|
|
63
|
+
skill_scanner/core/static_analysis/taint/tracker.py,sha256=1WExA8NAV62X5Az64grI41LkkyMNQ7kFS8Mzf6Id1NI,7182
|
|
64
|
+
skill_scanner/core/static_analysis/types/__init__.py,sha256=XluM6BlZ8ECfdAD-231ONJn13UeDdAGmirPAVc0zePk,937
|
|
65
|
+
skill_scanner/data/__init__.py,sha256=eeZz0MhPMEV-PAx8Eqpbb4ey6EHbXT5g8j-DC4427A4,969
|
|
66
|
+
skill_scanner/data/prompts/boilerplate_protection_rule_prompt.md,sha256=DNXYx13Mcbn2q9hw4msTDDbq_VcYCiVkqBZVFSNfzOg,1471
|
|
67
|
+
skill_scanner/data/prompts/code_alignment_threat_analysis_prompt.md,sha256=OzOOFVCbhSHFYCd4Xg3_q0tIlOe32YRFOje-lZTyYws,25406
|
|
68
|
+
skill_scanner/data/prompts/llm_response_schema.json,sha256=nBPlsOtuqv0zwIns4YY7uZsaAM0uPZ7mkcqe8tNDHl8,2971
|
|
69
|
+
skill_scanner/data/prompts/skill_meta_analysis_prompt.md,sha256=aufAuj71GtMq9jwZfQoXAaZj0x43BAeBhC-fahc3bk4,13926
|
|
70
|
+
skill_scanner/data/prompts/skill_threat_analysis_prompt.md,sha256=sg38JO8PvmxlpPudqzmUhGdv66A6d_Bj4dPiGVc_g8U,11629
|
|
71
|
+
skill_scanner/data/prompts/unified_response_schema.md,sha256=-f1EDpKzxjMMFFxXlakS3rORyLtD1_2XiuNwnty1nQs,3571
|
|
72
|
+
skill_scanner/data/rules/signatures.yaml,sha256=EfP_gQk2tTNLNTaJK1si_yfg6XpmxGDGSaQCqpTnxvs,16465
|
|
73
|
+
skill_scanner/data/yara_rules/autonomy_abuse.yara,sha256=5rbbKXvdWrrIi29T_nBhOQB9erUO8vqK_6TjWok-V2U,2581
|
|
74
|
+
skill_scanner/data/yara_rules/code_execution.yara,sha256=mdXAEqi_Upphzt-NhGascbdG5hu8-UDEiRMfq0lgvWc,1896
|
|
75
|
+
skill_scanner/data/yara_rules/coercive_injection.yara,sha256=3QNzoiHDyhk1zUXHv7_COtCBSsr-bb--H4wKeNRCbBM,5359
|
|
76
|
+
skill_scanner/data/yara_rules/command_injection.yara,sha256=gwZ531smAPzLU1iodtX1JuZOyM_2RwKtBj_SfKjt_20,2163
|
|
77
|
+
skill_scanner/data/yara_rules/credential_harvesting.yara,sha256=7W0pSKpW2KAmek1qP_DpjMHKuswv5L36tWusjuEl6Pc,5643
|
|
78
|
+
skill_scanner/data/yara_rules/prompt_injection.yara,sha256=q5tT7-L__x9RCjdAbFLcs9mSs8gZOmPPzjbdNKRwIHE,2715
|
|
79
|
+
skill_scanner/data/yara_rules/script_injection.yara,sha256=pzVPd7b9WNAS5iw8ZMoUgojKSBlEeSTLHLBho8UiMmA,3100
|
|
80
|
+
skill_scanner/data/yara_rules/skill_discovery_abuse.yara,sha256=l1a2YESrARelhByvKxKaOdohKntMqxYGVcusp-1ZZCk,2452
|
|
81
|
+
skill_scanner/data/yara_rules/sql_injection.yara,sha256=pWq3ccqEvQtWz4fU8dQOkhCgVl6US9SZJDfuBU_YCY4,3691
|
|
82
|
+
skill_scanner/data/yara_rules/system_manipulation.yara,sha256=XoO17sZrarzdC58yyHaIz8z36x5xyxzmQXBnkYdoYfM,2231
|
|
83
|
+
skill_scanner/data/yara_rules/tool_chaining_abuse.yara,sha256=1SyF3_j3VJysDvn1uKkuP9G7F4EhMYXMrq7Xcn1UURI,2255
|
|
84
|
+
skill_scanner/data/yara_rules/transitive_trust_abuse.yara,sha256=8YMYbM5qwn-pqn8EFHJwpKvWyk__n9vEI7bH_MLzF2k,2772
|
|
85
|
+
skill_scanner/data/yara_rules/unicode_steganography.yara,sha256=5UxTvcy8CeWJLrPeldgJ9rY5gfODlC9bTNOkCauuOJA,2650
|
|
86
|
+
skill_scanner/hooks/__init__.py,sha256=W7_Xr71Edm6eHKz9_vZgpERbr0Wx2cyTxPn4YJaGg6o,739
|
|
87
|
+
skill_scanner/hooks/pre_commit.py,sha256=dtajQcyAlSaH15J1O9HHQ67xrGj2P6M2pHN6MZ0htwY,13207
|
|
88
|
+
skill_scanner/threats/__init__.py,sha256=9qlA659fV2Ngl-nV3INIrbVDvXzevHy0F9YAmu_kPWE,875
|
|
89
|
+
skill_scanner/threats/threats.py,sha256=egFsT1crNlWQH3szG8yYIURMXXGh7GJnH3wI8w05nfI,21449
|
|
90
|
+
skill_scanner/utils/__init__.py,sha256=mmzKMNaDQ3EtmD2zr_68gMatm4OETbVNtEXuVESxzJs,906
|
|
91
|
+
skill_scanner/utils/command_utils.py,sha256=74rojYVuVWpv-HVdW0qTIzq0ySPdpBuyNTdIQZDakUM,4291
|
|
92
|
+
skill_scanner/utils/di_container.py,sha256=O3aaQVKcu4t1YUXl9iCZxjSBXnvgddlTgmEp0De_g04,4585
|
|
93
|
+
skill_scanner/utils/file_utils.py,sha256=LT2xwrbqIWaYC-BYAL9zpF6a2xk6QNUVzItvGGJcBn8,2043
|
|
94
|
+
skill_scanner/utils/logging_config.py,sha256=8LJwRCVM-oED_6KRDvtjaL8cvEoR88seX1pDyILeQV4,2939
|
|
95
|
+
skill_scanner/utils/logging_utils.py,sha256=CLdOYmQdJejiLbcECTT2CbDU27PJ327AFMmeuVfCy94,1902
|
|
96
|
+
cisco_ai_skill_scanner-1.0.1.dist-info/METADATA,sha256=Ph3EsZ9hjAj9CbQGa8Cew3SM1iF3RfHowlfVifp_37I,9166
|
|
97
|
+
cisco_ai_skill_scanner-1.0.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
98
|
+
cisco_ai_skill_scanner-1.0.1.dist-info/entry_points.txt,sha256=Qpg94wQPc6kWF_KQ-jf2tL_wCJ3aJfZ4V4vsYz50GIw,175
|
|
99
|
+
cisco_ai_skill_scanner-1.0.1.dist-info/licenses/LICENSE,sha256=b4va5sK_CWxpeDnOO2MF0MKqsiwU-3YblMmWKnmuWZg,653
|
|
100
|
+
cisco_ai_skill_scanner-1.0.1.dist-info/RECORD,,
|
|
@@ -15,15 +15,19 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
|
|
18
|
+
Skill Scanner - Security scanner for agent skills packages.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
try:
|
|
22
|
+
from ._version import __version__
|
|
23
|
+
except ImportError:
|
|
24
|
+
__version__ = "0.0.0+unknown"
|
|
25
|
+
|
|
22
26
|
__author__ = "Cisco Systems, Inc."
|
|
23
27
|
|
|
24
28
|
# Core exports
|
|
25
29
|
from .config.config import Config
|
|
26
|
-
from .config.constants import
|
|
30
|
+
from .config.constants import SkillScannerConstants
|
|
27
31
|
from .core.loader import SkillLoader, load_skill
|
|
28
32
|
from .core.models import Finding, Report, ScanResult, Severity, Skill, ThreatCategory
|
|
29
33
|
from .core.scanner import SkillScanner, scan_directory, scan_skill
|
|
@@ -41,5 +45,5 @@ __all__ = [
|
|
|
41
45
|
"SkillLoader",
|
|
42
46
|
"load_skill",
|
|
43
47
|
"Config",
|
|
44
|
-
"
|
|
48
|
+
"SkillScannerConstants",
|
|
45
49
|
]
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '1.0.
|
|
32
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
31
|
+
__version__ = version = '1.0.1'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 0, 1)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
#
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
|
-
"""API module for Skill
|
|
17
|
+
"""API module for Skill Scanner.
|
|
18
18
|
|
|
19
|
-
This module provides a FastAPI application for scanning
|
|
19
|
+
This module provides a FastAPI application for scanning agent skills packages.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
from fastapi import FastAPI
|
|
@@ -24,8 +24,8 @@ from fastapi import FastAPI
|
|
|
24
24
|
from .router import router as api_router
|
|
25
25
|
|
|
26
26
|
app = FastAPI(
|
|
27
|
-
title="
|
|
28
|
-
description="Security scanning API for
|
|
27
|
+
title="Skill Scanner API",
|
|
28
|
+
description="Security scanning API for agent skills packages",
|
|
29
29
|
version="0.2.0",
|
|
30
30
|
docs_url="/docs",
|
|
31
31
|
redoc_url="/redoc",
|
|
@@ -25,21 +25,21 @@ import sys
|
|
|
25
25
|
def main():
|
|
26
26
|
"""Main entry point for API server CLI."""
|
|
27
27
|
parser = argparse.ArgumentParser(
|
|
28
|
-
description="
|
|
28
|
+
description="Skill Scanner API Server",
|
|
29
29
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
30
30
|
epilog="""
|
|
31
31
|
Examples:
|
|
32
32
|
# Start server on default port
|
|
33
|
-
skill-
|
|
33
|
+
skill-scanner-api
|
|
34
34
|
|
|
35
35
|
# Start on custom port
|
|
36
|
-
skill-
|
|
36
|
+
skill-scanner-api --port 8080
|
|
37
37
|
|
|
38
38
|
# Start with auto-reload for development
|
|
39
|
-
skill-
|
|
39
|
+
skill-scanner-api --reload
|
|
40
40
|
|
|
41
41
|
# Custom host and port
|
|
42
|
-
skill-
|
|
42
|
+
skill-scanner-api --host 0.0.0.0 --port 9000
|
|
43
43
|
""",
|
|
44
44
|
)
|
|
45
45
|
|
|
@@ -58,14 +58,14 @@ Examples:
|
|
|
58
58
|
print("Install with: pip install fastapi uvicorn python-multipart", file=sys.stderr)
|
|
59
59
|
return 1
|
|
60
60
|
|
|
61
|
-
print("Starting
|
|
61
|
+
print("Starting Skill Scanner API Server...")
|
|
62
62
|
print(f"Server: http://{args.host}:{args.port}")
|
|
63
63
|
print(f"Docs: http://{args.host}:{args.port}/docs")
|
|
64
64
|
print(f"Health: http://{args.host}:{args.port}/health")
|
|
65
65
|
print()
|
|
66
66
|
|
|
67
67
|
try:
|
|
68
|
-
uvicorn.run("
|
|
68
|
+
uvicorn.run("skill_scanner.api.api:app", host=args.host, port=args.port, reload=args.reload)
|
|
69
69
|
except KeyboardInterrupt:
|
|
70
70
|
print("\nShutting down server...")
|
|
71
71
|
return 0
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
REST API server for
|
|
18
|
+
REST API server for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
Provides HTTP endpoints for skill scanning, similar to MCP Scanner's API server.
|
|
21
21
|
"""
|
|
@@ -126,8 +126,8 @@ class BatchScanRequest(BaseModel):
|
|
|
126
126
|
|
|
127
127
|
# Create FastAPI app
|
|
128
128
|
app = FastAPI(
|
|
129
|
-
title="
|
|
130
|
-
description="Security scanning API for
|
|
129
|
+
title="Skill Scanner API",
|
|
130
|
+
description="Security scanning API for agent skills packages",
|
|
131
131
|
version="0.2.0",
|
|
132
132
|
docs_url="/docs",
|
|
133
133
|
redoc_url="/redoc",
|
|
@@ -140,7 +140,7 @@ scan_results_cache = {}
|
|
|
140
140
|
@app.get("/", response_model=dict)
|
|
141
141
|
async def root():
|
|
142
142
|
"""Root endpoint."""
|
|
143
|
-
return {"service": "
|
|
143
|
+
return {"service": "Skill Scanner API", "version": "0.2.0", "docs": "/docs", "health": "/health"}
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
@app.get("/health", response_model=HealthResponse)
|
|
@@ -309,7 +309,7 @@ async def scan_uploaded_skill(
|
|
|
309
309
|
raise HTTPException(status_code=400, detail="File must be a ZIP archive")
|
|
310
310
|
|
|
311
311
|
# Create temporary directory
|
|
312
|
-
temp_dir = Path(tempfile.mkdtemp(prefix="
|
|
312
|
+
temp_dir = Path(tempfile.mkdtemp(prefix="skill_scanner_"))
|
|
313
313
|
|
|
314
314
|
try:
|
|
315
315
|
# Save uploaded file
|
|
@@ -627,7 +627,7 @@ def run_server(host: str = "0.0.0.0", port: int = 8000, reload: bool = False):
|
|
|
627
627
|
"""
|
|
628
628
|
import uvicorn
|
|
629
629
|
|
|
630
|
-
uvicorn.run("
|
|
630
|
+
uvicorn.run("skill_scanner.api.api_server:app", host=host, port=port, reload=reload)
|
|
631
631
|
|
|
632
632
|
|
|
633
633
|
if __name__ == "__main__":
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
|
-
"""API router for Skill
|
|
17
|
+
"""API router for Skill Scanner endpoints."""
|
|
18
18
|
|
|
19
19
|
import shutil
|
|
20
20
|
import tempfile
|
|
@@ -123,7 +123,7 @@ class BatchScanRequest(BaseModel):
|
|
|
123
123
|
@router.get("/", response_model=dict)
|
|
124
124
|
async def root():
|
|
125
125
|
"""Root endpoint."""
|
|
126
|
-
return {"service": "
|
|
126
|
+
return {"service": "Skill Scanner API", "version": "0.2.0", "docs": "/docs", "health": "/health"}
|
|
127
127
|
|
|
128
128
|
|
|
129
129
|
@router.get("/health", response_model=HealthResponse)
|
|
@@ -282,7 +282,7 @@ async def scan_uploaded_skill(
|
|
|
282
282
|
if not file.filename or not file.filename.endswith(".zip"):
|
|
283
283
|
raise HTTPException(status_code=400, detail="File must be a ZIP archive")
|
|
284
284
|
|
|
285
|
-
temp_dir = Path(tempfile.mkdtemp(prefix="
|
|
285
|
+
temp_dir = Path(tempfile.mkdtemp(prefix="skill_scanner_"))
|
|
286
286
|
|
|
287
287
|
try:
|
|
288
288
|
zip_path = temp_dir / file.filename
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Command-line interface for the
|
|
18
|
+
Command-line interface for the Skill Scanner.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
21
|
import argparse
|
|
@@ -623,7 +623,7 @@ def generate_multi_skill_summary(report) -> str:
|
|
|
623
623
|
"""Generate a simple summary for multiple skills."""
|
|
624
624
|
lines = []
|
|
625
625
|
lines.append("=" * 60)
|
|
626
|
-
lines.append("
|
|
626
|
+
lines.append("Agent Skills Security Scan Report")
|
|
627
627
|
lines.append("=" * 60)
|
|
628
628
|
lines.append(f"Skills Scanned: {report.total_skills_scanned}")
|
|
629
629
|
lines.append(f"Safe Skills: {report.safe_count}")
|
|
@@ -648,33 +648,33 @@ def generate_multi_skill_summary(report) -> str:
|
|
|
648
648
|
def main():
|
|
649
649
|
"""Main CLI entry point."""
|
|
650
650
|
parser = argparse.ArgumentParser(
|
|
651
|
-
description="
|
|
651
|
+
description="Skill Scanner - Security scanner for agent skills packages",
|
|
652
652
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
653
653
|
epilog="""
|
|
654
654
|
Examples:
|
|
655
655
|
# Scan a single skill
|
|
656
|
-
skill-
|
|
656
|
+
skill-scanner scan /path/to/skill
|
|
657
657
|
|
|
658
658
|
# Scan with behavioral analysis (dataflow tracking)
|
|
659
|
-
skill-
|
|
659
|
+
skill-scanner scan /path/to/skill --use-behavioral
|
|
660
660
|
|
|
661
661
|
# Scan with all engines (static + behavioral + LLM)
|
|
662
|
-
skill-
|
|
662
|
+
skill-scanner scan /path/to/skill --use-behavioral --use-llm
|
|
663
663
|
|
|
664
664
|
# Scan with JSON output
|
|
665
|
-
skill-
|
|
665
|
+
skill-scanner scan /path/to/skill --format json
|
|
666
666
|
|
|
667
667
|
# Scan all skills in a directory
|
|
668
|
-
skill-
|
|
668
|
+
skill-scanner scan-all /path/to/skills
|
|
669
669
|
|
|
670
670
|
# Scan recursively with all engines
|
|
671
|
-
skill-
|
|
671
|
+
skill-scanner scan-all /path/to/skills --recursive --use-behavioral --use-llm
|
|
672
672
|
|
|
673
673
|
# List available analyzers
|
|
674
|
-
skill-
|
|
674
|
+
skill-scanner list-analyzers
|
|
675
675
|
|
|
676
676
|
# Validate rule signatures
|
|
677
|
-
skill-
|
|
677
|
+
skill-scanner validate-rules
|
|
678
678
|
""",
|
|
679
679
|
)
|
|
680
680
|
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Configuration management for
|
|
18
|
+
Configuration management for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
Mirrors MCP Scanner's config structure.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
from .config import Config
|
|
24
|
-
from .constants import
|
|
24
|
+
from .constants import SkillScannerConstants
|
|
25
25
|
|
|
26
|
-
__all__ = ["Config", "
|
|
26
|
+
__all__ = ["Config", "SkillScannerConstants"]
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Configuration class for
|
|
18
|
+
Configuration class for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
Based on MCP Scanner's Config structure.
|
|
21
21
|
"""
|
|
@@ -28,7 +28,7 @@ from pathlib import Path
|
|
|
28
28
|
@dataclass
|
|
29
29
|
class Config:
|
|
30
30
|
"""
|
|
31
|
-
Configuration for
|
|
31
|
+
Configuration for Skill Scanner.
|
|
32
32
|
|
|
33
33
|
Mirrors MCP Scanner's Config class structure.
|
|
34
34
|
"""
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
#
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
|
-
"""Configuration parser for Skill
|
|
17
|
+
"""Configuration parser for Skill Scanner.
|
|
18
18
|
|
|
19
19
|
This module provides functionality to parse configuration files
|
|
20
|
-
and environment variables for Skill
|
|
20
|
+
and environment variables for Skill Scanner.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
import os
|
|
@@ -25,7 +25,7 @@ from pathlib import Path
|
|
|
25
25
|
|
|
26
26
|
from ..utils.logging_config import get_logger
|
|
27
27
|
from .config import Config
|
|
28
|
-
from .constants import
|
|
28
|
+
from .constants import SkillScannerConstants
|
|
29
29
|
|
|
30
30
|
logger = get_logger(__name__)
|
|
31
31
|
|
|
@@ -74,10 +74,10 @@ def parse_config_file(config_path: str | None = None) -> Config:
|
|
|
74
74
|
if not config_path:
|
|
75
75
|
# Try to find default config file
|
|
76
76
|
default_paths = [
|
|
77
|
-
Path.home() / ".
|
|
78
|
-
Path.home() / ".
|
|
79
|
-
Path.cwd() / ".
|
|
80
|
-
Path.cwd() / ".
|
|
77
|
+
Path.home() / ".skill_scanner" / "config.yaml",
|
|
78
|
+
Path.home() / ".skill_scanner" / "config.json",
|
|
79
|
+
Path.cwd() / ".skill_scanner.yaml",
|
|
80
|
+
Path.cwd() / ".skill_scanner.json",
|
|
81
81
|
]
|
|
82
82
|
|
|
83
83
|
for path in default_paths:
|
|
@@ -96,11 +96,11 @@ def parse_config_file(config_path: str | None = None) -> Config:
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
class ConfigParser:
|
|
99
|
-
"""Parser for Skill
|
|
99
|
+
"""Parser for Skill Scanner configuration files."""
|
|
100
100
|
|
|
101
101
|
def __init__(self):
|
|
102
102
|
"""Initialize the config parser."""
|
|
103
|
-
self.constants =
|
|
103
|
+
self.constants = SkillScannerConstants
|
|
104
104
|
|
|
105
105
|
def parse(self, config_path: str | None = None) -> Config:
|
|
106
106
|
"""Parse configuration from file and environment.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Constants for
|
|
18
|
+
Constants for Skill Scanner.
|
|
19
19
|
|
|
20
20
|
Mirrors MCP Scanner's constants structure.
|
|
21
21
|
"""
|
|
@@ -23,7 +23,7 @@ Mirrors MCP Scanner's constants structure.
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class
|
|
26
|
+
class SkillScannerConstants:
|
|
27
27
|
"""Constants used throughout the analyzer."""
|
|
28
28
|
|
|
29
29
|
# Version
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
Analyzer modules for detecting security vulnerabilities in
|
|
18
|
+
Analyzer modules for detecting security vulnerabilities in agent skills.
|
|
19
19
|
|
|
20
20
|
Structure mirrors MCP Scanner's analyzer organization.
|
|
21
21
|
"""
|
|
@@ -61,9 +61,9 @@ except (ImportError, ModuleNotFoundError):
|
|
|
61
61
|
pass
|
|
62
62
|
|
|
63
63
|
try:
|
|
64
|
-
from .
|
|
64
|
+
from .cross_skill_scanner import CrossSkillScanner # noqa: F401
|
|
65
65
|
|
|
66
|
-
__all__.append("
|
|
66
|
+
__all__.append("CrossSkillScanner")
|
|
67
67
|
except (ImportError, ModuleNotFoundError):
|
|
68
68
|
pass
|
|
69
69
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
AI Defense API analyzer for
|
|
18
|
+
AI Defense API analyzer for agent skills security scanning.
|
|
19
19
|
|
|
20
20
|
Integrates with Cisco AI Defense API (https://api.aidefense.cisco.com) for:
|
|
21
21
|
- Prompt injection detection
|
|
@@ -325,7 +325,7 @@ class AIDefenseAnalyzer(BaseAnalyzer):
|
|
|
325
325
|
}
|
|
326
326
|
]
|
|
327
327
|
metadata = {
|
|
328
|
-
"source": "
|
|
328
|
+
"source": "skill_scanner",
|
|
329
329
|
"skill_name": skill_name,
|
|
330
330
|
"file_path": file_path,
|
|
331
331
|
"content_type": content_type,
|
|
@@ -465,7 +465,7 @@ class AIDefenseAnalyzer(BaseAnalyzer):
|
|
|
465
465
|
{"role": "user", "content": f"# Code Analysis for {file_path}\n```{language}\n{content[:15000]}\n```"}
|
|
466
466
|
]
|
|
467
467
|
metadata = {
|
|
468
|
-
"source": "
|
|
468
|
+
"source": "skill_scanner",
|
|
469
469
|
"skill_name": skill_name,
|
|
470
470
|
"file_path": file_path,
|
|
471
471
|
"language": language,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# SPDX-License-Identifier: Apache-2.0
|
|
16
16
|
|
|
17
|
-
"""Behavioral Analysis Package for
|
|
17
|
+
"""Behavioral Analysis Package for Agent Skills.
|
|
18
18
|
|
|
19
19
|
This package provides enhanced behavioral analysis capabilities including:
|
|
20
20
|
- Alignment verification between skill description and code behavior
|
|
@@ -192,7 +192,7 @@ class AlignmentLLMClient:
|
|
|
192
192
|
{
|
|
193
193
|
"role": "system",
|
|
194
194
|
"content": (
|
|
195
|
-
"You are a security expert analyzing
|
|
195
|
+
"You are a security expert analyzing agent skills. "
|
|
196
196
|
"You receive complete dataflow analysis and code context. "
|
|
197
197
|
"Analyze if the skill description accurately describes what the code actually does. "
|
|
198
198
|
"Respond ONLY with valid JSON. Do not include any markdown formatting or code blocks."
|