Skip to content

trustProxy: falseでIPベースのレートリミットが機能しないなどの問題がある #16994

@syuilo

Description

@syuilo

今まで trustProxy: true がデフォルトだったが、脆弱性である(IPアドレスを偽装してレートリミットをバイパスできる)との報告があったため、v2025.12.0からデフォルトで false に変更された。

しかし、false だと入ってくるIPアドレスがすべて同じになるため、IPベースのレートリミットが正しく機能せず、誰がアクセスしても同一人物と見做されるようになるため、特定の操作(そのサーバーへのサインインなど)が困難になるといった問題や、IPログが機能しないといった問題が発生する。
※サインアップについては現状レートリミット処理は無いため影響を受けないはず

そのため、すべてのサーバーにおいて、trustProxyを環境に合わせて適切な数字に調整することが運営するうえで必須となっているが、手間なのと、知識が必要なためなかなかハードルがあるように思われる。

そこで何らかの対応を考えたい。

考えられる選択肢:

⓪ 現状のまま

全てのサーバー運営者に対し、サーバーの環境に合わせた適切な段数設定を行うことを強制するのは難しいのではないか。
また、その設定値が正しいのかどうかを簡単に検証する方法もおそらく無い。
Mastodonなど他ソフトウェアはどうなっている?

仮にこのままにするとしても、適切な設定が行われていない限りMisskeyが正しく動作しないということを強く警告する、設定が行われない限り起動不可にするなどの改修が必要

① falseでもサインインできるよう、IPベースのレートリミットを削除する

false、または設定値が正しくない場合でも「サインインなどの操作ができなくなる」という最悪の事態を回避するためにIPベースのレートリミット自体を削除する

ただ、レートリミットが存在しないのは、それはそれで問題があるし、「レートリミットをバイパスできる」ことが脆弱性と見做されるのであればレートリミットが存在しないこと自体がより大きな脆弱性となる

若干脱線するが、IPベースのリクエスト制限というのはMisskeyではなくそれより前のレイヤーの責務である可能性がある
現に特定のIPアドレスをアクセス不可にしたりする設定は今のところMisskeyには存在していない
そう考えるとIPベースのレートリミットがMisskey自体に存在していなくても直ちに「脆弱性」にはならないのではないか?(昔のMisskeyはIPベースのレートリミットは実装されていなかったが、特に脆弱性とは見做されてはいなかった)

② デフォルトでtrueにする以前の実装に戻す(当該コミットをrevert)

デフォルトでtrueとなっている点が今回脆弱性と判定されたが、個人的には、IPアドレスベースのレートリミットは回避しようと思えばtrustProxy: falseであったとしても方法はあると思うのと、仮に回避できたとしても元々厳密性を求めていない(無いよりは有ったほうが良いという感じ)から脆弱性とは違うのではないかという見解。

むしろfalseにすることでレートリミットが機能しなくなることの方がより問題であると捉え、デフォルトでtrueにする以前の実装に戻す。

追加で、「バイパスされるのを防ぐには適切な数値設定を行なってください」といったアナウンスやドキュメントへの注意書きなどを行う。

③ Misskeyとして信頼できないプロキシはサポートせず、設定項目そのものを削除

常にtrueと見做す。

④ trustProxy: 1 をデフォルトにする

今よりは緩和されるが、適切な数字に調整することが必須というのは変わらない

⑤ IPアドレスベースのレートリミットをオプションにする

オプトイン。運営者が適切なtrustProxy設定を行えていると自覚している場合のみオンにする

どれくらいの運営者が適切なtrustProxy設定を行うのかは分からないが、それ以外の運営者の場合やはりレートリミットが使用できないため(IPアドレスを偽装してレートリミットをバイパスできるという問題よりも)セキュリティ上のリスクは大きくなるのではないか。

が、CloudfrareなどMisskeyより前段でレートリミットを行うことは可能だしそっちの方が確実なので、その場合Misskey自体でIPベースレートリミットを無効にしていたとしても問題はない

⑥ trustProxy の信頼境界をデフォルトで明示する

デフォルトで['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '127.0.0.1/32',]にする

今よりは緩和されるが、適切な数字に調整することが必須というのは変わらない(?)

そのような実装にして、デフォルト値から変更しなければならない環境がどれくらいあるのかによる
もし多くのケースでそのままで問題ないのであればそれで良さそう
もし「割とよくある」のであれば、設定を強制させるメリットよりもデメリットの方が上回っていると思われる

またそのように実装して、「変更すべき環境で変更しなかった場合」にどうなるのかが気になる
「IP偽装できる」なのか、逆に「全て同じIPアドレスになる」のか、「そのどちらになるのか自体も環境に依存する」のか
「全て同じIPアドレスになる」または「そのどちらになるのか自体も環境に依存する」の場合は、前述のようにサインイン困難になるなどの致命的な問題が発生する

ⓧ その他

妙案募集中

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions