Twisted IRCサーバーで認証なしにサービス停止のおそれ
概要
Twisted の IRC サーバー機能に、改行のない大量のデータを送り続けると、メモリを使い果たしてサーバー全体が停止するおそれの脆弱性が見つかりました。認証の前でも攻撃でき、影響は 26.10.0rc1 より前の版です。修正版の 26.10.0rc1 以降へ更新してください。
AI要約
外部の AI が作成した要約です。誤りを含むことがあります。重要な判断の前に、下の原文と参照URLを確認してください。
Twisted の IRC サーバー機能に、改行のない大量のデータを送り続けると、メモリを使い果たしてサーバー全体が停止するおそれの脆弱性が見つかりました。認証の前でも攻撃でき、影響は 26.10.0rc1 より前の版です。修正版の 26.10.0rc1 以降へ更新してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| twisted | twisted | — | — |
| pip | Twisted |
26.10.0rc1 未満 |
26.10.0rc1 |
| PyPI | twisted |
26.10.0rc1 未満 |
26.10.0rc1 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Summary
An unbounded-buffer vulnerability (CWE-770) in the Twisted words IRC server lets any unauthenticated remote client exhaust server memory. twisted.words.protocols.irc.IRC.dataReceived appends every received byte to a per-connection buffer and only removes data at a line feed, with no maximum length. Because IRC is a plain Protocol and not a LineReceiver, one connection that streams bytes without a line feed grows the buffer without bound and drives the whole single-threaded process to out-of-memory, dropping every user at once. The twistd words server inherits the method unchanged through IRCUser, and the data is buffered before any authentication.
Details
IRC.dataReceived keeps everything up to the last line feed in self.buffer:
# twisted/words/protocols/irc.py
class IRC(protocol.Protocol): # not a LineReceiver, so no MAX_LENGTH
buffer = ""
def dataReceived(self, data):
if isinstance(data, bytes):
data = data.decode("utf-8")
lines = (self.buffer + data).split(LF)
self.buffer = lines.pop() # no 3line feed -> whole input stays buffered
...
With no line feed in the data, lines.pop() returns the entire accumulated content to self.buffer, so it grows by every chunk and is never bounded; IRC defines no MAX_LENGTH, no lineLengthExceeded, and no timeout, so the connection is never closed. The twistd words server protocol IRCUser subclasses IRC without overrid…
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory