Handlebarsに不適切なエンコード・エスケープの脆弱性(CVE-2026-106444)
概要
Handlebarsに不適切なエンコード・エスケープの脆弱性が確認されました。
バージョン 4.0.0 以上 4.7.10 未満に影響があります。
修正版 4.7.10 への更新が推奨されます。
脆弱性の基本情報
| 脆弱性ID |
CVE-2026-106444 GHSA-xw65-4hp5-5hc7 |
|---|---|
| 脆弱性の種類 | 不適切なエンコード・エスケープ |
| 危険度 | 中 |
| CVSSスコア |
4.7(CVSS v3.x) CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N |
| 公開日 | 2026年10月8日 |
影響を受ける製品
| 製品 | 影響を受けるバージョン | 修正版 | 出典 |
|---|---|---|---|
| Handlebars |
4.0.0 以上 4.7.10 未満 | 4.7.10 | OSV.dev |
推奨対応
- Handlebarsを修正版 4.7.10 またはそれ以降の公式最新版へ更新してください。
情報元の原文
OSV.dev
Handlebars: JavaScript Injection via Unsafe Inline Embedding of Precompiled Templates
## Summary
`Handlebars.precompile()` generates JavaScript source that is commonly embedded in browser `<script>` elements. Before the fix, static template text containing `</script>` was emitted unchanged. HTML parsers recognize `</script>` even inside a JavaScript string literal, closing the surrounding script element and allowing following attacker-controlled markup to be parsed and executed.
This affects applications that precompile attacker-controlled templates and embed the generated source directly in an HTML `<script>` element. It does not affect ordinary server-side rendering or precompiled templates delivered as external JavaScript files.
## Details
Static text is serialized by `quotedString()` in `lib/handlebars/compiler/code-gen.js`. The generated JavaScript is valid, but JavaScript quoting alone does not make it safe to embed in HTML. In HTML script data, the sequence `</script>` terminates the element regardless of JavaScript string context.
On affected releases, this template:
```handlebars
safe</script><script>alert("XSS")</script><script>
```
could produce generated source containing:
```js
return 'safe</script><script>alert("XSS")</script><script>';
```
When included inline in an HTML document, the first `</script>` closes the script containing the precompiled template. The next `<script>` element is then parsed as HTML and executes.
## Proof of Concept
```js
const Handlebars = require('handlebars');
const template = 'safe</script><script>alert("XSS")</script><script>';
const output = Handlebars.precompile(template);
console.log(output.includes('</script>'));
```
Affected versions print `true`. Embedding `output` directly in an inline `<script>` element allows the injected script tag to be parsed by the browser.
## Workarounds
- Do not inline precompiled output from untrusted templates into HTML documents.
- Serve generated precompiled templates as external JavaScript files where practical.
## Credits
Reported by Curly-Haired-Baboon Aka Laplas
利用条件:CC BY 4.0
出典: GitHub Advisory Database(OSV.dev 経由で取得)。原文のまま掲載(改変なし)