セキュアなコーディングの一般的なガイドライン

次のコーディング・プラクティスに従って、ソース・コード・レベルでセキュリティを拡張します:
  • タイプ・チェック、長さチェック、バインド・チェックを実行して、入力データがプログラムで必要なデータであることを確認します。入力には、ユーザーが入力するデータに加えて、コマンドライン引数および環境変数が含まれます。

  • インジェクション攻撃で利用される可能性のあるシェル・コマンド、SQL文、XMLまたはHTMLコードなどの構造体が含まれているかどうか、入力データを確認します。

  • システム・コールおよびライブラリ・ルーチンに対する引数のタイプ、長さ、バインドを確認します。可能な場合は、バッファ・オーバーフローを防ぐライブラリ・ルーチンを使用します。

  • ファイル名引数にはフルパス名を使用します。あらゆるユーザーが書込み可能なディレクトリのファイルは使用しないでください。また、書き込まれるファイルがシンボリック・リンクでないことを確認し、既存のファイルが間違って上書きされないようにします。

  • システム・コールおよびライブラリ・ルーチンから返される値のタイプ、長さ、バインドを確認します。コードが、システム・コールおよびライブラリ関数で設定された、またはこれらから返されたエラー・コードに適切に応答するようにします。

  • シェル環境の状態を想定しないでください。ユーザー・ファイル作成マスク、シグナル処理、ファイル記述子、現在の作業ディレクトリ、環境変数など、特にPATHIFSなど、プログラムがシェルから継承した設定を確認します。必要に応じて、設定をリセットします。

  • 有限の値セットをとる変数で、アサーション・チェックを実行します。

  • 権限アクションやエラー条件に関する情報を記録します。エンドユーザーのシステム上で、プログラムがコア・ファイルをダンプしないようにしてください。

  • パスワードを画面にエコーしたり、クリア・テキストで送信または保存したりしないでください。パスワードを送信または保存する前に、Salt値と組み合せて、SHA-512などのセキュアな一方向アルゴリズムを使用してハッシュを作成します。

  • プログラムで擬似乱数生成ルーチンを使用する場合、生成する番号がセキュリティ要件を満たすのに十分にランダムであることを確認します。また、潜在的な攻撃者が予測できないよいランダム・シードを使用してください。詳細は、RFC 4086、『Randomness Requirements for Security』を参照してください。

  • ホスト・システムでアドレス空間配置のランダム化(ASLR)を有効にします。この機能は、特定のタイプのバッファ・オーバーフロー攻撃を撃退する可能性があるためです。「アドレス空間配置のランダム化」を参照してください。

  • プログラムをコンパイルしてリンクする際、位置独立実行形式(PIE)機能を使用して位置独立バイナリを生成します。「位置独立実行形式」を参照してください。

  • chroot()を使用して、プログラムの操作境界をファイル・システム内の指定された場所に制限することを検討してください。

  • プログラム内、特にsetuidまたはsetgidプログラムからpopen()またはsyscall()をコールしてシェル・コマンドを実行しないでください。

次のガイドラインは、プログラムにsetuidまたはsetgidビットが設定されていて、権限を持たないユーザーのかわりに権限アクションを実行できる場合に適用されます:
  • シェル・スクリプトでsetuidまたはsetgidビットを設定しないでください。ただし、setuidまたはsetgidのPerlスクリプトを使用する場合は、perlを"taint"モードで実行できます。これは、同様のCコードを使用するよりも安全です。詳細は、perlsec(1)マニュアル・ページを参照してください。

  • setuidまたはsetgidが付与する権限の使用を、その権限を必要とする機能に制限し、その後有効なUIDまたはGIDをユーザーのUIDまたはGIDに戻します。可能な場合は、権限機能は独自の監視対象スレッドまたはプロセスで実行します。

  • PATH環境変数を使用するexeclp()またはexecvp()を使用して、子プロセス内でsetuidまたはsetgidプログラムを実行しないでください。