Back to skill

Security audit

Jira Task Creator

Security checks for vulnerabilities and agentic risk

Overview

This Jira automation skill is purpose-aligned, but it can send a Jira bearer token and issue or user data to any configured URL, including plaintext HTTP, while performing real Jira write actions without clear safeguards.

Review before installing. Use only an HTTPS Jira URL you control, use a least-privilege Jira token, rotate any token used over HTTP, and avoid bulk or natural-language issue creation unless you add a preview and confirmation step. Treat every successful call as a real Jira write operation.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
jira_task_creator.py:141
Finding
Jira bearer token and sensitive Jira data can be transmitted over plaintext HTTP<![CDATA[ ## Vulnerability Details **File Location**: `jira_task_creator.py:141-147`, `jira_task_creator.py:192-196`, `SKILL.md:42-43`, `SKILL.md:53-54`, `PROJECT.md:20-21`, `package.json:62-66` **Vulnerability Type**: Cleartext transmission of credentials and sensitive data **Risk Level**: High ### Vulnerable Code The application constructs request URLs directly from the configured base URL and attaches the Jira bearer token without enforcing HTTPS: ```python url = f"{self.base_url.rstrip('/')}{endpoint}" headers = { "Authorization": f"Bearer {self.token}", "Content-Type": "application/json" } try: response = requests.get(url, headers=headers, params=params, timeout=30) ``` Issue creation uses the same unrestricted base URL and sends the bearer token together with issue data: ```python url = f"{base_url.rstrip('/')}/rest/api/3/issue" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } try: response = requests.post(url, headers=headers, json=issue_data, timeout=30) ``` The documentation explicitly demonstrates an unencrypted HTTP endpoint: ```bash export JIRA_BASE_URL="http://your-jira.com" export JIRA_BEARER_TOKEN="your-token-here" ``` The package configuration also uses HTTP in its example: ```json "JIRA_BASE_URL": { "required": true, "description": "Jira server base URL (e.g., http://your-jira.com)" }, "JIRA_BEARER_TOKEN": { "required": true, "description": "Jira Bearer Token for authentication" } ``` ### Technical Analysis Network communication with the configured Jira server is necessary for the declared issue-creation and user-search functionality. Sending a Jira authentication token and the requested Jira records to that server therefore does not inherently exceed the skill's functional scope. However, the implementation accepts any URL scheme and the documentation actively recommends `http://`. When HTTP is used, TLS does not protect the `Authorization: Bearer` header, user-se ...[truncated 2467 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce HTTPS before issuing any request: ```python from urllib.parse import urlparse parsed = urlparse(base_url) if parsed.scheme != "https": return { "success": False, "error": "JIRA_BASE_URL must use HTTPS" } ``` 2. Apply the same validation in both `create_issue()` and `UserSearcher.__init__()`, ideally through a shared configuration-validation function. 3. If plaintext HTTP is required for isolated local development, require a clearly named explicit opt-in such as `JIRA_ALLOW_INSECURE_HTTP=true`. Default to rejection and display a prominent warning. 4. Replace every documented `http://your-jira.com` example with `https://your-jira.com`. 5. Allow administrators to configure an approved hostname or origin and reject requests to other destinations. This reduces the risk of token exfiltration through configuration tampering. 6. Preserve normal TLS certificate verification. If private certificate authorities are used, support a configured CA bundle rather than disabling certificate validation. 7. Use a dedicated Jira service account with only the project and issue permissions required for issue creation and assignable-user search. 8. Rotate any token that may previously have been used over plaintext HTTP and review Jira access logs for suspicious API activity. 9. Avoid returning unrestricted `response.text` to downstream callers because Jira error responses may contain internal details. Parse and return a minimal, sanitized error message instead. ]]>

T08 · Insecure Dependencies

Warning
Location
package.json:48
Finding
Python dependencies are not reproducibly pinned or hash-verified<![CDATA[ ## Vulnerability Details **File Location**: `package.json:48-52`, `SKILL.md:34`, `PROJECT.md:14` **Vulnerability Type**: Non-reproducible third-party dependency resolution **Risk Level**: Medium ### Vulnerable Configuration The package metadata permits any future compatible release at or above the stated versions: ```json "dependencies": { "python": ">=3.7", "pip": [ "requests>=2.25.0", "python-dateutil>=2.8.0" ] } ``` The installation documentation does not specify versions, hashes, a package index, or a lockfile: ```bash pip install requests python-dateutil ``` ### Technical Analysis The declared dependencies are established Python packages, and the reviewed project contains no evidence that either dependency is currently malicious. The security issue is that installations are not reproducible: `>=` constraints and unconstrained `pip install` commands permit the resolver to select future releases that were not reviewed with this skill. No lockfile, exact-version requirements file, or cryptographic hashes are included. Consequently, two installations at different times may execute different dependency code. This expands the supply-chain trust boundary to all future matching releases and to the package index used during installation. Python packages may execute code during build or installation, and imported packages execute module initialization logic at runtime. A compromised upstream release, compromised package-index account, maliciously substituted package source, or unsafe future release could therefore execute code with the privileges of the user installing or running the skill. ### Attack Path 1. An attacker compromises a permitted dependency release channel, publishing infrastructure, or package-index account, or causes the installer to use a malicious package source. 2. The attacker publishes a release that satisfies `requests>=2.25.0` or `python-dateutil>=2.8.0`. 3. A user follows the documented installation command ...[truncated 1255 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Generate and commit a reviewed lockfile or requirements file containing exact dependency versions. 2. Record cryptographic hashes and require hash verification during installation. For example: ```text requests==<reviewed-version> --hash=sha256:<reviewed-hash> python-dateutil==<reviewed-version> --hash=sha256:<reviewed-hash> ``` 3. Install with hash enforcement: ```bash python -m pip install --require-hashes -r requirements.txt ``` 4. Configure installations to use an explicitly trusted package index or an internally controlled package mirror. 5. Review dependency release notes and security advisories before updating locked versions. 6. Add automated dependency scanning and a controlled update process that tests new versions before deployment. 7. Keep the human-readable dependency declarations synchronized with the authoritative lockfile so the documentation does not encourage unconstrained installation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (12)

Tainted flow: 'url' from os.getenv (line 210, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Content
}

        try:
            response = requests.get(url, headers=headers, params=params, timeout=30)
            if response.status_code == 200:
                users = response.json()
                if users and len(users) > 0:
Confidence
90% confidence
Finding
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Tainted flow: 'url' from os.getenv (line 210, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
}

    try:
        response = requests.post(url, headers=headers, json=issue_data, timeout=30)
        print(f"[INFO] Status code: {response.status_code}")

        if response.status_code == 201:
Confidence
90% confidence
Finding
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
This markdown file documents setting a sensitive environment variable (JIRA_BEARER_TOKEN) and calling create_issue to send task data to a Jira server, but it provides no warning about transmitting project content to an external system or safeguarding credentials. For markdown files, omissions around behaviors affecting privacy or system integrity should be flagged when the skill description lacks warnings.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The documentation advertises CSV-based bulk task creation and templates that can modify Jira data at scale, but it does not warn users about the operational risk of creating many issues unintentionally or with malformed input. In a skill intended to automate Jira actions, omission of safeguards and warnings materially increases the chance of accidental mass changes, project spam, or workflow disruption.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The code hard-codes the due date format with a +08:00 timezone, which can silently create incorrect deadlines for users in other regions. In workflow systems this can lead to missed deadlines, mistaken scheduling, or policy violations when due dates are interpreted differently than intended.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill sends summary, description, assignee, due date, and related task content to a remote Jira server without any built-in user-facing notice or consent step. This can cause unintended disclosure of sensitive operational or personal data, especially if the caller assumes the action is local or if the Jira endpoint is externally hosted.

External Transmission

Medium
Category
Data Exfiltration
Content
}

    try:
        response = requests.post(url, headers=headers, json=issue_data, timeout=30)
        print(f"[INFO] Status code: {response.status_code}")

        if response.status_code == 201:
Confidence
80% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The manifest advertises broad natural-language Jira task creation but does not describe any trigger constraints, confirmation requirements, or exclusion conditions before performing a write action. In a skill that creates external tickets, ambiguous natural-language interpretation can cause unintended issue creation, mis-assignment, or misuse of privileged automation against Jira projects.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The skill advertises user search by name, email, and open_id while also requiring a bearer token, yet the manifest provides no privacy guidance, access restrictions, or credential-handling warnings. This can facilitate user enumeration and unsafe handling of sensitive identifiers or authentication material, especially in enterprise Jira environments.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The manifest explicitly supports batch task creation from CSV and templates but provides no warning, rate limit, preview, or approval flow for bulk write operations. This increases the risk of mass accidental or abusive ticket creation, which can disrupt Jira workflows, spam projects, and create operational cleanup burdens at scale.

Missing User Warnings

Low
Confidence
85% confidence
Finding
The skill supports searching users by email and maintaining Feishu-Jira user mappings, but the documentation does not mention privacy implications, data minimization, or access controls around user identity data. This can encourage collection or exposure of personal information beyond what operators expect, especially in enterprise environments where directory data is sensitive.

Missing User Warnings

Low
Confidence
84% confidence
Finding
User search queries are transmitted to Jira without explicit disclosure. While this is part of the feature, names or email addresses entered for lookup may still be sensitive in some environments, making silent transmission a privacy issue.

Static analysis

No suspicious patterns detected.