<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 08 Oct 2026 10:01:08 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-106102</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-106102</link>
      <description>&lt;p&gt;Quasar Framework is a framework for building high-performance Vue.js user interfaces. Prior to 2.22.0, the SSR-only getHead() serializer in ui/src/plugins/meta/Meta.js used getAttr() to interpolate values supplied through useMeta() into title, meta, link, and script markup without HTML text or quoted-attribute encoding. injectServerMeta() appended that output to the raw server-rendered response. An attacker who can influence dynamic page metadata, such as a post title, product name, excerpt, or display name, can terminate the intended HTML context and inject executable markup before hydration. The client-side apply() path is not affected because it uses DOM APIs that encode attributes. This issue is fixed in version 2.22.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Quasar Framework is a framework for building high-performance Vue.js user interfaces. Prior to 2.22.0, the SSR-only getHead() serializer in ui/src/plugins/meta/Meta.js used getAttr() to interpolate values supplied through useMeta() into title, meta, link, and script markup without HTML text or quoted-attribute encoding. injectServerMeta() appended that output to the raw server-rendered response. An attacker who can influence dynamic page metadata, such as a post title, product name, excerpt, or display name, can terminate the intended HTML context and inject executable markup before hydration. The client-side apply() path is not affected because it uses DOM APIs that encode attributes. This issue is fixed in version 2.22.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-106102</guid>
    </item>
    <item>
      <title>GHSA-pq96-jpmf-w254 — Quasar Framework: Stored/Reflected XSS via unescaped SSR meta tag rendering in getHead()</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-pq96-jpmf-w254</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: quasar&lt;/p&gt;
&lt;p&gt;## Vulnerability Details&lt;/p&gt;
&lt;p&gt;**File**: `ui/src/utils/meta/Meta.js` — actually `ui/src/plugins/meta/Meta.js` (lines 149-176: `getAttr()` and `getHead()`)
**Sink**: `injectServerMeta()` (same file) → `ctx.headTags += getHead(data)`, interpolated verbatim into the raw HTTP response `&amp;lt;head&amp;gt;` by the production SSR template (`app-vite/templates/entry/ssr-prod-webserver.js` + `app-vite/lib/plugins/vite.html.js`)
**Entry point**: the public `useMeta()` composable (`ui/src/composables/use-meta/use-meta.js`) — the single documented way apps set page title/meta/link/script tags&lt;/p&gt;
&lt;p&gt;### Root Cause
`getHead()` is Quasar&amp;#39;s SSR-only serializer that turns the meta/link/script/title data collected from every `useMeta()` call into a literal HTML string, using plain template-literal interpolation with **zero HTML-entity escaping and zero attribute-quote escaping**:&lt;/p&gt;
&lt;p&gt;```js
function getAttr(seed) {
  return att =&amp;gt; {
    const val = seed[att]
    return att + (val !== true &amp;amp;&amp;amp; val !== void 0 ? `=&amp;#34;${val}&amp;#34;` : &amp;#39;&amp;#39;)
  }
}&lt;/p&gt;
&lt;p&gt;function getHead(meta) {
  let output = &amp;#39;&amp;#39;
  if (meta.title) {
    output += `&amp;lt;title&amp;gt;${meta.title}&amp;lt;/title&amp;gt;`
  }
  ...
}
```&lt;/p&gt;
&lt;p&gt;Contrast this with the client-side equivalent, `apply()` (same file, used only in the browser post-hydration), which builds the same tags via `document.createElement(...)` + `tag.setAttribute(att, val)` — the browser DOM API automatically escapes attribute values, so **the client-side path is not vulnerable**. `getHead()` is a separate, parallel implementation for th…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: quasar&lt;/p&gt;
&lt;p&gt;## Vulnerability Details&lt;/p&gt;
&lt;p&gt;**File**: `ui/src/utils/meta/Meta.js` — actually `ui/src/plugins/meta/Meta.js` (lines 149-176: `getAttr()` and `getHead()`)
**Sink**: `injectServerMeta()` (same file) → `ctx.headTags += getHead(data)`, interpolated verbatim into the raw HTTP response `&amp;lt;head&amp;gt;` by the production SSR template (`app-vite/templates/entry/ssr-prod-webserver.js` + `app-vite/lib/plugins/vite.html.js`)
**Entry point**: the public `useMeta()` composable (`ui/src/composables/use-meta/use-meta.js`) — the single documented way apps set page title/meta/link/script tags&lt;/p&gt;
&lt;p&gt;### Root Cause
`getHead()` is Quasar&amp;#39;s SSR-only serializer that turns the meta/link/script/title data collected from every `useMeta()` call into a literal HTML string, using plain template-literal interpolation with **zero HTML-entity escaping and zero attribute-quote escaping**:&lt;/p&gt;
&lt;p&gt;```js
function getAttr(seed) {
  return att =&amp;gt; {
    const val = seed[att]
    return att + (val !== true &amp;amp;&amp;amp; val !== void 0 ? `=&amp;#34;${val}&amp;#34;` : &amp;#39;&amp;#39;)
  }
}&lt;/p&gt;
&lt;p&gt;function getHead(meta) {
  let output = &amp;#39;&amp;#39;
  if (meta.title) {
    output += `&amp;lt;title&amp;gt;${meta.title}&amp;lt;/title&amp;gt;`
  }
  ...
}
```&lt;/p&gt;
&lt;p&gt;Contrast this with the client-side equivalent, `apply()` (same file, used only in the browser post-hydration), which builds the same tags via `document.createElement(...)` + `tag.setAttribute(att, val)` — the browser DOM API automatically escapes attribute values, so **the client-side path is not vulnerable**. `getHead()` is a separate, parallel implementation for th…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-pq96-jpmf-w254</guid>
    </item>
  </channel>
</rss>
