{"data":{"skill":{"slug":"microsoft-azure-resource-lookup","name":"azure-resource-lookup","icon":"📦","repo":"https://github.com/microsoft/github-copilot-for-azure/tree/main/plugin/skills/azure-resource-lookup/","status":"approved","author":"microsoft","authorVersion":"0.0.0-placeholder","skillstoreRevision":2},"audit":{"id":"4e07a520-fd9f-4ace-9948-c3441bd157fb","skill_id":"39883e38-e2e3-46b5-bde2-833cea7e61b6","version":5,"content_hash":"v3:ebdfe608f5de2b66ff37ab4af12af8ac4f5e8006:789a407eb1a6456585e2ccc6175d8b7e74d9a3aa5c26d300ba90cb669b3289d3:7c3c7609663f21a774dd76f958816796b78d0ecee617ac9bb23bb78432972892:736b696c6c732f6d6963726f736f66742f617a7572652d7265736f757263652d6c6f6f6b7570:c27a0f84d5edc11f128ee3313f134988","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Two findings are confirmed because the workflow generates and runs an Azure CLI command from user intent without an explicit validation or confirmation checkpoint. The other 29 detections are Markdown syntax, tool names, flags, or read-only examples, and no prompt injection or malicious intent was found.","remediation":[{"issue":"A command generated from user intent is executed without an explicit validation or approval step.","severity":"medium","suggestion":"Require review and user confirmation before execution. Allow only structured az graph query arguments and reject shell operators."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":27,"line_start":27},{"file":"SKILL.md","line_end":36,"line_start":36},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":45,"line_start":45},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":57,"line_start":57},{"file":"SKILL.md","line_end":58,"line_start":58},{"file":"SKILL.md","line_end":59,"line_start":59},{"file":"SKILL.md","line_end":60,"line_start":60},{"file":"SKILL.md","line_end":61,"line_start":61},{"file":"SKILL.md","line_end":62,"line_start":62},{"file":"SKILL.md","line_end":63,"line_start":63},{"file":"SKILL.md","line_end":64,"line_start":64},{"file":"SKILL.md","line_end":66,"line_start":66},{"file":"SKILL.md","line_end":67,"line_start":67},{"file":"SKILL.md","line_end":73,"line_start":73},{"file":"SKILL.md","line_end":79,"line_start":75},{"file":"SKILL.md","line_end":85,"line_start":79},{"file":"SKILL.md","line_end":87,"line_start":85},{"file":"SKILL.md","line_end":89,"line_start":87},{"file":"SKILL.md","line_end":91,"line_start":89},{"file":"SKILL.md","line_end":91,"line_start":91},{"file":"SKILL.md","line_end":97,"line_start":97},{"file":"SKILL.md","line_end":99,"line_start":98},{"file":"SKILL.md","line_end":99,"line_start":99},{"file":"SKILL.md","line_end":104,"line_start":100},{"file":"SKILL.md","line_end":105,"line_start":104},{"file":"SKILL.md","line_end":105,"line_start":105}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":73,"line_start":73}],"confidence":0.78,"description":"Use `extension_cli_generate` to build the `az graph query` command:","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 73 directs the agent to generate an Azure CLI command from the user's request. Dynamic command generation can expand scope or introduce shell content unless the result is constrained and reviewed."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":87,"line_start":85}],"confidence":0.88,"description":"Run the generated command. Use `--query` (JMESPath) to shape output:","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 85 explicitly instructs the agent to run the generated command. Because the command derives from user intent and no validation checkpoint is specified, execution presents an external-command risk."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":3,"total_lines":301,"audit_model":"codex","audited_at":"2026-07-23T19:23:26.441+00:00","created_at":"2026-07-25T23:07:28.858631+00:00","static_findings":[{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> ⚠️ **Warning:** App Service / Web Apps have no dedicated MCP `list` command. Prompts like \"list we","category":"external_commands","line_end":27,"severity":"medium","line_start":27},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **CLI Command** | `az graph query -q \"<KQL>\" -o table` |","category":"external_commands","line_end":36,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **Extension** | `az extension add --name resource-graph` |","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **MCP Tool** | `extension_cli_generate` with intent for `az graph query` |","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `extension_cli_generate` | Generate `az graph query` commands | Primary tool — generate ARG querie","category":"external_commands","line_end":45,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp_azure_mcp_subscription_list` | List available subscriptions | Discover subscription scope bef","category":"external_commands","line_end":46,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp_azure_mcp_group_list` | List resource groups | Narrow query scope |","category":"external_commands","line_end":47,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Virtual Machines | `compute` | ✅ Full — list, details, sizes |","category":"external_commands","line_end":57,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Storage Accounts | `storage` | ✅ Full — accounts, blobs, tables |","category":"external_commands","line_end":58,"severity":"medium","line_start":58},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Cosmos DB | `cosmos` | ✅ Full — accounts, databases, queries |","category":"external_commands","line_end":59,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Key Vault | `keyvault` | ⚠️ Partial — secrets/keys only, no vault listing |","category":"external_commands","line_end":60,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| SQL Databases | `sql` | ⚠️ Partial — requires resource group name |","category":"external_commands","line_end":61,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Container Registries | `acr` | ✅ Full — list registries |","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":"| Kubernetes (AKS) | `aks` | ✅ Full — clusters, node pools |","category":"external_commands","line_end":63,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| App Service / Web Apps | `appservice` | ❌ No list command — use ARG |","category":"external_commands","line_end":64,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Event Hubs | `eventhubs` | ✅ Full — namespaces, hubs |","category":"external_commands","line_end":66,"severity":"medium","line_start":66},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Service Bus | `servicebus` | ✅ Full — queues, topics |","category":"external_commands","line_end":67,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `extension_cli_generate` to build the `az graph query` command:","category":"external_commands","line_end":73,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```yaml","category":"external_commands","line_end":79,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":85,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Run the generated command. Use `--query` (JMESPath) to shape output:","category":"external_commands","line_end":87,"severity":"medium","line_start":85},{"id":"external_commands:SKILL.md:87:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":89,"severity":"medium","line_start":87},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":91,"severity":"medium","line_start":89},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `--first N` to limit results. Use `--subscriptions` to scope.","category":"external_commands","line_end":91,"severity":"medium","line_start":91},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resource-graph extension not found` | Extension not installed | `az extension add --name resource","category":"external_commands","line_end":97,"severity":"medium","line_start":97},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `AuthorizationFailed` | No read access to subscription | Check RBAC — need Reader role |","category":"external_commands","line_end":99,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:99:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `BadRequest` on query | Invalid KQL syntax | Verify table/column names; use `=~` for case-insensit","category":"external_commands","line_end":99,"severity":"medium","line_start":99},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Empty results | No matching resources or wrong scope | Check `--subscriptions` flag; verify resour","category":"external_commands","line_end":104,"severity":"medium","line_start":100},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- ✅ **Always** use `=~` for case-insensitive type matching (types are lowercase)","category":"external_commands","line_end":105,"severity":"medium","line_start":104},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- ✅ **Always** scope queries with `--subscriptions` or `--first` for large tenants","category":"external_commands","line_end":105,"severity":"medium","line_start":105},{"id":"blocker:SKILL.md:99:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"| `BadRequest` on query | Invalid KQL syntax | Verify table/column names; use `=~` for case-insensit","category":"blocker","line_end":99,"severity":"low","line_start":99}],"finding_verdicts":[{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"Line 27 uses Markdown backticks around the word list inside a routing warning. It does not execute a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Line 36 presents an Azure CLI query template in a documentation table. The backticks are Markdown delimiters, not Ruby or shell execution syntax.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"Line 37 documents a fixed Azure CLI extension installation command. It is not programmatically executed or built from untrusted input at this location.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"Line 38 names an MCP tool and an Azure CLI command using inline Markdown. No backtick command execution occurs.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"Line 45 is a documentation table row describing a command-generation tool. Its backticks only format tool and command names.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"Line 46 formats an MCP subscription-list tool name in Markdown. It contains no shell command or execution instruction.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"Line 47 formats an MCP resource-group tool name in Markdown. It contains no shell command or execution instruction.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"Line 57 uses backticks to format the compute tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","reason":"Line 58 uses backticks to format the storage tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"Line 59 uses backticks to format the Cosmos DB tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"Line 60 uses backticks to format the Key Vault tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"Line 61 uses backticks to format the SQL tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","reason":"Line 62 uses backticks to format the container registry tool identifier. The text is documentation, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"Line 63 uses backticks to format the AKS tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"Line 64 formats the App Service tool identifier in Markdown. The row only explains that Azure Resource Graph should be used.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","reason":"Line 66 uses backticks to format the Event Hubs tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"Line 67 uses backticks to format the Service Bus tool identifier in a coverage table. There is no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"Line 73 directs the agent to generate an Azure CLI command from the user's request. Dynamic command generation can expand scope or introduce shell content unless the result is constrained and reviewed.","verdict":"confirmed","severity":"medium","confidence":0.78},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"Line 75 is the opening marker for a YAML documentation block. Triple backticks do not invoke a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"Line 79 closes a fenced documentation block. It is Markdown structure, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","reason":"Line 85 explicitly instructs the agent to run the generated command. Because the command derives from user intent and no validation checkpoint is specified, execution presents an external-command risk.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"external_commands:SKILL.md:87:ruby-shell-backtick-execution","reason":"Lines 87 through 89 contain a documented, read-only Azure Resource Graph command template. The fence itself is not Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","reason":"Line 89 is the closing marker for the Bash example. Triple backticks do not execute the preceding command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"Line 91 formats two Azure CLI flags as inline Markdown. It does not execute either flag.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","reason":"Line 97 documents a fixed troubleshooting command for the official Azure Resource Graph extension. It is not automatically executed or interpolated.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"Line 98 formats an Azure authorization error name in Markdown. It contains no external command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:99:ruby-shell-backtick-execution","reason":"Line 99 formats an error name and the KQL comparison operator in Markdown. Neither is shell execution syntax in this context.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","reason":"Line 100 formats an Azure CLI scope flag in a troubleshooting table. It does not run a command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","reason":"Line 104 formats the KQL case-insensitive comparison operator in Markdown. It is query guidance, not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","reason":"Line 105 formats Azure CLI scope and result-limit flags in Markdown. The line provides constraints without executing a command.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:99:system-reconnaissance","reason":"Line 99 explains an Azure Resource Graph syntax error and the KQL comparison operator. It performs no host, network, or system reconnaissance.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"ebdfe608f5de2b66ff37ab4af12af8ac4f5e8006","subject_content_hash":"789a407eb1a6456585e2ccc6175d8b7e74d9a3aa5c26d300ba90cb669b3289d3","subject_tree_hash":"7c3c7609663f21a774dd76f958816796b78d0ecee617ac9bb23bb78432972892","subject_plugin_path":"skills/microsoft/azure-resource-lookup","audit_payload_hash":"c27a0f84d5edc11f128ee3313f134988","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"ebdfe608f5de2b66ff37ab4af12af8ac4f5e8006","contentHash":"789a407eb1a6456585e2ccc6175d8b7e74d9a3aa5c26d300ba90cb669b3289d3","treeHash":"7c3c7609663f21a774dd76f958816796b78d0ecee617ac9bb23bb78432972892","pluginPath":"skills/microsoft/azure-resource-lookup","auditPayloadHash":"c27a0f84d5edc11f128ee3313f134988"},"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/microsoft-azure-resource-lookup/audits/5/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":2,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}