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

announce

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年の年末にどうなっているかが全てですので、懲りずに精進します。

コメント

  1. カトウ より:

    自業自得で草

  2. test

タイトルとURLをコピーしました