本文へ移動
English version →
重大 9.8 急ぎ度: 早めに

HoneySQLにSQLインジェクションの脆弱性、修正版あり

HoneySQLでSQLを組み立てるClojureアプリで、利用者の入力を識別子として渡していると、SQLインジェクションを受ける恐れがあります。修正版へ更新し、入力をkeywordやsymbolにしている箇所も洗い出してください。

CVE-2026-61620 公開 生成 AI で作成
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

CVSS v3が9.8で、認証なしにネットワーク越しで成立しうる脆弱性ですが、利用者の入力を識別子として渡すコードがあるアプリに限られ、修正版の2.7.1392がすでに公開されています。

関係があるか

HoneySQLでSQLを生成するClojureアプリのうち、利用者の入力などをテーブル名や列名として渡している環境が対象です。入力が固定値だけのアプリは、この条件には当てはまりません。

製品影響を受ける版修正版
HoneySQL(seancorfield/honeysql) 2.0.0から2.7.1392より前 2.7.1392

確かめ方

  1. 1deps.edn や project.clj を開き、honeysqlの版が2.7.1392より前かどうかを見ます。他のライブラリ経由で入っていることもあるので、依存関係の一覧でも確かめてください。
  2. 2ソースコードで、ユーザー入力、リクエストの値、外部ファイルの値などを keyword や symbol に変えてからHoneySQLのクエリ定義に渡している箇所を探します。
  3. 3該当箇所があり、生成したSQLをJDBCドライバーでそのまま実行しているなら、この脆弱性の対象です。

何が起きたか

HoneySQLを使うアプリが、利用者の入力をテーブル名や列名としてクエリに組み込んでいると、細工された入力によってSQL文の構造が変えられる恐れがあります。成功すると、データベースの内容の読み取り、書き換え、停止につながります。

HoneySQLはClojureのデータ構造をSQLに変換するライブラリです。入力を keyword や symbol に変えてDSLに渡すと、一部のformatterでは、疑わしい文字を調べる既存のチェックが、変換後の名前に適用されませんでした。その結果、そのままJDBCドライバーで実行されるSQL文に、意図しない内容が混ざる余地が生まれます。

修正版の2.7.1392では、この検査が抜けていた箇所が直されています。

攻撃の流れ

  1. 1

    入力を受け取る

    アプリが利用者の入力や外部から来た値を受け取ります。

  2. 2

    識別子に変換

    その値を `keyword` や `symbol` にして、HoneySQLのDSLに渡します。

  3. 3

    検査が働かない

    一部のformatterで文字のチェックが適用されず、SQL文に不正な内容が混ざります。

  4. 4

    DBで実行される

    JDBCドライバーがそのまま実行し、接続の権限の範囲で被害が出ます。

公開されている情報をもとにした流れの例です。

どう悪用されるか

ネットワーク越しに成立し、認証と利用者の操作はどちらも不要です。ただし、アプリが利用者の入力などを keyword か symbol に変えてDSLへ渡し、生成したSQLを加工せずに実行していることが前提になります。インターネットに公開された画面やAPIがその入力を受け付けているなら、外部から狙われうる状態です。

被害の大きさは、SQLを実行するデータベース接続の権限で決まります。権限が広い接続ほど、情報の読み取り、データの改ざん、サービス停止といった影響が大きくなります。

今すぐやること

  1. 1

    使っている版を確認する

    依存関係の一覧にhoneysqlがあるか、あれば何の版かを確認します。直接指定していなくても、他のライブラリ経由で入っていることがあります。

    clojure -Stree | grep honeysql
  2. 2

    修正版に更新する

    honeysqlを2.7.1392以降に上げ、テストを通してから本番に反映します。間接的に入っている場合は、依存元の更新を待たず、プロジェクト側でhoneysqlの版を指定して上書きする方法もあります。

  3. 3

    入力を識別子にしている箇所を洗い出す

    利用者の入力が、ソート列や検索対象の列、テーブル名などとして keyword や symbol に変えられていないかを調べます。見つかった箇所は、更新後も許可する名前の一覧と照合する形に直しておくと安全です。

  4. 4

    データベース接続の権限を見直す

    アプリが使う接続に、必要以上の権限が付いていないかを確認します。参照だけで足りる処理には、参照専用の接続を使います。

  5. 5

    公開済みの環境ではログも見る

    更新前から外部に公開されていたアプリは、SQLエラーの急増や、見慣れない列名・テーブル名を含むクエリの記録がないかをデータベースとアプリのログで確かめます。

すぐ更新できないとき

すぐに更新できないときは、keyword や symbol を作る前に入力を検証します。任意の文字列を通さず、あらかじめ決めた列名やテーブル名の一覧に含まれる値だけを受け入れる形にしてください。あわせて、データベース接続の権限を必要最小限に絞ると、万一のときの被害を抑えられます。

背景

HoneySQLは、Clojureのマップやベクターで書いたクエリをSQL文字列に変換するライブラリです。Webアプリのバックエンドで、検索条件や並び替えが動的に変わる画面のクエリ組み立てに使われることが多く、変換後のSQLはJDBCドライバー経由でそのままデータベースに送られます。

SQLインジェクションを防ぐ定番の方法は、値をプレースホルダーで渡すことです。しかしテーブル名や列名のような識別子はプレースホルダーにできないため、文字列として組み立てる段階で検査するしかありません。HoneySQLには疑わしい文字を調べる検査がもともとありました。今回の問題は、その検査が一部のformatterで、keyword や symbol から作られた名前に適用されていなかったことにあります。並び替えの列を画面から選ばせるような実装は、まさにこの経路に当たります。

よくある質問

Q.直接honeysqlを指定していないのですが、確認は必要ですか。
A.必要です。他のライブラリが内部でhoneysqlを使っていると、依存関係の一覧に現れます。その場合は、依存元が修正版を取り込んでいるかを確かめるか、プロジェクト側でhoneysqlの版を上げて対応します。
Q.クエリの形がすべて固定で、利用者の入力は列名に使っていません。更新は急ぎませんか。
A.今回の条件には当てはまらないため、通常の更新サイクルで構いません。ただ、あとから並び替えや絞り込みの機能を足したときに条件を満たしてしまうことがあるので、更新はしておくほうが安全です。

この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。

原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

HoneySQL turns Clojure data structures into SQL. From 2.0.0 until 2.7.1392, applications that pass user input or other arbitrary data into the HoneySQL DSL by calling keyword or symbol on that input can produce SQL strings that facilitate SQL injection when executed unchanged by a JDBC driver. Some formatters do not apply the existing suspicious-character check to the resulting entity names. The impact depends on the privileges of the database connection executing the generated statement. Input validation before constructing keyword or symbol entities is a workaround. The maintainer-designated fixed version is 2.7.1392.

出典: CVE.org (CVE Program・cvelistV5) NVD

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく