TavernKeeper Scan Report

leandrojofre/SillyTavern-WI-Bulk-Mover

Commit 68ff211 Reviewed

No material or immediate-danger concern was identified in this review.

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 0 material 7 low

What this review found

No material or immediate-danger item was identified.

Minor cautions

zizmor reported archived-uses

Minor caution · high confidence

The release workflow uses an old GitHub Action that GitHub has archived. This is a maintenance concern for the project's own release process but does not affect users who install the extension.

Technical evidence

Scanner reason: zizmor matched workflow-security rule archived-uses. The match applies to this repository.

Contextual assessment: The zizmor finding flags actions/create-release@v1 at line 70 as an action from an archived GitHub repository. This workflow is CI/CD automation that runs only on merged pull requests to the release branch and is not part of the shipped extension. Using an archived action is a maintenance and supply-chain hygiene issue for the repository owner, but it does not introduce runtime behavior on user machines, does not exfiltrate credentials, and does not affect extension users. The workflow uses only the standard GITHUB_TOKEN with expected permissions for creating releases.

Impact: none · Exploitability: unlikely

Developer action: Replace actions/create-release@v1 with a maintained alternative such as softprops/action-gh-release or the GitHub CLI gh release create command to avoid relying on archived tooling.

Scanner
zizmor 1.28.0
Rule
archived-uses
File role
tooling
Source
.github/workflows/release.yml:70
Deterministic technical evidence (3)
  • zizmor reported artipacked · zizmor 1.28.0

    The code has a known weakness, though this scan does not show that anyone can exploit it here.

    Policy reason: zizmor-known-workflow-rule · Execution scope: automation

    Source: .github/workflows/release.yml:21-24

  • zizmor reported unpinned-uses · zizmor 1.28.0

    The code has a known weakness, though this scan does not show that anyone can exploit it here.

    Policy reason: zizmor-known-workflow-rule · Execution scope: automation

    Source: .github/workflows/release.yml:70

  • zizmor reported unpinned-uses · zizmor 1.28.0

    The code has a known weakness, though this scan does not show that anyone can exploit it here.

    Policy reason: zizmor-known-workflow-rule · Execution scope: automation

    Source: .github/workflows/release.yml:22

Contextual expected matches (2)

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The code loads a local sound file and plays it through the browser's standard audio player as part of a joke animation. It only loads files from the extension's own folder and does not download or execute anything from the internet.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner correlated fetch() with audioCtx.decodeAudioData() as a download-to-execution pattern. In reality, fetch() retrieves local MP3 files from the extension's own assets directory using URLs constructed from hardcoded arrays (daGnomes, daGnomesSounds) and the extensionFolderPath constant. decodeAudioData is a standard Web Audio API method that decodes audio binary data into a playable AudioBuffer; it does not execute arbitrary code. The URLs are fully determined by internal constants with no attacker-controlled input. Additionally, the initTheChosenGnomer call is commented out in the extension's initialization code, so this feature is not currently active. This is a benign easter-egg animation feature.

Impact: none · Exploitability: unlikely

Developer action: No change required for security. The feature is currently disabled; if re-enabled, ensure audio and image URLs remain derived from hardcoded constants as they are now.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
source/js/getGnomedBozo.js:26-74

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The extension fetches HTML templates and lorebook data from the local SillyTavern server, which is normal for an extension. The code does not download anything from external sites or run untrusted code.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner correlated network retrieval primitives with a code execution sink in the same file. Examining the actual data flow: fetch('/api/settings/get') calls the local SillyTavern API to retrieve world info names, and $.get() retrieves HTML templates from the extension's own local folder path. Neither call reaches an external or attacker-controlled endpoint. The likely execution sink is element.innerHTML assignment in createElement, which is used for building extension UI elements from extension-controlled data, not from untrusted external input. All network destinations are same-origin local SillyTavern APIs or local extension asset paths. This is standard, expected SillyTavern extension behavior matching the project's stated purpose of managing world info entries.

Impact: none · Exploitability: unlikely

Developer action: No change required for security. If desired, sanitize or avoid innerHTML assignment in createElement when handling dynamic values, but no demonstrated risk path exists.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
index.js:102-236

Related contextual observations

createElement uses innerHTML assignment for DOM construction

low risk · medium confidence

A helper function can write raw HTML into page elements. Currently it is only used with extension-controlled content, but if lorebook entry text were ever passed through it, that could become a problem.

Technical assessment

The createElement function accepts an options.innerHTML parameter and assigns it directly to element.innerHTML. While current call sites use this for extension-controlled UI construction, if any future code path passes user-controlled lorebook entry content through this function, it could create a self-XSS vector. No such path is demonstrated in the supplied code.

Impact: low · Exploitability: unlikely

Developer action: Prefer textContent or template-based rendering over innerHTML when the content originates from user-editable lorebook entries to eliminate any future XSS risk.

Sources:

Coverage and limitations

JavaScript coverage

Unresolved JavaScript stages

Tools

Limitations

Technical scan identity