FuelPHPのCSRF対策トークンは何が問題だったのか

本質的な意味でCSRF対策とは何か、ということを、FuelPHPの実装をネタに学ぶことができました。
7
Kousuke Ebihara💉💉 💉 💉 @co3k

PHP の uniqid() と time() の組ってどっちも時刻情報に基づくので割と予測可能なのでは……

2012-06-06 12:05:35
田中ひさてる @tanakahisateru

話題のFuelPHPのCSRFの件は https://t.co/e2Wh7p5p あたりかな。 uniqid() がもうすでに時刻に準拠した値なのに time() 付けてもねぇ、このソース公開しちゃってるしねぇということ?

2012-06-06 14:06:50
Kousuke Ebihara💉💉 💉 💉 @co3k

@brtriver その cookie 値は構築したサイトの機能を使って書き換えた感じでしょうか?

2012-06-06 14:15:43
Kousuke Ebihara💉💉 💉 💉 @co3k

@brtriver おっとごめんなさい返信しようと思ったツイートを削除されてましたね><

2012-06-06 14:16:06
田中ひさてる @tanakahisateru

あー、あと hidden と Set-Cookie に同じ文字列が登場しないかなこれ。サーバ側でsalt使って暗号化してる、クライアント側では絶対に作れないものじゃないと、セキュリティ的にサーバ側のセッションと等価なものにならない。って、たしかCIでもやってたと思う。

2012-06-06 14:16:31
Masao Maeda @brtriver

@co3k あ、まさにそこで勘違いしてたので削除しました。

2012-06-06 14:16:43
Masao Maeda @brtriver

さきほどのFulePHP1.2のCSRF問題を訂正。Cookieとhiddenが同じ値になってる事が問題ではなく推測不可能なユニークな文字列になっていないことが問題ということか。

2012-06-06 14:17:50
Fumito Mizuno @ounziw

@tanakahisateru hidden とクッキーの値が同じになりますね。 #fuelphp

2012-06-06 14:18:54
田中ひさてる @tanakahisateru

@brtriver え、同じ値になるところは問題じゃないんですか?

2012-06-06 14:19:28
Fumito Mizuno @ounziw

@tanakahisateru @brtriver 同じになるのは問題だと思います。第三者が cookie の値を知れば CSRF が成立してしまいます

2012-06-06 14:20:40
田中ひさてる @tanakahisateru

@ounziw ということは、postとcookieのcsrfになんか適当に同じ値を入れたら、ホントのフォームからもらった券じゃなくても、通ってしまうのですか?

2012-06-06 14:25:37
Masao Maeda @brtriver

@ounziw @tanakahisateru cookieの値を攻撃者が知り得る脆弱性があれば駄目と思いますが。無いという前提で。セッションCookieのように。

2012-06-06 14:27:26
Fumito Mizuno @ounziw

@tanakahisateru おそらく通ってしまいますね。post の値だけでなく、cookie を操作するので、攻撃の手間は増えますけど

2012-06-06 14:28:22
田中ひさてる @tanakahisateru

@brtriver @ounziw えと、コードを見ると、攻撃者は本当のcookieの値を知る必要はなくて、それっぽく捏造したものを使えば済むと思います。

2012-06-06 14:30:59
Fumito Mizuno @ounziw

@tanakahisateru @brtriver core/classes/security.php を見ると単純に===なので、cookie と post の両方を書き換えれば攻撃成立ですね

2012-06-06 14:34:45
Kousuke Ebihara💉💉 💉 💉 @co3k

@brtriver まあ、 cookie がどうこうというより、任意の CSRF トークンがクライアント側のみでなんとかすれば指定できてしまう状況というのは依然として問題だと思いますね。同じタイミングで直せるならついでに直してもらいたいところですが……

2012-06-06 14:35:53
田中ひさてる @tanakahisateru

なんか大丈夫じゃなかったみたいな気がする...

2012-06-06 14:36:17
田中ひさてる @tanakahisateru

なんかこれってつまり、hiddenとcookieに違うsailtでmcryptかけて与えて、サーバでそれ復号してから照合したら済むんじゃないのかな?

2012-06-06 14:44:11
Masao Maeda @brtriver

@tanakahisateru @ounziw 秘密情報が正しいかのチェックですよね?(十分予測不可能な秘密情報になってないけど) http://t.co/uDZkcGUF

2012-06-06 14:56:39
kenjis @kenji_s

@ounziw @tanakahisateru @brtriver 攻撃者がどうやってcookieを書き換えるのでしょう?

2012-06-06 14:56:42
田中ひさてる @tanakahisateru

@kenji_s @ounziw @brtriver もし、罠サイトのフォームがプロキシにpostして、それがhiddenとcookieに適当な値を書いて対象サイトにpostしたら攻撃できないですかね?

2012-06-06 15:07:59
田中ひさてる @tanakahisateru

@kenji_s @ounziw @brtriver CSRFっていう用語が、罠サイトにあるフォームのactionに、直接攻撃対象のURIが書いてあるものだけを指すのでしょうか? だとすると僕の理解が及んでないだけなんですみません。

2012-06-06 15:10:30
kenjis @kenji_s

@tanakahisateru @ounziw @brtriver 罠のサイトのフォームから別のサイト(Proxy)にPOSTしたら、Cookieが飛ばないのでは?

2012-06-06 15:19:05
Fumito Mizuno @ounziw

@tanakahisateru @kenji_s @brtriver 具体的なcookie書き換え方法は分からない(無いかもしれない)ですが、単に同じ値をセットすれば攻撃成功、という状況は避けるべきだと思います。

2012-06-06 15:22:19