FearlessCMSの脆弱性で認証なしにファイル改ざん、0.1.4で修正
FearlessCMSの0.1.4より前では、管理画面に残ったデバッグ用スクリプトが認証なしで動き、コンテンツの書き換えや読み取り、管理者を狙ったスクリプトの埋め込みが起こりえます。PHPの組み込みサーバーやDocker標準構成で動かしている組織は、特に影響を受けやすい構成です。0.1.4への更新を先に済ませ、そのあとで改ざんの痕跡を確認してください。
急ぎ度: 早めに
CVSS v3は9.4で、認証なしにネットワーク経由で到達できる一方、修正版の0.1.4がすでに出ているため、早めの更新が妥当です。
関係があるか
FearlessCMSで自社サイトや情報発信用のページを運用している組織が対象です。PHPの組み込みサーバーで動かしている場合と、Docker標準構成の場合は、とくに該当しやすくなります。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| FearlessCMS | 0.1.4より前のすべての版 | 0.1.4 |
確かめ方
- 1FearlessCMSの版を確認し、0.1.4より前かどうかを見ます。
- 2起動方法を確認し、
php -Sなどによる組み込みサーバーか、Docker標準構成のままかを見ます。 - 3
admin/の下にdebug_save_flow.php、debug_content.php、preview-handler.php、testdebug.php、test_redirect.phpがあれば、該当する版です。 - 4インターネットや社内の広い範囲から、そのサイトにアクセスできるかを確認します。
何が起きたか
FearlessCMSの0.1.4より前では、管理画面の下に置かれたデバッグ用・テスト用のPHPスクリプトが、ログイン確認なしで動きます。サイトのコンテンツファイルを外部から書き換えたり読み出したりでき、公開ページに悪意あるスクリプトを仕込むこともできます。
問題のスクリプトは5つあり、いずれも権限確認、CSRF対策、pathの十分な検証を欠いています。
- debug_save_flow.phpは、送られたpathとcontentをそのままファイルに書き込みます。
.mdファイルをcontent/ の下だけでなく、pathに細工をすれば外側にも書けます。サイトの改ざんや、公開ページへのスクリプト埋め込みにつながります。 - debug_save_flow.phpは、受け取ったPOSTの内容をエスケープせずに画面へ出すため、反射型クロスサイトスクリプティングの原因にもなります。
- debug_content.phpは、pathで指定したディレクトリの一覧と
.mdファイルの中身を返します。絶対パス、所有者、権限、ハッシュ、contentの冒頭部分まで分かります。 - preview-handler.phpは、送られたJSONのcontentとtitleをcontent/_preview/ に書き出します。保存型のクロスサイトスクリプティングと、ディスクの枯渇を招きます。
- testdebug.phpは、認証なしでadmin/testdebug.logに追記を続けられるため、ディスクの枯渇を招きます。
test_redirect.phpもテスト用の成果物を外部にさらしますが、入力をエスケープしており、それ自体はクロスサイトスクリプティングの原因になりません。
読み書きはPHPの権限で実行されます。ベンダーが検証した構成ではPHPがrootで動いており、そのぶんファイルシステムへの影響が大きくなっていました。
攻撃の流れ
-
1
認証の迂回
組み込みサーバーでは、ルーターとファイルシステムのパス解釈の差により、管理画面のログイン確認を通らずにスクリプトへ届きます。
-
2
スクリプト実行
認証もCSRF対策もないデバッグ用スクリプトに、外部から直接リクエストが送られます。
-
3
読み取りと書き込み
ディレクトリの列挙、`.md` ファイルの読み取り、任意の `.md` の書き込みがPHPの権限で行われます。
-
4
スクリプト埋め込み
書き込まれたコンテンツに仕込まれたJavaScriptが、公開ページや管理者の閲覧時に動きます。
-
5
管理者の乗っ取り
管理者がその内容を開くと、セッションが盗まれ、管理者のアカウントが危険にさらされます。
どう悪用されるか
ファイル操作の部分は、ログインも利用者の操作も要りません。ネットワーク越しに対象サイトへ届けば足ります。PHPの組み込みサーバー(Docker標準構成を含む)では、ルーターが見るURLの先頭部分と、ファイルシステムが解決するパスに食い違いがあります。そのため管理画面の入口の認証を通らずに、スクリプトへ直接届いてしまいます。
保存型のスクリプト実行は、管理者が影響を受けたコンテンツを開いたときに成立します。反射型のものも、細工されたリクエストの結果を利用者が開くことが前提です。
悪用されると、サイトの改ざん、公開ページへのスクリプト埋め込み、絶対パスや権限情報の漏えいが起こります。管理者のセッションが盗まれれば、管理操作そのものを奪われるおそれもあります。preview-handler.phpとtestdebug.phpでは、書き込みを繰り返されてディスクが埋まり、サイトが止まる可能性があります。
今すぐやること
-
1
0.1.4に更新する
本番・検証を問わず、公開されているインスタンスから先に修正版へ更新します。Dockerで動かしている場合は、0.1.4を取り込んだ状態でコンテナを作り直します。
-
2
改ざんの痕跡を確認する
content/_preview/ に見覚えのないファイルがないか、admin/testdebug.logが異常に大きくなっていないかを見ます。content/ の外側を含め、更新した覚えのない
.mdがないかも調べます。公開ページに見知らぬスクリプトが入っていないかも確認します。ls -la content/_preview admin/testdebug.log -
3
痕跡があれば管理者の認証情報を入れ替える
不審な書き込みが見つかったときは、管理者のセッションを無効にし、パスワードを変更します。盗まれたセッションが残っていると、更新後も操作される可能性があります。
-
4
PHPの実行ユーザーを見直す
PHPをrootで動かしていないかを確認し、動かしているなら、必要最小限の権限を持つ一般ユーザーに切り替えます。読み書きの影響範囲が狭まります。
すぐ更新できないとき
すぐに更新できないときは、サイトを外部に公開せず、アクセスできる範囲をIPアドレスやファイアウォールで絞ります。あわせて、admin/ にある5つのテスト用・デバッグ用スクリプトを削除するか、Webサーバー側で拒否します。preview-handler.phpを消すとプレビュー関連の動作に影響しないかを、先にテスト環境で確認してください。PHPをrootで動かしているなら、一般ユーザーに変えるだけでも影響は小さくなります。
背景
FearlessCMSは、データベースを使わずファイルでコンテンツを持つフラットファイル型のCMSです。記事はcontent/ の下のMarkdownファイルとして置かれるため、そこに書き込めることは、公開内容を自由に変えられることに近い意味を持ちます。今回、content/ の外側にまで .md を書けた点は、サイトの改ざんにとどまらない影響につながります。
今回の問題のもう一つの軸は、PHPの組み込みサーバーです。組み込みサーバーは開発用であり、本番での利用は想定されていません。ところがDockerの標準構成が組み込みサーバーを使っているため、イメージをそのまま動かしただけの運用でも、今回の迂回が成立する構成になります。開発中のデバッグ用スクリプトが管理画面の下に残ったまま配布されていたことが、被害を大きくしました。
よくある質問
Q.社内ネットワークだけに公開している場合も、急ぐ必要がありますか。
Q.管理画面のログインを強化していれば防げますか。
まだ分かっていないこと
- 実際の攻撃で悪用されたかどうかは、確認できていません。最新の状況は、GitHubのセキュリティアドバイザリなどベンダーの告知で確認してください。
- 組み込みサーバー以外の構成で、5つのスクリプトにどこまで外部から届くかは、明記されていません。また、影響が始まった最初の版も示されていません。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| fearlessgeekmedia | FearlessCMS | — | — |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
FearlessCMS is a flat-file content management system centered on simplicity and open source. Prior to version 0.1.4, five debug/test PHP scripts under admin/ perform privileged operations without isLoggedIn() authentication checks, CSRF protection or adequate path validation. On PHP's built-in development server, including the default Docker deployment, router.php checks an unnormalized admin URI prefix while the filesystem resolves dot segments, so /./admin/ bypasses the admin login gate and executes those scripts directly. In admin/debug_save_flow.php, attacker-controlled path and content reach file_put_contents for arbitrary .md writes under content/ or outside it through path traversal, enabling site defacement and stored JavaScript in public pages; print_r($_POST) output without htmlspecialchars escaping also causes reflected cross-site scripting. The admin/debug_content.php path parameter reaches scandir(), file_get_contents() and posix_getpwuid(), permitting arbitrary directory enumeration and .md file reads that expose absolute paths, ownership, permissions, hashes and content previews. The admin/preview-handler.php endpoint accepts JSON content and title and writes enumerable files under content/_preview/, enabling stored cross-site scripting and disk exhaustion. The admin/testdebug.php endpoint appends to admin/testdebug.log without authentication, also enabling disk exhaustion. The admin/test_redirect.php sc…
出典: CVE.org (CVE Program・cvelistV5) NVD
参照URL
- web github.com
- web github.com
- web github.com