.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

システム開発工程とセキュリティ対策

実施例

要件定義

工程

・・・

実施

方式設計

工程

・・・

実施

  • リスク分析の実施
  • セキュリティ要件の決定
  • セキュリティ基本要件の決定
    • セキュリティ目標
    • 適用 / 準拠 基準
    • セキュリティ基本要件
  • セキュリティ実装要件の決定
    • 識別 / 認証
    • アクセス制御
    • データ保護(暗号化)
    • セキュリティ監視
    • セキュリティ監査
    • マルウェア対策
    • DoS攻撃対策
  • アプリケーション・セキュリティ要件の決定
    • 開発環境のセキュリティ対策要件
    • アプリケーション特性からのセキュリティ要件
    • セキュリティ・テスト方式に関する要件
  • システム・セキュリティ管理要件の決定
    • ID管理
    • 鍵管理
    • パッチ管理
    • 構成 / 設定 / 変更管理
    • ログ管理
    • インシデント / 問題 管理

基本・詳細設計

工程

  • UI設計
  • システム構造設計
  • プログラム構造設計

実施

  • セキュリティ設計 / 構築手順書の整備
  • システム領域
    • 要件:セキュリティ実装要件、システム・セキュリティ管理要件
    • ネットワーク、サーバ機器、セキュリティ製品の構成決定
    • 構築手順書の整備
  • プログラミング領域
    • 要件:セキュリティ実装要件、アプリケーション・セキュリティ要件
    • プログラム構成の決定
    • 共通モジュール、モジュール間I/F仕様の決定
  • セキュア・プログラミング・ガイド文書の整備
    • 文書の整備
    • 開発要員の教育

構築、PG、UT

工程

  • システム基盤構築
  • プログラミング
  • プログラムテスト

実施

  • セキュア・システム基盤構築
  • セキュア・プログラミング
    • プログラム開発
    • ソースコード・レビュー(ホワイト・ボックス)
      • 専門家によるレビュー
      • ツールによるレビュー

テスト

工程

  • 結合テスト
  • システム・テスト
  • 運用テスト→移行

実施

本番前脆弱性検査

  • 専門家による脆弱性検査
  • 脆弱性検査ツール
    • プラットフォーム層診断
    • アプリケーション層診断

運用・保守

工程

・・・

実施

稼働後脆弱性検査

セキュリティ規格・基準

ISO/IEC 15408

PCI DSS

ASVS

OWASP の ASVS

  • ASVS : Application Security Verification Standard
  • アプリケーションセキュリティ検証標準

言語毎の留意点

C/C++

BOF系

  • 言語使用として、全体的にBOF系に弱い。
    • 終端ナル(NULL)文字を忘れると、終端が認識されずBOFに繋がる。
    • 以下の様に、BOFを引き起こす可能性がある引数チェックされない関数が多い。
      #関数代替案/対策用法備考
      1char *gets(char *s)
      標準入力から一行を取り込む。
      char *fgets(char *s, int n, FILE *stream);fgets(dst , sizeof(dst) , stdin);gets と異なり
      ・引数に最大読み込み文字数を指定する。
      ・改行文字も 1文字として数える。
      ・実際読むのはn-1で最後は終端ナル(NULL)文字になる。
       ・終端記号は、末尾の改行を置換ではなく改行の後ろに付与
       ・最大文字数を超えた場合でも終端ナル(NULL)文字を保証
      2char *strcpy(char *dst, const char *src);
      src文字列をdst文字列バッファに'\0' までコピー
      void *memset(void *buf, int ch, size_t n);
      char *strncpy(char *dst, const char *src, size_t n);
      memset(dst, 0 , sizeof(dst));
      -> strncpy(dst, src, sizeof(dst) - 1);
      ・コピーされる文字の長さは、src長とnのいずれか小さい方。
      ・src長がnより短い場合、終端ナル(NULL)文字を保証
      3char *strcat(char *dst, const char *src);
      src文字列をdst文字列バッファに'\0' まで連結
      char *strncat(char *dst, const char *src, size_t n);strncat(dst, src, sizeof(dst) - strlen(dst) - 1)・文字列連結される文字の長さは、src長とnのいずれか小さい方。
      ・src長がnより短い場合、終端ナル(NULL)文字を保証
      4int sprintf(char *dst, const char *format, ...);
      可変個引数をstring.Format()的に処理しdst文字列バッファに格納。
      sprintf(dst, ”%.{B}s”, data){B} = dstの要素数 - 書式指定子以外の文字数 - 1
      5int snprintf(char *dst, size_t n, const char *format, ...);snprintf(dst, sizeof(dst), ”%s”, data)動作としては、fgets()に近く、実際読むのはn-1で最後は終端ナル(NULL)文字になる。
      6int scanf(const char *format, ...);
      標準入力から空白、タブ、改行で分割された文字列を読みstring.Format()的に処理し格納可変個引数に格納。
      scanf(”%.{B}s”, dst){B} = dstの要素数 - 書式指定子以外の文字数 - 1
      7int sscanf(char *src, const char *format, ...);
      src文字列をstring.Format()的に処理し格納可変個引数に格納。
      sscanf(src, ”%.{B}s”, dst){B} = dstの要素数 - 書式指定子以外の文字数 - 1
      8int fscanf(FILE *fp, const char *format, ...);
      ストリームをstring.Format()的に処理し格納可変個引数に格納。
      fscanf(fp, ”%.{B}s”, dst){B} = dstの要素数 - 書式指定子以外の文字数 - 1
      9getchar();, fgetc(fp);, getc(fp);
      入力から一文字を取り込む。
      使用する際にバッファ境界チェックを行う。
  • パターン
  • 何れもdstのサイズを調査して長さを指定する。
    • 基本的には、n = dstのサイズ - 1(終端ナル(NULL)文字用)
    • 指定先は、size_tか、書式指定子の精度(書式指定子の場合、更に書式指定子以外の文字列数を引く)になる。
    • 関数によっては(fgets、snprintf)、入力を自動的にn-1するものもあり、「- 1」が不要。
  • va_listを使用する関数も基本的対応は同じ。
    • vscanf → scanf
    • vsscanf → sscanf
    • vfscanf → fscanf
    • vsprintf → sprintf

OSコマンド・インジェクション

Java

セキュリティ機構

  • サンドボックス・モデル(CASのような仕組)
    • ローカル
    • 外部
      • ネットワーク
  • セキュリティ・ポリシ
  • 設定項目
    • 署名者(signedBy)
    • コードの場所(codeBase)
    • アクセス権(permission)
  • 設定箇所
    • システム・ポリシーファイル ({java.home} 以下)
    • ユーザ・ポリシーファイル ({user.home} 以下)
  • クラスローダ
    • アクセス権を持ったクラス・オブジェクトの定義
    • 上記を統合して、クラスを実行時インストールする
      • サンドボックス・モデル
      • セキュリティ・ポリシ
  • セキュリティモデル
  • セキュリティ・マネージャ
    • セキュリティモデルを、セキュリティ・マネージャに委ねる場合。
    • System.getSecurityManager?SecurityManager?クラスを取得し、
    • security.checkXXXXメソッドでチェックする。
  • アクセス・コントローラ
    • 特定のセキュリティモデルを使用する場合、
    • XXXXPermissionクラスをnewし、
    • AccessController?.checkPermissionメソッドでチェックする。

レース・コンディション

  • 変数
    主に、Instance変数ではない、
    static変数により競合が発生する。
  • RDBMSレコード
    仮予約などの機構で競合し、
    他人の予約を参照できてしまう。

その他

  • 公開不要なメソッド、メンバ変数は、Publicではなく、Privateに設定
  • 不要な、setter / getterは、Interfaceに定義しない
    (そして、ユーザはClassではなくInterfaceを利用)。
  • 継承の末端Classにはfinalを付与

ECMAScript

留意点

グローバルでvar省略しない。

その他

  • Cookieを使用可能。
  • Ajax
    • クライアント側ライブラリとしてXMLHttpRequest?を使う。
    • データ・フォーマットとしては主にJSONを使う。
      • eval()は危険なので、JSON.parse()を使用する。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-04 (月) 13:52:23 (7d)