{"data":{"skill":{"slug":"lambdasec-frame-security-scan","name":"frame-security-scan","icon":"📦","repo":"https://github.com/lambdasec/skills/tree/7d791206069498962a85a0f1ba95f7468dcf82f7/skills/frame-security-scan","status":"approved","author":"lambdasec","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"9b94d64a-fff6-49af-9b10-3f89c827e93d","skill_id":"69ca4001-b745-47bc-9eef-d5e2bbb5265c","version":1,"content_hash":"v3:87c9669baf85385959f9b0a344dc9dfc8d978f9c:e762138cbbae760967f106604628cff061b9aea006d56c67dac53943b5731854:bd38aaaa8a74bd89a34596781957a5a6e5c95214182e71a42a46992c0c796d7f:736b696c6c732f6c616d6264617365632f6672616d652d73656375726974792d7363616e:f787bbfcd45df6e5b1de6f68d8c023cc","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"All 31 static findings are false positives involving Markdown formatting, authorized tooling, a local endpoint, a repository URL, and an empty credential example. The instructions require consent for hosted AI requests, installation, and source changes. No evidence found of credential theft, unauthorized exfiltration, or prompt injection.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":11,"line_start":11},{"file":"SKILL.md","line_end":20,"line_start":17},{"file":"SKILL.md","line_end":22,"line_start":20},{"file":"SKILL.md","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":26,"line_start":24},{"file":"SKILL.md","line_end":32,"line_start":26},{"file":"SKILL.md","line_end":36,"line_start":32},{"file":"SKILL.md","line_end":38,"line_start":36},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":40,"line_start":40},{"file":"SKILL.md","line_end":44,"line_start":44},{"file":"SKILL.md","line_end":52,"line_start":46},{"file":"SKILL.md","line_end":54,"line_start":52},{"file":"SKILL.md","line_end":54,"line_start":54},{"file":"SKILL.md","line_end":62,"line_start":58},{"file":"SKILL.md","line_end":62,"line_start":62},{"file":"SKILL.md","line_end":63,"line_start":63},{"file":"SKILL.md","line_end":71,"line_start":67},{"file":"SKILL.md","line_end":73,"line_start":71},{"file":"SKILL.md","line_end":75,"line_start":73},{"file":"SKILL.md","line_end":75,"line_start":75},{"file":"SKILL.md","line_end":81,"line_start":79},{"file":"SKILL.md","line_end":83,"line_start":81},{"file":"SKILL.md","line_end":89,"line_start":83},{"file":"SKILL.md","line_end":89,"line_start":89},{"file":"SKILL.md","line_end":91,"line_start":90},{"file":"SKILL.md","line_end":91,"line_start":91}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":91,"line_start":91}]},{"factor":"env_access","evidence":[{"file":"SKILL.md","line_end":48,"line_start":48}]}],"critical_findings":[],"high_findings":[],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":2,"total_lines":114,"audit_model":"codex","audited_at":"2026-10-28T06:35:32.988+00:00","created_at":"2026-10-28T07:04:11.613507+00:00","static_findings":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Frame is a command-line tool. The scan steps run locally in the user's shell; run them when the user","category":"external_commands","line_end":9,"severity":"medium","line_start":9},{"id":"external_commands:SKILL.md:11:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If the `frame` MCP server is connected (tools named `scan`, `verify`, `fix`, `solve` and so on), you","category":"external_commands","line_end":11,"severity":"medium","line_start":11},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":20,"severity":"medium","line_start":17},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":22,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If `frame` is not found, tell the user it is not installed. It is on PyPI as `frame-security`; the i","category":"external_commands","line_end":22,"severity":"medium","line_start":22},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":26,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":32,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":36,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":38,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Useful flags (confirmed in `frame scan --help`, Frame 1.0.0): `--min-severity {critical,high,medium,","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Languages: the symbolic frontends cover python, javascript, typescript, java, c, cpp and csharp; eac","category":"external_commands","line_end":40,"severity":"medium","line_start":40},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--ai` adds LLM detection and LLM triage on top of the symbolic scan. `--llm-detect` and `--llm-tria","category":"external_commands","line_end":44,"severity":"medium","line_start":44},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":52,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":54,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Before enabling it, tell the user that with a hosted endpoint, code snippets leave the machine, and ","category":"external_commands","line_end":54,"severity":"medium","line_start":54},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Each finding has a type, severity, CWE ID (`cwe_id`), location (file, line, column), the function, t","category":"external_commands","line_end":62,"severity":"medium","line_start":58},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Symbolic findings: the `source` is a real variable name from the code (for example `u`). The READM","category":"external_commands","line_end":62,"severity":"medium","line_start":62},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- LLM findings: the `source` is `llm_detect` or `llm_verified` (confirmed in the Frame source). `llm","category":"external_commands","line_end":63,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Open each finding's location and read the code. Use `references/triage-checklist.md`. For every find","category":"external_commands","line_end":71,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":73,"severity":"medium","line_start":71},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":75,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--guidance` takes the findings JSON (a file path, or `-` for stdin). By default `frame fix` prints ","category":"external_commands","line_end":75,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":81,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":83,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Compare with the earlier file. Report which findings are gone, which remain, and any new ones. `fram","category":"external_commands","line_end":89,"severity":"medium","line_start":83},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- MCP server, so any MCP client can call Frame as tools: `claude mcp add frame -- uvx frame-mcp` (Cl","category":"external_commands","line_end":89,"severity":"medium","line_start":89},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- GitHub Action that uploads SARIF to code scanning: `uses: lambdasec/frame-action@v1`.","category":"external_commands","line_end":91,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- pre-commit hook: `repo: https://github.com/lambdasec/frame`, `rev: v1.0.0`, hook `id: frame`.","category":"external_commands","line_end":91,"severity":"medium","line_start":91},{"id":"network:SKILL.md:47:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"export FRAME_LLM_BASE_URL=http://localhost:8080/v1   # your endpoint","category":"network","line_end":47,"severity":"low","line_start":47},{"id":"network:SKILL.md:91:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- pre-commit hook: `repo: https://github.com/lambdasec/frame`, `rev: v1.0.0`, hook `id: frame`.","category":"network","line_end":91,"severity":"low","line_start":91},{"id":"env_access:SKILL.md:48:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"export FRAME_LLM_API_KEY=                            # empty for local servers","category":"env_access","line_end":48,"severity":"high","line_start":48}],"finding_verdicts":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","reason":"Backticks format the in-place option as Markdown, not shell substitution. This paragraph explicitly requires user consent before network transfers or source changes.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:11:ruby-shell-backtick-execution","reason":"Backticks identify MCP tool names and options, not executable substitutions. The instructions retain consent requirements for AI, in-place fixes, and exploit operations.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","reason":"The match is a Markdown code fence containing Frame version and help checks. These fixed diagnostic commands contain no shell substitution or untrusted arguments.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence for version and help commands. Nearby inline backticks name the tool and package rather than execute code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:22:ruby-shell-backtick-execution","reason":"Inline backticks format the Frame executable and PyPI package names. Installation is explicitly delegated to the user or requires their agreement.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The Markdown fence shows a conventional PyPI installation command, not backtick execution. The following instructions require agreement before running it.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"This is a closing Markdown fence, not shell syntax. The adjacent prose prohibits installation without agreement and discourages running unpinned source.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"The fenced examples run Frame on example source paths and save scan results. They implement the requested scanning workflow without command substitution or injected arguments.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"The match starts at a closing Markdown fence and extends into documented scan options. There is no Ruby code or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"Inline backticks format CLI options and accepted values. The paragraph documents scan configuration rather than executing dynamic commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","reason":"Backticks format language-selection and AI flags in a language-support explanation. No executable substitution or dangerous argument handling appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","reason":"Backticks identify optional AI flags rather than shell substitutions. The optional endpoint workflow is subject to explicit consent requirements.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"This is a Markdown configuration example for optional AI scanning, not backtick execution. Hosted transfers require disclosure and agreement before enabling the example.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence for optional AI configuration. The next paragraph warns about hosted code transfers and requires agreement.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","reason":"Backticks format the model override option and environment variable name. The prose provides a privacy warning rather than an execution instruction.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","reason":"Backticks name finding metadata fields in documentation. The instructions require reporting scanner values accurately and contain no shell evaluation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","reason":"Inline backticks identify the source field and an example variable name. These are explanatory data labels, not executable shell expressions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"Inline backticks identify LLM finding labels. The paragraph explicitly treats model findings as leads requiring review, not authoritative instructions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"Backticks format a bundled checklist path. The paragraph requests source inspection and evidence-based triage, with no shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","reason":"The fenced Frame command requests a proposed diff using saved findings. Endpoint transfers require consent, and source writes require separate agreement.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"The match is a closing Markdown fence and adjacent option documentation. It does not represent executable backtick syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"Inline backticks describe fix options and input handling. The prose requires diff inspection, consent for in-place writes, and a backup or commit.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"The Markdown fence contains a conventional follow-up scan that saves results. No backtick execution or dynamic shell input is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence for a follow-up scan. The following prose describes result comparison and verification, not shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","reason":"Inline backticks format the Frame verification command. Re-scanning earlier findings and running project tests are legitimate validation steps.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","reason":"Inline backticks document optional MCP setup commands, not shell substitutions. The instructions only mention this integration when relevant and require agreement before installation.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"Backticks format GitHub Action and pre-commit configuration entries. These are optional integration examples, not Ruby or shell execution syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"Backticks format a repository URL, revision, and hook identifier. This documents a versioned pre-commit integration without backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:47:hardcoded-url","reason":"The URL points to a loopback endpoint for optional AI configuration, not an external collection service. Hosted endpoints require disclosure and user agreement.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:91:hardcoded-url","reason":"The URL identifies the public Frame repository for an optional versioned pre-commit hook. It is not a destination for credentials or source uploads.","verdict":"false_positive","confidence":0.99},{"id":"env_access:SKILL.md:48:generic-api-secret-keys","reason":"The example assigns an empty API-key value for local servers. It contains no credential and does not read or disclose an existing secret.","verdict":"false_positive","confidence":1}],"semantic_findings":[],"subject_marketplace_commit_sha":"87c9669baf85385959f9b0a344dc9dfc8d978f9c","subject_content_hash":"e762138cbbae760967f106604628cff061b9aea006d56c67dac53943b5731854","subject_tree_hash":"bd38aaaa8a74bd89a34596781957a5a6e5c95214182e71a42a46992c0c796d7f","subject_plugin_path":"skills/lambdasec/frame-security-scan","audit_payload_hash":"f787bbfcd45df6e5b1de6f68d8c023cc","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"87c9669baf85385959f9b0a344dc9dfc8d978f9c","contentHash":"e762138cbbae760967f106604628cff061b9aea006d56c67dac53943b5731854","treeHash":"bd38aaaa8a74bd89a34596781957a5a6e5c95214182e71a42a46992c0c796d7f","pluginPath":"skills/lambdasec/frame-security-scan","auditPayloadHash":"f787bbfcd45df6e5b1de6f68d8c023cc"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/lambdasec-frame-security-scan/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}