T03 · Remote Payload Retrieval and Execution
- Location
references/setup.md:51- Finding
Mutable Remote Installer Is Downloaded and Executed Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Auth0 Express skill is purpose-aligned, but its setup and examples include risky authentication practices users should review before installing.
Review this skill before installing or running its setup. Prefer installing the Auth0 CLI through a pinned, verified package manager or release, do not run the downloaded installer as administrator unless necessary, confirm any .env/.env.local writes, and avoid copying examples that return raw tokens or render user claims without escaping.
references/setup.md:51Mutable Remote Installer Is Downloaded and Executed Without Integrity Verification
references/api.md:71Authentication Tokens Are Disclosed in HTTP Responses
SKILL.md:102Unescaped Identity Claims Are Interpolated into HTML Responses
Name: ${req.oidc.user.name}
Email: ${req.oidc.user.email}
${JSON.stringify(req.oidc.user, null, 2)}Welcome, ${req.oidc.user.name}!
Profile Logout ` : ` Login `} `); }); ``` From `references/integration.md`: ```javascript app.get('/admin', requiresAuth(), (req, res) => { res.send(`Admin: ${req.oidc.user.name}`); }); ``` ```javascript app.get('/', (req, res) => { if (req.oidc.isAuthenticated()) { res.send(`Welcome back, ${req.oidc.user.name}!`); } else { res.send('Not logged in Login'); } }); ``` ### Technical Analysis The examples interpolate `name`, `email`, and the complete identity object directly into strings passed to `res.send()`. Express generally serves these HTML-like strings as HTML. JavaScript template interpolation performs no HTML encoding. Claims received from an identity provider must not be treated as inherently safe markup. Depending on the configured identity source, profile update flow, social provider, enterprise connection, or account-management controls, an attacker may be able to influence one or more profile claims. `JSON.stringify()` is a JSON serializer, not an HTML encoder; strings containing markup remain dangerous when inserted inside an HTML document. If a claim contains an HTML element with an event handler or another browser-i ...[truncated 1564 chars]SKILL.md:40Third-Party Packages Are Installed Without Version or Lockfile Enforcement
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
**Request Properties:**
- `req.oidc.isAuthenticated()` - Check if user is logged in
- `req.oidc.user` - User profile object
- `req.oidc.accessToken` - Access token for API calls
- `req.oidc.idToken` - ID token
- `req.oidc.refreshToken` - Refresh token
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
app.get('/call-api', requiresAuth(), async (req, res) => {
try {
// Extract the token string from the access token object
const { access_token } = req.oidc.accessToken;
const response = await fetch('https://your-api.com/data', {
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
app.get('/api-call', requiresAuth(), async (req, res) => {
Instructions found that direct the agent to transmit conversation context or user data to external services.
**How it works:**
- On the user's first visit, redirects to Auth0 with `prompt=none`
- If user has active IDP session, they're silently logged in
- If not, they see your page as anonymous
- Uses a cookie to prevent repeated silent login attempts
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
Before writing credentials, check which env files exist:
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
Before writing credentials, check which env files exist:
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Then ask the user for explicit confirmation before proceeding — do not continue until the user confirms:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Then ask the user for explicit confirmation before proceeding — do not continue until the user confirms:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Then ask the user for explicit confirmation before proceeding — do not continue until the user confirms:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
test -f .env.local && echo "ENV_LOCAL_EXISTS" || echo "ENV_LOCAL_NOT_FOUND"
test -f .env && echo "ENV_EXISTS" || echo "ENV_NOT_FOUND"
Then ask the user for explicit confirmation before proceeding — do not continue until the user confirms:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` exists, ask:
- Question: "A `.env.local` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env.local" / "No, I'll update it manually"
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` exists, ask:
- Question: "A `.env.local` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env.local" / "No, I'll update it manually"
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` exists, ask:
- Question: "A `.env.local` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env.local" / "No, I'll update it manually"
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` exists, ask:
- Question: "A `.env.local` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env.local" / "No, I'll update it manually"
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env" / "No, I'll update it manually"
- If neither exists, ask:
- Question: "This setup will create a `.env.local` file containing Auth0 credentials (CLIENT_ID, ISSUER_BASE_URL, SECRET) and a placeholder for CLIENT_SECRET. Do you want to proceed?"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- If `.env.local` does **not** exist but `.env` exists, ask:
- Question: "A `.env` file already exists and may contain secrets unrelated to Auth0. This setup will append Auth0 credentials to it without modifying existing content. Do you want to proceed?"
- Options: "Yes, append to existing .env" / "No, I'll update it manually"
- If neither exists, ask:
- Question: "This setup will create a `.env.local` file containing Auth0 credentials (CLIENT_ID, ISSUER_BASE_URL, SECRET) and a placeholder for CLIENT_SECRET. Do you want to proceed?"
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
curl -sSfL https://raw.githubusercontent.com/auth0/auth0-cli/main/install.sh -o /tmp/auth0-install.sh
echo "⚠️ Review the install script at /tmp/auth0-install.sh before running"
sh /tmp/auth0-install.sh -b /usr/local/bin
rm /tmp/auth0-install.sh
fi
fi
The example returns the full user object and the raw ID token from a route response. While the route is authenticated, exposing tokens and unnecessary identity attributes to the browser or API consumers increases the chance of token leakage via frontend code, logs, browser extensions, or downstream integrations, and encourages insecure copy-paste use by developers.
The example forwards access_token in an Authorization header to https://your-api.com/data, which is a privacy- and security-relevant network operation. The surrounding documentation explains how to do it but does not explicitly warn that tokens should only be sent to trusted endpoints over HTTPS and scoped minimally.
The example exposes req.oidc.user, idToken, and accessToken directly in an HTTP response. Even on an authenticated route, returning raw tokens and full identity objects to the browser or downstream clients can leak bearer credentials and sensitive claims, enabling token theft, replay, or unintended disclosure through logs, browser storage, or client-side code.
The document explicitly requires user confirmation before any env-file write, but the provided automation script itself performs unconditional writes once run. In an agent-skill context, operators may treat the script as approved automation and execute it directly, bypassing the stated safeguard and modifying sensitive configuration files without a live consent gate.
The guide says the downloaded install script should be reviewed before execution, but the next command immediately executes that remote script and then deletes it. This undermines the safety instruction and creates a supply-chain risk: a compromised upstream script would be run locally with little opportunity for inspection.
Detected: suspicious.exposed_secret_literal