T09 · Insecure Skill Coding Practices
- Location
scripts/freedcamp.mjs:174- Finding
Session Token and Workspace Metadata Stored Without Explicit Restrictive Permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims for Freedcamp, but it automatically stores reusable session credentials locally in a way that needs review before installation.
Review before installing on shared or less-trusted machines. Use a dedicated low-privilege Freedcamp API credential if possible, avoid commands that print stored config values, and remove or protect the local session cache when rotating credentials or disabling the skill.
scripts/freedcamp.mjs:174Session Token and Workspace Metadata Stored Without Explicit Restrictive Permissions
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
*
* Usage: node skill/scripts/demo.mjs
*
* Loads .env from project root automatically if env vars aren't set.
*/
import { execFileSync } from "node:child_process";
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
*
* Usage: node skill/scripts/demo.mjs
*
* Loads .env from project root automatically if env vars aren't set.
*/
import { execFileSync } from "node:child_process";
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
// Load .env if needed
function loadEnv() {
if (process.env.FREEDCAMP_API_KEY && process.env.FREEDCAMP_API_SECRET) return;
const envFile = path.join(ROOT, ".env");
if (!fs.existsSync(envFile)) return;
for (const line of fs.readFileSync(envFile, "utf-8").split("\n")) {
const match = line.match(/^(?:export\s+)?(\w+)=(.+)$/);
The README instructs users to run config inspection commands that can print stored skill configuration values, including the API key, without warning that this may expose secrets in terminal history, screen recordings, shared shells, or logs. In this skill’s context, the credential material grants direct access to a third-party project-management account, so accidental disclosure can lead to unauthorized API use.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
node scripts/freedcamp.mjs task <task_id>
### 5) Create a task
```bash
node scripts/freedcamp.mjs create-task --project <project_id> --title "New task"
The skill advertises user-invocable functionality that uses both environment-provided secrets and outbound network access, but it does not declare any explicit tool scope such as permissions or allowed-tools. That weakens policy enforcement and reviewability: an agent may invoke a capability-bearing skill without a clear, machine-readable boundary around secret access and external API calls.
The documentation instructs users to configure and store API credentials and then perform read/write API operations, but it does not provide safety guidance around secret handling, least-privilege use, output redaction, or the fact that commands can modify remote account data. In an agent context, missing warnings increase the chance of accidental credential exposure, unsafe persistence of secrets, or unintended task/comment changes in a live workspace.
The skill persists sensitive session material, including a Freedcamp API session token and associated user data, to a predictable local file path in the user's home directory. Because the file is written without explicit permission controls, encryption, or user disclosure, other local users, processes, or later agent runs may access reusable credentials and account metadata if filesystem permissions are weak or the host is shared.
Detected: suspicious.env_credential_access, suspicious.potential_exfiltration