T09 · Insecure Skill Coding Practices
- Location
scripts/get_job_status.py:18- Finding
Plaintext HTTP Allows Interception and Tampering of Job Status Data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill matches its stated job-status purpose, but it should be reviewed because it sends job IDs and receives detailed job metadata over plaintext HTTP and its documentation overstates some safety controls.
Review this skill before installing in any sensitive HPC or business environment. It may expose job IDs and returned job details over unencrypted HTTP, and its scripts do not enforce the numeric jobId validation promised in metadata. Prefer an HTTPS endpoint, executable-side input validation, and clarified docs before relying on it for automation or confidential workloads.
scripts/get_job_status.py:18Plaintext HTTP Allows Interception and Tampering of Job Status Data
scripts/get_job_status.py:36Executable Scripts Do Not Enforce Declared Job ID Validation
install.sh:42Installer Retrieves an Unpinned Python Dependency
The script hardcodes a plain HTTP API endpoint, so job identifiers and returned job metadata are transmitted without transport-layer protection. This enables man-in-the-middle interception or tampering, which is especially risky for HPC/AI job monitoring because an attacker could observe sensitive job activity or falsify reported status.
The skill describes outbound network access to a hardcoded external HTTP endpoint and effectively implies executable behavior, but it does not declare any explicit tool scope such as allowed network destinations or permitted tools. This weakens sandboxing and review controls, making it easier for an agent runtime to grant broader-than-necessary network or shell capabilities and increasing the risk of unintended data exposure or misuse.
The manifest says the skill fetches job status by jobId from a specific API endpoint and parses the jobState field, but this documentation presents additional supported inputs such as timeout, verbose, and format, plus text/table rendering modes. That is not merely incomplete documentation; it actively describes the skill as having richer formatting and control features than its stated purpose and behavior indicate.
The file explicitly states at L244 that the skill itself only supports single job query, yet later sections present scheduled tasks, monitoring loops, cache advice, alerting, history recording, and runtime log files as part of the skill's usage and behavior. These sections blur the boundary between external orchestration examples and the skill itself, contradicting the manifest's narrow status-query purpose and overstating what the skill does.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
check_bash_deps() {
log_info "Checking Bash dependencies..."
check_command curl
check_command jq
return 0
The script sends the user-supplied job ID to a remote third-party service but does not clearly disclose that network transmission will occur. In an HPC/AI context, job identifiers can be sensitive operational metadata and could reveal workload existence or be intercepted/logged by external infrastructure, especially since the configured endpoint uses insecure transport.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def test_help_command(self):
"""Test help command"""
import subprocess
result = subprocess.run(
['python', 'scripts/get_job_status.py', '--help'],
capture_output=True, text=True
)
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def test_missing_job_id(self):
"""Test missing jobId parameter"""
import subprocess
result = subprocess.run(
['python', 'scripts/get_job_status.py'],
capture_output=True, text=True
)
The manifest forces LANG=en_US.UTF-8 for script execution without user opt-in, which can alter parsing, formatting, error messages, or downstream behavior in ways the user did not request. In this skill the risk is limited because the function is a simple status lookup, but locale pinning can still create subtle reliability and interpretation issues, especially if scripts parse localized command or date output.
The README encourages use of an external API but does not clearly warn users that job identifiers and associated request metadata are transmitted off-host to a third-party service. In an HPC/AI context, job IDs can be operationally sensitive, and silent external transmission may create privacy, confidentiality, or policy-compliance issues for users in regulated or multi-tenant environments.
The security section states 'Log Sanitization: Don't record sensitive information', implying sanitized logging behavior. However, elsewhere the README promotes verbose logging and direct API inspection, and this file provides no supporting implementation showing sanitization, creating a documentation-level contradiction about what logging reveals.
The documentation instructs users to query an external service directly and references transmitting job identifiers to a third-party host without any explicit privacy or data-handling warning. Even though job IDs may seem low sensitivity, they can reveal workload existence, timing, infrastructure identifiers, and operational metadata when sent off-system or logged during troubleshooting.
The manifest describes a skill for querying HPC/AI job status by jobId, but this test module invokes the skill via subprocess in order to test its CLI behavior. Spawning subprocesses is not part of the stated end-user purpose of fetching job status, so this represents an additional capability in the codebase beyond the manifest's functional scope.
The manifest description 'Query HPC/AI computing job status' describes the tool's purpose but does not specify concrete trigger phrases, scope limits, or exclusion conditions. In a manifest file, this can be interpreted broadly enough to match many generic status-checking requests without clear boundaries on when this skill should or should not activate.
No suspicious patterns detected.