T09 · Insecure Skill Coding Practices
- Location
scripts/research-keyword.sh:19- Finding
DataForSEO Credentials Exposed Through Process Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This SEO writing skill is mostly purpose-aligned, but it tells the agent to commit and push generated blog content to the main branch without a clear confirmation step.
Install only if you are comfortable with an SEO workflow that sends keywords to DataForSEO and Google Suggest, uses DataForSEO credentials from environment variables, writes article and image files, and may commit and push to your repository. Treat Git commit and push steps as manual review points, prefer a draft branch or pull request, and avoid using confidential campaign terms unless third-party lookup is acceptable.
scripts/research-keyword.sh:19DataForSEO Credentials Exposed Through Process Arguments
scripts/research-keyword.sh:8Unvalidated Input Embedded in Authenticated JSON Requests and Google Suggest URL
SKILL.md:302Generated Content Is Pushed Directly to the Main Branch Without a Confirmation Boundary
The declared description promises a broad end-to-end SEO content pipeline covering research through article creation, image generation, fact-checking, humanization, assembly, and translation. The supplied code chunk only implements a narrow keyword research utility: it validates inputs and credentials, calls DataForSEO APIs for search volume and related keywords, and fetches Google Suggest suggestions. While keyword research is one component of the declared pipeline, the code shown does not perform the other major advertised capabilities. This is a material description-to-behavior mismatch because the actual code’s primary purpose is limited keyword research rather than full article production.
The skill clearly instructs use of shell capabilities (scripts/research-keyword.sh, cwebp, ffmpeg, git) but does not declare an explicit tool scope or allowed-tools boundary. That creates an authorization gap where an agent may execute filesystem and command operations beyond what a user would reasonably expect from a content-writing skill.
The description says the skill generates SEO content, but the body also stages files into a repository and performs version-control operations. Omitting write-and-publish behavior is dangerous because users may invoke what looks like a drafting tool and unexpectedly get local repo changes or remote publication actions.
The invocation wording is broad enough to match many ordinary writing requests, increasing the chance the skill is triggered in situations where the user only wanted brainstorming or drafting help. Because the skill also performs shell, file-write, image, and git actions, overbroad triggering materially increases the risk of unintended side effects.
The instructions direct file creation, image copying, git commit, and git push without any required user-facing warning or approval step. This is dangerous because the skill can make persistent local changes and publish them remotely as part of a routine content request, violating user expectations and change-control practices.
Including git push origin main gives the skill the ability to publish content directly to a remote branch, potentially altering production content or triggering deployment pipelines. In a content-generation context, automatic remote push is higher risk because it crosses from drafting assistance into unilateral external side effects.
This code transmits the supplied keyword and contextual metadata to DataForSEO over the network. In this skill, external transmission is functionally expected, but it still constitutes a real data egress path that can leak sensitive inputs if users assume processing is local.
# 1. Search volume
echo "--- Search Volume ---"
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/search_volume/live" \
-u "$DFORSEO_LOGIN:$DFORSEO_PASS" \
-H "Content-Type: application/json" \
-d "[{\"keywords\":[\"$KEYWORD\"],\"language_code\":\"$LANG\",\"location_code\":$LOCATION}]" | \
This code transmits the supplied keyword and contextual metadata to DataForSEO over the network. In this skill, external transmission is functionally expected, but it still constitutes a real data egress path that can leak sensitive inputs if users assume processing is local.
# 1. Search volume
echo "--- Search Volume ---"
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/search_volume/live" \
-u "$DFORSEO_LOGIN:$DFORSEO_PASS" \
-H "Content-Type: application/json" \
-d "[{\"keywords\":[\"$KEYWORD\"],\"language_code\":\"$LANG\",\"location_code\":$LOCATION}]" | \
This second API call sends the keyword to DataForSEO again for related-keyword expansion, increasing external exposure of user input. The behavior aligns with the stated SEO purpose, but it remains a real privacy and data-governance concern if not transparently communicated.
# 2. Related keywords
echo "--- Related Keywords (top 15 by volume) ---"
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/keywords_for_keywords/live" \
-u "$DFORSEO_LOGIN:$DFORSEO_PASS" \
-H "Content-Type: application/json" \
-d "[{\"keywords\":[\"$KEYWORD\"],\"language_code\":\"$LANG\",\"location_code\":$LOCATION,\"sort_by\":\"search_volume\",\"limit\":15}]" | \
This second API call sends the keyword to DataForSEO again for related-keyword expansion, increasing external exposure of user input. The behavior aligns with the stated SEO purpose, but it remains a real privacy and data-governance concern if not transparently communicated.
# 2. Related keywords
echo "--- Related Keywords (top 15 by volume) ---"
curl -s -X POST "https://api.dataforseo.com/v3/keywords_data/google_ads/keywords_for_keywords/live" \
-u "$DFORSEO_LOGIN:$DFORSEO_PASS" \
-H "Content-Type: application/json" \
-d "[{\"keywords\":[\"$KEYWORD\"],\"language_code\":\"$LANG\",\"location_code\":$LOCATION,\"sort_by\":\"search_volume\",\"limit\":15}]" | \
The manifest describes an SEO article pipeline driven by a target keyword, but does not indicate that the skill depends on host-stored credentials or secret access. Reading DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD introduces a credential-handling capability that goes beyond the user-facing content-creation purpose, even though it is used for legitimate keyword research.
The script sends the user-supplied keyword to a third-party SEO API without any explicit notice or consent gate. While keyword research inherently requires external lookup, user inputs may contain sensitive business plans, unpublished campaign terms, or client data, so silent transmission creates a privacy risk.
The script also sends the keyword to Google's suggestion endpoint without notifying the user. This expands third-party exposure beyond the primary SEO vendor, which is unnecessary from a privacy perspective unless clearly disclosed and justified.