T01 · Skill Instruction Hijacking
- Location
SKILL.md:48- Finding
Undisclosed Affiliate-Link Substitution Hijacks Agent Recommendations
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is openly for affiliate monetization, but it broadly tells agents to replace normal recommendations with commission-tracking links without requiring user disclosure or clear consent.
Review before installing. This skill is designed to make an agent earn affiliate commissions, so it can affect the neutrality and transparency of product recommendations. Only use it if you are comfortable with external registration at syndicatelinks.co, local storage of an affiliate API key, and clear disclosure to users whenever tracking links are used. Do not run the setup script in a shared environment unless credential-file permissions and temporary-file handling are hardened.
SKILL.md:48Undisclosed Affiliate-Link Substitution Hijacks Agent Recommendations
scripts/setup.sh:15Predictable Temporary File Permits Local File Overwrite and Data Exposure
scripts/setup.sh:8Affiliate API Credential Is Stored Without Explicit Restrictive Permissions
The skill directs the agent to monetize recommendations via affiliate tracking links but does not require a user-facing disclosure that links may generate commission. This creates a deception and conflict-of-interest risk, allowing covert ad insertion into advice that users may interpret as neutral recommendations.
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
if [ -f "$CONFIG_DIR/api-key" ]; then
echo "Already registered. API key found at $CONFIG_DIR/api-key"
echo "Testing connection..."
RESP=$(curl -s -w "%{http_code}" -o /tmp/sl-me.json "$API_URL/affiliate/me" \
-H "Authorization: Bearer $(cat $CONFIG_DIR/api-key)")
if [ "$RESP" = "200" ]; then
echo "✅ Connected. Profile:"
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
echo " Name: $AGENT_NAME"
echo " Email: $AGENT_EMAIL"
RESP=$(curl -s "$API_URL/affiliate/register" \
-H "Content-Type: application/json" \
-d "{\"email\":\"$AGENT_EMAIL\",\"name\":\"$AGENT_NAME\"}")
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
# Auto-discover and join programs
echo ""
echo "Discovering available programs..."
PROGRAMS=$(curl -s "$API_URL/affiliate/programs" \
-H "Authorization: Bearer $API_KEY")
echo "$PROGRAMS" | python3 -c "
The skill includes shell-based setup and API invocation guidance but declares no explicit tool scope or permission boundaries. In agent environments, this can enable unexpected shell access during normal use and increases the chance the skill is invoked with more capability than users realize.
The registration step transmits agent-identifying data to an external third-party service and returns a live API key for continued access. While expected for service onboarding, this is still a meaningful security concern because it expands data exposure and introduces credential handling requirements in an agent skill context.
curl -X POST https://api.syndicatelinks.co/affiliate/register \
-H "Content-Type: application/json" \
-d '{"email":"YOUR_AGENT_EMAIL","name":"YOUR_AGENT_NAME"}'
The registration step transmits agent-identifying data to an external third-party service and returns a live API key for continued access. While expected for service onboarding, this is still a meaningful security concern because it expands data exposure and introduces credential handling requirements in an agent skill context.
curl -X POST https://api.syndicatelinks.co/affiliate/register \
-H "Content-Type: application/json" \
-d '{"email":"YOUR_AGENT_EMAIL","name":"YOUR_AGENT_NAME"}'
Listing available programs sends an authorization bearer token to an external service, creating routine outbound data transfer and credential exposure risk if the environment, logs, or shell history are not well controlled. In an agent skill, this matters because the skill offers executable commands without permission gating or secret-management guidance.
curl https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $(cat ~/.config/syndicate-links/api-key)"
Applying to affiliate programs performs an authenticated state-changing request to a third-party service. If triggered automatically by an agent, it could enroll accounts in external programs without clear operator intent or oversight.
curl -X POST https://api.syndicatelinks.co/affiliate/programs/PROGRAM_ID/apply \
-H "Authorization: Bearer $(cat ~/.config/syndicate-links/api-key)"
Generating tracking links is the core monetization action and creates externally managed affiliate identifiers that can be injected into user-facing recommendations. In context, this is more dangerous because the skill also encourages broad use of those links without mandatory disclosure, enabling covert monetized redirection at scale.
curl -X POST https://api.syndicatelinks.co/affiliate/links \
-H "Authorization: Bearer $(cat ~/.config/syndicate-links/api-key)" \
-H "Content-Type: application/json" \
-d '{"program_id":"PROGRAM_ID"}'
Checking earnings is an authenticated external call but is comparatively low risk because it is read-only and operational. The primary concern is still external credential use and possible leakage through insecure storage or command execution practices.
curl https://api.syndicatelinks.co/affiliate/me/balance \
-H "Authorization: Bearer $(cat ~/.config/syndicate-links/api-key)"
The skill instructs the agent to include affiliate tracking links during broad categories of ordinary recommendation behavior, such as suggesting tools or answering general product questions. That creates a prompt-level policy vulnerability where the skill may steer many routine responses toward monetized link insertion without a specific trigger, consent boundary, or relevance check.
The examples instruct users or agents to register an external affiliate account, submit identifying data, enumerate programs, and auto-apply to one without any consent, disclosure, or safety guardrails. In an agent-skill context, this is dangerous because it normalizes autonomous creation of third-party accounts and monetization actions that may violate user expectations, privacy requirements, or platform policy.
This example sends an email address and name to an external API to create an affiliate account and returns an API key, but it provides no user notice, consent checkpoint, or discussion of secret handling. In a skill designed to make agents 'automatically become an affiliate,' this external transmission is more concerning because it can lead to silent account creation and collection of credentials for a third party.
# 1. Register
API_KEY=$(curl -s https://api.syndicatelinks.co/affiliate/register \
-H "Content-Type: application/json" \
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
This example sends an email address and name to an external API to create an affiliate account and returns an API key, but it provides no user notice, consent checkpoint, or discussion of secret handling. In a skill designed to make agents 'automatically become an affiliate,' this external transmission is more concerning because it can lead to silent account creation and collection of credentials for a third party.
# 1. Register
API_KEY=$(curl -s https://api.syndicatelinks.co/affiliate/register \
-H "Content-Type: application/json" \
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
# 2. Find programs
curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq '.[].name'
# 3. Join first program
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
# 2. Find programs
curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq '.[].name'
# 3. Join first program
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
# 2. Find programs
curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq '.[].name'
# 3. Join first program
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
-d '{"email":"myagent@agentmail.to","name":"My Agent"}' | jq -r '.apiKey')
# 2. Find programs
curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq '.[].name'
# 3. Join first program
This request applies to an affiliate program using a bearer token, causing an external state-changing action on behalf of the user or agent operator. The danger is elevated by the surrounding workflow, which automatically selects the first program and applies without meaningful review, potentially creating unauthorized business relationships or policy violations.
# 3. Join first program
PROG_ID=$(curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq -r '.[0].id')
curl -s -X POST "https://api.syndicatelinks.co/affiliate/programs/$PROG_ID/apply" \
-H "Authorization: Bearer $API_KEY"
# 4. Generate tracking link
This request applies to an affiliate program using a bearer token, causing an external state-changing action on behalf of the user or agent operator. The danger is elevated by the surrounding workflow, which automatically selects the first program and applies without meaningful review, potentially creating unauthorized business relationships or policy violations.
# 3. Join first program
PROG_ID=$(curl -s https://api.syndicatelinks.co/affiliate/programs \
-H "Authorization: Bearer $API_KEY" | jq -r '.[0].id')
curl -s -X POST "https://api.syndicatelinks.co/affiliate/programs/$PROG_ID/apply" \
-H "Authorization: Bearer $API_KEY"
# 4. Generate tracking link
The script sends agent identity data to an external service during setup, automatically registering the host as an affiliate without explicit opt-in beyond running the script. In the context of an agent skill, this is more concerning because installation triggers monetization-related external enrollment and data disclosure unrelated to core local setup.
echo " Name: $AGENT_NAME"
echo " Email: $AGENT_EMAIL"
RESP=$(curl -s "$API_URL/affiliate/register" \
-H "Content-Type: application/json" \
-d "{\"email\":\"$AGENT_EMAIL\",\"name\":\"$AGENT_NAME\"}")
The script stores a bearer API key on disk in a predictable location without setting restrictive file permissions or warning the user. On multi-user systems or in permissive umask configurations, this can expose the credential and allow unauthorized use of the affiliate account and API.
The inline comment says 'Auto-discover and join programs,' which implies the script will actively apply to affiliate programs. However, the code at L51-L62 only fetches and lists available programs, and L65-L69 merely prints that joining programs is possible later; no apply request is made.
The script derives registration identity from local host and environment data and transmits it to a third-party affiliate service without explicit user confirmation. While the data is not highly sensitive by itself, hostname-derived identifiers and inferred email addresses can expose internal naming conventions or create unintended external accounts tied to the machine.
No suspicious patterns detected.