-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Missing global per-ip rate limit leads to service abuse #14951
Comments
The current outcome of this issue is that we're having to report service abuse to hosting provides of misskey instances that are being attacked and used to spam the Fediverse. To maintain a good standing within the Fediverse, implementing rate limiting is a necessity. IFTAS has been tracking these spam attacks and coordinating responses. |
(translated) 💡 まとめ 🥰 予期される動作 🤬 実際の動作
|
This suits better as a feature request than bug report. |
はっきり言ってこのアイデアは気に入らないです。 「偽陽性率ができるだけ低くなるような防御方法」という点において、このissueは少し考えればわかるような欠点を抱えています。一番大きな点は変動IPアドレスや共有IPアドレスについて全く考えられていないことです。一般にIPアドレスと言っても、IPv4アドレスとIPv6アドレスの2種類が存在し、全世界において広く普及しているのはIPv4アドレスになるであることは自明に了解されるものかと思います。現時点のIPv4アドレスの割当はISPのポリシーによっても異なりますが、時間帯によって異なるエンドユーザーへ割り当てられたり、NATのように終端がISP側のゲートウェイだったり、ルーターの電源を消すと違うIPアドレスが割り当てられたりといつまでも同じIPアドレスで有り続けるケースのほうが少ないです。IPv6アドレスであればCIDR記法における/64以下がランダムに割り当てられるケースが多いためなおのことそうですが、日本以外ではIPv6網があまり普及していないためここでは考えないことにします。 |
私もKisaragiEffectiveさんと同意見で、その機能を実現するのはMisskey本体ではなく、もしどうしてもあなたがその機能が必要であるならば、前段のFirewallやWAFで実現するの方が本質的な問題解決のアプローチであるように思います |
Whilst I'm aware that IP rate limiting isn't the pinnacle of security, it's certainly a low cost measure. If the limit is say 2000 request's within a 5 minute window, that'd allow an apartment with NAT to have 500 requests per person assuming 4 people all use the exact same Misskey server. But right now Misskey's approach is not mitigating spam and flood attacks, so something must be done to improve that situation. Increasing difficulty of attacks is one such measure. You could also do a global limit on posting or the hemming distance between recent posts. However, Misskey should not become synonymous with spam from japanese script kiddies fighting like the school children they are over discord servers. -- IPレート制限はセキュリティの頂点ではないことは承知していますが、確かに低コストの手段です。制限が5分間のウィンドウ内に2000件のリクエストの場合、4人全員がまったく同じMisskeyサーバーを使用していると仮定すると、NATのあるアパートで1人あたり500件のリクエストが可能になります。 しかし、現在、Misskeyのアプローチはスパムや洪水攻撃を緩和していないため、その状況を改善するために何かを行わなければなりません。 攻撃の難易度を上げることは、そのような手段の1つです。また、投稿のグローバル制限や、最近の投稿間のヘミング距離を設定することもできます。 しかし、ミスキーは、不和サーバーを介して学童のように戦う日本のスクリプトの子供たちからのスパムの代名詞になるべきではありません。 |
At this point, the fix on #14811 (already released in alpha) should improve the problem. (One thing to bear in mind is that the attackers' main base of operations is Japan, where Misskey is preferred over other countries. Some of the servers under attack have also stopped updating altogether. It is already possible to limit the rate limit per actor on a role-by-role basis.) |
「なんらかの対策が必要である」という点において完全に同意できます!私も悩まされている管理人の一人です。 一つの解決策として、フォークではありますが以下のような実装があります 私はこのPRが公式にMisskeyにバックポートされないのは、Fediverseの自由の守護の観点で公式に取り入れることができないのではないかと思っていますが、私はMisskeyの開発グループの一人ではないので真意のほどはわかりません。 このような点を踏まえて、CloudflareのようなWAFの側で制限を行うという手順であなたの期待を達成するのは現実的な手段であるように思います。 |
相互フォローかは判定する方法は確かに現状ないですが、自らのサーバーからのフォローがいない場合にメンション数制限を行う等は現時点でのコンディショナルロールによる制限でも可能です(Misskeyでのリモートユーザーのフォロー・フォロワー数は自サーバーのユーザーのみがカウントされるため) |
Another option you might have at your disposal is making access tokens short-lived and requiring that they be refreshed from time to time. That would make preparing a list of tokens for attack ahead of time more difficult, since they'd expire and have to be refreshed (I currently maintain a lot of the OAuth related things in Mastodon, and moving away from static access tokens is very high on our list) -- 自由に使える別のオプションは、アクセストークンを短命にし、時々更新する必要があることです。 有効期限が切れて更新する必要があるため、攻撃用のトークンのリストを事前に準備することが難しくなります。 (私は現在、MastodonでOAuthに関連する多くのものを維持しており、静的アクセストークンから離れることは、私たちのリストの上位にあります) |
ああ、その方法は利便性とのトレードオフについて詳しく検討する必要がありますが、個人的にはセンスが良いと思います。
なんということでしょう!コンディショナルロールの機能を使って、リモートユーザーの振る舞いをある程度制限することができます。私は全く気づきませんでした。 |
等の理由から当該機能の恩恵というのは少ない気がするけど、よく要望されるものではあるし大したコストも無く実装できるはずだからオプションでやってもよさそう |
Your current rate limit for creating Notes is, if I recall correctly, 300 per hour per account. Maybe there needs to be a lower maximum within a 5 minute timespan? e.g., 20 per 5 minute rolling window? (That's 300 / 60 * 5 * 80%), that would still allow decent uaage within the hour, but would prevent floods where all 300 tokens in the rate limiter couldn't be used as quickly as possible. -- ノートを作成するための現在のレート制限は、私の記憶が正しければ、アカウントごとに1時間あたり300です。おそらく、5分間の期間内により低い最大値が必要ですか?例えば、5分間のローリングウィンドウあたり20?(それは300 / 60 * 5 * 80%です)、それでも1時間以内にまともなuaageを許可しますが、レートリミッターの300トークンすべてができるだけ早く使用できない洪水を防ぎます。 |
That'd mean they'd only be able to publish 20 notes per account per 5 minutes, instead of 300 per account within 5 minutes |
Yes, and late limit factor affect almost all api. |
You currently use the ratelimiter package (did you know about async-ratelimiter for promises? I saw a different implementation in your code to try to support promises) You could have two different instances:
const createNoteFloodLimiter = new Limiter({
id: `per-five:${accountId}:createNote`,
db: redis,
max: 25,
duration: 5 * 60 * 1000 // 5 minutes
}) And then evaluate against both the 300 per hour AND the Though, to be honest, this rate limiting package seems very limited. E.g., this is an alternative I know about from Adonis.js, which has possibly a better API for this type of thing and has burst protection: https://github.com/animir/node-rate-limiter-flexible (It is weird that the ratelimiter package you use requires an entire separate instance per identifier you want to limit, when all the settings are shared) Yes, it's true that the per-five should almost never trigger in normal usage, you can probably work this out to a correct amount using a statistics query on your database to count notes per 5 minute windows to get the right numbers. It might be lower or higher than 25 notes creations. |
あなたが紹介したライブラリは私にとっては初耳なものです。 |
はい、私はそれとそれがエンドポイントでどのように使用されているかを見ました。私はあなたのコードベースをかなり読みました。 (Yes, I've seen that and how it is used in endpoints. I have read your codebase quite a lot.) |
(Original post #14951 (comment)) FYI: Backporting is being discussed here: #14888 |
💡 Summary
Hi, currently there is an issue with Misskey servers being attacked by spam from a discord server. The way the script that I've seen works is to use access tokens for a list of accounts and then to make requests until the individual accounts has exhausted the API request limit for the account. This effectively means that there is no upper bound on the number of requests a malicious actor could make.
As a global middleware on all API requests, Misskey should rate-limit by IP Address, the value for this would depend on the number of concurrent accounts you want to receive API requests from for a single IP address within a given window. For instance, in Mastodon, we have a global rate limit for API requests of 1,500 requests per 5 minutes.
Have such a global per-IP address rate limit in place would prevent Misskey servers from being abused as much by these kids that are fighting over their discord servers.
🥰 Expected Behavior
Too many requests from the same IP Address within a given window results in rate limiting
🤬 Actual Behavior
No rate limiting occurs because all the current rate limits are tied to the authenticated account and there is no global rate limit per IP Address
📝 Steps to Reproduce
n/a
💻 Frontend Environment
🛰 Backend Environment (for server admin)
Do you want to address this bug yourself?
The text was updated successfully, but these errors were encountered: