TavernKeeper Scan Report

luisbrandao/SillyTavern-Tracker

Commit 657b8a8 Reviewed

3 material concerns identified.

This advisory report describes what the named tools and review process found at one exact commit. Unknown or unobserved behavior may still exist.

0 immediate danger 3 material 4 low

What this review found

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Material concern · high confidence

The extension lets users type custom JavaScript into a settings box for tracker display, and runs it using new Function. This JavaScript is also included in exported and imported preset files. If someone shares a preset file containing malicious JavaScript and a user imports and selects it, the malicious code runs in their browser with access to their SillyTavern data and API keys. Users would not expect a preset file to contain executable code.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Detailed technical wording was omitted by the public report safety filter.

Impact: high · Exploitability: plausible

Developer action: Review the cited evidence and confirm the intended behavior.

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
src/settings/settings.js:742

mesTrackerJavascript included in exportable and importable presets

material risk · high confidence

Preset files exported by this extension include the custom JavaScript field. If a user imports a preset from someone else, that JavaScript runs when they select the preset, creating a way to sneak malicious code into a file users expect to contain only prompt templates.

Technical assessment

getCurrentPresetSettings includes mesTrackerJavascript in the preset object that gets exported to JSON files and imported from JSON files. This means executable JavaScript is bundled into shareable preset files, and importing a preset from an untrusted source can introduce arbitrary code that executes when the preset is selected.

Impact: high · Exploitability: plausible

Developer action: Do not include mesTrackerJavascript in preset export/import, or strip and warn about executable code when importing presets from files.

Sources:

Preset selection triggers JavaScript execution from imported data

material risk · high confidence

When a user picks an imported preset from the dropdown, the extension runs the JavaScript that came with it. This is the step that turns an imported file into executed code.

Technical assessment

onPresetSelectChange calls Object.assign(extensionSettings, presetSettings) which copies the imported mesTrackerJavascript into the active settings, then calls setSettingsInitialValues which calls processTrackerJavascript, triggering the new Function execution of the imported code.

Impact: high · Exploitability: plausible

Developer action: none

Sources:

Contextual expected matches (2)

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

The scanner flagged this file as potentially obfuscated, but the actual code is plain, readable JavaScript with clear comments. It does what the extension says it does: generates trackers using a separate connection. No hidden or obfuscated behavior was found.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.obfuscated-code. The match applies to this repository.

Contextual assessment: The JS-X-Ray obfuscated-code signal (scanner_confidence=low) is a false positive. The supplied source for file is fully readable, well-commented production JavaScript. It imports SillyTavern core modules, manages independent connection profile requests via ctx.ConnectionManagerRequestService.sendRequest, builds prompt templates with regex-based placeholder substitution, and parses tracker responses. No minified, encoded, packed, or obfuscated code is present. All data flows remain within SillyTavern's extension context and route to the user-configured connection profile. No external destinations, concealed execution, credential access, or persistence beyond saving tracker data to chat messages are observed. The temporary preset override on the live profile (lines 145-152) is restored in a finally block, matching the stated purpose of non-interfering independent generation.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.obfuscated-code
File role
production
Source
src/generation.js:1

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

The scanner flagged this file as potentially obfuscated, but the code is plain and readable. It manages the extension's settings, UI, and preset dropdowns. No hidden or obfuscated behavior was found.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.obfuscated-code. The match applies to this repository.

Contextual assessment: The JS-X-Ray obfuscated-code signal (scanner_confidence=low) is a false positive. The supplied source for file is fully readable, well-commented JavaScript handling settings initialization, migration, UI loading, event listener registration, connection profile dropdowns, completion preset categorization, and preset import/export. No minified, encoded, packed, or obfuscated code is present. All operations use SillyTavern's standard saveSettingsDebounced and jQuery UI patterns. The settings data stays within the extension's configuration scope and does not access credentials, make external network calls, or perform concealed execution.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.obfuscated-code
File role
production
Source
src/settings/settings.js:1

Related contextual observations

Readable generation request code with proper preset restoration

low risk · high confidence

The generation code is straightforward and readable. It sends prompts to the model using the user's chosen connection profile and restores any temporary changes afterward.

Technical assessment

The sendIndependentGenerationRequest function temporarily overrides the connection profile's preset for a single request and restores it in a finally block. This matches the README's stated feature of using a dedicated completion preset without interfering with the main connection. No credentials are read or transmitted beyond what SillyTavern's own ConnectionManagerRequestService handles.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Readable settings initialization and UI management code

low risk · high confidence

The settings code is straightforward. It handles loading the settings panel, managing presets, and updating dropdown menus. Nothing hidden or suspicious.

Technical assessment

The initSettings function performs standard settings migration and merge logic. The loadSettingsUI function fetches HTML from the extension folder and appends it to the SillyTavern settings panel. Both are standard SillyTavern extension patterns with no obfuscation or hidden behavior.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Coverage and limitations

JavaScript coverage

Tools

Limitations

Technical scan identity