Back to skill

Security audit

Jira

Security checks for vulnerabilities and agentic risk

Overview

This Jira skill appears purpose-built for Jira management, but its credentialed API helper can send Jira credentials to an untrusted URL in some pagination or configuration scenarios.

Review before installing. Use this only with a trusted HTTPS JIRA_URL, preferably a least-privilege Jira API token, and avoid running worklog summary commands until the API helper is hardened to reject external pagination URLs or validate they match the configured Jira host. Expect the skill to modify Jira data when you run status, assign, comment, create, or log commands.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/jira.sh:46
Finding

Jira credentials can be forwarded to an untrusted pagination URL

Content
View full analysis
"$out_file" local next="${JIRA_URL}/rest/api/3/worklog/updated?since=${since_ms}" while [[ -n "$next" ]]; do local resp resp=$(api GET "$next") echo "$resp" | jq -r '.values[].worklogId' >>"$out_file" local last last=$(echo "$resp" | jq -r '.lastPage') if [[ "$last" == "true" ]]; then next="" else next=$(echo "$resp" | jq -r '.nextPage // ""') fi done } ``` ### Technical Analysis The `api()` function treats any string beginning with `http` as an acceptable absolute URL. It then unconditionally attaches the Jira Basic authorization header, which contains the Base64-encoded Jira email address and API token. The `fetch_worklog_ids()` function obtains subsequent request URLs from the server-provided `nextPage` property. No validation ensures that this URL: - Uses HTTPS. - Has the same host and port as `JIRA_URL`. - Is an expected Jira REST API path. - Does not contain a redirect or reference an external origin. Consequently, a malicious or compromised Jira-compatible endpoint can direct the client to an attacker-controlled server while retaining the authorization header. The configuration also accepts an HTTP `JIRA_URL`, allowing credentials and Jira information to be transmitted without transport encryption. ### Attack Path 1. A user invokes `hours` or `hours-day`, causing `fetch ...[truncated 1384 chars]
Remediation
View remediation
&2 return 1 fi if [[ "$path" == http://* || "$path" == https://* || "$path" == //* ]]; then echo "Error: API requests must use relative Jira paths" >&2 return 1 fi curl --proto '=https' -sS -X "$method" "${JIRA_URL}${path}" \ -H "$AUTH_HEADER" \ -H "$JSON_HEADER" \ ${data:+-d "$data"} } ``` Pagination values should additionally be parsed and converted to relative paths only after verifying that their origin exactly matches `JIRA_URL`. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/jira.sh:351
Finding

Sensitive Jira worklog data can remain in temporary files after abnormal termination

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (3)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill invokes shell-based functionality via scripts/jira.sh and requires command-line tools like curl, jq, bc, and python3, but it does not declare an explicit tool scope such as permissions or allowed-tools. That omission weakens sandboxing and review controls because an agent may gain broader shell execution capability than the metadata communicates, increasing the risk of unintended command execution or misuse of sensitive environment variables like JIRA_API_TOKEN.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

The generic api() helper will send the Jira Basic Authorization header to any URL passed to it, and it accepts absolute URLs when the argument begins with http. Because fetch_worklog_ids() follows nextPage values from server responses and passes them back into api(), a malicious or compromised Jira endpoint, misconfigured JIRA_URL, or SSRF-style redirection in returned pagination links could cause the script to transmit Jira credentials to an attacker-controlled host.

Content

Scanner excerpt · scripts/jira.sh (reported line 60)May include surrounding context.

sh
if [[ "$url" != http* ]]; then
    url="${JIRA_URL}${url}"
  fi
  curl -sS -X "$method" "$url" \
    -H "$AUTH_HEADER" \
    -H "$JSON_HEADER" \
    ${data:+-d "$data"}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This shell script includes state-changing operations such as transitioning issues, assigning users, creating issues, logging work, and posting comments via Jira API calls. While the commands print success or error output after execution, there is no prior confirmation prompt or explicit warning in the file that these commands modify remote project data.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.