概要
SSRF ハードニング(DNS リバインディング)と番組表の書き込みロックを主軸に、テスト・リリースゲートの信頼性をまとめて立て直した回。
5.33.0 マイルストーン
変更内容
セキュリティ
- #4524 SSRF allowlist が DNS リバインディングを防げない(検証した IP アドレスで接続していない) — 名前解決の結果を検証したあと、素の URL で接続し直していたため、検証と接続の間に応答が変わると内部アドレスへ到達できた。検証したアドレスへ接続を固定(pinning)する方式に変更し、短縮 URL 展開の各ホップにも同じ検証を通す
- #4574 内部アドレス判定がゼロアドレス(
0.0.0.0/::)を素通りする —IPAddrのprivate?/loopback?/link_local?はいずれも0.0.0.0に false を返すが、connect(2)はローカルホスト宛として扱う。予約・特殊用途レンジ(CGNAT・NAT64・マルチキャスト等)を明示的に拒否するようにした。リリース前レビュー由来
バグ修正
- #4549 カスタムフィードの相対 enclosure URL が解決されず、サムネイルが全滅する — あわせて syslog へ日 2 万行の出力。5.32.1 で 1 台のみ先行適用していたものが、本リリースで全台へ行き渡ります
- #4534 番組表の書き込みが無ロックの read-modify-write になっている — 話数の増分中に別の編集が入ると巻き戻る。Redis の
SET NX EXによる排他(TTL 30 秒)を編集経路とsaveに導入。競合時は 409 を返す - #4575 読み経路のキャッシュ温めがロックの外にあり、書き込みを恒久的に巻き戻す — #4534 の残り穴。読み経路のキャッシュ書き込みだけ
SET NXに分離した。リリース前レビュー由来 - #4537 の残り 2 件 —
next_onの日付整形が明示オフセット付きの値にも UTC 変換を掛けていた件ほか
観測性
- #4560
logger.warnがマスキング層を通らない / カスタムフィードのunresolved_enclosuresが伸び続ける —warnだけ JSON 化とシークレットのマスキングが効いておらず、素の文字列がログへ出ていた
テスト
- #4503 CI・手元でアカウント依存のテストが 1 件も走っていない — テスト用トークンが解決せず、822 件中 304 件が omission のまま
100% passedと表示されていた。あわせて fedi-test-harness の実走をリリースゲートとして明文化 - #4492 / #4516 / #4552 harness 実走で常態化していた失敗 8 件を解消 — うち 1 件は harness 側の実バグ
- #4559 リリースゲートの穴 2 件 — 両系同時実行時のコントローラ取り違えと、omission 集計の fail-open
- #4567 webhook の
endpoint_missing?が route-not-found 以外の 404 も omit する
メンテナンス
- #4508 sinatra 4.2.1 / rack-protection 4.2.1 / tilt 2.8.0 へ更新
- bundle update — ginseng-core 1.16.2、ginseng-web 1.3.46
既知の問題
次リリース(5.34.0)で対応予定です。
- #4573 リモート辞書が 200-with-HTML を掴むと黙って空になる — Google Apps Script のデプロイ URL が失効すると HTTP 200 のまま
text/htmlを返し、辞書が空のまま復旧しない。ログにしか出ないため気付けない - #4576
is_catの webfinger と webhook のimage_urlに SSRF 検証が掛かっていない — #4524 / #4574 で塞いだのは短縮 URL 展開の経路。この 2 経路は修正範囲が広いため独立サイクルに分けています - #4558 番組表の
next_onにTimeを手書きすると、Redis キャッシュ往復で無効値になる —var/program.yamlを手で編集した場合のみ発生します
アップグレード手順
更新手順を参照してください。
4.x系からのアップグレードは4.x → 5.0 アップグレードガイドも参照してください。
必要 Ruby: 4.0.6(.ruby-version。5.32.x から据え置き)。未導入のサーバーは rbenv install 4.0.6 が前提です。
Gemfile.lock に更新があるため bundle install が必要です。BUNDLED WITH が 4.0.18 に上がっているので、bundler が古いサーバーでは bundle install の前に gem install bundler -v 4.0.18 を明示してください(FreeBSD では bundler の自己インストール → 再 exec が失敗することがあります)。
本リリースに起動スクリプトの変更はありません。