<?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>Wed, 30 Sep 2026 01:46:59 +0000</lastBuildDate>
    <item>
      <title>GHSA-xhpv-hc6g-r9c6 — Handlebars.js has JavaScript Injection via AST Type Confusion when passing an object as dynamic partial</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-xhpv-hc6g-r9c6</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: handlebars&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;A crafted object placed in the template context can bypass all conditional guards in `resolvePartial()` and cause `invokePartial()` to return `undefined`. The Handlebars runtime then treats the unresolved partial as a source that needs to be compiled, passing the crafted object to `env.compile()`. Because the object is a valid Handlebars AST containing injected code, the generated JavaScript executes arbitrary commands on the server. The attack requires the adversary to control a value that can be returned by a dynamic partial lookup.&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The vulnerable code path spans two functions in `lib/handlebars/runtime.js`:&lt;/p&gt;
&lt;p&gt;**`resolvePartial()`:** A crafted object with `call: true` satisfies the first branch condition (`partial.call`) and causes an early return of the original object itself, because none of the remaining conditionals (string check, `options.partials` lookup, etc.) match a plain object. The function returns the crafted object as-is.&lt;/p&gt;
&lt;p&gt;**`invokePartial()`:** When `resolvePartial` returns a non-function object, `invokePartial` produces `undefined`. The runtime interprets `undefined` as &amp;#34;partial not yet compiled&amp;#34; and calls `env.compile(partial, ...)` where `partial` is the crafted AST object. The JavaScript code generator processes the AST and emits JavaScript containing the injected payload, which is then evaluated.&lt;/p&gt;
&lt;p&gt;**Minimum prerequisites:**
1. The template uses a dynamic partial lookup: `{{&amp;gt; (lookup . &amp;#34;key&amp;#34;)}}` or equivalent.
2. The adversary…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: handlebars&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;A crafted object placed in the template context can bypass all conditional guards in `resolvePartial()` and cause `invokePartial()` to return `undefined`. The Handlebars runtime then treats the unresolved partial as a source that needs to be compiled, passing the crafted object to `env.compile()`. Because the object is a valid Handlebars AST containing injected code, the generated JavaScript executes arbitrary commands on the server. The attack requires the adversary to control a value that can be returned by a dynamic partial lookup.&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The vulnerable code path spans two functions in `lib/handlebars/runtime.js`:&lt;/p&gt;
&lt;p&gt;**`resolvePartial()`:** A crafted object with `call: true` satisfies the first branch condition (`partial.call`) and causes an early return of the original object itself, because none of the remaining conditionals (string check, `options.partials` lookup, etc.) match a plain object. The function returns the crafted object as-is.&lt;/p&gt;
&lt;p&gt;**`invokePartial()`:** When `resolvePartial` returns a non-function object, `invokePartial` produces `undefined`. The runtime interprets `undefined` as &amp;#34;partial not yet compiled&amp;#34; and calls `env.compile(partial, ...)` where `partial` is the crafted AST object. The JavaScript code generator processes the AST and emits JavaScript containing the injected payload, which is then evaluated.&lt;/p&gt;
&lt;p&gt;**Minimum prerequisites:**
1. The template uses a dynamic partial lookup: `{{&amp;gt; (lookup . &amp;#34;key&amp;#34;)}}` or equivalent.
2. The adversary…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-xhpv-hc6g-r9c6</guid>
    </item>
  </channel>
</rss>
