CanSecWestで話をしたSEH Overwriteのエクスプロイトテクニックとそれに対する対策。
これはこれで、セキュリティという面でなんらかの貢献のできる内容なのかなぁとは思うけど、基本的にはやはり技術ありきでの話の内容になっている。
何らかの問題があって、それを解決するために調べてこの話をしたのではなくて、技術的にこういうことが可能であることを知ることが楽しいから、これを書いたということ。
コンピュータの利用や通信が安全になることには意味があると思う。ただ、現在存在するハードウェア、ソフトウェアの上に、安全性を築こうとする行為は、僕はあまり意味があるとは思っていない。
つまり、今回のSEHの話も、ものすごく小さな目先の話であって、こういうことをいくらやったところで、コンピュータを安全に(情報を盗まれないとか、不正アクセスされないように)使うことは無理だと思っている。
さて、一方ですばらしく安全なシステム、ハードウェア、インターネットが整備されていたら、僕はきっと楽しくないから、こういった内容について調べたりはしないだろう。
そういう適当さのある世界が好きだからインターネットやコンピュータが好きなのだと思っている。インターネットの世界も、僕が初めてインターネットを使い始めた当時(1996ねんごろ)の方が面白かったと感じる。
いろんな驚きがあったし、いろんな自由があった。いまでも自由だけど、あまりにも社会に影響しすぎている。
twitterとかも、みんなそんな自由さを求めているんじゃないかと感じることもある。(なんとなく適当に一言感じていることを言って、特に責任ある発言を求められるわけではない。)
今のネットワークや、個人PCに、それだけの安全性や責任を求める行為そのものに、僕は抵抗を感じているのかもしれない。今のままで十分楽しいと思ったり。
それは僕は基本的に性善説的な考え方をしているせいかもしれない。みんなで楽しく使えばいいじゃん、みたいな気楽なのりなのだ。
形式ばった、なんのミスも許されない、ちょっとしたミスでみんなからいろいろ言われる、そんな社会じゃ面白くないし、何にもしたいと思えない。悪い人もいるかもしれないけど、コンピュータそのもので人は殺せないし、いいんじゃないかって思う。
僕が大企業が向かない理由はこういうところにある。僕にとっては楽しく生きるうえでどうでもいいことが多すぎるんだ。
コンピュータの世界は中小企業のような自由さから、だんだんと大企業的な世界に変わっていっているように思う。
そのうち、コンピュータやインターネットにも興味を持たなくなるときがくるかもしれない。
My Daily Programming Life...
Showing posts with label Security. Show all posts
Showing posts with label Security. Show all posts
情報の伝わり方
CanSecWest2010で話したことが少しだけ下の記事で参照されている。
問題は、ちょっと書いていることが、僕の言ったことと変わってしまっているということ。
"SEH OverwriteでASLRとDEPやその他のメモリプロテクションがバイパスできる"みたいなことを言ったように書かれているが、僕が言ったことの中にはASLRは含まれていない。
実際に、この発表の結論は、ASLRがこれらのバイパスを防ぐために重要な役割をしているということだった。スライドを一枚使ってきちんと説明したのに・・・。
おそらく、会場にいた技術的なバックグラウンドがある人たちにはきちんと伝わったはずだと思う。実際にその後のディスカッションでも何も認識に違いはなかった。
この前も、一部のニュースでASLRとDEP回避のゼロデイが出たみたいなのがあって、実際にはASLR回避は含まれていなかった。
話はだんだん大きくなってしまうのかもしれない・・・。
ところで、ASLRは単純に回避するのは難しい。
SEH Overwriteの場合、SEHOPと組み合わせると、かなり効果的だる事は間違いない。
ただ、ここの記事でも書かれているように、難しいことと不可能なことは違う。
実際にはDEP+ASLRの回避方法自体は例がある。まあただこれもSEHOPを組み合わせると難しくなる。
ASLR+SEHOP回避も、少しはExploit確率をあげるような方法はあるかもしれない。そのあたりを今度は調べてみようか。
SafeSEHとSoftware DEP
SEH関連の情報をひたすらに収集しているのだけれど、いまいちSafeSEHとSoftware DEPとの関係性が分からない。
あるところでは全く同じ物だと書いてあったり、そうでないところもあったり。全く関係がないわけではないことは確かなのだけど。
SafeSEHオプションがなくてもSoftware DEPの一部は機能する気がするし、一方でSoftware DEPを実行属性なしメモリを例外ハンドラとして呼ばない機能とすれば、SafeSEHオプションだけでも意味のある物になる(登録されている例外ハンドラしか呼ばないという機能になるから)。
いまのところ、僕のイメージは、別々の物だけれどどちらもSEHを攻撃から保護してくれる機能という感じ。
でもなんか違うのかも。どこからどこまでがSafeSEHで、どこからどこまでがSoftware DEPなのかはっきりしてほしいと思うのだけれど・・・。
まあ、もうすぐ整理して書かなくてはいけないので、これから必死になっていろいろ読んで理解するしかない。
あるところでは全く同じ物だと書いてあったり、そうでないところもあったり。全く関係がないわけではないことは確かなのだけど。
SafeSEHオプションがなくてもSoftware DEPの一部は機能する気がするし、一方でSoftware DEPを実行属性なしメモリを例外ハンドラとして呼ばない機能とすれば、SafeSEHオプションだけでも意味のある物になる(登録されている例外ハンドラしか呼ばないという機能になるから)。
いまのところ、僕のイメージは、別々の物だけれどどちらもSEHを攻撃から保護してくれる機能という感じ。
でもなんか違うのかも。どこからどこまでがSafeSEHで、どこからどこまでがSoftware DEPなのかはっきりしてほしいと思うのだけれど・・・。
まあ、もうすぐ整理して書かなくてはいけないので、これから必死になっていろいろ読んで理解するしかない。
マルウェアって
ここ数日いろいろなマルウェアをいじっている。
感染させたりしながら挙動を見たりとか。
うまくできている物もあれば、そうでないものもある。
そんななか、ちょっと調べたConfickerはなかなかすごそう。
手が込んでいる感じ。すごくきれいに設計されている気がする。
というか、なんでこんなとこにそんな能力使ってるのか疑問だ。
こんなの作れる人なら、きっといい物作れるだろうに。
あと、意外に簡単にそういう攻撃コードは書けてしまうということもだんだん分かってきた。まだそういうバイナリレベルのセキュリティとかのことを勉強し始めて半年だけど、書けそうにない訳じゃない。
表現はちょっと悪いけど、質のいいマルウェアは作れないかもしれないけど、ちょっとしたものなら作れる。
けどやっぱり最終的に重要なのは脆弱性を見つけられるかということなんだろう。見つければそれを利用するのは簡単で、コードを書くのも簡単と言うことだ。普通のアプリケーション作るのとほとんど変わらない。
最近、PDFとか開くの怖くなってきたよ
感染させたりしながら挙動を見たりとか。
うまくできている物もあれば、そうでないものもある。
そんななか、ちょっと調べたConfickerはなかなかすごそう。
手が込んでいる感じ。すごくきれいに設計されている気がする。
というか、なんでこんなとこにそんな能力使ってるのか疑問だ。
こんなの作れる人なら、きっといい物作れるだろうに。
あと、意外に簡単にそういう攻撃コードは書けてしまうということもだんだん分かってきた。まだそういうバイナリレベルのセキュリティとかのことを勉強し始めて半年だけど、書けそうにない訳じゃない。
表現はちょっと悪いけど、質のいいマルウェアは作れないかもしれないけど、ちょっとしたものなら作れる。
けどやっぱり最終的に重要なのは脆弱性を見つけられるかということなんだろう。見つければそれを利用するのは簡単で、コードを書くのも簡単と言うことだ。普通のアプリケーション作るのとほとんど変わらない。
最近、PDFとか開くの怖くなってきたよ
SEH and SEHOP 現在の疑問 とりあえず解決?
前の投稿からちょっとしか時間がたってないけど、もう一度読み返して解決したかなぁといった感じ。
uninformedの方のPDFには、スタック上の_EXCEPTION_REGISTRATION_RECORDのnextを0xffffffffに攻撃者が書き換えたらどうなるか、ということを考察してあって、その場合はpop,pop,ret命令に飛ばすことで、このnextのコードを実行するという利点が生かせなくなるため、そうする意味がなくなると書いてある。これが僕の考えていたことであって、そうなんだったら、わざわざ終端用フレームを入れる必要がない。でも、さらに付け加えて、それでも何らかのコードを任意に実行されることは確かなので、念のためにランダムな終端フレームを入れてチェックするように下ほうがいい、と言っている。
つまりは念のためにそうしているという感じなのかもしれない。まあ、pop,pop,retを利用できないとなれば、基本的にはスタックオーバーフローならリターンアドレス書き換えの方が素直な方法だし、SEH Overwritingの利点がなくなっちゃうし。
とりあえず、こんな感じで解決と言うことにしておきます。
uninformedの方のPDFには、スタック上の_EXCEPTION_REGISTRATION_RECORDのnextを0xffffffffに攻撃者が書き換えたらどうなるか、ということを考察してあって、その場合はpop,pop,ret命令に飛ばすことで、このnextのコードを実行するという利点が生かせなくなるため、そうする意味がなくなると書いてある。これが僕の考えていたことであって、そうなんだったら、わざわざ終端用フレームを入れる必要がない。でも、さらに付け加えて、それでも何らかのコードを任意に実行されることは確かなので、念のためにランダムな終端フレームを入れてチェックするように下ほうがいい、と言っている。
つまりは念のためにそうしているという感じなのかもしれない。まあ、pop,pop,retを利用できないとなれば、基本的にはスタックオーバーフローならリターンアドレス書き換えの方が素直な方法だし、SEH Overwritingの利点がなくなっちゃうし。
とりあえず、こんな感じで解決と言うことにしておきます。
SEH and SEHOP 現在の疑問
SEHについて今いろいろ調べている。そのうちまとめてこのサイトにも載せる予定。
最初は単純にSEHの仕組みを知りたかったのだけれど、だんだんと深くなってしまい、
まずは下のを読んで
http://uninformed.org/?v=5&a=2&t=pdf
それから
http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
を読んだ。
他にもいろいろ読んだのだけれど、とりあえずこの二つで今のところ疑問なのは、
なぜスレッドの開始時に終端例外フレームを挿入しておかないといけないのかということ。例外フレーム(_EXCEPTION_REGISTRATION_RECORD)のnextポインタが0xffffffffに突き当たればそれでOKなんじゃないのか?と思った。でもきっと違うんだろう。入れておかないといけないんだろうなぁ。でもなんでだか今のところよく分からない。
誰か分かる人教えてください。
最初は単純にSEHの仕組みを知りたかったのだけれど、だんだんと深くなってしまい、
まずは下のを読んで
http://uninformed.org/?v=5&a=2&t=pdf
それから
http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
を読んだ。
他にもいろいろ読んだのだけれど、とりあえずこの二つで今のところ疑問なのは、
なぜスレッドの開始時に終端例外フレームを挿入しておかないといけないのかということ。例外フレーム(_EXCEPTION_REGISTRATION_RECORD)のnextポインタが0xffffffffに突き当たればそれでOKなんじゃないのか?と思った。でもきっと違うんだろう。入れておかないといけないんだろうなぁ。でもなんでだか今のところよく分からない。
誰か分かる人教えてください。
