The guide prints every Function App setting and passes AzureWebJobsStorage on command lines. These values can expose production credentials in logs and process listings.
The commands explicitly retrieve, print, and reuse app settings and a storage connection string. AzureWebJobsStorage is a credential-bearing setting.
A hidden template comment says "DON'T REMOVE THIS COMMENT BLOCK" and directs agents to continue without user input or token limits. Generated files can persist these directives.
The instructions are explicit, persistent, and hidden inside a generated project comment. They attempt to control future agent behavior and disregard operational limits.
Redis requests are redirected to separately maintained repositories, and users are told to install those skills. No immutable commit or reviewed package version is required.
The routing and installation instructions are explicit, but the linked repositories are external to this audited package. Their future content is outside this report.
Capability review items (11)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The helper executes a detected project Maven wrapper or an unrestricted --mvn executable. A malicious wrapper or supplied executable can run arbitrary code with the agent's privileges.
The script opens a fixed project-root rewrite.yml path with truncation and does not preserve an existing file. The cleanup later removes that same path.
with open(build_file, "w", encoding="utf-8") as f:
The script replaces the complete Gradle build file after regex-based injection. It performs no backup or atomic restoration if the source layout is unexpected.
The script grants execute permission to a project-provided Maven wrapper before running it. This can activate untrusted repository code without a trust check.
app_settings=$(az functionapp config appsettings list --name $appName --resource-group $rgName)
The command captures all Function App settings, and the next line prints them. App settings commonly contain connection strings, tokens, and other secrets.
storageConnection=$(az functionapp config appsettings list --name $appName --resource-group $rgName
The command extracts AzureWebJobsStorage into a shell variable. The guide later passes that connection string on command lines, exposing a storage credential.
packageName=$(az storage blob list --connection-string $storageConnection --container-name scm-relea
The command passes the storage connection string as an unquoted process argument while querying blobs. This can expose credentials through process inspection and shell expansion.
The Java workflow tells the agent to avoid pausing, treats token and time limits as invalid, and proceeds directly to execution. These instructions can conflict with host limits, user confirmation, and safe scope control.
The cited text directly imposes no-pause and no-stop behavior. It does not claim system authority, but it can override user or host boundaries.
The BOM helper writes rewrite.yml in the project root and later removes that path. A preexisting OpenRewrite configuration can be overwritten or deleted.
The code constructs a fixed rewrite.yml path, writes it, and removes it during cleanup. There is no check, backup, or restore for an existing user file.
The automation guidance collects and prints app settings, then reads the AzureWebJobsStorage connection string for storage access. These values commonly contain secrets.
The cited commands explicitly collect app settings and a storage connection string. Azure app settings commonly include credentials and tokens.
- **NO premature termination**: Token limits, time constraints, or complexity are NEVER valid reason
The mandatory rule says token limits, time constraints, and complexity are never valid reasons to stop. This is not reconnaissance, but it is a real prompt-control risk.
- **NO premature termination**: Token limits, time constraints, or complexity are NEVER valid reason
The template says token limits, time constraints, and complexity are never valid reasons to skip fixing. This can pressure an agent to ignore operational limits.
The template forbids dismissing failing tests as non-production or sample issues. This can be useful quality guidance, but it also reduces safe stopping discretion.
The package name returned from blob storage is used unquoted as the local output file path. Blob names with spaces, option-like prefixes, or path separators can cause unintended behavior.
The package name comes from remote blob metadata and is expanded unquoted in a shell command. This creates plausible parsing and file path risks.
Capability review items (22)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The script runs Maven and OpenRewrite in the target project. Even without shell=True, project build tools can execute project-controlled plugins and scripts.
storageConnection=$(az functionapp config appsettings list --name $appName --resource-group $rgName
The script reads AzureWebJobsStorage into a shell variable. This value is a credential-bearing connection string and may be exposed through logs or shell state.
packageName=$(az storage blob list --connection-string $storageConnection --container-name scm-relea
The script uses the storage connection string to list deployment packages. It combines credential use with unquoted shell variables in runnable guidance.
with open(build_file, "w", encoding="utf-8") as f:
The script rewrites the Gradle build file to inject OpenRewrite configuration. This directly modifies project build configuration and can corrupt it if assumptions fail.
The imported urllib module is used by the same script to fetch BOM metadata from GitHub. This is an external network dependency that influences migration output.
Most static findings are Markdown formatting false positives or expected Azure migration inventory. Confirmed risks are operational: Azure CLI commands collect app settings, identity and RBAC metadata, deployment packages, hostnames, and validation endpoints. No prompt injection, malicious exfiltration intent, or hidden override instructions were found in the reviewed files.
The section instructs the user to enumerate blob trigger configuration for compatibility. It is authorized migration assessment, but it is still cloud resource reconnaissance.
az functionapp config hostname list --webapp-name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
The command verifies custom hostnames on the new app after migration. It is legitimate validation, but it performs resource inventory through Azure CLI.
1. **Smoke test** — Get the app’s default hostname via `az functionapp show --query defaultHostName
The step instructs the agent to retrieve the default hostname and test reachability. That is normal validation, but it reveals endpoint information and uses external commands.
Capability review items (13)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The line is part of an Azure CLI query that enumerates custom hostnames for a Function App. It is legitimate migration work, but it performs cloud resource inventory through external commands.
app_settings=$(az functionapp config appsettings list --name $appName --resource-group $rgName)
The command captures all Function App settings into a shell variable and prints them later. App settings may include connection strings or secrets, so this is a real sensitive data handling risk.
systemUserId=$(az functionapp identity show --name $appName --resource-group $rgName \
The command queries managed identity metadata from Azure and stores it for role assignment checks. This is authorized migration inventory, but it still exposes identity identifiers through shell execution.
userIdentities=$(az functionapp identity show --name $appName --resource-group $rgName \
The command retrieves user-assigned managed identity data from Azure. It is valid upgrade preparation, but it gathers identity metadata that should be handled carefully.
The command parses managed identity resource IDs with jq and sed inside command substitution. It is not malicious, but unquoted shell processing around cloud identity data is an operational risk.
az role assignment list --assignee $(echo "$identity" | jq -r '.value.principalId') --all --output j
The command lists role assignments for managed identities. This is expected for migration, but it enumerates RBAC permissions and can reveal sensitive authorization structure.
packageName=$(az storage blob list --connection-string $storageConnection --container-name scm-relea
The command uses a storage connection string to list deployment packages in scm-releases. This is legitimate recovery guidance, but it accesses deployable artifacts through credentials.
DEFAULT_HOST=$(az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
The command queries the new Function App default hostname for validation. It is benign in intent, but it still executes external Azure CLI inventory commands.
The command performs a curl request against the app hostname returned by Azure. This is expected smoke testing, but it contacts an external endpoint from the user environment.
Track progress in `upgrade-status.md` inside the workspace root.
The skill instructs creation or updates of upgrade-status.md in the workspace root. This is expected progress tracking, but it is real workspace filesystem modification.
The curl command makes an outbound HTTPS request to the app hostname for smoke testing. The target is derived from Azure, so this is expected but still real network activity.
The curl command contacts a Function App endpoint supplied by the user workflow. This is legitimate validation, but it requires outbound network access.
Most static findings are Markdown formatting false positives or expected Azure migration inventory. Confirmed risks are operational: Azure CLI commands collect app settings, identity and RBAC metadata, deployment packages, hostnames, and validation endpoints. No prompt injection, malicious exfiltration intent, or hidden override instructions were found in the reviewed files.
The section instructs the user to enumerate blob trigger configuration for compatibility. It is authorized migration assessment, but it is still cloud resource reconnaissance.
az functionapp config hostname list --webapp-name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
The command verifies custom hostnames on the new app after migration. It is legitimate validation, but it performs resource inventory through Azure CLI.
1. **Smoke test** — Get the app’s default hostname via `az functionapp show --query defaultHostName
The step instructs the agent to retrieve the default hostname and test reachability. That is normal validation, but it reveals endpoint information and uses external commands.
Capability review items (13)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The line is part of an Azure CLI query that enumerates custom hostnames for a Function App. It is legitimate migration work, but it performs cloud resource inventory through external commands.
app_settings=$(az functionapp config appsettings list --name $appName --resource-group $rgName)
The command captures all Function App settings into a shell variable and prints them later. App settings may include connection strings or secrets, so this is a real sensitive data handling risk.
systemUserId=$(az functionapp identity show --name $appName --resource-group $rgName \
The command queries managed identity metadata from Azure and stores it for role assignment checks. This is authorized migration inventory, but it still exposes identity identifiers through shell execution.
userIdentities=$(az functionapp identity show --name $appName --resource-group $rgName \
The command retrieves user-assigned managed identity data from Azure. It is valid upgrade preparation, but it gathers identity metadata that should be handled carefully.
The command parses managed identity resource IDs with jq and sed inside command substitution. It is not malicious, but unquoted shell processing around cloud identity data is an operational risk.
az role assignment list --assignee $(echo "$identity" | jq -r '.value.principalId') --all --output j
The command lists role assignments for managed identities. This is expected for migration, but it enumerates RBAC permissions and can reveal sensitive authorization structure.
packageName=$(az storage blob list --connection-string $storageConnection --container-name scm-relea
The command uses a storage connection string to list deployment packages in scm-releases. This is legitimate recovery guidance, but it accesses deployable artifacts through credentials.
DEFAULT_HOST=$(az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \
The command queries the new Function App default hostname for validation. It is benign in intent, but it still executes external Azure CLI inventory commands.
The command performs a curl request against the app hostname returned by Azure. This is expected smoke testing, but it contacts an external endpoint from the user environment.
Track progress in `upgrade-status.md` inside the workspace root.
The skill instructs creation or updates of upgrade-status.md in the workspace root. This is expected progress tracking, but it is real workspace filesystem modification.
The curl command makes an outbound HTTPS request to the app hostname for smoke testing. The target is derived from Azure, so this is expected but still real network activity.
The curl command contacts a Function App endpoint supplied by the user workflow. This is legitimate validation, but it requires outbound network access.
Static command-execution findings are mostly true in context: this skill is documentation that instructs an AI agent to generate and run Azure CLI, curl, and deployment commands. I found no prompt-injection attempt or confirmed malicious exfiltration, but the skill can create, modify, deploy, download packages from, and delete Azure resources, so it should not be published without stronger execution safeguards.
6
Files scanned
955
Lines analyzed
7
Review items
2
False positives ignored
Capability review items (4)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
Agent-Guided Azure Resource Modification and Deletion
The skill guides execution of Azure CLI commands that create a new function app, deploy code, restart apps, and delete function apps. The documents include confirmation language, but marketplace use would still expose users to high-impact cloud changes if an agent executes the steps with broad Azure permissions.
The referenced lines contain concrete Azure CLI commands for migration, deployment, restart, and deletion. The intent is legitimate Azure upgrade automation, but the operational impact is clearly high.
The automation guide collects app settings, reads AzureWebJobsStorage, lists managed identity role assignments, and downloads a deployment package using a storage connection string. These steps can expose secrets or proprietary application code in the workspace or command output.
The commands directly retrieve app settings, identity data, and deployment packages. This is expected for migration work, but it creates real exposure risk if logs or files are mishandled.
The skill instructs the agent to call the default Azure Functions hostname and HTTP trigger endpoints with curl. This is a normal validation step, but it can contact production endpoints and may trigger application behavior.
The curl commands and validation step are explicit. The risk depends on the target app behavior, so this is moderate rather than inherently malicious.
Local Workspace File Creation for Upgrade Artifacts
The skill requires creating status and assessment files in the workspace and can download a deployment package. This is useful for migration tracking, but it may persist sensitive configuration or application artifacts locally.
The files and downloaded package are specifically named. The sensitivity depends on what values the agent writes into reports or package files.
Static false positives ignored (2)
These static matches were dismissed by semantic review or matched schema-only tokens, so they are shown for transparency but do not drive the quality score.
Static Weak-Crypto and Backtick Hits Are Markdown False Positives
Many weak cryptography and Ruby backtick findings map to Markdown emphasis, diagrams, inline code, Azure SKU names, or shell examples. I found no executable Ruby code, hidden cryptographic implementation, or prompt-injection instruction in the reviewed files.
The lines are documentation constructs or code-fenced templates, not executable skill code. The broader command examples remain risky, but these specific pattern classes are false positives.
Hardcoded Documentation URLs Are Benign References
The hardcoded URLs point to Microsoft Learn and Azure sample documentation. I did not find evidence that the skill sends user data or secrets to those URLs.
The URLs are cited as documentation links, not request targets for collected data. Network activity in the skill comes from Azure CLI and curl validation commands instead.
This is an official Microsoft skill providing Azure upgrade documentation. The static scanner detected patterns in markdown code examples - these are FALSE POSITIVES. The skill contains documentation with example Azure CLI commands, not executable code. All detected external_commands, network, and filesystem patterns are in documentation context. No actual code execution occurs - the skill provides guidance to Claude for helping users perform legitimate Azure upgrades.
6
Files scanned
955
Lines analyzed
0
Review items
7
False positives ignored
Static false positives ignored (7)
These static matches were dismissed by semantic review or matched schema-only tokens, so they are shown for transparency but do not drive the quality score.
The static scanner flagged a CRITICAL heuristic for 'suspicious behavior patterns' (code execution + network + credential access). This is a FALSE POSITIVE - the skill is legitimate Microsoft documentation that describes Azure CLI commands for performing upgrades. The 'code execution' is bash/PowerShell examples in markdown documentation, 'network' is Azure API calls made by user-approved Azure CLI operations, and there is no credential exfiltration - the skill uses official Azure MCP tools for authenticated operations.
This is an official Microsoft skill from the azure-skills repository. The detected patterns are documentation code blocks, not actual code execution. Azure operations are performed through official MCP tools with user authentication.
Static scanner flagged 'PowerShell invocation' at multiple locations in automation.md and consumption-to-flex.md. These are FALSE POSITIVES - the findings are detecting PowerShell syntax in markdown documentation code blocks, not actual PowerShell execution. The skill provides example commands for users to run in their own Azure Cloud Shell.
These are documentation code blocks in markdown files - the skill is a documentation reference, not executable code. Users run these commands themselves in their Azure environment.
Static scanner flagged 'Weak cryptographic algorithm' at various locations in global-rules.md, automation.md, consumption-to-flex.md, workflow-details.md, and SKILL.md. These are FALSE POSITIVES - the scanner is likely triggered by text mentioning hash functions or authentication methods in documentation context. The skill promotes identity-based authentication (managed identity, DefaultAzureCredential) as documented in global-rules.md.
The skill explicitly advocates for managed identity over connection strings. These findings are triggered by documentation text mentioning authentication concepts, not actual weak cryptography implementation.
False Positive: Shell Command Detection in Documentation
Static scanner flagged 207 'Ruby/shell backtick execution' and 'Shell command substitution' findings across multiple files. These are FALSE POSITIVES - the findings are triggered by code blocks (backtick fences) in markdown documentation describing Azure CLI commands. The skill does not execute any commands - it provides documentation and guidance.
All 207 findings are in markdown documentation files. The skill uses markdown code fences to display example Azure CLI commands. No actual shell execution occurs - these are documentation examples for users to follow.
Static scanner flagged 'Hardcoded URL' findings at various locations. These are FALSE POSITIVES - the URLs point to official Microsoft Learn documentation (learn.microsoft.com), which is expected for an official Microsoft skill.
The hardcoded URLs are legitimate Microsoft Learn documentation links. This is expected and appropriate for an official Microsoft skill.
Static scanner flagged 'Standard device file access' at locations in automation.md. These are FALSE POSITIVES - the findings are triggered by documentation text about file paths and logs, not actual filesystem operations.
These are documentation references to log files and output paths in example commands. No actual filesystem operations occur - the skill is documentation-only.
Static scanner flagged 'System reconnaissance' findings at various locations. These are FALSE POSITIVES - the skill documents how to assess Azure resources (list apps, check compatibility) which is a legitimate upgrade assessment workflow, not system reconnaissance.
These findings are triggered by documentation describing Azure resource queries (list apps, check settings). This is standard Azure administration for upgrade assessment, not malicious reconnaissance.
No confirmed security findings were recorded for this completed audit.