安全なコーディングのプラクティス
この記事まっているより多くの技術的側面のセキュリティを実装するには、コードを使用するアプリケーションのように、ガイドラインを提供し、安全な実装を開発するためのプロセスを施行します。 潜在的な脆弱性が存在するための強力なアプリケーションが減額されるの設計、実装、アプリケーションのアザラシしかし、その運命なんだ。 重労働に投入され、安全な設計が足りない場合は不十分な実装されていた。 重要なことを理解することも含まれてセキュリティ関連の技術やデザインには、必ずしも意味するメソッドまたは任意のレベルのセキュリティを保証するアプリケーションです。 アプリケーションの実装およびすべてのセキュリティが使われている技術の1つのコンポーネントの最終的な高レベルの信頼性をもたらすことです。 分析の実施段階では、開発者や開発マネージャーの両方の責任だ。 開発者は責任を実現するための井戸のデザインが、経営者が責任を設定する過程で良い実装していることを確認します。 この標準的な手続きを経由して実行できます。ドキュメントが含まれるコーディング標準の開発と、設計やコードレビュー、および開発者向けのトレーニングと関連して、セキュリティアプリケーションの開発します。 これらの手順やアプリケーションの開発者の利益に関わらず、どの言語が使用されたり、アプリケーションの種類を開発しました。 今日では、最もよく使用される言語でのプログラミング言語のc 、 java 、およびスクリプト言語のようなperlとunixのシェルします。 これらの各言語や不適切な環境で使用できるアプリケーションのセキュリティを妥協すると、システムはそれを実行します。 しかし、この記事ではありません開発者のためのチェックリストに従っています。 その代わりに、開発のセキュリティ上の思考過程に焦点を当てたことがないため、強力なコーディングの間違いを練習します。 落とし穴されるのcプログラミング言語のc 、これを含めるカップ、 c + + 、およびオブジェクト-カップ、が最も多く使用される言語とはわからない危険な手にすることができます。 彼らの能力を提供し、開発者の多くの部分を操作すると、システムへのアクセスなど、メモリ、ファイルやデバイスです。 これは、偉大な強さはc言語で、開発者が間違いを犯す危険が発生したときです。 cを提供する高レベルのオペレーティングシステムの根底にアクセスできるようにして、そこにはいくつかのチェックアンドバランスを守るために開発します。 開発者の場合、誤ってデータを書き込み、間違った場所やメモリデバイスは、 cプログラムは何であれ、開発者の書き込みを問わず、データまたはリンクになります。 頻繁に関連付けられている領域の最初の脆弱性はバッファオーバーフローcがします。 次のサンプルコードを示して、非常に基本的な越: 文字列[ 10 ] ;strcpyを(文字列、 " aaaaaaaaaaaaaaa " ) ; / * 15 " a "の文字 ここでは、 15 " a "の文字がコピーされたメモリ領域は、文字列変数は、宣言している静的な10 -文字配列します。 ( )関数は、 strcpyを顧みずに正確に指示されたとおりの大きさのデータがコピーされているか、場所をほしかったんです。 あるバッファオーバーフローが発生したとき、 11日の要素は、メモリの場所にコピーされ、すぐに次の場所第10回な要素である文字列変数です。 今すぐこの原則を適用してデータを入力して、外部ソースから来て、交換した文字列" a "の文字です。 これにより、攻撃の効果がオーバーフローを制御します。 strcpyをして( )関数は、いくつかの機能の1つはcを実行していない任意の範囲内で任意のサイズのバッファをチェックできるようにコピーされます。 他の関数を避けるために( )を取得するには、 strcat ( )は、 sprintf ( )の、そして家族のための関数のscanf ( )します。 更新されたバージョンにはいくつかのこれらの関数にコピーされることができるの長さを指定します。 これらは( ) strncpy 、 strncat ( ) 、 snprintf ( ) 、 fgets ( )にします。 これらの機能を変更するだけでコピーして文字数の長さのパラメータで指定された。 ほとんどで、長さの文字はコピーしてソースからのリンク先 : strncpy (リンク先、ソース、長さ) ; ヒント を使用するときに" n "でのバージョンの文字列操作関数( ) - strncpy 、 strncat ( ) 、 snprintf ( ) 、および- fgets ( )にあることを確認していない以上の長さの文字列のリンク先ではなく、ソース文字列です。 することができた場合は、バッファオーバーランの長さの値がより大きいサイズでは、宛先のバッファします。 バッファポインタを使用する際には、代わりに静的バッファを宣言し、十分なメモリを割り当てることが必要な値を格納しているコピーされます。 メモリ操作関数を使用して、どの長さを指定することができます。 ヒント 文字列データメモリを割り当てるときには、忘れないで1名を追加して合計の長さのために、 nullを終了文字を収容します。 ターミネーターせずにnullでは、データを直接メモリの後の最後の文字と見なされるかもしれない文字列の部分文字列です。 これらの機能だけではない場所でのバッファオーバーフローが発生しました。 情報を読んでいることを確認していることを確認し、コピー、または任意のメモリロケーションに書き込まれたり、変数に代入するに合うような、あるいはその先の記憶容量が十分に確保されます。 ヒント バッファオーバーフローを避けるためには、コードの入力を検証していることを確認します。 チェックして、データのサイズを使用すると、ストレージの場所と操作を生成する機能を開発者が指定した金額の情報の代わりに任意の長さのデータを固まりました。 レース条件を追加するレベルの複雑さcのコードを使っています。 レースの条件を悪用することができ、 2つの側面を設立- cのコードシーケンスと保護します。 シークエンシングを指した順序でイベントが発生するアプリケーションです。 レースの条件に依存することができた結果からシークエンシングの間でのイベントのパターンは、チェックが行われていない場合の間でのイベントです。 このことによって、しばしば欠点は、いかなる意味すると検証エラーチェックルーチンを使用している。 順番に2つの機能を実行した場合、通常、 2つ目の機能を前提として検索結果の最初の有効なのは、その可能性をレースの条件が存在します。 昇格した権限は、しばしば攻撃のターゲットにします。 組織、併用シークエンシングとエラーチェックで、レースの条件の可能性を最小限に抑えます。 これは、悪いレースを実装して作成する条件: increase_privs ( ) ;...値= special_app_function ( ) ; / * *権限が必要/other_unreleted_function ( ) ; / * *権限の必要はありません/other_unreleated_function2 ( ) ; / * *同上/special_dependent_function (値) ; / * *権限が必要/...出口( ) ; ここでは、いくつかの危険な行為が発生しました。 高架の権限は、アプリケーションの初期には、アプリケーションではなく遅くまで使用されます。 彼らはまた、放棄しないので、ほとんどの機能を実行するよりも高い特権レベルが必要に応じています。 最後に、レースの条件が作成さかわいそうな組織に依存していない機能を互いに近くに発生します。 は、これらの問題を解決する例を示し increase_privs ( ) ;値= special_app_function ; / * *権限が必要/もし( ! validate_function (値) / *の安全性を確保する値* /(do_error_processing (値) ; / *何か知的でエラーが発生します* /)special_dependent_function (値) ; / * *権限が必要/decrease_privs ( ) ; / * *特権をする必要がありません/other_unreleted_function ( ) ; / * *権限の必要はありません/other_unreleated_function2 ( ) ; / * *同上/ 特別に注意して検証およびエラー処理ルーチンを通過する前に使用されている値を別の機能です。 ヒント 整理の機能と組み合わせることで、検証を確保するための情報ではありません予想して妥協の間でのイベントに依存します。 多くの条件が存在するレースの結果としてかわいそうなテンポラリファイルを使用します。 ときに、これらのファイルが作成されると、外部の攻撃から守らなければならない時に操作します。 unixとwindowsの許可を設定できるようにし、開発者や運用ビットフラグファイルを作成するときにします。 しかし、誰にもアクセスできるようにすべき許可権限の所有者のプロセスです。 作成する際に使用してファイルを開いて( )をコールする、とにおけるo_excl o_creatフラグを設定し、これの原因は、関数からエラーが返される場合、現在のファイルを作成しようと既に存在します。 しているため、一時ファイル、それは存在すべきではないの必要性を前にしてください。 ファイルが存在する場合には、これは攻撃の可能性がサインします。 これらのメソッドを使用する場合は、をチェックすることも重要の関数の戻り値と任意のファイルをきれいにエラーが発生し、イベントの条件です。 次の例では、構文を開くには1つのファイルを作成したり、すでに存在していない場合にのみを許可することができるの創造を読み取り、書き込み、およびマクロモードs_irwxuを使用して実行しています。 オープンします( "ファイル名"は、 o_creat |におけるo_excl | o_wronly 、 s_irwxu ) ; このイベントに、呼び出しは失敗したが、ファイルが既に存在するため、におけるo_exclフラグです。 また、ファイル名をメモしていないします。 命名規則を使用して静的な攻撃の危険性を大幅に向上させるための1つのコンポーネントの攻撃は、すでに提供されます。 プレゼンスの増加のため、一時ファイルレース状況とそれに関連付けられ不安、いくつかのオペレーティングシステムが特定の機能には、安全な方法でテンポラリファイルを作成します。 開発者が使用することもでき、オペレーティングシステムに組み込まれているファイルのロック、ファイルのアクセスを制御する機能を提供します。 これらのメソッドは、根本的なカーネルのコンポーネントへのアクセスを制御します。 ヒント テンポラリファイルを使用する場合は、ファイル名をランダムにして、強力な権限を設定し、作成して整理して、使用、および除去のファイルを最小限に抑えることの可能性を攻撃します。 別のコンポーネントの信頼性を高めるとの安全保障に影響を与えることができ、アプリケーションが戻り値です。 明白な中に思えるかもしれない、それは重要なの必要性を強調するための関数の戻り値を検証します。 頻繁に実行する機能を逐次に頼っていると、以前の検索結果からのデータや機能します。 される前の関数の戻り値をチェックして、依存して実行する機能は無効なデータから保護します。 イベントはありません攻撃のときにも、異常な状態から回復し、アプリケーションの堅牢性を向上します。 この例ではかわいそうなデモを実装して戻り値をチェックするが失敗した場合: n = do_string_check (文字列、 valid_characters ) ; / * intを返す関数* /もし( n == good_return )(process_string (文字列) ;) ここでは、実装されてい弱いため、負の場合、戻りが悪い、処理することはありませんします。 より良い実装されてい n = do_string_check (文字列、 valid_characters ) ; / * intを返す関数* /もし( n ! = good_return )(special_error_processing_routine ( n )の; / *悪いの値は、何か* /)process_string (文字列) ; 負の戻りが処理され、エラー処理ルーチンは、プログラムを終了することができ、新しい文字列を要求する、または戻り値に変換され、有効なパラメータです。 戻り値が良い場合は、それが、ルーチンプロセスです。 ヒント イベントの作成およびエラールーチンを提供し、再利用できる標準的なメカニズムをすべてのアプリケーションに対応するさまざまな攻撃と問題があります。 これらの共通のルーチンのアイディアを検証メソッドを含めるための文字列や数値は、ラッパの整合性チェックを実行する機能、および変数やメモリ保護のメカニズムを検証して地域もあります。 常にチェックして処理して関数の戻り値です。
詳細は、次のビットを使用するアプリケーション内の機密情報を、パスワードを含む、暗号化、またはその他の個人情報です。 前述のように、すべてのプログラムの情報が存在する分野での共通のプールのメモリを読むことができるの対象外とされる手続きを修正します。 それは有益な情報のメモリをクリアするときには、もはや使用される場合、情報の露出を避けるために攻撃の中にいます。 最もよくかつ十分なデータをクリアする方法は、これは通常のメモリと呼ばれるゼロアウトします。 情報の保存時には、もはや必要に応じて、ストレージの場所またはゼロでなければならないランダムなデータで上書きを防ぐための情報を介して、攻撃者からの回復やメモリコアダンプします。 この手順は特に重要になる際の暗号化が使用されます。 キーを用いて暗号化したり復号化したメッセージは、最も重要な点は、暗号化システム、およびすべての可能性を保護しなければならないことです。 これらのガイドラインを実証するいくつかの共通の問題が発生したcベースのアプリケーションです。 cは、非常に人気があり、非常に強力な言語の柔軟性を提供することを可能にし、開発者、およびケアを使用しなければならないとします。 するperlのアプリケーションperlは興味深い獣の多くのメリットを組み合わせた構造化プログラミング言語のようなカップ、柔軟性と統合して、シェルします。 perlの開発者により、またはサブルーチンを作成する手順は、変数の定義、および活用するアプリケーションやオペレーティングシステムで利用可能なコマンドをします。 これらの機能と、正規表現やパースの強さと、強い存在感を与えるperlのウェブアプリケーションは、システム管理者、および自動化します。 perlのプログラムではないため、通常のバッファオーバーフローの影響を受けやすい性質の弱型付き変数と宣言します。 とは違ってカップ、どのようにしなければならないとメモリ変数として定義され、特定のクラスのストレージとメモリ用に確保しなければならないし、 perlではすべての文字列として扱われるすべてのデータを自動的にします。 次の例を取る: # ! /パス/を/パール1ドル= 1 ;$ one_s = " 1 " ; #全く異なりません1ドル2ドル= $ 1 + $ one_s ; #結果は2 、または" 2 "では同等 cでは、 1つの変数$れるだろうと宣言し、整数$ one_s 、文字列です。 この2つの要素も加えて、結果として誤った値です。 perlで、さまざまな種類を区別できませんので、 2ドルが割り当てられて2 、または" 2 "に相当する彼らは、 perlでいます。 言語ではありませんしても秋の犠牲にして他の言語での要件を示すメモリ割り当てます。 次の例では、完全に許容されるのperl : # ! /パス/を/パール$ var1 = " aaaaa " ;$ var2 = " bbbb " ;$ var2 = $ var1 ; # $ var2になる" aaaaa " ; $ var2にして新しい値の5つの" a "の文字です。 すべての変数は動的に割り当て;プリセットの概念はありませんことができるストレージ容量オーバーフローします。 perlは多感しかし、レースを条件として脆弱性を外部のプログラムの実行に関連付けられています。 ケアに与えられなければならないの機能をシークエンシングします。 入力検証が等しく重要であるperlで、搾取を防止するために、外部のアプリケーションです。 perlの機能をサポートしてファイルを開くには、 cと同様に他の言語で、そのため、一時ファイルを使用しなければ、適切な権限を組み込むフラグを創出します。 perlでの使用はウェブベースのcgiプログラムでも非常に人気があります。 最大のリスクに関連付けられたのは、この環境での使用中に起こる入力検証および外部システムからプログラムを実行します。 アプリケーションを保護するため、いくつかの注意事項を撮影することができます。 汚染のメカニズムを使用して確認したperlで、任意の変数を設定するの外に渡されません。このプログラムでは、任意のプログラムを実行されるアプリケーションです。 任意の変数に設定された変数となる汚染され汚染されました。 汚染チェックモードは、特に便利の脆弱性を回避するために、いかにしてユーザーのチェックボックスをオフにするプログラムをひそかに渡される変数は、 perlのアプリケーションから呼ばれます。 を初期化するバージョン5のperlで汚染チェックモードでは、次のようなスクリプトを使用してヘッダーを選択する: # ! /パス/を/トン# perlの汚染チェックモードで実行する 予防策は、次の値の入力をパースするメタ文字を削除すると、不要な値です。 これにより攻撃から身を守るに渡すパラメータを利用して他のアプリケーションをシェルとします。 次の例では、単純なルーチンをスキャンして任意の文字列を入力してメタ文字と解釈されるかもしれませんプログラム: $ unclean_input = & get_html_forms_response ( ) ; このケースでは、定期的にエラーが発生した場合はレポートのメタ文字が見つかりました。 代替方法のメタ文字を置き換える、または続行していない場合にのみメタ文字が見つかりました。 最終的な予防策は、シェルを使用する他のアプリケーションを実行します。 unixシステムと同様に( )をコールすると、 windowsのexec ( )の呼び出しは、システムコール( )にperlを使用すると、別のアプリケーションを実行する開発者です。 のexec ( )の関数を呼び出し、 perlでunixのようなことを電話でのプログラムの実行中のプロセスに置き換えられて表示されます。 これらの関数を使用することができ、特に危険なときには、ユーザーの入力環境で行うことができるなど、 cgiのプログラムやシステムユーティリティします。 入力検証場合は発生しませんが、アプリケーションに利用できる任意のプログラムを実行して、システムに影響を与えることができます。 次の例を示して、不安を使用するシステム( )をnonvalidated入力します。 ユーザが指定した文字列のユーザー名と仮定し; / binに/てrm -のrf /になったことに割り当てられた変数$入力: システム( " ecommerce_appは$ input " ) ; この変換を効率的に/ bin / shにecommerce_appユーザー名; / binに/てrm -のrf / 。 と仮定して、プログラムが実行され、特権で、このプログラムを実行するシェルを実行するには、 eコマースのアプリケーション;シェルセミコロンヒットします。これは、シェルコマンドの区切りを;そして実行してrm -高周波、これを消去したファイルシステム全体のします。 javaのjavaの美es sujavaは、比較的最近の発明のインターネットの世界では分散コンピューティングします。 もたらすことを実現するコードの概念をプラットフォームに依存します。 javaの作品のコードを書くとコンパイルして、特別なフォーマットでは、 javaの仮想マシンを実行しています。 仮想マシン( vm )は、特定のプラットフォームで、そのコードを実行することはありません。 javaの許可およびリモートシステムのウェブブラウザを実行すると、より複雑なインタラクティブなアプリケーションです。 ウェブサイトは、ウェブブラウザからアクセスすると、サーバーからjavaアプレットを受信するとします。 次にこのアプレットを実行するには、ウェブブラウザと通信することができ、ウェブサーバーで発生します。 を導入したとき、ジャワのウェブページを変換する静的および動的なアプリケーションを流れています。 以来、初期の頃は、 javaの使用が拡大され、さまざまな分散アプリケーションのネットワーク管理などの分野では、インターネット家電組み込み、およびその他のユーティリティ関数です。 javaは罰金の例は、その言語の開発者が設計の初期段階でのセキュリティみなされます。 初期のバージョンのjavaの文書資料もしっかりしたセキュリティアーキテクチャは、サンドボックスと呼ばれ、それを妨げたjavaアプレットまたはアプリケーションからシステムリソースへのアクセスします。 javaの使用を拡大し始めたとして、必要なシステムリソースへのアクセスが起きたため、サンドボックスの外にします。 最初のバージョンのjava開発キットを提供して使用するアプレットに署名します。 モデルを記述するアプレットのデジタル署名を確認することは、その創造します。 デジタル署名の確認が完了したときは、アプレットは、信頼されるローカルシステムにあり、これにより、アプレットを他のシステムリソースへのアクセスします。 このデジタル署名法ではかなりの量の複雑なプログラミングが正しく動作します。 することも重要に注意して、このセキュリティモデルは、デジタル署名付きjavaアプレットは欠点がある。 誰にもアプレットに署名することができます。 悪質なアプレットにすることができ、攻撃者が署名したとされ、ウェブブラウザをダウンロードします。 どうかを検証し、ウェブブラウザを効果的に悪質なアプレットが実際に書かれた攻撃、そして幸せを実行して、結果はどのようにプログラムされています。 2つ目は、現在のものと反復javaセキュリティアーキテクチャは、それ以前よりもはるかに強力で柔軟性のバージョンがあります。 これにより、 javaのアプリケーションの開発を入力し、以前の多くの地域で、その能力を超えました。 javaセキュリティアーキテクチャでは、新しい定義のセキュリティポリシーやアクセス制御を簡単に行うことができるメソッドをアプレットやアプリケーションにアクセスする度にさまざまなリソースを特定します。 ガイドラインの提示に関連してここでは、 javaのデザイナーとの相互作用を分析し、さまざまな分散インターネットアプリケーションの脆弱性が存在して、到着したモデルを提供する柔軟性の高いセキュリティを極端にします。 javaのための完全なドキュメントとその上のapi 、 http://java.sun.comを参照してくださいました。 シェルゲームやunixunixのシェルの基礎を形成するユーザーのunixシステムの相互作用します。 シェルがコマンドラインの通訳をサポートするいくつかのレベルの自動化やプログラミングの形で、シェルスクリプトです。 これらのスクリプトによく使用されるタスクを自動化するシステムを、繰り返し操作を実行し、 cgiのウェブアプリケーションを実行します。 perlのと同様に、地域の潜在的な危険性は、入力検証、レースの条件は、外部のファイルやプログラムの相互作用、およびその組織の機能です。 unixでは、特権操作することができ特権ユーザ実行される、またはすることができ特権ユーザーとして実行するように設定されます。 そこには微妙な違いの2つの方法です。 unixシステム内のすべてのファイルを含むアプリケーション、設定の属性を持つユーザーとグループの所有権が含まれる、とのフラグのセットを許可します。 複合、彼らに厳密に制御されたファイルへのアクセスを許可します。 通常のアプリケーションでは、ユーザーが所有すると、アクセス権に応じて、彼らの所有者だけで実行されるかもしれない、されるグループ、またはシステム上の誰にもされました。 相続しているアプリケーションを実行するユーザーの権限をしてください。 root権限を必要とするアプリケーションを実行することができ、非rootユーザではなくても、これらのポイントをどこより高い特権が必要、それは失敗します。 これを克服すると通常のユーザーがアクセスできるように特定の特権関数、 unixのsetuidやsetgidフラグを提供しています。 有効にしたとき、かれらの原因として、アプリケーションを実行すると、そのアプリケーションの所有者またはグループに設定してユーザid ( uid )は、複数のアプリケーションを所有しています。 cgiと多くのシステムのプログラムやシステムリソースへのアクセスを必要とはsetuid rootである。 このプログラムのコンパイルに適用され、のようなcプログラム、およびスクリプトなど、 perlとunixのシェルします。 unixの経験が多いユーザや開発者の危険性について警告し、シェルスクリプトsetuid root権限を提供しています。 すでに述べたようにこれに先立って、入力の検証とレースの条件を簡単に悪用ではありませんが、スクリプトを適切に保護します。 スクリプトを実行するときに特権ユーザとしてはありません。方法を簡単にキーを手渡す城よりも弱いシェルスクリプトです。 スクリプトのようなときには、特に危険なセキュリティ対策プログラムをするために、シェルは、インタラクティブな性質されました。 ユーザーの供給を入力し、シェルを実行する機能です。 perlでは多くのビルトインのチェックアンドバランスsetuid安全に使用することができます。 インターネット家電インターネット家電や携帯デバイスでは、これらのシステム全体の目的は、インターネットコンピューティングします。 すべての設計ガイドラインについては、プログラミング言語の配慮、脆弱性、およびオペレーティングパラダイムは、直接に関連したインターネット家電ます。 インターネット家電頻繁に使用する共通のオペレーティングシステムでは、アプリケーション、およびその目標を達成する方法をします。 アプリケーション開発の場合、次のようにこのパスは、特別な注意を払うのすべての情報をここに提示されます。 いくつかのインターネット家電は、スクラッチから開発し、デザインや技術を組み込むだけで新たに開発します。 これらのシステムのセキュリティリスクを評価するために必要な余分な勤勉されます。 セキュリティを統合することが特に重要に設計プロセスの起動時からスクラッチします。 これは、記事を追加したタマスquerolin 免責事項:弊社のウェブサイト上に含まれる情報は、責任を負いませんこの記事されました。 この記事ではない方法での意見を反映して、ご意見、思想や信条の記事ディレクトリのスタッフします。 翻訳注意:記事"安全なコーディングプラクティス"だった翻訳する自動翻訳サービスを使っています。 すべてのお客様にご迷惑を翻訳してエラーが発生しました。 理解していただきありがとうございました。
|
||||||||||
| Online: 578 users browsing the articles directory |
|
|