バッファオーバーラン
バッファオーバーランが認識され続けてきた低レベルの問題では言語です。 コアな問題は、ユーザーのデータ、およびプログラムに関する情報は、内のフロー制御のためのパフォーマンス、および低レベルの言語に直接アクセスできるようにアプリケーションをメモリします。 cとc + +は、最も人気の高い2つの言語に苦しんでいるバッファオーバーランします。 厳密に言えば、バッファオーバーランが発生したときに入力できるようにプログラムを書くことは、割り当てられたバッファの終わりを越えて、そこには、いくつかの問題に関連して頻繁に同じような効果を持っています。 最も興味深いのは、 1つのフォーマット文字列のバグを解決します。 別の問題が発生したときの権化、攻撃者が許可を書くことで、任意の場所にメモリの配列の外には、アプリケーションのように、また、厳密に言えば、クラシックのバッファオーバーランではありません、私たちもここでカバーしています。 その効果は、何もバッファオーバーラン攻撃から大きな音を立てて、アプリケーションの完全な制御を獲得している場合は、アプリケーションとして実行する高レベルのユーザー( rootでは、管理者、またはローカルシステム)は、オペレーティングシステム全体を制御するそして、他のユーザーがログインして、現在のところ、またはログオンには、攻撃者の手に委ねられます。 質問をしている場合は、アプリケーションをネットワークサービスで、その結果、欠陥の可能性があるワームです。 最初のよく知られインターネットワームに悪用するのバッファオーバーラン指のサーバー、およびt.だったとして知られるロバートモリス(または単にモリス)指ワームです。 これは私たちが学んだかのように見える方法を避けるために1つのバッファオーバーランほぼ失脚して以来、インターネットは1988年に、私たちの継続してレポートを参照してください頻繁にバッファオーバーランで多くの種類のソフトウェアです。 1つだけだと思うかもしれないだらしないものの、不注意なプログラマのバッファオーバーランの犠牲となると、この問題は複雑になると、多くのシンプルな解決策ではない、と書いてあればどなたでも十分に用c / c + +ほぼ確実に前にこのコードは間違いです。 でも非常にいいが、プログラマの間違いを非常に慎重に、そして非常に簡単にすることが最善の方法を知っているプログラマースリップすると慣行を置く場所に乗ろうと固体のテストエラー。 影響を受けた言語cが最もよく使用される言語を作成するバッファオーバーラン、 c + +の密接に続いています。 バッファオーバーランを簡単に作成することを書くときにアセンブラ与えられていないすべてのセーフガードします。 c + +がものの、本質的に危険カップ、しているため、上位のcを使用して、標準テンプレートライブラリ( stl )を大幅に軽減することができケア虐待する可能性がある文字列です。 狭義の増加、 c + +コンパイラプログラマーを避けるのに役立ついくつかの過ちをします。 私たちのアドバイスはしても純粋なcのコードを書く場合は、使用して、 c + +コンパイラ結果には、コードを掃除します。 最近になって発明抽象的な高レベルの言語で直接メモリアクセスプログラマから離れて、通常はかなりのコストパフォーマンスします。 言語のようなジャワ、 c # 、およびvisualがネイティブの基本的な文字列型、配列の範囲内にチェックし、通常直接メモリアクセスを禁止します。 これによりご希望の言ってもいくつかのバッファオーバーラン不可能で、それはより正確にバッファオーバーランを言うことは、はるかに少ないようです。 実際には、ほとんどの実装は、これらの言語はc / c + + 、および実装結果にバッファオーバーランの欠陥ことができます。 別の潜在的なバッファオーバーランのソースコードが存在しているため、高レベルのコードする必要があり、最終的なインターフェイスのオペレーティングシステム、およびオペレーティングシステムでは、ほぼ確実で書かれた用c / c + + 。 c #にせずに実行することを許可する宣言を行うことにより危険なセクションの純;しかし、それは容易で、相互運用の基礎とライブラリで書かれたオペレーティングシステム用c / c + + 、ミスをすることができ、同じようにすることができ用c / c + +します。 プログラムの場合は、主に高レベルの言語では、メインのアクションアイテムを続行するためには、外部のライブラリに渡されたデータを検証する、または導管としての役目を果たすことができな欠陥しています。 われわれはないだろうが、完全なリストを提供する言語の影響を受け、ほとんどの言語は、古い脆弱性をバッファオーバーラン の犯した罪の説明クラシックの権化バッファオーバーランと呼ばれる"スマッシングスタック"と述べた。コンパイルしたプログラムでは、スタックが使用され制御情報を保持するなど、引数は、アプリケーションのニーズはどこに復帰することが1回行われているため、機能利用可能なレジスタの数を少なくしてx86プロセッサは、一時的にかなり頻繁にレジスタを取得してスタックに格納します。 残念なことに、ローカル変数が割り当てられても、スタックに保存されます。 これらの変数は、ときどき不正確スタックと呼ばれる静的に割り当てられている、として反対しているヒープメモリを動的に割り当てられています。 もし静的な話を聞くのバッファオーバーラン、実際には何が言いたいのは、スタックのバッファオーバーランします。 問題の根源であった場合には、アプリケーションの書き込みの範囲を超えて配列をスタックに割り当てられる場合、攻撃者の詳細情報を取得するコントロールを指定します。 成功しており、これが重要な影響を及ぼす;攻撃したいの値を変更した入札のデータを制御します。 私たちの1つかもしれない理由を聞いて継続して使用するような危険なシステムを明らかにします。 私たちはこの問題を逃れるする機会を、少なくとも部分で、移行をインテルの64ビットitaniumのチップは、どこに保存された戻りアドレスが登録してください。 問題は、私たちは認めざるを容認する重要な後方互換性の損失、および本稿執筆時点で、ということがわかったのx64チップに終わる可能性がより多くのチップの人気がします。 なぜ私たちが要求することもできていないだけですべてのアレイに移動してコードを実行する厳格なチェックと直接メモリアクセスを禁止します。 問題は、多くの種類のためのアプリケーションでは、パフォーマンスの特性に十分な高レベルの言語ではありませんします。 地面には、真ん中の1つを使用する高レベルの言語では、トップレベルのインターフェイス内での危険なことをして(ユーザーのように! ) 、および下位レベルの言語のためのコアコードします。 解決策は別の機能を完全に使用してc + + 、およびコレクションクラスライブラリや文字列を使用します。 たとえば、インターネットインフォメーションサービス( iis ) 6.0ウェブサーバーを完全に切り替えてc + +の文字列を入力クラスを処理するためには、開発者の主張と1つの勇敢な彼は自分の小指を切断した場合バッファオーバーランが発見されたコードです。 本稿執筆時点で、開発者はまだありませんと自分の指を発行してきたセキュリティ情報は、ウェブサーバーに反対して以来、 2年近くリリースします。 現代のコンパイラをうまくtemplatizedクラスの取引が可能で、非常に高いパフォーマンスを書くc + +コードします。 十分な理論の例を考えてみよう: #含める<stdio.h> ボイドdontdothis ( *文字入力) strcpyを( buf 、入力) ; するprintf ( " % sを\ " 、 buf ) ; intメイン( int argc 、 argvを文字* [ ] ) 今すぐには、アプリケーションをコンパイルしてみようを見て何が起こっています。 このデモでは、リリースに使用され、作者のビルドとデバッグシンボルを有効化され、スタックのチェックを無効にする。 コンパイラにもいいたいの小型インライン関数としてdontdothis 、特にのみの場合は、 1回呼び出されたので、彼にも最適化を無効にします。 次のようなもので、スタックのようにすぐに自分のシステムをコールする前にstrcpyを: 0 x0012fec0 c8のfe 12 00 èþ .. < -"アドレスの引数b uf 思い出して、スタック上のすべての値が戻ります。 この例では、インテルのシステムから、これは"リトルエンディアン"と述べた。これは、最下位のバイト値を最初に来るので、表示される場合は、返信先アドレスとしてメモリ" 3f104000 、 "それは本当にアドレス0x0040103fます。 今何が起こるか見てみましょうbufときには上書きされます。 最初の制御情報は、スタック上の内容を拡張ベースポインタ( ebp )登録してください。 ebpが含まれ、フレームポインタをしている場合、 1つのオフを越なれば、 ebpは切り捨てられます。 メモリを制御することができた場合、攻撃者は0x0012fe00 (オフごとに1つのゼロからの最後のバイト)は、プログラムを実行すると、その場所にジャンプし攻撃コードに供給されます。 オーバーランを拘束している場合ではありませんバイトの1つは、次の項目に行くの返信先アドレスがします。 この値を制御することができた場合、攻撃者、および組立ができるように十分な場所を知っているの場所をバッファして、お探しのバッファオーバーランを悪用クラシックます。 アセンブリコードに注意して(よく知られているため、シェルコードを起動するには、最もよく利用するコマンドシェル)に配置されていませんが、それはバッファが上書きされます。 それは古典的なケースではなく、全般的に、攻撃して、任意のコードが配置され、プログラムの別の場所かもしれないします。 何の慰めに取らないと考えることから、オーバーランは狭い範囲に限られます。 いったん戻りアドレスを上書きしてきた場合、攻撃者の引数を伴っての取得を再生する機能を悪用しています。 プログラムの書き込みをしている場合、これらのいずれかの引数を返す前に、それを表し騒乱する機会を追加します。 この際に重要になる点を考慮して対策の効果をスタックの改ざんなどのクリスピンコーワンのstackguard 、 ibmのあるpropolice 、およびマイクロソフトの/たgsコンパイラフラグです。 として見ることができ、私たちは与えられただけで、少なくとも3つの方法があり、攻撃者の制御を奪って、私たちのアプリケーションのように、これは非常に単純な機能のみにします。 もし、 c + +クラスでの仮想関数を宣言してスタックの場合、仮想関数ポインタのテーブルがあり、そして、このことは容易につながる攻撃します。 1つの引数には、関数を関数へのポインタが偶然にも、これは非常に共通の任意のウィンドウシステム(たとえば、 xウィンドウシステム、またはmicrosoft windows )は、その後上書きした関数ポインタを使用する前には、明らかに流用する方法を制御するのアプリケーションです。 多くの人は、さらに多くの気の利いた方法を制御するアプリケーションを手に入れるに存在するよりも私たちのかすかな頭脳を考えることができます。 そこは、私たちの能力として開発者との間の不均衡の能力とリソースを攻撃します。 君は使用できません無限量の時間を割いてのお申込みが、攻撃を行うかもしれませんが、それ以外の余暇の時間をより理解するコードを使用して、どのようにしたいものです。 お客様のコードを保護する可能性の貴重な資産を正当化するために十分な努力を覆すカ月以内にお申し込みください。 攻撃に多くの時間を費やす学習については、最新の騒乱を引き起こして開発されて、どこがwww.metasploit.com資源のようにすることができ、ポイントしてクリックする方法をシェルコードはほとんど何もして欲しい営業中の文字セット内で拘束されます。 もし何かが悪用できるかどうかを判断しようとすると、その可能性が高いことになるでしょう間違っています。 ほとんどの場合、それは可能性があることを証明するだけで、何かがどちらかに悪用またはスマートに十分なことはできないこと(または可能性が十分な時間を過ごしていません)を悪用する方法を決定する書き込みました。 非常にまれなことができるように、すべての自信を証明するすべてのオーバーランではありません悪用しています。 その点、この非難は、スマートやるべきことは、バグ修正だけで! があったことを複数回"コードの品質改善"であると判明したセキュリティ修正回想しています。 この投稿者だけで3時間以上を費やした議論しているかどうかについては、開発チームのバグを修正すべきだ。 電子メールのスレッドの方には、合計8人が見つかって、そして私たちを簡単に費やした20時間( 50人週)この問題を解決するかどうかを討論ませんので、開発チームを証明したかったのだった悪用コードします。 セキュリティ専門家を証明したら、本当の問題は、バグ、フィックスは推定で1時間の開発時間と、数時間の試験時間です。 それは信じられないほどの時間を無駄にします。 1時間にしたい場合には、直ちに分析する前に出荷するアプリケーションです。 アプリケーションの場合は、最終段階には、できるようにしたいのですが見栄えが良い推測を正当化するかどうかの問題が悪用の危険性をregressionsと、不安定な製品です。 それは共通の誤解をしたヒープバッファオーバーランが低く、スタックオーバーランよりも悪用が、このケースではありません判明します。 ほとんどのヒープの実装に苦しむと同じ基本的な欠陥として、スタック、ユーザーのデータとは、データ内の制御します。 に応じて実施してメモリアロケータ、それを取得する可能性が多い場所に4バイトのヒープマネージャには、攻撃者の選択で指定された場所を攻撃します。 のヒープを攻撃する方法の詳細については、やや難解です。 最近のトピックと明確に書いてプレゼンテーションして、 "信頼性のヒープwindowsの手口"マシュー" shok "コノバー&オーデッドホロヴィッツ、発見することができhttp://cansecwest.com/ csw04/csw04-oded + connover.pptます。 たとえヒープマネージャはできません。 subvertedを行うアタッカーの入札では、データを含む可能性の配分は、隣接する関数ポインタ、またはポインタを書くの情報を使用することになりました。 一時、ヒープオーバフローを搾取したとみなされエキゾチックハードヒープオーバフローが現在、いくつかのより多くの種類の悪用を頻繁にエラーが発生します。 罪深い用 c / c + + そこには多くの、多くの方法があるのバッファオーバーラン用c / c + + 。 次のようなものを生じた指モリスワーム: 文字buf [ 20 ] ; 取得( buf ) ; 絶対にありませんを読んで取得する方法を使用せずに入力stdinから危険性があるバッファオーバーフローの代わりに使用するfgetsます。 おそらく、最も人気のある2つ目の方法を使用するには、 strcpyをバッファオーバフロー(前の例を参照してください) 。 これは別の方法で問題を引き起こす: 文字buf [ 20 ] ; strcpyを( buf 、プレフィックス) ; 文字buf [ max_path ] ; sprintf ( buf 、 "時間% s -% d個\ " 、パス、 e rrnoに) ; それはほぼ不可能で、いくつかのコーナーを除いては、場合によっては、安全にsprintfを使用します。 microsoft windowsの重要なセキュリティ情報をリリースしたsprintfだったため、デバッグログ機能で使用されています。 を参照して情報ms04 - 011を参照してください(詳細については、リンクでは"その他のリソース"セクション)します。 ここでは別のお気に入り: 文字buf [ 32 ] ; 問題の原因は、別の方法をmistaking文字バイト数をカウントします。 ascii文字を扱う場合は、これらは、同じですが、しかし、ユニコードを扱う場合は、 1つのキャラクターには2つのバイトをします。 例を次に示します: _ snwprintf ( wbuf 、 sizeof ( wbuf ) 、 " % sを\ "は、入力) ; bool copystructs ( inputfile * pinfile 、 unsigned longにカウント) m_pstructs =新しい構造体を[カウント] ; (私= 0 ;私<カウント;私+ + ) ptrに変更=のmalloc ( sizeof (型) *カウント) ; ここでのバッファオーバーランする別の方法を得ることができ作成日: # defineのmax_buf 256 試合時間= strlen (入力) ; / /もちろん、 strcpyを安全に使うことができ const size_t max_buf = 256 ; 試合時間= strlen (入力) ; / /もちろん、 strcpyを安全に使うことができ 関連の罪 1つは、整数オーバーフローの罪密接に関連します。 を選択した場合はカウントさを緩和するバッファオーバーランを使って文字列処理のコール、それともを見極めようと努力してどれくらいの部屋を割り当てるヒープは、算数の安全性が重要な影響を及ぼすのアプリケーションです。 使用できるフォーマット文字列のバグを達成するバッファオーバーランと同じ働きをし、真にオーバーランではありませんします。 フォーマット文字列は、通常のバグを達成せずにoverrunning任意のバッファである。 上のバッファオーバーランの変種は、無限の配列の書き込みをします。 攻撃を供給することができた場合は、お客様の配列のインデックスは、正しくありませんとするかどうかを検証することで、適切な範囲内での配列は、メモリに書き込むために、ターゲットを絞った場所を攻撃者の選択が行われます。 同じことができだけでなく、すべてのプログラムを流用起こるの流れではなく、攻撃者を混乱させるかもしれませんが隣接メモリ、対策のかもしれませんがhampers任意の場所でバッファオーバーランに反対します。 スポッティングの犯した罪のパターンここでは、コンポーネントを探す:
このコードの中に焦点を絞った罪の見直しの範囲が非常に簡単に極めて困難でした。 簡単なものを探すのは、危険な文字列処理関数を使用します。 1つの問題を認識するべきであるということを見つける多くのインスタンスを安全に使用するに当たって、それは私たちの経験があることが隠れている問題のうち、正しい呼び出します。 セーフのコールに変換するコードのみを使用するには、非常に低い回帰率(どこから10 thを1/100thは、通常のバグフィックス回帰率)は、それからの攻撃コードが削除されます。 これを行うには1つの良い方法を見つけましょう、コンパイラの危険な関数呼び出しを行います。 strcpyを定義する場合は、 strcat 、 sprintf 、および同様の機能は、コンパイラは、すべての検索してくれます。 問題を認識するべきでは、いくつかのアプリが再実装する部分の全部またはランタイムライブラリの内部でのcします。 より困難な課題はヒープオーバーランを探しています。 基本的には、最初に探して配分したい、そして検討する算数のバッファサイズを使用して算出しています。 全体の最善のアプローチは、ユーザからの入力をトレースからのエントリポイントを通じて、お客様のアプリケーションのすべての関数を呼び出します。 知っているかどうかを制御し攻撃者が大きな違い テストのテクニックを紹介して罪を見つけるファズテストでは、どの科目のお申込みをセミランダム入力、 1つは、より良いテストのテクニックを紹介します。 増加した文字列の長さを入力してみながら、アプリケーションの動作を観察しています。 何かを探している間は、ときどき入力ミスマッチをチェックするために比較的小さな窓の脆弱性コードします。 たとえば、チェックマークを付けるするかもしれないし、一カ所未満で260文字を入力しなければならない、そして、 256バイトのバッファを割り当てることです。 非常に長い入力をテストする場合は、それは単純に拒否し、ヒットした場合でも、正確にあふれ、搾取を見つけることができます。 長さには2つの倍数の倍数と2つのプラスマイナス1つの問題点を見つけることがよくあります。 トリックを試しては、他のあらゆる場所を探して入力して、何かがどこの長さをユーザーが指定します。 長さを変更していませんので、文字列の長さを合わせて、その中でも特に整数のオーバーフローの可能性を探すの条件はどこの長さ+ 1 = 0は、しばしば危険だ。 何かをしなければならないときにファズテストを作成するには、特殊なテストを構築します。 デバッグビルドの主張が頻繁に変更するようにしておきプログラムの流れとは、打撃からの条件を悪用します。 その半面、デバッグビルドの近代コンパイラが含まれ、通常より高度なスタックの破損検出します。 ヒープとオペレーティングシステムによって異なりますが、より厳格なヒープを有効にすることもでき腐敗をチェックします。 お勧めの1つの変更を行うには、お客様のコードを主張している場合は、ユーザーの入力のチェックは、変更してから次の 断言(試合時間< max_path ) ; を もし(試合時間> = max_path ) コードをテストする必要があり、いつもの下に何らかの形で、メモリのエラー検出ツールなど、 appverifier windows上 罪の例次のエントリは、共通の脆弱性が来るから直接撮りやリスト、またはれるcve ( http://cve.mitre.org )の例は、バッファオーバーランします。 興味深いビットのトリビアは、本稿執筆時点で、 1,734れるcveのエントリがマッチ"のバッファオーバーラン"が存在します。 検索のcertの勧告、これだけで、より広範なドキュメントとの深刻な脆弱性は、イールド107安打"のバッファオーバーラン"と述べた。 れるcve - 1999 - 0042れるcveからの説明: "にバッファオーバーフローのワシントン大学での実装imapやpopサーバー"と述べた。 このエントリは徹底的に記載されるcve cert勧告ca - 1997 - 09 、および関与するのバッファオーバーランの認証シーケンスのワシントン大学の郵便局でのインターネットプロトコル(ポップ)とのメッセージにアクセスするプロトコル(のimap )サーバーにします。 脆弱性に関連した電子メールサーバーを実装するに失敗しました最小特権、およびルートのアクセス権限を付与して悪用を攻撃します。 オーバーフローの脆弱性搾取につながっている広範なシステムです。 ネットワークの脆弱性のチェックに設計され、このサーバーのバージョンの脆弱性を見つける似たような欠陥が見つかりましたシアトルラボslmail 2.5として計上www.winnetmag.com/article/articleid/9223/9223.htmlます。 れるcve - 2000 - 0389 -れるcve - 2000 - 0392かられるcve - 2000 - 0389 : "バッファオーバーフローkrb_rd_req機能kerberosの4と5を使うと、リモートの攻撃を、 root権限を得る"と述べた。 かられるcve - 2000 - 0390 : "バッファオーバーフローkrb425_conv_principal機能のkerberos 5を使うと、リモートの攻撃者にroot権限を得る"と述べた。 かられるcve - 2000 - 0391 : "バッファオーバーフローkrshdでのkerberos 5を使うと、リモートの攻撃者にroot権限を得る"と述べた。 かられるcve - 2000 - 0392 : "バッファオーバーフローksuでのkerberos 5では、ローカルユーザーにroot権限を得る"と述べた。 このシリーズでの問題は、ドキュメントに書かれているmit kerberosの実装としてcert勧告ca - 2000 - 06 、見つかりwww.cert.org/advisories/ca-2000-06.htmlます。ていたものの、ソースコードを利用できるようにするための公共ここ数年、問題の茎から危険な文字列処理関数を使用する( strcat )だけだったの報告は2000年にします。 れるcve - 2002 - 0842は、 cve - 2003 - 0095 、でき- 2003 - 0096
これらの脆弱性の詳細についてはcert勧告ca - 2003 - 05 、位置www.cert.org/advisories/ca-2003-05.htmlます。いくつかの問題が発見され、 1組のデビッドリッチフィールドと彼のチームは次の世代のセキュリティソフトウェア株式会社余談として、この広告の1つのアプリケーションを示して"アンブレイカブル"ではありません最良の間に行うべきことは、リッチフィールド氏は調査を行って作成したアプリケーションです。 ことができ- 2003 - 0352
このオーバーフローは興味深いつながっているので、非常に広範な搾取される2つの重要な原因は、双方の破壊ワーム、インターネット上で混乱します。 ヒープオーバーフローしていたのは、と見られたという事実だった可能性がワームを構築することは非常に安定している。 失敗する要因だった最小特権の原則:インターフェイスが利用できるようにすべきではない匿名ユーザーです。 メモは、他に興味深いオーバフロー対策は、 windows 2003劣化してからの攻撃に特権の昇格のサービス拒否します。 詳細については、この問題を解決することができ見つかりwww.cert.org/advisories/のca - 2003 - 23.html 、およびwww.microsoft.com/technet/security/bulletin/ms03-039.asp 償還手順償還のバッファオーバーランの道を歩んでは長いと落とし穴に満ちています。 私たちについて話し合う、さまざまな種類のバッファオーバーランのテクニックを支援することを避けること、そして他の多くの技術を減らすためバッファオーバーランを引き起こす可能性が損傷します。 見てみましょうどのようにしてコードを向上させることができます。 危険な文字列置換処理関数必要があり、最低で、危険なのような関数strcpyを交換し、 strcat 、 sprintf 、これらの関数の各バージョンのカウントされます。 必要があり、いくつかの選択肢を何に置き換えています。 古い数え関数を念頭に置いておくことが問題のインターフェイス、および算術をお願いすることは多くの場合、パラメータを決定します。 コンピュータではありませんがうまいかもしれ数学として希望します。 新しい図書館のようなstrsafeは、安全なブラウン管( cランタイムライブラリ)で出荷されるマイクロソフトビジュアルスタジオ(とは、トラックは、高速な部分になるのはansi c / c + +の標準)とstrlcat / strlcpyを*拒絶します。 世話をする必要もあり、これらの各機能をどのように扱うの終了後の文字列を切断します。 終了nullを保証するいくつかの関数が、ほとんどの古い数え関数はありません。 グループは、マイクロソフトオフィスの経験を交換する危険な文字列処理するための関数が、 office 2003のリリースだったの回帰率(原因の新しいバグフィックスあたり)は極端に低いので、恐怖regressions停止させていないよ。 監査配分他の情報源から来るのバッファオーバーラン算術エラーが発生します。 ループと配列へのアクセスをチェック3つ目の方法でバッファオーバーランが原因ではありませんが正常に終了チェックループではなく、適切な範囲内でのチェック配列の前に書き込みアクセスします。 これは最も困難な地域の1つ、およびでしょう、いくつかのケースは、問題と驚天動地- kaboomは全く違ったモジュールです。 文字列のバッファを置き換えるcでc + +文字列これは交換するよりも効果があるだけで、通常の通話cが、多大な変化を引き起こす可能性が既存のコードは、特にコードの場合ではありませんc + +で既にとしてコンパイルされます。 にも注意する必要があり、パフォーマンスの特徴を理解してstlコンテナクラスです。 可能性は非常に高性能stlコードを書くことが、他の多くの面でのプログラミングのように、失敗を読むには立派なマニュアル( rtfm )は、多くの場合に最適な結果にも満たない結果を確認する。 最もよく交換した場合は、 stlのstd : :文字列またはのstd : wstringテンプレートクラスです。 静的な配列の容器を交換しstl上述のすべての問題をstlコンテナのようなベクトルに適用されますが、問題なのは、他のすべての実装がないベクトル: :イテレータを構築するための範囲内でのアクセスを確認します。 今回の措置に役立つかもしれない、とし、著者が使用して検出することが可能stl正しいコードを書くために彼をより迅速に、しかし、このことに注意して、銀の弾丸ではありませんします。 解析ツールを使用するいくつかありますが良いツールとなってきたので、市場の分析用c / c + +コードのセキュリティ上の欠陥; coverity例としては、 prefast 、およびklocworkます。 ビジュアルスタジオします。ネット2005が含まれprefastと呼ばれるツールを別の言語のソースコードの注釈(サル)を支援するセキュリティの欠陥を追跡するなどのバッファオーバーランします。 最良の方法は、サルの方法を記述するコードです。 は、以下のとおりです(ばか)の例では、ご存知のデータとの間の関係をカウント引数:データバイト長はカウントします。 しかし、コンパイラを知っていません;それだけでは見size_tをchar *とします。 * dostuffボイド( *文字データ、 size_tカウント) ( このコードは分かった(実際に私たちを無視して嫌がって静的なバッファを返すが、私たちのユーモア)します。 しかし、大規模な場合はカウントして、 32 、その後のバッファオーバーランを持っています。 これはサルを捕まえるの注釈のバージョンのバグ: * dostuffボイド( __in_ecount (カウント) *文字データ、 size_tカウント) ( 追加の防衛策を検討する場合と同じ方法でお客様の車のシートベルトと思うのです。 シートベルトの程度を軽減することがよくあり、クラッシュでもまだしたくない事故に入るました。 することが重要に注意してクラスのすべての主要な緩和のバッファオーバーランは、以前の条件が悪用悪用すべて存在していません;とは、いかなる緩和技術は、この技術を十分に複雑な攻撃を完全に克服することができます。 いくつか見てみましょうしている。 Stack ProtectionStack protection was pioneered by Crispin Cowan in his Stackguard product, and was independently implemented by Microsoft as the /GS compiler switch. At its most basic, stack protection places a value known as a canary on the stack between the local variables and the return address. Newer implementations may also re-order variables for increased effectiveness. The advantage of this approach is that it is cheap, has minimal performance overhead, and has the additional benefit of making debugging stack corruption bugs easier. Another example is ProPolice, a Gnu Compiler Collection (GCC) extension created by IBM. Any current product should utilize stack protection. You should be aware that stack protection can be overcome by a variety of techniques. If a virtual function pointer table is overwritten and the function is called prior to return from the function—virtual destructors are good candidates—then the exploit will occur before stack protection can come into play. Non-executable Stack and HeapThis countermeasure offers considerable protection against an attacker, but it can have a significant application compatibility impact. Some applications legitimately compile and execute code on the fly, such as many applications written in Java and C#. It’s also important to note that if the attacker can cause your application to fall prey to a return into libc attack, where a legitimate function call is made to accomplish nefarious ends, then the execute protection on the memory page may be removed. Unfortunately, most of the hardware currently available is unable to support this option, and support varies with CPU-type, operating system, and operating system version as well. As a result, you cannot count on this protection being present in the field, but you must test with it enabled to ensure that your application is compatible with a non-executable stack and heap, by running your application on hardware that supports hardware protection, and the target operating system set to use the protection. For example, if you are targeting Windows XP, then make sure you run all your tests on a Windows XP SP2 computer using an AMD Athlon 64 FX processor. On Windows, this technology is called Data Execution Protection (DEP); it was once known as No eXecute (NX). Windows Server 2003 SP1 also supports this capability. PaX for Linux and OpenBSD also support non-executable memory Other Resources
this is an article added by Hendra Fang
|
|||
|