アカウント名:
パスワード:
BSD系のqsortは再帰するからスタック系の攻撃に弱いみたいだね。再帰で書けるなら再帰で、というのが意識高いプログラマかと思ってたけど必ずしもそうではないと。
言うまでもないことだが、再帰は使うメリットが大きい場面で使うものであって、何でも再帰で書けば良いというものではない。
関数型言語「お前は俺達を敵に回した」
Cで、通常想定される程度のスタック使用量で再帰するやつならガードページで捕まえられるんじゃない? それでクラッシュ(clashじゃなくてcrashの方)させるのを攻撃というなら攻撃だろうけど。今回のは従来の保護機構をスキップするような手段が見つかったって話じゃないのかな。
あと深い再帰でクラッシュっていうのは再帰そのものが悪いんじゃなくて言語ランタイム設計がそういう選択をしてるってことね。設計によっては深さを数えて一定以上はランタイムエラーを投げるものもあるし、割り当てられたスタック領域を使い切ったら生きてるフレームをヒープに移すことで事実上ヒープとスタックの境界を無くしたものとかもある。
言語の性質を知らないと再帰のコストは見えにくいけれど、ちゃんとわかってれば再帰はヒープとスタックのトレードオフだから適切な選択をすればいいだけ。
加えて、今回の問題は qsort の再帰の深さ(=スタック使用量)が攻撃者の任意になることなので再帰自体がどうとかではないようですね。CVE-2017-1000373 [mitre.org]の修正 [openbsd.org]を見ても、これで本当に防げているのか、私のような素人には中々理解できません…。
> CVE-2017-1000373 [mitre.org]の修正 [openbsd.org]を見ても、> これで本当に防げているのか、私のような素人には中々理解できません…。まったくです。私もこれはスタック使用量は減るだけで根本的に解決になっていないと思いますが、これで原理的に攻撃できるデータの組み合わせ存在しなくなるとか何かあるんですかね。
カーネル側の対策で、ガードとして1MB分あけるようにしているようです。008: SECURITY FIX: May 19, 2017 [openbsd.org]しかしこれもローカル変数が1MB以上あるような関数が呼び出されれば、ガードをスキップしてしまいそうな。
それは意識高い系の無能。真のプログラマは常にベストなパフォーマンスを求めるのだ。
明示的にスタック操作するかどうかの違いだけなのに
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
再帰すべきか否か (スコア:0)
BSD系のqsortは再帰するから
スタック系の攻撃に弱いみたいだね。
再帰で書けるなら再帰で、というのが
意識高いプログラマかと思ってたけど
必ずしもそうではないと。
Re: (スコア:0)
言うまでもないことだが、再帰は使うメリットが大きい場面で使うものであって、何でも再帰で書けば良いというものではない。
Re: (スコア:0)
関数型言語「お前は俺達を敵に回した」
Re: (スコア:0)
Cで、通常想定される程度のスタック使用量で再帰するやつならガードページで捕まえられるんじゃない? それでクラッシュ(clashじゃなくてcrashの方)させるのを攻撃というなら攻撃だろうけど。今回のは従来の保護機構をスキップするような手段が見つかったって話じゃないのかな。
あと深い再帰でクラッシュっていうのは再帰そのものが悪いんじゃなくて言語ランタイム設計がそういう選択をしてるってことね。設計によっては深さを数えて一定以上はランタイムエラーを投げるものもあるし、割り当てられたスタック領域を使い切ったら生きてるフレームをヒープに移すことで事実上ヒープとスタックの境界を無くしたものとかもある。
言語の性質を知らないと再帰のコストは見えにくいけれど、ちゃんとわかってれば再帰はヒープとスタックのトレードオフだから適切な選択をすればいいだけ。
Re:再帰すべきか否か (スコア:1)
加えて、
今回の問題は qsort の再帰の深さ(=スタック使用量)が攻撃者の任意になることなので
再帰自体がどうとかではないようですね。
CVE-2017-1000373 [mitre.org]の修正 [openbsd.org]を見ても、
これで本当に防げているのか、私のような素人には中々理解できません…。
Re:再帰すべきか否か (スコア:1)
> CVE-2017-1000373 [mitre.org]の修正 [openbsd.org]を見ても、
> これで本当に防げているのか、私のような素人には中々理解できません…。
まったくです。私もこれはスタック使用量は減るだけで根本的に解決になっていないと思いますが、これで原理的に攻撃できるデータの組み合わせ存在しなくなるとか何かあるんですかね。
カーネル側の対策で、ガードとして1MB分あけるようにしているようです。
008: SECURITY FIX: May 19, 2017 [openbsd.org]
しかしこれもローカル変数が1MB以上あるような関数が呼び出されれば、ガードをスキップしてしまいそうな。
Re: (スコア:0)
それは意識高い系の無能。真のプログラマは常にベストなパフォーマンスを求めるのだ。
Re: (スコア:0)
明示的にスタック操作するかどうかの違いだけなのに