T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/wine-import.js:123- Finding
Arbitrary Local-File Disclosure Through Unrestricted Label Paths
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a coherent wine archive, but its import/export and Telegram label paths can expose arbitrary local files after a crafted import.
Review before installing. Do not import wine archives from untrusted sources, and avoid using --include-images or Telegram label sending until image paths are constrained to the label directory. If enabling LLM classification, assume message text may go to a model provider and be stored locally in an interaction log. Protect exported archive files because they can contain personal history and embedded label images.
scripts/wine-import.js:123Arbitrary Local-File Disclosure Through Unrestricted Label Paths
scripts/wine-import.js:123Unbounded Base64 Image Decoding Enables Memory and Disk Exhaustion
shared/interaction-store.js:105Full LLM Prompts and Responses Are Persisted Without Retention Controls
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
npm install
npm run wine:init
cp .env.example .env
# Edit .env and add your ANTHROPIC_API_KEY if desired
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive npm install npm run wine:init cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive npm install npm run wine:init cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive
npm install
npm run wine:init
cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
```
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive
npm install
npm run wine:init
cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
```
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive
npm install
npm run wine:init
cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
```
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive
npm install
npm run wine:init
cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
```
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cd skills/wine-archive
npm install
npm run wine:init
cp .env.example .env # add ANTHROPIC_API_KEY for LLM features
```
Data is stored in `data/wine/wine.sqlite3` and label images in `data/wine/labels/`.
Referenced artifact was not completely inspected
and adapt `lib/wine-store.js` `normalizeImageInPlace` for cross-platform resizing).
Referenced artifact was not completely inspected
- **Node.js >= 22** required (`node:sqlite` built-in used in `shared/interaction-store.js`).
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
node scripts/wine-service.js init
# 5. Copy .env.example → .env if not already present
if [[ ! -f ".env" ]]; then
cp .env.example .env
echo ""
echo "Created .env from .env.example — add your ANTHROPIC_API_KEY if you want LLM features."
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
let smokeTestPromise = null;
let cachedClient = null;
function parseDotEnv(dotEnvPath = path.resolve(process.cwd(), '.env')) {
if (!fs.existsSync(dotEnvPath)) return {};
const raw = fs.readFileSync(dotEnvPath, 'utf8');
const result = {};
The Telegram bridge section shows how to send wine information and labels to Telegram chats but does not warn users that message contents and attached label images leave the local system and are shared with Telegram recipients and infrastructure. Because the skill stores personal tasting history and archived label images, this omission can lead to unintentional disclosure of private data.
The README explicitly documents optional LLM intent classification but does not warn that user-provided wine notes and recall/chat text may be transmitted to a third-party model provider such as Anthropic or OpenAI. This can expose personal consumption history, purchase locations, and label-derived text to external services without informed user consent, creating a privacy and compliance risk.
The export feature can produce a portable archive of personal tasting history and, with --include-images, embed label photos as base64. The skill documents the mechanics but does not clearly warn that this increases the sensitivity, portability, and accidental sharing risk of the resulting file.
The Telegram bridge sends messages and media through an external messaging channel, which changes the trust boundary and may disclose archived label images or related content to third-party infrastructure or unintended recipients. The documentation describes how to send media but does not prominently warn users about the external transmission and recipient targeting risks.
The function sends raw user message content to an external LLM service via runner(prompt, ...), and the prompt explicitly embeds the full message text. Even though this is for intent classification, the code provides no indication of consent, minimization, redaction, or disclosure controls, so sensitive user content could be transmitted off-system unexpectedly.
The package description at L04 frames the skill as a local archive and recall tool for wine data. The additional scripts for a Telegram bridge and sending labels over Telegram at L16-L17 introduce external messaging/integration capability that is not justified by that stated purpose and goes beyond an obvious implementation detail of storage or natural-language recall.
The remove command performs a destructive delete via deleteWineEntry(Number(args.id)) and immediately reports success, but there is no confirmation prompt, cautionary message, or other user disclosure around the irreversible action. For a code file, destructive operations should include some visible warning unless the warning is provided elsewhere in accompanying markdown, which is not present in this file.
This code persistently logs full LLM prompts, responses, and errors to a local SQLite database, which can capture sensitive user inputs, model outputs, secrets, proprietary data, or personal information. Although some secret patterns are redacted, the redaction is incomplete and best-effort only, so sensitive data may still be stored without user awareness or consent, increasing privacy and data exposure risk if the host is compromised or logs are accessed by other local users/processes.
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.
"wine:import": "node scripts/wine-import.js"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.55.0",
"better-sqlite3": "^11.8.1"
},
"engines": {
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.
},
"dependencies": {
"@anthropic-ai/sdk": "^0.55.0",
"better-sqlite3": "^11.8.1"
},
"engines": {
"node": ">=22"
No suspicious patterns detected.