Back to skill

Security audit

Dashboard Manager

Security checks for vulnerabilities and agentic risk

Overview

This skill is a narrow local dashboard helper that reads and writes one configured data.json file, with some data-integrity and install hygiene issues but no evidence of deception, exfiltration, or destructive behavior.

Install only if you want this skill to modify the configured Jarvis dashboard data file automatically. Consider backing up data.json, disabling or controlling autosync if available, and removing the unnecessary fs/path dependency declarations before use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
index.js:31
Finding
Non-Atomic Database Updates Can Cause Data Loss or Corruption<![CDATA[ ## Vulnerability Details **File Location**: `index.js`, lines 19–44; affected read-modify-write operations also occur at lines 57–63, 70–78, 85–96, 103–112, 119–136, 143–151, and 158–167 **Vulnerability Type**: Non-atomic file updates and concurrent write race condition **Risk Level**: Medium ### Vulnerable Code ```javascript async function loadDatabase() { try { const data = await fs.readFile(DATA_FILE_PATH, 'utf8'); return JSON.parse(data); } catch (error) { console.error('❌ Erreur lors de la lecture de data.json:', error.message); throw error; } } /** * Sauvegarde la base de données dans data.json */ async function saveDatabase(db) { try { await fs.writeFile( DATA_FILE_PATH, JSON.stringify(db, null, 2), 'utf8' ); console.log('✅ Base de données sauvegardée'); return true; } catch (error) { console.error('❌ Erreur lors de la sauvegarde de data.json:', error.message); throw error; } } ``` A representative read-modify-write operation is: ```javascript async function processNote(noteId) { const db = await loadDatabase(); const note = db.quick_notes?.find(n => n.id === noteId); if (note) { note.status = 'processed'; await saveDatabase(db); console.log(`✅ Note #${noteId} marquée comme traitée`); return true; } console.warn(`⚠️ Note #${noteId} introuvable`); return false; } ``` ### Technical Analysis Each mutation loads the entire JSON database, changes an in-memory copy, and overwrites the original file. There is no mutex, serialized write queue, revision check, file lock, transactional database mechanism, or atomic temporary-file replacement. If two exported mutation functions execute concurrently, both can read the same initial version. Each then writes a different modified copy, and the final writer silently discards the first writer's changes ...[truncated 2036 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Serialize all mutations through a process-wide write queue or mutex so only one read-modify-write transaction can execute at a time. 2. Consolidate mutations into a helper that acquires the lock, reads the latest state, validates it, applies one update, and commits it before releasing the lock. 3. Write serialized content to a uniquely named temporary file in the same directory as `data.json`. 4. Flush the temporary file when durability is required, then atomically rename it over the destination. 5. Apply restrictive file permissions to both the destination and temporary files. 6. Add a revision number or optimistic concurrency check to detect stale updates rather than silently overwriting newer state. 7. Validate the full database against a defined schema before committing it. 8. Maintain a known-good backup and implement recovery handling for malformed JSON. 9. If multiple processes can access the file, use an inter-process locking mechanism or replace the JSON file with a transactional datastore such as SQLite. 10. Add concurrency and interruption tests that verify simultaneous updates are preserved and incomplete writes do not damage the active database. ]]>

T08 · Insecure Dependencies

Note
Location
skill.json:7
Finding
Unnecessary Registry Dependencies for Node.js Core Modules<![CDATA[ ## Vulnerability Details **File Location**: `skill.json`, lines 7–10 **Vulnerability Type**: Unnecessary third-party dependency and supply-chain exposure **Risk Level**: Low ### Vulnerable Code ```json "dependencies": { "fs": "^0.0.1-security", "path": "^0.0.1-security" } ``` ### Technical Analysis `fs` and `path` are built-in Node.js modules and do not require installation from a package registry. Declaring registry packages with these names unnecessarily introduces external package resolution into the installation process. The implementation uses: ```javascript const fs = require('fs').promises; const path = require('path'); ``` These imports resolve to Node.js core modules during normal runtime. Therefore, the reviewed code does not demonstrate execution of a malicious package. Nevertheless, if a skill installer interprets the metadata dependency section as an installation manifest, it may download unnecessary external artifacts. This increases the supply-chain attack surface and creates avoidable exposure to registry compromise, unsafe mirrors, dependency substitution, or future package changes. The declared `path` module is also unused by the implementation, making that dependency entirely unnecessary. ### Attack Path 1. A skill installation or build tool reads the `dependencies` object from `skill.json`. 2. The tool resolves `fs` and `path` through its configured package registry or mirror. 3. External packages are downloaded even though the Node.js runtime already provides both modules. 4. If the registry, mirror, lock resolution, or package version is compromised, attacker-controlled package lifecycle code or package content may enter the build or installation environment. 5. The resulting compromise would depend on how the surrounding installer handles metadata dependencies and package lifecycle scripts; such execution is not shown in the reviewed project itself. ### Impact Assessment No direct compromise is established by th ...[truncated 510 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove both `fs` and `path` from the dependency declaration because they are Node.js core modules. 2. Remove the unused `path` import from `index.js` unless future code requires it. 3. Keep the runtime import for the filesystem module as `require('fs')`; no registry dependency is needed. 4. If third-party dependencies are added later, use an appropriate package manifest and lockfile with exact, reviewed versions. 5. Disable dependency lifecycle scripts where operationally feasible and verify package integrity during installation. 6. Configure automated dependency scanning and ensure installers use a trusted registry. 7. Document the minimum supported Node.js version so the availability of required core APIs is explicit. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (7)

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The documentation states that pending notes can be retrieved and marked as processed, but it does not clearly warn users that notes may be automatically transitioned out of the pending state. This can lead to loss of visibility, skipped review, or accidental destruction of workflow state if the automation processes notes unexpectedly.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill explicitly describes a silent background loop that reads notes and writes to `data.json` every few seconds without conversational interaction or an explicit user-facing warning. Autonomous background modification of persisted state can surprise users, hide unintended actions, and make it easier for harmful or erroneous updates to occur without informed consent.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
The skill's operational description and instructions are presented in French, which effectively forces a specific language for users reading the documentation. Under the policy, language constraints should either be optional for the user or explicitly justified as region- or audience-specific.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
Le code formate explicitement les dates avec `toLocaleString('fr-FR', ...)`, ce qui impose une langue/locale déterminée. La politique demande d'éviter de forcer une langue sans choix utilisateur ou justification clairement documentée, et aucune option d'opt-in ou justification régionale n'apparaît ici.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
La mise à jour du statut système utilise aussi `toLocaleString('fr-FR', ...)`, ce qui impose le français pour les sorties temporelles. Aucune possibilité de sélection de langue/locale ni justification métier explicite n'est fournie dans le fichier.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The manifest description is written only in French ("Gère les interactions avec le dashboard Jarvis"), which indicates a language-specific presentation without any stated user choice or region-specific justification. This can violate language/locale policy when the skill does not explicitly offer multilingual support or explain the locale constraint.

Natural-Language Policy Violations

Low
Confidence
96% confidence
Finding
This JavaScript test file emits all user-facing status and error messages in French, such as the initialization and test-progress logs. The file does not offer any language selection or explain a justified French-only locale requirement, which is a natural-language locale policy concern.

Static analysis

No suspicious patterns detected.