Skip to content
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

Make the invitation code longer to prevent brute force attacks. #11156

Closed
MineCake147E opened this issue Jul 7, 2023 · 24 comments
Closed

Make the invitation code longer to prevent brute force attacks. #11156

MineCake147E opened this issue Jul 7, 2023 · 24 comments
Labels
✨Feature This adds/improves/enhances a feature

Comments

@MineCake147E
Copy link

MineCake147E commented Jul 7, 2023

Summary

const code = secureRndstr(8, {
chars: '23456789ABCDEFGHJKLMNPQRSTUVWXYZ', // [0-9A-Z] w/o [01IO] (32 patterns)
});

Currently, the invitation code space is only $32^8 = 2^{40} = 1,099,511,627,776$.
Let us consider generating random invitation codes by pseudo-random numbers that allow non-reciprocal extraction, such as LCG in 40-bit state, to obtain valid invitation codes.
The probability that there are exactly k valid invitation codes out of n generated invitation codes is by hypergeometric distribution,
$$\frac{\binom{K}{k}\binom{N-K}{n-k}}{\binom{N}{n}}$$
K is the number of valid invitation codes and N is the total number of possible invitation codes.
Also, the expected number of valid invitation codes if n invitation codes are generated,
$$n\times \frac{K}{N}$$
And the expected value of the number of generation times required to obtain one valid invitation code is,
$$\frac{N}{K}$$
As the number of valid invitation codes increases, the number of required generations decreases.
For example, Misskey.io has 240,000 users. If all of them created 16 invitation codes each without using it, there would be $240,000*16=3,840,000$ of valid invitation codes.
The expected number of invitation codes to generate before one valid invitation code is obtained is
$$\frac{1,099,511,627,776}{3,840,000}=286,331.1530666... $$
and that means that at most 290,000 attempts will yield one valid invitation code.
290,000 is a lot of attempts for a single person to get an invitation code. However, if more than one person performs a random attempt with a script or other means, and even one successful attempt is made, the successful experience will be spread. As a result, more people may try random invitation code generation, resulting in many people being able to create accounts through fraudulent means.

To avoid this situation, I think the invitation code needs to be longer, e.g., 16 characters.
With 102 characters, the invitation code space would be $32^{16}=1,208,925,819,614,629,174,706,176$, and the expected number of random attempts required to illegally obtain one valid invitation code out of $3,840,000$ valid invitation codes is $3.148244321913096809130666... × 10^{17}$.

@MineCake147E MineCake147E added the ✨Feature This adds/improves/enhances a feature label Jul 7, 2023
@tamaina
Copy link
Contributor

tamaina commented Jul 7, 2023

Bot認証で十分では?

@syuilo
Copy link
Member

syuilo commented Jul 7, 2023

CAPTCHAを有効にしていればプログラムで自動で試行したりができないから問題ないと思われる

@MineCake147E

This comment was marked as off-topic.

@syuilo
Copy link
Member

syuilo commented Jul 7, 2023

ほむ

@ghost
Copy link

ghost commented Jul 7, 2023

これ、新規登録試みるのレートリミットあるから別に長くしなくてもいいのではと思ったり思わなかったり。
あとそもそも招待コードって発行されないと使えないんじゃなかったっけ

@MineCake147E

This comment was marked as off-topic.

@u1-liquid
Copy link
Contributor

招待コードは事前に用意するものではなくユーザー(またはアドミン)が要請した時発行されるので、通常は総当たりされても問題ないです。
もし横取りされたとしても有効な資格がある人なら発行してくれた人にもう一度聞いて発行してもらえばいいので、そんなに問題にはならないはず
総当たりか偶然拾えた方はおめでとう!くらいでいいんじゃないでしょうか・・・
本当に会員管理をしてるサーバーならモデレーターが気付くはずですし

@u1-liquid
Copy link
Contributor

過去に発行された未使用の招待コードをランダム試行により確率で引き当てることを想定しています。

こちらについてはもし対応が必要であればどっちかというと招待コードの使用期限を設定したほうがよさそうです

@ghost
Copy link

ghost commented Jul 7, 2023

使用期限設定は賛成だわ🙂

@MineCake147E

This comment was marked as off-topic.

@syobocat
Copy link

syobocat commented Jul 7, 2023

長くするのには賛成ですが、102文字はさすがに長すぎるかと
言われているような使用期限設定を設けた上で16文字程度にするのがよいのでは

@nenohi
Copy link
Contributor

nenohi commented Jul 7, 2023

文字数を増やす、というよりはMisskeyのAdminやモデレーターが招待コードを管理できる画面を用意するだけで十分な気がします

@syobocat
Copy link

syobocat commented Jul 7, 2023

招待コードの管理画面があった方が良いのは確かだと思います

@CyberRex0
Copy link
Contributor

もう少し現実を見て利便性を考えてほしい

@syuilo
Copy link
Member

syuilo commented Jul 7, 2023

手打ちではなくコピペで使われる場合が多いとしてもまあ16文字程度が上限かな

@meronmks
Copy link
Contributor

meronmks commented Jul 7, 2023

んーーこの提案で招待コードのセキュリティ高められるとして・・・
誰がどういう得を得れるんだろうか?

@syuilo
Copy link
Member

syuilo commented Jul 7, 2023

今の8文字が短いのであれば10文字くらいで良いんじゃねと思った

@tamaina

This comment was marked as abuse.

@ghost
Copy link

ghost commented Jul 7, 2023

招待コードの管理画面の実装だけで充分だと思う
そもそも招待制にしているサーバーなんて大体が小規模なんだから危惧するようなことではないと(そもそも招待コード売れてるところ見たことないし招待コードビジネスなんてすぐなくなると思う)

@MineCake147E

This comment was marked as off-topic.

@u1-liquid
Copy link
Contributor

なんとですね、クレカのCVCは3桁の数字なんですよ・・・

@ghost
Copy link

ghost commented Jul 7, 2023

まぁioには招待コード総当たりページがあるからセキュリティー上げる必要なさそうなの

@MineCake147E MineCake147E closed this as not planned Won't fix, can't repro, duplicate, stale Jul 7, 2023
@yuriha-chan
Copy link
Contributor

招待コードを長くした場合、招待コードを当てるより既存のユーザーのパスワード当てて乗っ取る方が簡単そう
(私は16文字程度のパスワードを使うことが多い)

@sorairolake
Copy link
Contributor

有効期限を先に決めてから、その期間内には総当たり攻撃で破られないであろう文字数に変更するのが良いと思います。

@MineCake147E MineCake147E changed the title Make the invitation code longer to prevent brute force attacks. (総当たり攻撃を防ぐために、招待コードを長くする。) Make the invitation code longer to prevent brute force attacks. Jul 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
None yet
Development

No branches or pull requests

10 participants