T09 · Insecure Skill Coding Practices
- Location
scripts/twenty-config.sh:7- Finding
Arbitrary Shell Command Execution Through Sourced Configuration File
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a real Twenty CRM helper, but it needs Review because it can change or delete CRM data and has weak safety controls around credentials and configuration.
Install only if you are comfortable giving this skill API-token authority over your Twenty CRM. Use a narrowly scoped token, prefer HTTPS, avoid delete permissions unless needed, review the hardcoded config path before use, and treat delete/destroy helpers as potentially irreversible.
scripts/twenty-config.sh:7Arbitrary Shell Command Execution Through Sourced Configuration File
scripts/twenty-graphql.sh:26Bearer Token and CRM Data Can Be Transmitted Over Plaintext HTTP
scripts/twenty-create-company.sh:18Predictable Temporary File Enables Symlink-Based File Clobbering
The skill exposes shell-based capabilities that can make authenticated REST and GraphQL calls to a self-hosted CRM, but it does not declare any tool scope or allowed-tools restrictions. Without explicit scoping, an agent may invoke broader shell functionality than intended, increasing the chance of unauthorized data access, modification, or destructive actions against the CRM.
The documentation advertises a delete helper for CRM objects without any cautionary note, confirmation guidance, or safety constraints. In a CRM context this is materially risky because records may contain important business data, and an agent or user could invoke destructive deletion without understanding permanence, backup requirements, or approval expectations.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
BODY=$(printf '{"query":%s}' "$QUERY_JSON")
fi
curl -sS -X POST "$TWENTY_BASE_URL/graphql" \
-H "Authorization: Bearer $TWENTY_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
This shell script performs an HTTP DELETE request, and may target an even more destructive '/destroy' endpoint, but it provides no confirmation prompt, warning message, or visible user disclosure before executing the operation. The brief usage comments describe syntax but do not warn about deletion impact, which increases the risk of accidental destructive use.
The script performs an outbound HTTP request with curl and includes the TWENTY_API_KEY bearer token in the Authorization header. While the code is straightforward, there is no confirmation prompt, user-facing log/message, or inline warning explaining that a credential-backed network request will be made.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
exit 1
fi
curl -sS -X PATCH "$TWENTY_BASE_URL/rest${PATH_PART}" \
-H "Authorization: Bearer $TWENTY_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
The script performs a network PATCH request and sends user-supplied JSON along with a bearer token, but it provides no confirmation prompt, visible disclosure, or explanatory comment warning that data will be transmitted to a remote service. This is a safety-relevant operation for a code file because it modifies remote state and uses sensitive credentials.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
exit 1
fi
curl -sS -X POST "$TWENTY_BASE_URL/rest${PATH_PART}" \
-H "Authorization: Bearer $TWENTY_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
This shell script performs a network POST request using user-provided JSON and includes an Authorization bearer token from configuration, but the file provides no confirmation prompt, warning message, or explanatory comment about transmitting data off-host. For a code file, this is a safety-relevant external data transmission and credential use with no visible user disclosure in the script itself.
No suspicious patterns detected.