Back to skill

Security audit

GitHunt

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to do what it says, but it handles recruiting contact data and outbound candidate-search requests with too little privacy and scoping guidance.

Review this skill before installing if your organization has recruiting, privacy, or anti-spam requirements. Treat returned emails and social profiles as personal data, confirm you have a lawful basis for use and outreach, and avoid feeding sensitive sourcing strategy into the API unless you trust GitHunt's handling of that data. Use the helper scripts only with trusted arguments and a trusted GITHUNT_API_URL value.

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

Warning
Location
scripts/githunt-search.sh:30
Finding
Unescaped command-line input permits JSON request-body manipulation<![CDATA[ ## Vulnerability Details **File Location**: `scripts/githunt-search.sh:30-41` **Vulnerability Type**: Improper encoding of user-controlled data in JSON **Risk Level**: Medium ### Vulnerable Code ```bash # Build JSON payload properly payload="{\"location\": \"$location\", \"maxUsers\": 100" if [ -n "$role" ]; then payload="$payload, \"role\": \"$role\"" fi if [ -n "$skills" ]; then skills_json=$(echo "$skills" | sed 's/,/","/g' | sed 's/^/["/' | sed 's/$/"]/') payload="$payload, \"skills\": $skills_json" fi payload="$payload}" ``` ### Technical Analysis The script directly interpolates the `location`, `role`, and `skills` command-line arguments into a JSON string. It does not escape JSON metacharacters such as quotation marks, backslashes, control characters, or newlines. The `sed` transformations applied to `skills` only convert commas into apparent array delimiters. They do not perform JSON encoding and therefore do not prevent a supplied skill value from terminating the array or introducing additional JSON properties. Because the resulting payload is subsequently submitted to the configured API, crafted arguments can modify the structure and meaning of the request. Depending on how the receiving API handles duplicate or unexpected properties, an attacker may override intended search parameters, add unauthorized parameters, or cause persistent request failures. This issue does not provide local shell-command execution: the shell variables are quoted when passed to `curl`, and the payload is not evaluated as shell code. ### Attack Path 1. An attacker controls or influences arguments passed to `githunt-search.sh`. 2. The attacker places JSON syntax in the location, role, or skills argument. For example, a location value can close the original string and introduce additional properties. 3. The script concatenates the value into `payload` without JSON escaping. 4. The crafted JSON body is sent through `curl` to `${GITHUNT_API_URL}/rank ...[truncated 911 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Construct the request with a JSON-aware tool rather than string concatenation: ```bash payload=$(jq -n \ --arg location "$location" \ --arg role "$role" \ --arg skills "$skills" ' { location: $location, maxUsers: 100 } + if $role != "" then {role: $role} else {} end + if $skills != "" then {skills: ($skills | split(",") | map(select(length > 0)))} else {} end ') ``` Additional hardening should include: 1. Restrict `role` to the documented allowlist. 2. Set maximum lengths for location and skill values. 3. Reject control characters and empty skill entries. 4. Validate the generated payload with `jq -e` before transmission. 5. Enforce a documented upper bound for `maxUsers`. 6. Report API and JSON parsing failures explicitly instead of suppressing all `curl` diagnostics. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
skill/scripts/githunt-search.sh:25
Finding
Unsafe JSON construction allows parameter injection and limit manipulation<![CDATA[ ## Vulnerability Details **File Location**: `skill/scripts/githunt-search.sh:25-40` **Vulnerability Type**: Improper encoding and validation of user-controlled JSON values **Risk Level**: Medium ### Vulnerable Code ```bash # Build skills array for JSON if [ -n "$skills" ]; then skills_json=$(echo "$skills" | sed 's/,/","/g' | sed 's/^/["/' | sed 's/$/"]/') else skills_json="[]" fi # Build JSON payload payload=$(cat <<EOF { "location": "$location", "skills": $skills_json, "maxUsers": $limit } EOF ) ``` ### Technical Analysis All three request parameters are inserted into a here-document without safe JSON serialization: - `location` is placed inside a JSON string without escaping. - `skills` is transformed with `sed`, but quotation marks, backslashes, control characters, and JSON delimiters remain unsafe. - `limit` is inserted as raw JSON rather than being validated as an integer. The raw insertion of `limit` makes exploitation particularly direct. A value such as `20, "additionalProperty": "value"` changes the resulting object by adding a new property while preserving syntactically valid JSON. Crafted location and skills values may similarly terminate their expected JSON contexts and inject additional data. The generated body is submitted to `${GITHUNT_API_URL}/rank/users`. Although the script later verifies that the response is JSON, it never validates the outbound request body. No shell evaluation is performed on the injected data, so this finding does not establish local command execution. ### Attack Path 1. An attacker supplies or influences the location, skills, or limit arguments. 2. The attacker provides a limit containing additional JSON syntax, such as an integer followed by another object property. 3. The here-document expands the value directly into the request body. 4. The resulting body remains valid JSON but contains attacker-selected properties. 5. The script sends the manipulated request to the configured API. 6. T ...[truncated 953 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Validate the numeric limit and serialize every value with `jq`: ```bash if ! [[ "$limit" =~ ^[0-9]+$ ]] || (( limit < 1 || limit > 1000 )); then echo "Error: limit must be an integer between 1 and 1000" >&2 exit 1 fi payload=$(jq -n \ --arg location "$location" \ --arg skills "$skills" \ --argjson maxUsers "$limit" ' { location: $location, skills: ( if $skills == "" then [] else ($skills | split(",") | map(select(length > 0))) end ), maxUsers: $maxUsers } ') ``` The implementation should also: 1. Apply reasonable length limits to `location` and `skills`. 2. Reject control characters in user input. 3. Validate the completed request with `jq -e`. 4. Use `curl --fail-with-body --show-error` and handle network errors separately. 5. Avoid printing arbitrary raw server responses unless output is appropriately bounded and treated as untrusted. 6. Consider restricting `GITHUNT_API_URL` to HTTPS and an approved hostname when endpoint customization is not a required feature. ]]>
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 (30)

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill includes shell-based usage patterns and network calls but does not declare any explicit tool scope such as allowed-tools or permissions. In an agent environment, this increases the chance that the skill can invoke shell/network capabilities without clear user visibility or policy constraints, which weakens least-privilege protections.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill description promotes discovery of candidates and contact information but provides no privacy, consent, or data-use warning. Because the skill is explicitly for recruiting and sourcing people, omission of those safeguards makes misuse more likely and normalizes collection of personal data without informing the operator of legal or ethical constraints.

External Transmission

Medium
Category
Data Exfiltration
Content
Real-time streaming search that returns candidates as they're found. Returns **top 10 sample results** for free.

```bash
curl -N -X POST "https://api.githunt.ai/v1/rank/users/stream" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
Confidence
91% confidence
Finding
The documented curl command transmits search criteria such as location, role, and skills to an external API. External transmission is expected for this integration, but it is still security-relevant because user inputs and potentially sensitive recruiting intent are sent to a third party, which may create privacy, compliance, or data-handling risks.

External Transmission

Medium
Category
Data Exfiltration
Content
Real-time streaming search that returns candidates as they're found. Returns **top 10 sample results** for free.

```bash
curl -N -X POST "https://api.githunt.ai/v1/rank/users/stream" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
Confidence
91% confidence
Finding
The documented curl command transmits search criteria such as location, role, and skills to an external API. External transmission is expected for this integration, but it is still security-relevant because user inputs and potentially sensitive recruiting intent are sent to a third party, which may create privacy, compliance, or data-handling risks.

External Transmission

Medium
Category
Data Exfiltration
Content
Get detailed score for a specific GitHub user.

```bash
curl -X POST "https://api.githunt.ai/v1/rank/user" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "torvalds",
Confidence
89% confidence
Finding
This endpoint sends a specific GitHub username and selected skills to an external service for scoring. While this appears to be the intended feature, it creates a data-sharing path to a third party and could expose profiling activity or candidate evaluation criteria without adequate disclosure.

External Transmission

Medium
Category
Data Exfiltration
Content
Get detailed score for a specific GitHub user.

```bash
curl -X POST "https://api.githunt.ai/v1/rank/user" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "torvalds",
Confidence
89% confidence
Finding
This endpoint sends a specific GitHub username and selected skills to an external service for scoring. While this appears to be the intended feature, it creates a data-sharing path to a third party and could expose profiling activity or candidate evaluation criteria without adequate disclosure.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This section explicitly advertises obtaining full contact information including emails, websites, and social profiles, yet gives no privacy warning or restriction. In context, that materially increases abuse potential for scraping, unsolicited outreach, profiling, or bulk collection of personal data from a third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
### Find React Developers in Berlin (Streaming)
```bash
curl -N -X POST "https://api.githunt.ai/v1/rank/users/stream" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{"location": "berlin", "role": "frontend"}' 2>/dev/null | \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#
# Roles: frontend, backend, fullstack, mobile, devops, data, security, blockchain, ai, gaming

API_URL="${GITHUNT_API_URL:-https://api.githunt.ai/v1}"

location="${1:-}"
role="${2:-}"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
echo ""

# Make streaming request and parse SSE
curl -s -N -X POST "$API_URL/rank/users/stream" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "User-Agent: OpenClaw/1.0 (githunt-skill)" \
Confidence
94% confidence
Finding
This script transmits user-supplied search criteria to an external internet service via curl, which is a real data egress behavior. While the purpose of the skill is to query GitHunt, the destination can also be overridden through the GITHUNT_API_URL environment variable, so location, role, and skills inputs may be sent to an untrusted endpoint without validation or user warning.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill’s core description explicitly advertises access to candidate contact information for recruiting use, but provides no privacy, consent, lawful-basis, or anti-spam guidance. In this context, the omission materially increases the risk of misuse of personal data and non-compliant outreach workflows.

External Transmission

Medium
Category
Data Exfiltration
Content
Search and rank GitHub developers by location and tech stack.

```bash
curl -X POST "https://api.githunt.ai/v1/rank/users" \
  -H "Content-Type: application/json" \
  -d '{
    "location": "berlin",
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Same as above but returns results via Server-Sent Events for real-time updates.

```bash
curl -X POST "https://api.githunt.ai/v1/rank/users/stream" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Find Backend Engineers in Europe
```bash
curl -s -X POST "https://api.githunt.ai/v1/rank/users" \
  -H "Content-Type: application/json" \
  -d '{"location": "europe", "role": "backend", "skills": ["go", "kubernetes"], "maxUsers": 20}' \
  | gunzip | jq '.results'
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.