YesWikiに認証不要のSQLインジェクション、修正版あり
YesWiki の Bazar 記事検索 API に、ログイン不要で外部から SQL を差し込める脆弱性が見つかりました。4.6.0 以上 4.7.0 未満と、5.0.0-alpha1 以上 5.0.0-alpha4 未満が対象で、利用者のパスワードハッシュの読み取りやデータベースの停止につながるおそれがあります。インターネットに公開している YesWiki がある組織は、4.7.0 または 5.0.0-alpha4 への更新を急いでください。
急ぎ度: 早めに
認証なしでネットワークから悪用できCVSS v3.1は9.1ですが、実際の攻撃で悪用されたという情報は現時点で明らかになっておらず、修正版が公開されています。
関係があるか
YesWiki 4.6.0以上4.7.0未満、または5.0.0-alpha1以上5.0.0-alpha4未満を運用している組織が対象です。Bazar記事検索APIは公開APIのため、外部から到達できるサイトは特に影響を受けやすい状態です。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| YesWiki 4.x 系 | 4.6.0以上4.7.0未満 | 4.7.0 |
| YesWiki 5.0.0 の alpha 版 | 5.0.0-alpha1以上5.0.0-alpha4未満 | 5.0.0-alpha4 |
確かめ方
- 1自社や関係団体でYesWikiを使っているかを洗い出します。部署単位で立てた小さなサイトや、外部の制作会社に任せているサイトも含めて確認します。
- 2稼働しているYesWikiの版を確認し、上の表の範囲に入るかを照らし合わせます。版の確認方法が分からない場合は、構築や運用を担当した人、またはホスティング事業者に問い合わせてください。
- 34.6.0より前の版が影響を受けるかどうかは、公表されている情報からは分かりません。古い版を使っている場合は、ベンダーの告知(GitHubのセキュリティアドバイザリ)で確認してください。
- 4そのサイトが社外のインターネットから到達できるかを確認します。到達できる場合は優先度を上げて対応します。
何が起きたか
YesWikiは、ページを自由に編集できるWikiに、フォームやデータベース機能を組み合わせて使えるオープンソースのソフトウェアです。このうちBazarと呼ばれる機能の記事検索APIに、SQLインジェクションの脆弱性が見つかりました。このAPIは公開されており、ログインしていない人でも呼び出せます。そのため、外部の第三者が検索の仕組みを悪用してデータベースに不正な命令を差し込めてしまいます。
悪用された場合、データベースに保存されている情報が読み取られるおそれがあります。例として、利用者のパスワードハッシュが挙げられています。また、データベースに時間のかかる処理をさせて接続を使い切らせ、サイトを使えなくすることもできるとされています。
技術的には、SearchManager::prepareSearchRequest() で、検索APIの query と searchfields パラメータに含まれるフィールド名を、バッククォートで囲んだ別名(エイリアス)としてSQLに組み込んでいます。この部分の保護が mysqli_real_escape_string によるエスケープだけで、バッククォートで囲む文脈には不十分でした。これが原因で、入力した値がSQL文の構造を変えられます。
攻撃の流れ
-
1
公開APIに到達
攻撃者はログインせずに、インターネットからBazar記事検索APIへリクエストを送れます。
-
2
細工した値を送信
検索条件の `query` や `searchfields` に、通常のフィールド名ではない値を含めて送ります。
-
3
SQL文が変化
エスケープが不十分なため、値がSQL文の構造として解釈されます。
-
4
DBへの不正な処理
データベースに追加の問い合わせが実行され、情報の読み取りや処理の遅延が起こります。
どう悪用されるか
悪用に必要なのは、対象サイトにネットワークから到達できることだけです。ログインなどの認証は不要で、攻撃の難易度は低く、利用者に何かを操作させる必要もありません。CVSS v3.1のベクターは AV:N/AC:L/PR:N/UI:N で、これらの条件を反映しています。
被害として挙げられているのは、機密性と可用性への影響です。パスワードハッシュなどの情報が読み取られるおそれがあり、データベースのスレッドを使い切られてサイトが応答しなくなるおそれもあります。一方、CVSSでは完全性(データの改ざん)への影響は「なし」と評価されています。ただし、パスワードハッシュが盗まれると、強度の弱いパスワードは推測されて別の不正ログインにつながる可能性があります。
実際の攻撃で悪用された事例は、現時点で明らかになっていません。
今すぐやること
-
1
対象版かどうかを確認する
運用中のYesWikiの版を確認し、4.6.0以上4.7.0未満、または5.0.0-alpha1以上5.0.0-alpha4未満に当てはまるかを調べます。インターネットに公開しているサイトから先に確認します。
-
2
修正版へ更新する
4.x系は4.7.0に、5.0.0のalpha版を使っている場合は5.0.0-alpha4に更新します。更新前にファイルとデータベースのバックアップを取ってください。alpha版は開発途上の版なので、本番で使っている場合は更新の影響を検証環境で確かめてから適用します。
-
3
不審なアクセスの痕跡を調べる
Webサーバーのアクセスログで、記事検索APIへの
queryやsearchfieldsを含むリクエストに、通常の検索では見られない値や急な件数増加がないかを確認します。ログを残していない場合、過去に悪用されたかどうかは判断できません。 -
4
悪用の疑いがあればパスワードを見直す
不審なアクセスが見つかった場合は、データベースの内容が読み取られた可能性を前提に、利用者のパスワード変更を促します。同じパスワードを他のサービスで使い回していないかも案内してください。
すぐ更新できないとき
すぐに更新できない場合に、公式に示された回避策は、今回参照できる情報には含まれていません。一時的な対策として、一般的に次のような方法が考えられます。ただし根本的な解決にはならないため、更新までのつなぎとして扱ってください。
- サイトへのアクセスを社内ネットワークやVPN経由に限定する。
- リバースプロキシやWAFで、Bazar記事検索APIへの外部からのアクセスを制限する。
- YesWikiが使うデータベースのアカウントの権限を必要最小限にする。
背景
YesWikiのようなWiki系ソフトは、社内の手順書や情報共有、会員向けのサイトなどに使われます。Bazarのようにフォームで集めた情報をデータベースに蓄積する機能があると、氏名や連絡先、利用者アカウントなどが保存されている場合もあります。そのため、Webアプリの弱点がそのままデータベースの情報流出に直結しやすくなります。
SQLインジェクションは、入力値をSQL文に組み込む際の扱いが不十分なときに起きる、古くから知られた種類の弱点です。値のエスケープだけに頼る実装では、値を囲む記号の種類などSQL文での使われ方に合っていないと防ぎきれません。根本的な対策は、プレースホルダを使ったパラメータ化などで、入力値とSQL文の構造を分けることとされています。
よくある質問
Q.ログインしていない人でも攻撃できるのですか。
Q.すでに攻撃されたかどうかは分かりますか。
Q.4.6.0より前の版は安全ですか。
まだ分かっていないこと
- 実際の攻撃で悪用されたかどうかは、現時点で明らかになっていません。
- 4.6.0より前の版が影響を受けるかどうかは、公表されている情報からは分かりません。
- 公式な回避策が示されているかどうかは、参照できる情報には含まれていません。GitHubのセキュリティアドバイザリで最新の情報を確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| YesWiki | yeswiki |
5.0.0-alpha1 以上 5.0.0-alpha4 未満 |
5.0.0-alpha4 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
YesWiki 4.6.0 before 4.7.0 and 5.0.0-alpha1 before 5.0.0-alpha4 contains an unauthenticated SQL injection vulnerability in SearchManager::prepareSearchRequest(). Field names from the query and searchfields parameters of the public Bazar entries search API are placed in a backtick-quoted alias escaped only with mysqli_real_escape_string. Attackers can supply a backtick to inject subqueries, reading data such as user password hashes or exhausting database threads with SLEEP().
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory github.com
- advisory vulncheck.com
- advisory nvd.nist.gov
- advisory github.com
- web github.com