Back to skill

Security audit

Jira

Security checks for vulnerabilities and agentic risk

Overview

This Jira skill mostly matches its stated purpose, but it contains an undocumented metrics export and weak URL validation that could leak Jira data or credentials.

Install only if you are comfortable reviewing or removing the metrics command and using a low-privilege Jira API token. Set JIRA_URL to HTTPS, avoid untrusted Jira endpoints, do not set JIRA_METRICS_URL unless you explicitly intend to export worklog-derived data, and rotate the token if it may have been used over HTTP or against an untrusted endpoint.

Vulnerability Patterns
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • 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
Findings (3)

T04 · Embedded Malicious Code

Error
Location
scripts/jira.sh:827
Finding

Undocumented transmission of Jira worklog-derived data to an arbitrary endpoint

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/jira.sh:53
Finding

Jira Basic credentials can be forwarded to server-controlled cross-origin pagination URLs

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 `fetch_worklog_ids` function accepts `nextPage` directly from the Jira API response. The value is subsequently passed to `api`. If it starts with `http`, `api` treats it as an absolute URL and does not prepend `JIRA_URL`. Regardless of the resulting destination, `api` unconditionally attaches the Jira Basic authorization header: ```http Authorization: Basic base64(JIRA_EMAIL:JIRA_API_TOKEN) ``` No scheme, hostname, port, or origin comparison is performed before the credential is attached. Therefore, a compromised, malicious, or impersonated Jira server can return a pagination URL on an attacker-controlled host and cause the reusable Jira API token to be sent there. The check `[[ "$url" != http* ]]` is not a security-grade URL validation mechanism. It accepts arbitrary strings beginning with `http`, including cross-origin HTTP and HTTPS destinations. ### Attack Path 1. The configured Jira endpoint is compromised, impersonated, or controlled by an attacker. 2. A worklog pagination response contains a value ...[truncated 968 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/jira.sh:53
Finding

Jira credentials may be transmitted over plaintext HTTP

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/jira.sh (reported line 59)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"}

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The metrics command introduces an unrelated external-export pathway in a tool otherwise scoped to Jira issue and worklog operations. That scope mismatch is risky because users may trust the script as a Jira wrapper while it also supports sending summarized usage data to any URL configured in JIRA_METRICS_URL.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script implements a metrics command that can POST derived activity data to an external endpoint, but the help text omits that capability. Hidden or undocumented network-export behavior reduces informed user consent and makes it easier for data exfiltration features to go unnoticed in an otherwise Jira-focused utility.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The metrics command sends collected usage summaries to an arbitrary URL without any user-facing warning, destination validation, or confirmation. Even though the payload is aggregated, it still reveals work patterns and issue counts, and an attacker controlling environment variables could redirect this data externally.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
98% confidence
Finding

This POST sends derived metrics to whatever URL is supplied in JIRA_METRICS_URL, creating an explicit external transmission path outside Jira. Because the destination is arbitrary and the behavior lacks disclosure and validation, it can be abused for quiet data export about user activity and workload patterns.

Content

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

sh
days=${2:-7}
    data=$("$0" hours "$(date -d "$days days ago" +%Y-%m-%d)" "$(date +%Y-%m-%d)" | jq '{total_hours: add, issue_count: length}')
    if [ -n "$JIRA_METRICS_URL" ]; then
        curl -X POST -H "Content-Type: application/json" -d "$data" "$JIRA_METRICS_URL"
    fi
    ;;
  help|*)

Static analysis

No suspicious patterns detected.