自作Discord Botを公開したらスパムに悪用された話
自作したDiscord Botを公開したところ、スパムの踏み台にされてしまいました。原因となったアーキテクチャの設計ミスと、今後のセキュリティ対策についてまとめます。
こんにちは!パン君です。
今回は個人で運用していた Discord Botを公開したら大失敗した という話になります。
先日、僕が運営しているゲーム開発サーバーで事件が起きました。
なんと自作ボットが乗っ取られたかのように、 全く関係ないDiscordサーバーの招待URLをひたすら連投し始めた んです。
原因は僕が作ったボットの アーキテクチャに潜んでいた致命的な設計ミス でした。
今回は自戒を込めて、僕がやらかしたミスとその対策を全部ここに書き残しておこうと思います。
何が問題だったのか?
原因は大きく分けて2つありました。
1. どのサーバーからでも、他のサーバーにコマンドが実行できた
詳細はこちらの記事でも書いたアーキテクチャが根本的な問題でした。
開発者向けにボットを追加しなくても色々な機能を追加できることを目指した結果、「どのサーバーからでもコマンドを実行できる」という仕様になっていたんです。
【なぜこれがヤバかったか?】
この仕様のせいで攻撃者は 自分のサーバーから、僕のゲーム開発サーバーに対してメッセージを送信する という離れ業が可能になっていました。
つまり、Aサーバーで実行したコマンドが全く無関係なBサーバーで発動してしまう状態だったんです。これがスパムの直接的な原因でした。
普通に考えたらマズいですよね。
ファイルベースでも良いので、サーバー(ギルド)ごとに実行できるコマンドを管理すべきでした。
2. 参加サーバーの一覧をリポジトリで公開していた
これも致命的でした。
ボットが参加しているサーバーの情報を guilds.json というファイルで管理していたのですが、これを GitHubの公開リポジトリにアップしてしまっていた んです。
【なぜこれがヤバかったか?】guilds.json には、ボットが参加している全てのサーバーIDがリストアップされていました。
攻撃者はこのリストを手に入れ、標的となるサーバー(僕のゲーム開発サーバー)のIDを特定し、そこに向けてスパムメッセージを送信していたわけです。
個人情報じゃないとはいえ、サーバーIDも立派な機密情報でした...。
今後の対策
今回の反省を踏まえて、ボットの仕組みを根本から見直すことにしました。
Botアプリの再作成 & トークンの完全リセット
まずは今のボットアプリを完全に削除して、新しいアプリとして作り直します。トークンをリセットするだけじゃ不十分なので、クリーンな状態から再スタートです。ギルドごとの権限管理を徹底
コマンドが他のサーバーに影響を与えないように、サーバーID(ギルドID)で完全に処理を分離します。今後はファイルベースのDBで、サーバーごとに許可するコマンドを管理する仕組みを導入します。招待方法を「リクエスト制」に変更
誰がボットを使っているかを僕が把握できるように、招待は公開制をやめて、僕への直接連絡によるリクエスト制に切り替えます。リポジトリのクリーンアップ
ソースコードは引き続き公開しますが、guilds.jsonのような機密情報を含んでしまう可能性があるファイルはリポジトリから完全に削除し、.gitignoreでしっかり管理するようにします。
まとめ
というわけで、今回は僕の盛大なやらかしについての話でした。
「誰でも使えるように」という手軽さを重視した結果、セキュリティという一番大事な視点が抜け落ちていたなと深く反省しています。
ボットはもっと安全な形に作り直していくので、もし「それでも使ってみたい!」と思ってくれる人がいたら気軽に声をかけてくれると嬉しいです。
コメントを読み込み中...