<?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>Mon, 28 Sep 2026 14:03:39 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-82409</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-82409</link>
      <description>&lt;p&gt;Klever-Go is the Go implementation of the Klever blockchain protocol. Prior to 1.7.20, indexer/common.go serializedDataForUpdateAccounts places the attacker-controlled acc.Name value into an Elasticsearch _bulk JSON and NDJSON request without escaping it. The SetAccountName transaction accepts valid UTF-8 account names containing quotes, backslashes, and newlines, and the resulting name is stored in consensus account state. When an indexer processes the account, those characters can break the JSON string, reject a bulk batch, or inject additional bulk actions that create, overwrite, or delete documents in indices writable by the indexer. The persistent state value is replayed by new or historical indexers, and direct access to the indexing host or Elasticsearch port is not required. This issue is fixed in version 1.7.20.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Klever-Go is the Go implementation of the Klever blockchain protocol. Prior to 1.7.20, indexer/common.go serializedDataForUpdateAccounts places the attacker-controlled acc.Name value into an Elasticsearch _bulk JSON and NDJSON request without escaping it. The SetAccountName transaction accepts valid UTF-8 account names containing quotes, backslashes, and newlines, and the resulting name is stored in consensus account state. When an indexer processes the account, those characters can break the JSON string, reject a bulk batch, or inject additional bulk actions that create, overwrite, or delete documents in indices writable by the indexer. The persistent state value is replayed by new or historical indexers, and direct access to the indexing host or Elasticsearch port is not required. This issue is fixed in version 1.7.20.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-82409</guid>
    </item>
    <item>
      <title>GHSA-7c7c-373r-gfjj — Klever-Go: Elasticsearch bulk / painless injection via on-chain account name -&gt; explorer/indexer data forgery</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-7c7c-373r-gfjj</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: github.com/klever-io/klever-go&lt;/p&gt;
&lt;p&gt;**Component:** Elasticsearch indexer (`indexer/`)
**Primary location:** `indexer/common.go:2395-2407` (`serializedDataForUpdateAccounts`)
**Entry point:** `SetAccountName` native transaction (contract type 12) — `core/process/transaction/txProcess.go:688`&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;When the node indexes account updates to Elasticsearch, it builds the ES `_bulk` painless-script line by splicing the account&amp;#39;s **name** directly into JSON with `fmt.Sprintf(&amp;#34;%s&amp;#34;, ...)` and **no escaping**:&lt;/p&gt;
&lt;p&gt;```go
// indexer/common.go:2395-2407  (serializedDataForUpdateAccounts)
serializedData := []byte(fmt.Sprintf(`{&amp;#34;script&amp;#34;:{&amp;#34;source&amp;#34;:&amp;#34;`+
    `ctx._source.name = params.name; ... `+
    `&amp;#34;,&amp;#34;lang&amp;#34;: &amp;#34;painless&amp;#34;,&amp;#34;params&amp;#34;:`+
    `{&amp;#34;name&amp;#34;: &amp;#34;%s&amp;#34;, &amp;#34;nonce&amp;#34;: %d, &amp;#34;rootHash&amp;#34;: &amp;#34;%s&amp;#34;, &amp;#34;balance&amp;#34;: %d, ...}}}`,
    acc.Name, acc.Nonce, acc.RootHash, acc.Balance, ...))   // acc.Name is RAW
```&lt;/p&gt;
&lt;p&gt;`acc.Name` originates from on-chain account state: `indexer/accountInfo.go:31` sets `Name: string(userAccount.GetName())`. An account name is fully attacker-controlled and only weakly validated when it is set on-chain by the `SetAccountName` handler:&lt;/p&gt;
&lt;p&gt;```go
// core/kapp/accounts/accounts.go:1740
if !utf8.Valid(tc.GetName()) || len(tc.GetName()) &amp;gt; core.MaxNameSize { ... }  // MaxNameSize = 100
```&lt;/p&gt;
&lt;p&gt;The only constraints are **valid UTF-8** and **length ≤ 100 bytes**. Double-quote (`&amp;#34;`), backslash (`\`), and newline (`\n`) are all valid UTF-8 and are **not** rejected. The safe helper `converters.JsonEscape()` exists and is used for `…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: github.com/klever-io/klever-go&lt;/p&gt;
&lt;p&gt;**Component:** Elasticsearch indexer (`indexer/`)
**Primary location:** `indexer/common.go:2395-2407` (`serializedDataForUpdateAccounts`)
**Entry point:** `SetAccountName` native transaction (contract type 12) — `core/process/transaction/txProcess.go:688`&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;When the node indexes account updates to Elasticsearch, it builds the ES `_bulk` painless-script line by splicing the account&amp;#39;s **name** directly into JSON with `fmt.Sprintf(&amp;#34;%s&amp;#34;, ...)` and **no escaping**:&lt;/p&gt;
&lt;p&gt;```go
// indexer/common.go:2395-2407  (serializedDataForUpdateAccounts)
serializedData := []byte(fmt.Sprintf(`{&amp;#34;script&amp;#34;:{&amp;#34;source&amp;#34;:&amp;#34;`+
    `ctx._source.name = params.name; ... `+
    `&amp;#34;,&amp;#34;lang&amp;#34;: &amp;#34;painless&amp;#34;,&amp;#34;params&amp;#34;:`+
    `{&amp;#34;name&amp;#34;: &amp;#34;%s&amp;#34;, &amp;#34;nonce&amp;#34;: %d, &amp;#34;rootHash&amp;#34;: &amp;#34;%s&amp;#34;, &amp;#34;balance&amp;#34;: %d, ...}}}`,
    acc.Name, acc.Nonce, acc.RootHash, acc.Balance, ...))   // acc.Name is RAW
```&lt;/p&gt;
&lt;p&gt;`acc.Name` originates from on-chain account state: `indexer/accountInfo.go:31` sets `Name: string(userAccount.GetName())`. An account name is fully attacker-controlled and only weakly validated when it is set on-chain by the `SetAccountName` handler:&lt;/p&gt;
&lt;p&gt;```go
// core/kapp/accounts/accounts.go:1740
if !utf8.Valid(tc.GetName()) || len(tc.GetName()) &amp;gt; core.MaxNameSize { ... }  // MaxNameSize = 100
```&lt;/p&gt;
&lt;p&gt;The only constraints are **valid UTF-8** and **length ≤ 100 bytes**. Double-quote (`&amp;#34;`), backslash (`\`), and newline (`\n`) are all valid UTF-8 and are **not** rejected. The safe helper `converters.JsonEscape()` exists and is used for `…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-7c7c-373r-gfjj</guid>
    </item>
  </channel>
</rss>
