アルゴリズムに脆弱性があったのかと誤読しかけたけどそんなことなかった。
もともとbcryptは「入力は72バイトまで」という仕様らしいので(好ましくはないけど脆弱性とは言えないと思う)、それをはみ出る長さのユーザー名を入力として使っちゃった側・仕様を考慮しなかった側が悪いってだけのはず。
https://gigazine.net/news/20241105-okta-ad-ldap-delegated-authentication-username/
Conversation
Notices
-
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:08:46 JST 斎藤ただし -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 22:08:44 JST ikeji @tadd goのbcryptは、長い文字列を渡すとエラーを出すらしい。
https://pkg.go.dev/golang.org/x/crypto/bcrypt
> ErrPasswordTooLong is returned when the password passed to GenerateFromPassword is too long (i.e. > 72 bytes).
Pascalは型に文字列の最大長が入ってたっけか?In conversation permalink Attachments
-
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:08:45 JST 斎藤ただし ただbcryptの実装として、73文字以上が渡されたら教える、とかするのはやってもいいかも知れない、いややりすぎかも知れない。
In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:08:45 JST 斎藤ただし 言語処理系側として考えられるのは…強引かもしんないけど、文字列の長さまで型にできる依存型?
73以上の長い文字列がbcryptの処理に渡される可能性を静的に検出する。いやびみょうかもしれないIn conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:08:46 JST 斎藤ただし 差が20バイトあるけど、おそらく先頭のユーザーIDが64ビットの整数で、それを10進で文字列化したものだった(最大20バイト)、としたらとても素直な説明になりそう
In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:38:31 JST 斎藤ただし @ikeji ところでこないだPascal配列 (???) を作ったので自慢しておきます。 https://github.com/tadd/libscary
In conversation permalink Attachments
-
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 22:38:31 JST ikeji @tadd 😀 In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 22:39:34 JST ikeji @tadd Pascal文字列も常に256バイト確保するわけじゃないはずなので、短かくしか確保されてない型があるんじゃないでしょうか? In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 22:39:35 JST 斎藤ただし @ikeji おぉ、それらしい感じだね。Pascalは型でそういうのってあるのかな?1バイト目がヘッダ(長さ)なので255まで、とかいう固定長なのはありそう。
In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:01:01 JST 斎藤ただし @ikeji ざっとFreePascalというのを見たら、むしろ
ShortString = String[255];
と書いてあった。短くても255?
https://www.freepascal.org/docs-html/ref/refsu9.html#x32-370003.2.4In conversation permalink Attachments
-
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:01:01 JST ikeji @tadd それは、Cで言うところの、
typedef char[255] ShortString;
みたいな意味だと思う。In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:09:33 JST ikeji @tadd いや、普通にstring[10]とか使えるよ。 In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:09:34 JST 斎藤ただし @ikeji うん、そう思う。つまり短い=255文字まで、なので、それより短い(というか、確保するバイト数が少ない)型は存在しないんじゃない?と言いたかった
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:26:03 JST ikeji @tadd いや、ShortStringが10個は
array [1..10] of ShortString
だと思う。
http://kaitei.net/pascal/arrays/In conversation permalink Attachments
-
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:26:04 JST 斎藤ただし @ikeji あれ、それは10文字じゃなくて文字列十個だよね?
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:27:09 JST ikeji @tadd ところで、短いやつにキャストしても怒られないだけで、Cも文字列型に長さが入ってると言える? In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:40:18 JST 斎藤ただし @ikeji 型には入ってないよね?つまり(普通のconst char *では)静的には検証できない。
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:40:18 JST ikeji @tadd 例えば、
void a(char b[10]);
a("abc");
は警告出るよね。In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:40:44 JST ikeji @tadd どれがどれへのレスポンスかわからなくなってきた。 In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:40:45 JST 斎藤ただし @ikeji うん、それはそうだけど。なんだか話がかみ合って無い気がする?
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:45:19 JST ikeji @tadd 20年以上前の事でよく覚えてないんだけど、
string →長さが指定できる
ShortString →string[255]へのエイリアス
String → ライブラリが用意する構造体、C++のStringみたいなやつ
とかじゃなかったっけ?他の長さのもあった気がする。In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Thursday, 07-Nov-2024 23:45:20 JST 斎藤ただし @ikeji 何となく分かったんだけど、これはtypedefの例えではないってことかな?
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Thursday, 07-Nov-2024 23:49:28 JST ikeji @tadd さっきのfreepascalのマニュアル見ると違うな。 In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:10:46 JST ikeji @tadd https://web.archive.org/web/20151125114234/http://www.codexterity.com/delphistrings.htm
違いに関してはこれが詳しそう。In conversation permalink Attachments
-
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:10:47 JST 斎藤ただし @ikeji うん、そう思うー
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:18:33 JST ikeji @tadd
ここでは、72文字までを受け取る関数が書きたいという話だったと思う。
CもPascalも最大長を気にしない文字列を受け取る関数も気にする関数も書けるけど、
Cではメモリサイズが大きい文字列を、小さい文字列に渡しても警告も出ないが、
Pascalでは厳密にメモリサイズをチェックする。
と理解した。
Cでchar*で受け取るのも、Pascalでopenstringで受け取るのもできるけど、それは今やりたいことではないのではないかと思った。In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:18:34 JST 斎藤ただし @ikeji うん、それは普通のconst char *じゃないからね。
という、予防線を張っても堂々と無視されると、議論が進まなくてうむむ……In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:33:54 JST ikeji @tadd
https://web.archive.org/web/20151125114234/http://www.codexterity.com/delphistrings.htm をまとめると、
# ShortString (String)
最初からあった文字列型
型に最大長さがある。(デフォルトで255、最大255)
値に長さが保存されてる。
型の長さが違うと違う型として扱われるのでキャストできない。
# openstring
型に最大長さがない。
値に長さが保存されてる。
どの最大長さのShortStringでも入れられる。
ポインタ型とセットでないと使えない。
# PChar
Cのchar*との相互運用用に導入された。ヌル終端。
型に最大長さがない。
値に長さが保存されてない。
# AsciiString
PCharとShortStringの良いところどりをしたい。ヌル終端。
型に最大長さがない。
値に長さが保存されてる。
AsciiStringは、先頭に長さがあって、最後にヌル終端してあるけど、
これはRubyのStringがそうだったなと思った。In conversation permalink Attachments
-
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:33:55 JST 斎藤ただし @ikeji 結論だけおしえてくださると助かる
In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:41:08 JST ikeji @tadd
> - char*で取り回すコードが大量に出回っている現実と、ヒープを受け取りたい必要性があるので、それをchar s[static 73](の逆版)みたいなので置き換えられるとはあまり思えないし、メリットが少なさそう
char* からchar x[n]への変換時に、手動で長さがn以下だとチェックしてなかったら警告出すぐらいなら、コードアナライザとかでできたりしないかな?
メリットないか。
> 想像は、文脈含めて流石にできなかった(できない)と思いますです。
それはすまんかった。
>「Cの文字列型の中には長さが入っているものもある」ならわかる。
「Cでも関数の引数に受け取る文字列の最大長さを記述する事は可能(書いたからと言って何か意味があるとは言ってない)」
ぐらいを言うべきだった。In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:41:09 JST 斎藤ただし @ikeji 「Cの文字列型」と言われたとき、「……のバイト数が明示的に宣言・制限されたものに限る」という修飾子がつく、という想像は、文脈含めて流石にできなかった(できない)と思いますです。
「Cの文字列型の中には長さが入っているものもある」ならわかる。けど文字列型一般ではないと思う。In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:46:19 JST ikeji @tadd あれ、RHGに常にヌル終端だと書いてあった気がするんだけど、変わった?さすがに昔すぎるか? In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:46:20 JST 斎藤ただし @ikeji これでいろいろ考えてたけどとりあえず。Rubyの方はStringValueCStrを呼び出さないと、NUL終端は保証しないはずです(というのがやや最近だったのかも?)。
なので実態としては、「そうであることを助ける機構まではある」くらいじゃないかな。In conversation permalink -
斎藤ただし (tadd@best-friends.chat)'s status on Friday, 08-Nov-2024 00:49:45 JST 斎藤ただし @ikeji コードアナライザとかで、は確かにできそう。メリットある場合もあるかも?その場合はコストと天秤にかけて、Cプログラマが受け入れてよいくらいまで楽で効果的なら、って感じかなぁ。
最後の方のは、一つの案としては、スタックに確保した&バイト数が分かってるやつしか受け入れない、という方針のAPIやらなんやらを作ってみるのはありかもね。
型を強制することによって安全性を確保……になるのかな??かも。In conversation permalink -
ikeji (ikeji@ostatus.ikeji.ma)'s status on Friday, 08-Nov-2024 00:49:45 JST ikeji @tadd DDDとかを熱狂的に信じてる人だと、Stringを受けとるのはケシカラン、BcryptPassword型を作ってそれを渡せ、とか言うのだろうか? In conversation permalink
-