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 JST44befae6ff1d52c487ebad020cf9ea55 @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 JST44befae6ff1d52c487ebad020cf9ea55 @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年の年末にどうなっているかが全てですので、懲りずに精進します。
詳細プロフィール。SNS: X Twitter/GS=gnusocialjp@gnusocial.jp/WP=gnusocialjp@web.gnusocial.jp。2022-07-17からgnusocial.jpとweb.gnusocial.jpのサイトを運営しています。WordPressで分散SNSに参加しています。このアカウントの投稿に返信すると、サイトのコメント欄にも反映されます。
Comments
自業自得で草
test
This Article was mentioned on web.gnusocial.jp
This Article was mentioned on web.gnusocial.jp
This Article was mentioned on web.gnusocial.jp
This Article was mentioned on web.gnusocial.jp