見出し画像

お絵かき掲示板の脆弱性について

お絵かき掲示板のCSRFの脆弱性

お絵かき掲示板Relmの最終バージョンは2007年にリリースされました。
この記事ではRelmを使ってCSRFの脆弱性をテストしています。
しかし、Relmにはそれを防ぐための設定がありますので、それを有効にする方法も合わせて記載しています。
Relmの場合は設定で回避できますが、POTI-board EVO v3.02.0以前の古いバージョンにはCSRFの脆弱性があり、バージョンアップして対応するしかありません。
また、v2.26.0以前のPOTI-boardにはXSSの脆弱性があります。
v3.09.5以前のPOTI-boardのすべてのバージョンには重大な欠陥があり、すべてのログファイルを失う可能性があります。
お手数をおかけしますが、v3.09.5以前の古いバージョンのPOTI-boardをご利用の方はv5.xへのバージョンアップをお願いします。

CSRFの脆弱性がある掲示板ではIPアドレスを調べても投稿した人物を特定できない

IPアドレスを調べて本人を特定しても、悪意のあるテキストを作成したのは別人で、そのIPアドレスの人はurlをクリックしただけなのかもしれません。
CSRFの脆弱性がある掲示板ではこの問題が発生します。

Relmを使ってCSRFの脆弱性をついた攻撃をローカル環境で再現

再現手順は以下の通りです。

  1. Relmの投稿フォームを名前を付けて保存する。

  2. Cドライブに保存した投稿フォームに悪意のある書き込みを埋め込む。

  3. 閲覧するだけで、submitボタンが押下されるJavaScriptを一行追加する

  4. ページを閲覧すると悪意のあるテキストが投稿される。

RSRFの脆弱性によりページを閲覧しただけで記事が投稿される

えええ?!そんな詳細な手口を公開!?
いえ、Laravelというフレームワークの紹介ページに具体的なコードが掲載されています。そんな一般的なコードです。

RelmでCSRFを防ぐには

RelmのCGI設定画面

サイト外からのアクセスを禁止する設定を有効にすればCSRF対策ができます。

POTI-board EVOとPetit Noteの最新版のCSRF対策

セッションをもとに生成したトークンを入力フォームにセットしてCSRFを防いでいます。
さらに、ブラウザではない何かによる投稿を防ぐためにCOOKIEの有無もチェックしています。
また、Orijinヘッダを確認して、外部サイトからの投稿を弾いています。
しかしながらPOTI-boardの場合はOrijinヘッダの確認がやや不十分です。
Orijinヘッダを確認できないEdgeのIEモードでの動作を確保するためです。
しぃペインターをIEモード+オラクルのJavaで起動して投稿するにはOrijinヘッダ非対応ブラウザでも動作するようにする他なかったからですね…。
CSRFトークンはセットしていますので、基本的な防御はできていると思うのですが…。

セキュリティには気を配っていますが、作者本人が気がついていない何かを他の人が発見するケースが多々あります。
ですから、POTI-boardやPetit Noteにはまだ脆弱性があるかもしれません。

またライセンス的には完全に無保証です。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。

https://licenses.opensource.jp/MIT/MIT.html

ここで責任が発生すると、フリーソフトの公開ができなくなってしまいます。
しかし脆弱性のある掲示板が一定の影響力をもっている場合は、IPAによる脆弱性の公表が行われるかもしれません。
たとえば、一世を風靡したお絵かき掲示板のCGI、BBSNoteの脆弱性に関する報告がIPAによって行われた事がありました。

無保証といいながらも、そんな事にならないように努力する事になりますね。

ネット上に存在するPOTI-boardの脆弱性に関する情報

そもそもevalを使っている時点でかなり危ういにおいがするので、使用は極力控えたほうがいいと思います。まともなコードを書いていればevalは不必要です。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11174642576

POTI-boardの開発に5年ほど参加しているため、この指摘に関する意見を述べます。
誰かと喧嘩したい訳ではありません。
該当スクリプトを開発している当事者だからです。

  1. $_GET $_POST といったスーパーグローバル変数に対してextract()使用している

  2. eval()を使っている

1.については、POTI-board EVOの現在のバージョンでは関数extract()の使用もスーパーグローバル変数$_POST、$_GETの使用もやめ、filter_input()に置き換えています。
2.については現在も関数eval()を使用しています。

という事は指摘のあった2点のうち一点の脆弱性がまだ残っているという事でしょうか?

BladeOneは関数eval()を使用しています。Twig、Smartyといった利用者数の多い各種テンプレートエンジンでも、関数eval()が使用されています。
2023年の現時点における一般的なテンプレートエンジンはeval()を使用して動いています。
テンプレートエンジンの構造上関数eval()を使う必要があり、それを避ける事はできないようです。

POTI-boardは、HTMLTemplate、skinny、BladeOneとテンプレートエンジンを変更しながら生き延びたお絵かき掲示板です。
2023年現在は多くのユーザーが存在し更新頻度の高いBladeOneを使用しています。
関数eval()はそのBladeOneで使用されています。

Petit Noteはテンプレートエンジンを切り替える煩わしさを解消するために作ったお絵かき掲示板なので、テンプレートエンジンを使っていません。
しかし、HTML部分のテンプレート化と外部化は実現しています。
HTMLパートをテンプレートとして分離する事ができたのは、テンプレートエンジンを使った事があったからです。
そういう意味ではいくつものテンプレートエンジンの載せ換えが必要になったPOTI-boardでの経験は無駄ではなかったといえるでしょう。
こちらはテンプレートエンジンを使っていないので関数eval()を使用していません。

POTI-boardとPetit Note

昨年もたくさん更新しました。
いろいろと不十分な点もありますが、コードを維持できる範囲で今後はゆっくり更新していく予定です。
新しいバージョンのPHPへの対応もすすめていますので、どうぞよろしくお願いします。
PHP5.6-PHP8.2で動作するPetit Note
PHP7.2-PHP8.2で動作するPOTI-boardをどうぞよろしくお願いします。

お絵かき掲示板交流サイト

お絵かき掲示板の絶滅の危機を救ったPaintBBS NEO。

PaintBBS NEO

高機能なChickenPaint。

ChickenPaint

日々更新されるKlecks。

Klecks

三種類のお絵かきアプリが使えるお絵かき掲示板交流サイトPetit Noteをどうぞよろしくお願いします。
多くのユーザーが利用する事ではじめてわかる問題点もあります。
実際に運用する中で必要になった機能をお絵かき掲示板のPHPスクリプトに追加しています。
お絵かきの投稿がなければお絵かき掲示板交流サイトは成立しません。
どうぞよろしくお願いします。


この記事が気に入ったらサポートをしてみませんか?