[META] Transport payload-size limits: consistent, correct, cross-transport enforcement
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 15/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- python
- 領域
- backend, networking
調査の方向性
これはトラッキング用の epic なので、ここで変更を加えるのではなく、子 issue 1908、1909、1910、1911 と Crossbar issue 2250 から始めてください。合意済みの設計と onFrameData の enforcement point を読み、各子 issue にそれぞれテスト済みの PR があり、一覧にある作業がすべて完了した時点で epic は完了です。
索引モデルが issue の本文から書いたものです。
説明
Summary
This is a tracking epic for a coordinated hardening of payload/message size
limits across the Autobahn|Python transports (WebSocket + RawSocket) and their
use in Crossbar.io. It originates from a reported denial-of-service issue
(security advisory GHSA-hxp9-w8x3-p566, "permessage-deflate bypasses
maxMessagePayloadSize after inflation", reported by Team Atlanta), but the
investigation surfaced a small cluster of related defects and design gaps that
are best fixed together so the size-limit model is finally coherent.
No development happens on this issue. Each child below is fixed on its own
issue + branch + PR, following our TDD red/green workflow (add the failing test
first, prove it red in CI, then fix, prove it green — all on the child's PR).
This epic is closed manually once all children are done.
The core problem: one knob, four possible meanings
There are two independent axes to a "size limit":
| on-the-wire (compressed) | at-the-application (uncompressed) | |
|---|---|---|
| per-frame | maxFramePayloadSize (correct) |
(no knob — covered transitively) |
| per-message | (no knob — covered transitively) | maxMessagePayloadSize |
Today maxMessagePayloadSize is documented as bounding the "re-assembled
payload" (uncompressed), enforced on send against the uncompressed message,
and enforced by RawSocket against the (uncompressed, no-compression) wire
message — but on the WebSocket receive path (Hybi/v13) it is enforced against
the compressed frame length, before inflation. A tiny compressed frame can
therefore inflate past the configured limit and reach the application. Hixie
(v0) already accounts uncompressed bytes correctly; Hybi is the outlier.
Agreed design (see child issues for detail)
- D1 — semantic anchor.
maxMessagePayloadSize= maximum size of a single
serialized WAMP message (transport payload), measured uncompressed — i.e.
before compression on send, after decompression on receive. This is already
true on send, on RawSocket, and on Hixie receive; we bring Hybi receive in
line. Default stays0(unlimited), so no existing deployment changes. - D2 — two knobs, correctly defined.
maxMessagePayloadSize(per-message,
uncompressed) +maxFramePayloadSize(per-frame, wire). The other two matrix
cells are covered transitively (enforcing the uncompressed per-message cap
during inflation also bounds a single-frame bomb; bounding uncompressed
transitively bounds accepted wire bytes). We deliberately do not add more
knobs — the existing two, defined correctly, are sufficient and less confusing. - Enforcement site. Backend-agnostic, at the inflation site in
onFrameData, so it works identically in message mode and streaming
(frame-based) mode (which differ only by whichonMessage*callbacks a
consumer overrides), and independently of the compression backend
(deflate / snappy / bzip2 / brotli).
Children (dependency-ordered)
- https://github.com/crossbario/autobahn-python/issues/1908
- https://github.com/crossbario/autobahn-python/issues/1909
- https://github.com/crossbario/autobahn-python/issues/1910
- https://github.com/crossbario/autobahn-python/issues/1911
- https://github.com/crossbario/crossbar/issues/2250
Cross-references
- Security advisory: GHSA-hxp9-w8x3-p566 (public; developed in the open).
- Related class: CVE-2016-10544 (ws / Node.js — same compressed-vs-decompressed
boundary mistake). - Ties into the Track T testing epic (parametrized both-backend / both-transport
/ multi-codec size-limit coverage; Crossbar zip-bomb functest into CI).
This work is being completed with AI assistance (Claude Code); all commits are
human-reviewed per AI_POLICY.md.
- 主要言語
- Python
- スター
- 2.5k
- フォーク
- 767
- 平均マージ
- 23時間 55分
- マージ済み PR(30日)
- 25
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
crossbario/autobahn-python のほかの issue
-
CI-CD enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
crossbario/autobahn-python#1945 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug CI-CD
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
crossbario/autobahn-python#1932 ·
メンテナーはふだん 1 日以内に返信
-
CI-CD enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
crossbario/autobahn-python#1829 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug CI-CD
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
crossbario/autobahn-python#2013 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
crossbario/autobahn-python#1963 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
crossbario/autobahn-python の issue をすべて見る
似ている issue
-
Project submission:オープン
難易度 1/5 1時間未満 初心者へのやさしさ 72/100
slavakurilyak/awesome-ai-agents#845 ·
メンテナーはふだん 1 日以内に返信
-
tests: pin that the atomic writers in utils/paths.py stage the temporary file in the target's directory対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンdifficulty:2 enhancement good first issue
難易度 1/5 1〜3時間 初心者へのやさしさ 92/100
MakazhanAlpamys/Soup#2178 ·
メンテナーはふだん 1 日以内に返信
-
[BUG] dcg.waggr permutation p-values are folded twice, so near-zero scores get the smallest p-valuesオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
scverse/rapids-singlecell#854 ·
メンテナーはふだん 1 日以内に返信
-
Slang input: int8_t4_packed and uint8_t4_packed are copied into CrossGL対応中かも @ninglinLiu が 1 日前に担当しました。 オープンarea:frontend backend:slang bug direction:input
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
random_elements(unique=True) on an OrderedDict: ZeroDivisionError once only zero weights remain, AssertionError with use_weighting=False対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
メンテナーはふだん 13 日以内に返信