告知: gnusocial.jpへのDoS攻撃とweb.gnusocial.jpの分散SNS参加

gnusocial.jp vs. Misskey.io

12/21 Wedからgnusocial.jpは誰かからDoS攻撃を受けており、この状況と情報サイトのGNU social JPをActivityPub対応 (gnusocialjp@web.gnusocial.jp | https://web.gnusocial.jp/post/author/gnusocialjp/) したのでお知らせします。

DoS攻撃

gnusocial.jpの普段のCPU使用率は100とか200くらいだったのですが、12/21から3000とか4000以上になっていました。私が攻撃を認知したのは、12/25 Sunの昼に大量のパスワードリセットのメールを受信したことがきっかけでした。

今回の攻撃を受けて、gnusocial.jpへの新規登録停止、パスワードリセット無効化、testユーザーのパスワード秘匿、個人サーバーsocial.senooken.jpの一時閉鎖を行いました。

攻撃の時系列の概要は以下となります。

  • 2022-12-25 Sun: gnusocial.jpとweb.gnusocial.jp、senooken.jp、social.senooken.jpに対して合計17万件のパスワードリセットメール
  • 2022-12-26 Mon: 午後14:00-15:00 にかけてgnusocial.jpに対して4万件のパスワードリセットメール
  • 2022-12-27 Tue: 18:39頃-19:00頃、19:40-20:00頃にかけて大量のユーザー登録。ID-81058から81908まで。850ユーザーの登録。
  • 2022-12-28 Wed: 15:00頃から前日の登録ユーザーによる大量投稿。17:00頃からtestユーザーによる大量投稿。

攻撃内容は、ユーザー登録画面のパスワードリセット時のリセットメールの大量送信 (メールボムと呼ぶらしい) と、スパムユーザーの大量登録及び大量投稿でした。後半の攻撃は「速報: 分散SNSでの無差別フォロー・メンション・再帰取得によるDDoS攻撃 | GNU social JP」と同じように感じました。

攻撃は私のGNU socialとWordPressのサイトでした。まず、パスワードリセットができないように、WordPressは「Simply Disable Password Reset – WordPress プラグイン | WordPress.org 日本語」のプラグインをインストールして、パスワードリセットを無効にしました。GNU socialはソースコードを確認して、送信箇所をコメントアウトしました。WordPressへの攻撃は一旦これで終わりました。当初は、フォームリンクだけコメントアウトしていて、API経由でのアクセスがあったため漏れがあり、12/26 Monの攻撃を許してしまいました。

パスワードリセットの無効化は以下のコメントアウトで対応しました。

diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php
index f3192b5dd3..3907323984 100644
--- a/actions/recoverpassword.php
+++ b/actions/recoverpassword.php
@@ -37,9 +37,9 @@ class RecoverpasswordAction extends Action
             $this->clientError(_('You are already logged in!'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
             if ($this->arg('recover')) {
-                $this->recoverPassword();
+                // $this->recoverPassword();
             } else if ($this->arg('reset')) {
-                $this->resetPassword();
+                // $this->resetPassword();
             } else {
                 // TRANS: Client error displayed when unexpected data is posted in the password recovery form.
                 $this->clientError(_('Unexpected form submission.'));   

この段階で、個人サーバーのsocial.senooken.jpは対応に手間がかかるため、落ち着くまで閉鎖にしました。

その後の、12/27 Tueのgnusocial.jpへの大量登録を受け、12/28 WedにUserLimitプラグインで登録上限を設けて、新規登録を禁止しました。新規登録停止後の12/28 Wedの午後から、登録されたスパムユーザーによる大量投稿が始まりました。

スパムユーザーによる投稿は以下のような内容でした。

44befae6ff1d52c487ebad020cf9ea55@gnusocial.jp’s status on Wednesday, 28-Dec-2022 16:09:05 JST44befae6ff1d52c487ebad020cf9ea5544befae6ff1d52c487ebad020cf9ea55
@3e63d56154219ae4@mstdn.jp 6153d1ac78405759

API経由の投稿を禁止すれば止まるかと思い、.htaccessの以下をコメントしてみました。

  ## Uncomment these if having trouble with API authentication
  ## when PHP is running in CGI or FastCGI mode.
  #
  # RewriteCond %{HTTP:Authorization} ^(.*)
  # RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

すると、投稿内容が以下に代わって続きました。

44befae6ff1d52c487ebad020cf9ea55@gnusocial.jp’s status on Wednesday, 28-Dec-2022 16:09:05 JST44befae6ff1d52c487ebad020cf9ea5544befae6ff1d52c487ebad020cf9ea55
@a8fc8f3feef34a95@mastodon.sdf.org 该攻击是从一个网页上进行的,没有使用API。 0c9e6fb237f1a381

日本語に翻訳すると「攻撃は、API を使用せずに Web ページから実行されました。」という意味です。どうやら、中国のDoS攻撃のサービスを利用しているようです。

GNU socialにはユーザー管理画面はなく、画面からは手動で1ユーザーずつ削除するしかありませんでした。さすがに850ユーザーもやっていられないので、DBのuserテーブルから一括削除しました。新規ユーザーは登録時に私gnusocialjpを自動フォローするので、subscriptionテーブルのデータも削除しました。DBの直接操作は怖いのですが止むをえません。

スパムユーザーの削除と、testユーザーのパスワード変更で一旦攻撃が収まったようです。

なお、攻撃を受けた際は解決策が見つかるまでの間は、.htaccessに以下を記述してアクセスを禁止してしのいでいました。

<RequireAll>
  Require all denied
</RequireAll>

なお、一番最初の2022-12-25 14:20頃の攻撃IPアドレスは138.199.21.248でした。IPアドレスでブロックすると、他のIPアドレスに変えて攻撃を継続されました。

告知: Misskey.ioからのドメインブロック | GNU social JP」で攻撃予告していた「カトウ」による攻撃かもしれません。

WordPress

今回の攻撃を受けて、gnusocial.jpのサービスの維持が難しい状況に陥りました。

これのバックアップとして、WordPressで動作しているこのサイトweb.gnusocial.jpにActivityPubプラグインを導入して、個人サーバーとして分散SNSに参加することにしました。

ActivityPub上のユーザー名は (gnusocialjp@web.gnusocial.jp | https://web.gnusocial.jp/post/author/gnusocialjp/) です。mstdn.jpからフォローできることを確認しました。gnusocial.jpからはフォローできませんでした。

WordPressのActivityPub対応は、自分からフォローできないので2019年頃に最初に試したとき以来懐疑的でした。ActivityPubプラグインを導入すると、導入後の画面に関連プラグインが何個か表示されており、その中のFriendsプラグインというので、WordPressからもフォローできると知りました。試したところ、以下のように他のユーザーを購読したり、返信できるようになりました。

自分のイメージとしては、Nextcloud Socialに近いUIの印象を持ちました。なお、このFRIENDS画面は、ログインユーザーしか見れません。悪く無く思いました。

ActivityPubに対応すると、フォロー時のステータスや返信時の投稿が、記事扱いになります。今のサイトはパーマリンクに/年/月/日/を想定しており、1日複数件の投稿に対応できません。そのため、末尾に投稿IDを付与して [/年/月/日/投稿ID/] にパーマリンクを差し替えました。

投稿IDは万が一他のブログサービスに乗り換える場合に、番号が変わるため、互換性の観点からは避けたかったのです。ただ、WordPress内で投稿を固有にすると、投稿IDかスラッグのどちらかしかなく、毎回名前に悩まされるスラッグよりはまし、年月日形式の末尾につければ、最悪投稿IDが変わっても直前のURLで類推できると判断しました。過去のURLがリンク切れしないで済むのが救いです。

Friendsプラグインを導入すると、固定ページ [friends] (ヘッダーのFriends (既定: Welcome to my Friends Page)) が追加されます。

他のFriendsプラグインを導入したWordPressであれば、この画面から自分のサイトのURLを入力すると、フォローできるようです。

WordPressの投稿に対して、分散SNSで返信すると、サイトのコメント欄と連携されます。RSSリーダーのつもりで、よければフォローしてみてください。

結論

gnusocial.jpへのDoS攻撃と、web.gnusocial.jpの分散SNS化でした。

GNU socialはメンテナンスされておらず、攻撃に対する防衛策が少なく、一般登録サーバーでの運営は、攻撃被害時にハードルが高く感じました。苦しくて、このまま閉鎖してしまおうかとも思いましたが、ひとまず一旦対応できてよかったです。

この攻撃を受けて、あまり詳しくない保安についていろいろ調べて勉強になりました。また、何か攻撃を受けたときに備えて、web.gnusocial.jpの分散SNS化も判断できて、これはこれでよかったです。

まだ今後も攻撃を受けそうな気がしますが、頑張って対応したいと思います。

GNU socialの立て直しは元々ハードなゲームになると思っていましたが、2022年の終わりに相応しいできごとでした。2023年の年末にどうなっているかが全てですので、懲りずに精進します。

Comments

  1. カトウ says:

    自業自得で草

  2. test

  3. This Article was mentioned on web.gnusocial.jp

  4. This Article was mentioned on web.gnusocial.jp

  5. This Article was mentioned on web.gnusocial.jp

  6. This Article was mentioned on web.gnusocial.jp

Ads Blocker Image Powered by Code Help Pro

広告ブロッカー検知/Ads Blocker Detected

このサイトは会費と広告で運営されています。[Bronze=月220円以上に登録] するか、広告ブロッカーを無効にしてください。

This site is operated by membership and advertise. Please [register at least Bronze=220 JPY/month], or disable ads blocker.

Copied title and URL