TKYTEL COMMENT 27 百合子設計局 局長 市川ゆり子 2026-01-15 始末書 (MKN 局の WebSocket サーバを破壊しました) 1. はじめに サーセン 2. 概要 [ゆれ](ゆれを観測するサイト)の WebSocket サーバに任意波形を突っ 込んでイタズラしたいと思い、PoC コードを執筆 & デバッグしていたとこ ろ、2026-01-12 0:53 頃 WebSocket サーバの前段に居た Cloudflare が攻 撃と検知したようで、サービス不能状態に陥った。またサーバに過大な負荷 をかけた。 3. 原因 PoC ということもあり動作確認を優先するため、送出パケットレートの制 限をかけていなかった。また、PoC コードを実行していたマシンの性能が想 像以上に強力で、wait() のないビジーループを超高速で回してしまい、秒 間数千パケット、累計数万~数十万パケットが送出された。 3.1. 元凶となった PoC コード(Python) import time import websocket import json import platform PLATFORM = 'python ' + platform.python_version() + ' ' + platform.release() USER_AGENT = 'YURIdroid (' + PLATFORM + ')' YURE_ID = 'yuri' + str(int(time.time()))[1:10] websocket_url = 'wss://unstable.example.com/yure/' ws = websocket.create_connection(websocket_url) packet_count = 0 while True: buf = [] for i in range(30): buf.append({'t': int(time.time() * 1000), 'userAgent': USER_AGENT, 'yureId': YURE_ID, 'x': 0.1, 'y': 0.2, 'z': 0.3}) ws.send(json.dumps(buf)) packet_count = packet_count + 1 print(str(packet_count)) 4. 発生した被害 - サーバのサービス提供不能 - サーバ管理者による再起動等による復旧作業 - IP アドレスガチャを回して手に入れた送信元 Elastic IP アドレス の被 BAN(yude 氏による) - 停止したサーバを参照していた他サービス yurecollect.yude.jp.eu.org の停止 - 当該通信を司るルータへの負荷の増大 - サーバへの過大な負荷 当時の負荷状況(みかんちゃん提供) $ uptime 00:11:01 up 50 days, 3:54, 2 users, load average: 2.13, 1.56, 0.90 5. 処置 - 始末書(本書)の提出 - 関係各所への詫び石配布(ぉ 6. 対策 PoC コードとは言え、外部へ与える影響をよく考慮してコーディングす る。特に高性能マシンで wait() のないビジーループを回さないように気を 付ける。また可能なら PoC コードは閉じた環境で実行し、外部への影響を なくす。 大量パケット着弾に耐えられる WebSocket サーバ(yure サーバ?)を 設計・開発する(ぇ 7. 幸運 最近書き慣れている Python(遅い)で開発していたため、秒間数千パケ ット程度のレートで収まった。ほかの高速な言語で書いていたらより大量の パケットを送出することができるので、被害が拡大していたかもしれない。 サーバ代をケチるため AWS EC2 の最小性能インスタンス t3a.nano 上で の実行だった。商用環境などでよく使われる m4.xlarge 上だったら秒間 100 万パケットを投げていたかもしれない。 8. まとめ 超うっかりしていた。ちゃんとする。 (サーバが)「ある」のがいけない!!! 「ある」のがいけない!!!(コラ 9. 参照 - サーバ側死亡時の管理者によるツイート - ゆれ 以上