POTI-boardとPetit Noteは、WAFに誤検知されないお絵かき掲示板に進化しました。
お絵かき掲示板交流サイトに大規模な攻撃がありました
この記事にも書きましたが、1日に66万回のサイバー攻撃がありました。
設置しているお絵かき掲示板はテキスト形式のログファイルを使用しているためSQLインジェクション攻撃は成立しませんが、ディレクトリトラバーサル攻撃や、閲覧者に被害をもたらすクロスサイトスクリプティング攻撃も多数ありました。
またこの日だけではありません、ほぼ毎日500回以上攻撃されている事が判明しました。
多くの人が使っているメジャーなアプリにも脆弱性はあります。
古いバージョンのWordPressや、古いバージョンのjQueryにも脆弱性があります。
ですから、開発中している掲示板には脆弱性が無いと宣言するのは難しいのが現状です。
このような問題に対応するために登場したのがWAFです。
WAFとは?
レンタルサーバーの老舗、ロリポップ!では、初期状態でWAFが有効です。
さくらのレンタルサーバ は、初期状態ではオフですが、追加料金なしでWAFをオンにできます。
WAFで攻撃を遮断してくれるのなら安心ですね!
でも、コントロールパネルに何か書いてあります。
WAF誤検知との果てなき戦い
PaintBBS NEOは、古くから存在しているお絵かき掲示板との互換性を確保するために、画像、動画、拡張ヘッダのテキスト情報をひとつにまとめた生データを送信していました。
そして、その生データは、WAFによって攻撃と判断される事がありました。
この場合は、エラーメッセージに従って「時間を置いて再度投稿」をこころみても投稿できません。
しかし、線を1本描き足すなどすればデータのパターンが変わり投稿が可能になります。
そこで…。
エラーメッセージを「WAFの誤検知かもしれません。もう少し描いてみてください」に変更しました。
これで、WAFの誤検知のエラーメッセージが出た時は描き足してもえらば投稿できるようになるから解決…と思ったのですが、描いた線を消しゴムで消す。また描く、その線を消すを繰り返して描き足しても投稿できません。
エラー→描き足す→その線を消しゴムで消すではWAFが攻撃と判断するデータにもどってしまうからです。
この状態になり投稿するのをあきらめる人が何名も出る事態になりました。
「NEOを使うのをやめるか、WAFを使うのをやめるかどちらかを選ぶ?」
というところまで追い詰められました。
しかし、窮鼠猫を噛む、追い詰められたネズミは猫を噛むということわざのように追い詰められればなんとかなるものですね。
PaintBBS NEOのデータの送信処理を解読して、生データで送信している処理をまる一晩かけてFormDataに書き換えました。
私はPaintBBS NEOの利用者であって開発者ではないので、どこがどうなっているのかコードを眺めただけではわかりません。
変数を一つずつPHPで取得、それをファイルに書き出して内容を確認しました。
時間をかけて、これはヘッダ、これは画像データ、これは動画という箇所を特定しました。
そして、それぞれをFormDataに追加して、FormDataで送信できるようにしました。
古いJavaアプレットからのデータの受信を行う処理をそのまま流用するのなら生データで送信するしかありません。
しかし、掲示板の開発者がFormDataによる受信に対応できるのであればPaintBBS NEOの送信をFormDataに変更してしまえばいいのです。
FormDataを使って、画像は画像、動画は動画、拡張ヘッダは拡張ヘッダに分けて送信できるようになりました。
この仕様変更は、現時点ではPaintBBS NEOの独自拡張です。
しかし、統一規格で解決できる事は統一規格で解決したほうがいいので、GitHubでプルリクエストを出しています。
WAF時代のお絵かき掲示板
Petit Note
WAFがオンの状態でも誤検知されない独自拡張版のPaintBBS NEOとFormDataで受信するファイルを同梱したPetit Noteをリリースしました。
WAFによる誤検知がほぼ無い、WAF時代のお絵かき掲示板のPHPスクリプトができました。
POTI-board
POTI-boardにも同様の変更を行い、WAFによる誤検知がほぼでないPaintBBS NEOの独自拡張版と新しいFormData形式のデータを受信するPHPスクリプトを同梱しました。
さらにPOTI-boardでは、WAFをオンにしたときにPHPが発行するCookieのHttpOnlyに変更され、JavaScriptによるCookieの読み込みができなくなる問題にも対応しました。
PHPが発行したCookieはWAFによって暗号化され、HttpOnlyになりますが、JavaScriptが発行するCookieは暗号化されずJavaScriptで読み込む事ができるため、フォーム入力のCookieをJavaScriptで発行する事でこの問題を回避しました。
Petit Noteはセキュリティを高めるために最初からCookieをHttpOnlyにしています。
しかしながら、POTI-boardは静的HTMLにCookieを読み込む必要があるため、JavaScriptによるCookieの読み込みがどうしても必要でした。
お絵かき掲示板交流サイト
POTI-boardとPetit Noteの開発と設置サポートを行っています。
設置サポート掲示板もあります。お絵かき掲示板を設置してみませんか?
お絵かき掲示板交流サイトを運営しています。
中学生・高校生の方のためのお絵かき掲示板交流サイト、Petit BOX ジュニアもできました。
投稿をお待ちしています。