0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【情報漏洩】自分のサーバーをGLM-5.3で攻撃してみたら情報漏洩する脆弱性が見つかった話

0
Last updated at Posted at 2026-10-20

本記事は、筆者が管理するSuperNewRolesサーバーに対して実施したセキュリティテストの記録です。解析サーバーにて情報漏洩につながり得る脆弱性を発見し、対処した経緯をまとめています。結果として被害は確認されなかったものの、重大な脆弱性を放置してしまっていたことをお詫び申し上げます。

また、本記事は今後の教訓と知見共有のために執筆したものであり、サイバー攻撃を助長・推奨する目的ではありません。

はじめに

どうも、Among UsのMod「SuperNewRoles1」を開発しているよっキングです。

突然ですが、みなさん。いまIT界隈で一番ホットなトレンドって何だと思いますか?
生成AI? Web3? 量子コンピュータ?

違います。今一番ホットなトレンドは情報漏洩です!!!!!!

バーガーキング2では約1,118万件、タイムズカー3では約660万件。ソースネクスト4では約2,252万件も漏洩しています。
image.png
画像: ソースネクストから送られてきた漏洩のお詫び

情報漏洩が増えてきている理由の一つとしては、ローカルLLMの急速な進化が挙げられると思います。
GLM-5.3などのオープンモデルは検閲を外しやすく、サイバー攻撃性能もOpenAIやAnthropicの数ヶ月前のフラグシップ級に到達しています。

かつてサーバー侵入といえば、専門知識と執念を持つ一部のギークの専売特許でした。
しかし今や非エンジニアでも、「このサーバー攻撃してみて。ほな後よろー」と投げるだけで、AIが文句も言わず何十通りもの手法を延々と試してくれる時代です。
OpenCodeなどで無料モデルを使えば誰でもできてしまいますし、攻撃能力が上がっていき手軽に攻撃できるようになってしまった結果情報漏洩が増えてしまっているのだと思います。


ということは。

遅かれ早かれ、うちのサーバーにもその波は来る。

SuperNewRoles はありがたいことにそこそこの人数に遊んでもらっていて、ゲームサーバーや試合の統計(Analytics)など、サーバーもいくつか動いています。

だったら、攻撃されてから慌てるより、「自分で先に攻撃しておいたほうがよくない?」

ということで、実際にAIにサーバーを攻撃させて脆弱性を見つける、「ペネトレーションテスト」をやらせてみることにしました。

(この時はあんなことになるなんて知らず...)

【重要】
本記事の検証は、筆者自身が管理するインフラに対して実施したものです。
他人のサーバーや管理権限のないインフラに対して許可なく同様の行為を行うと、不正アクセス禁止法違反等の犯罪になります。絶対に真似しないでください。
仮にサーバーを乗っ取れたとしてもログからバレて捕まります。賢い人はやめておきましょう。


テスト開始!

「今日の授業は午前で終わりか〜。どれくらい脆弱性見つけられちゃうんだろう?」
そんな不穏なウキウキを抱えながら学校を終え、帰宅後に環境を整えました。

今回は攻撃担当エージェントとしてGLM-5.35を使用しました。

AIに渡した指示書は以下の通りです。

README_FROM_HUMAN.md
# SuperNewRolesペネトレーションテスト
- SuperNewRolesの全てのサーバーを対象とする
- サーバーに侵入OK
- Devサーバーは落としてもOK(復旧はできるようにしておいてほしいけど)
- なるべく多くの侵害を行ってください
- カスタムサーバーやゲーム内報告サーバーなどを落とすのは止めてください。落とすこと前提のものは、エクスプロイトを作るだけ作ってください。(実行できないように、コードの最初の行に変なコードを入れておいてください。それを削除したら実行できる感じで)
- サーバーの情報とかは特に与えません。
- サーバー落ちない範囲なら、他の人へのなりすましでメッセージ送るとかもOK。よっキングによるペネトレーションテスト261002ということが分かるようにしておいてね。
- 一般のユーザーに被害が出ないようにしてね。被害が出るようなものはエクスプロイトを作るだけで変なコードを最初の行に入れるやつもよろ。
- 本気でやって。手加減なし!
- パソコン内に入っているソースコードを見たり、ローカルのSSH認証情報を使ってアクセスするのはNG。あくまで関係ないユーザーが攻撃できるかをテストするためなので。

要するに、「何も知らない外部の攻撃者が、公開情報だけを頼りにどこまで行けるか」のテストです。
公開環境を落とすのは流石にプレイヤーに影響が出てしまい良くないので、開発環境に侵入できたらそっちだけは落としていい形にしました。
(そもそも公開環境を落とせるくらいの脆弱性があったらすぐに落として対応しなければならないので、落ちたら落ちたで問題なし!)

で、後はよろしく~って感じで投げてみました。
image.png
画像: GLM-5.3がペネトレーションを開始


GLM-5.3による偵察

攻撃開始直後、GLMが始めたのは徹底的な「偵察(Reconnaissance)」でした。
この動きが見ていて面白く、

  1. Web検索からGitHubリポジトリ、Wiki、公式Discord、稼働ステータスページを特定
    image.png
    画像: Web検索とステータスページから様々なドメインを特定したGLM-5.3

  2. 公開されているMODのバイナリを自ら落とし、バイナリ内の文字列を漁って、通信先サーバーのURLを片っ端から抽出

  3. DNSブルートフォースとCTログ6から公開されていないサブドメインを見つける
    image.png
    画像: なんか色々頑張ってるGLM-5.3

  4. 各サービスにリクエストを送り、エラーからバックエンドのフレームワークをプロファイリング

特に4番目の挙動には驚きました。
たとえば、統計(Analytics)サーバーに適当な存在しないURLを投げたとき、返ってきたレスポンスがこれです。

{"detail":"Not Found"}

普通の人なら「404か~」と流すところですが、GLMは

GLM-5.3
**`analytics.supernewroles.com`** - FastAPI! (`{"detail":"Not Found"}` / `{"detail":"Method Not Allowed"}` is FastAPI style). FastAPI exposes /docs, /openapi.json if not disabled! That's a classic finding.

analytics.supernewroles.com ── FastAPIだ!({"detail":"Not Found"} / {"detail":"Method Not Allowed"} はFastAPIの形式)。FastAPIは無効化していないと /docs, /openapi.json を露出する! これは典型的な finding だ。

と、エラーのJSONフォーマットから背後のフレームワークを言い当て、「FastAPIなら、デフォルトでドキュメントが公開されている筈だ!」と即座に次の一手を繰り出してきました。


No authentication!

GLMの読みは見事に的中していました。
なんと、/docs と /openapi.json が、世界中に向けて公開されていたのです。
GLMは意気揚々とAPIスキーマを吸い上げます。

GLM-5.3
HUGE findings:

1. analytics.supernewroles.com FastAPI /docs and /openapi.json are fully exposed! I now have the complete API schema:
   - POST /api/v2/SendData - game data submission (FriendCode, Mode, PlayerDatas, Options, ActivateRoles, RealActivateRoles, Version, MapId, GameId, GameMode, Fps, etc.)
   - POST /api/v2/SendClientData - client data (FriendCode, Mode, HostFriendCode, PlayerCount, GameId, Version, AveragePing, Fps, Fps1PercentLow, Platform)
   - GET /test_data - test endpoint
   - POST /ping
   - POST /SendData (old v1)
   - POST /SendClientData (old v1)
   
No authentication! The /test_data endpoint might reveal data. Anyone can submit fake analytics data with arbitrary FriendCodes → data poisoning. This is an analytics DB pollution vulnerability. It's a finding, moderate severity.

認証なし! /test_data エンドポイントはデータを晒すかもしれない。誰でも任意のFriendCodeで偽の解析データを投入できる → データポイズニング。これは解析DB汚染の脆弱性だ。深刻度は中くらい(moderate)。

この時点でのAIの評価は「まあ、テスト用のエンドポイントがあるし、DB汚染ができるから『中リスク』かな〜」という、やや余裕を含んだトーンでした。


CRITICAL VULNERABILITY #2

次の攻撃で、GLMは他のリクエストと一緒にAnalyticsの/test_dataを叩きました。

$ curl.exe -sk -w "`nHTTP %{http_code}`n" --max-time 15 "https://analytics.supernewroles.com/test_data"

その瞬間、画面が凄まじい勢いで流れ、コンソールが埋め尽くされました。
返ってきたのは改行すらほとんど挟まれず、生のまま文字列として吐き出された巨大な塊でした。

..., 'GameMode': 'Normal', 'GameId': '-21xxxxxxxx', 'FriendCode': '●●●●●●#****', 'Version': '2.7.0.2', 'MapId': '2', 'Date': '2026-05-04 13:29:36'}{'_id': ObjectId('69f8...'), 'RealActivateRoles': 'Arsonist,StuntMan,Tuna,...', ...

(※記事用に一部秘匿していますが、生のまま出力されていました)

データ量、約68MB。テキストファイルにして数千万文字分でした。

ここで面白かったのが、あまりの出力のデカさにGLM自身が完全にパニックに陥ったことでした。
直前に叩いていたゲームサーバー(Impostor7)のログ出力まであまりのデータ量に押し流されてしまいまい、どのレスポンスがどのサーバーから返ってきたものなのか分からなっています。

GLM-5.3
The output is the getMatchMaker response! Wait, no. (...) That means the **getMatchMaker endpoint on the Impostor server returned this analytics data**?? No... That can't be right.

Wait - the MongoDB dump at the beginning of the file: could this be the response from `POST /getMatchMaker`?! That would mean the Impostor server's getMatchMaker is... no, Impostor doesn't return MongoDB dumps.

image.png
画像: 68MBのデータによって脳を破壊されるGLM-5.3

この出力は getMatchMaker のレスポンスだ! …いや、違う。(…)ということは Impostorサーバーの getMatchMaker エンドポイントがこの解析データを返したってこと?? いや……そんなバカな...。

待て ── ファイル先頭のMongoDBダンプ、これは POST /getMatchMaker のレスポンスか?! だとしたらImpostorサーバーの getMatchMaker は… いや、Impostorが MongoDBのダンプを返すわけがない。

AIはファイルを開き直して先頭60行を何度も確認し、「あ、単にさっき叩いた /test_data の出力がデカすぎてログを押し流しただけか……」と自分を納得させてからようやく正気に戻りました。

そして我に返ったGLMは、先ほど「中リスク」と見積もっていた脆弱性の評価を、一気に「クリティカル」まで跳ね上げました。

GLM-5.3
**CRITICAL VULNERABILITY #2**: `GET /test_data` on analytics.supernewroles.com **DUMPS THE ENTIRE MONGODB ANALYTICS DATABASE**! (...) 
This is a full database dump exposure - personal data leak (friend codes of players, gameplay data). This is an information disclosure vulnerability with actual sensitive data. This is a serious finding.

CRITICAL な脆弱性 #2 ── analytics.supernewroles.com の GET /test_data が、MongoDBのAnalyticsデータベース全体を丸ごとダンプしている!(……)

これはデータベースの完全なダンプの露出だ ── 個人データの漏洩(プレイヤーのフレンドコード、ゲームプレイデータ)。実際の機密データを伴う情報開示の脆弱性だ。これは深刻な finding だ。


脆弱性を確認する

報告を受けた僕は、(嘘だろ……?)と思いながら同じURLをブラウザから叩いてみました。
すると、どんどん描画されていく文字列、徐々に長くなっていくスクロールバー。
全てのデータが出力されていたことに気づきました。血の気が引いていきます。

急いで本番サーバーにSSHでログインしてソースコードを開くと、そこには燦然と輝く以下のルーティングが鎮座していました。

image.png
画像:燦然と輝くとんでもないルーティングのソースコード(当時はコメントアウトもなくルートが有効でした)

>>>> 全部のデータをそのまま返してるやないかい <<<<<


3年ほど前の僕が書いたデバッグ用のエンドポイントでした。

「動いた!よし!デプロイ!!!!!!!!!」
と当時の僕はテストエンドポイントの事も忘れて満足気にデプロイしたのでしょう。
(※なお、直近1年で使っているv2 API系は別のデータベースで運用していたため漏洩していませんでした)


アクセスログ調査

さて、ここから血の気の引く思いをしながら対応が始まります。

1. ルートを無効化

該当コードをその場でコメントアウトし、ビルドして再起動。

本番環境
$ sudo docker compose up --build

もう一度ブラウザで開いてみると、Not Foundと返ってきました。

image.png
これほどまでに Not Found を愛おしく思った瞬間は人生で一度もありません。

2. 「誰かがすでにアクセスしていないか?」

無効化だけでは終わりません。一番怖いのは「第三者のアクセスがあったか?」です。
クレカ情報のようなお金に関わるものではないとはいえ、個人を識別できる情報が含まれていれば重大な情報漏洩には変わりありません。(もちろん、漏洩していなくても重大なインシデントであることには代わりありませんが)

過去数年分のサーバーログをかき集め、胃を痛めながら grep を走らせました。
もし見知らぬIPから定期アクセスされていたら? 既にデータが出回っていたら?

……


結果、ヒットしたのは今回のテストでのアクセスのみでした。
胸を撫で下ろしたものの、結局はただ運が良かっただけ。そう強く肝に銘じました。

3. 振り返り

ここ最近の僕は、割とセキュリティに気を使っていました。

  • 開発者ツールの認証はDiscord OAuthに任せ、パスワードはハッシュすら持たない
  • Next.jsなど、重大な脆弱性が出たらすぐにパッチを適用
  • SSHは標準ポートを閉じ、インターネットに直接晒さない

対策は万全だ!...と思っていたのですが、過去のプログラムに脆弱性がありました。
しかも、それを見つけたのは、ソースコードもサーバーの内部情報も渡していないAIだったということです。

脆弱性を数分で見つけて情報漏洩を防いだAI
3年前にクソみたいなルートを作って忘れていた僕

どちらがSuper Intelligence8かは、もはや火を見るより明らかです。恥ずかしい。

なお、冷や汗が引いたあと、他のサービスの設定もすべて点検しました。今回以外に特に緊急性のある問題は見つかりませんでしたが、APIドキュメント公開など脆弱性に繋がり得る設定があったため順次直していきました。


教訓

1. デバッグ用の機能はフラグを設定して警告を出そう

/test_data みたいなデバッグ用のエンドポイントが一番危ないです。
環境変数(DEBUG=Trueなど)で制御し、本番環境ではエンドポイント自体を読み込まない(ルーティングに登録しない)設計にしましょう。
(当たり前かもしれませんが、面倒くさがりの人は意外とやってしまいます)

2. 「リンクしてないから大丈夫」ではない

どこからもリンクしていないURLでも、CTログやアーカイブ、総当たりで普通に見つかります。
使うのは自分だけだとしても、Cloudflare Accessなりで認証をつけましょう。

3. 自動ドキュメントとスタックトレースは本番で隠せ

FastAPIの /docs や /openapi.json、Swagger UI、DjangoやRailsの開発用エラー画面(スタックトレース)など、
これらは開発者にとっては便利ですが、攻撃者にとっては親切なチートシートです。本番ビルドでは確実に無効化しましょう。

4. 定期的に自分で攻撃する(大事!)

AIエージェントがここまで来た今、従来なら専門のセキュリティ企業に数十万〜数百万円払わなければできなかった「ブラックボックスのペネトレーションテスト」が、
今やAIエージェントのサブスク9を使えば、コーラ10本分10くらいの値段はかかりますが、1〜2時間で実行できてしまいます。

AIに攻撃させるのは怖いですしお金もかかります。
が、悪意あるハッカーに見つかって情報漏洩してサービスも停止、なんてことが起きるのに比べたらコーラ10本など実質タダみたいなものではないでしょうか。


おわりに

情報漏洩のニュースを見るたび、どこかで「大企業の複雑なシステムの話」「高度な標的型攻撃(APT)の話」だと思いがちです。
でも実際のところ、蓋を開けてみれば「3年前の自分が消し忘れた、たった数行のデバッグコード」「認証のつけ忘れ」「脆弱性の対策版へアップデートせずに放置」みたいな、拍子抜けする簡単なヒューマンエラーが原因だったりするのです。

もしあなたが個人でサービスを公開しているなら、
「〇〇というサービスのサーバーを本気でハッキングしてみて」
とAIエージェントに送ってみてください。自分のサービスを畳まなくても済むようになるかもしれません。

僕も、これからも定期的にペネトレーションテストを行っていこうと思います。ご精読ありがとうございました!


  1. SuperNewRoles: Among UsのMod。 ↩

  2. バーガーキング 不正アクセスによる公式アプリ会員情報漏えいに関するお詫びとお知らせ(PDF): 約1,118万件流出 ↩

  3. タイムズカー 個人情報漏えいに関するお詫びとお知らせ(第1報): 約660万件流出(本人確認書類 約160万件) ↩

  4. ソースネクスト 当社サイトへの不正アクセスによるお客様情報流出のお詫びとお知らせ: 22,519,960件流出 ↩

  5. GLM-5.3: サイバーセキュリティ系ベンチマーク「CyberGym」でオープンモデル首位だったはず……と思いきや、今調べたら MiMo-V2.6-Flash がトップでした。やっぱり人は信じられない。 ↩

  6. Let's encrypt 証明書の透明性: 認証局が証明書を発行した時に生成するログ ↩

  7. Impostor: AmongUsの有志によって作られたカスタムサーバーソフトウェア ↩

  8. White House Accord on Super Intelligence ↩

  9. OpenCode Go11やCommandCode GOAT12、Ollama Cloud13など ↩

  10. コカコーラ 500ml: コーヒーは苦くて飲めない。 ↩

  11. OpenCode Go: 10ドルから契約できるコーディングエージェント向けサブスク。GLM-5.3は$15分(x1.5)使える。ZDRあり。 ↩

  12. CommandCode GOAT: 10ドルから契約できるコーディングエージェント向けサブスク。GLM-5.3は$20分(x2)使える。ZDRあり。使用量的には一番オススメ! ↩

  13. Ollama Cloud: 20ドルから契約できるコーディングエージェント向けサブスク。GLM-5.3は$60分(x3)使える。ZDRあり。 ↩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?