ソフトウェアセキュリティ対策の不思議 – 設計なしのセキュリティ対策

セキュリティ対策には設計図があります。少なくともアーキテクチャー図があります。しかし、何故かソフトウェアの場合は設計図もアーキテクチャー図も書けないセキュリティ対策が当たり前になっています。国際情報セキュリティ標準やセキュリティガイドラインを普通に理解すれば解ること、セキュリティ対策の基礎の基礎にも関わらず、です。

これは開発者の問題というより、セキュリティ専門家の問題でしょう。設計図となると細かな仕様が必要となります。ここではアーキテクチャーだけでも十分なのでこれだけを考慮します。

重要な事なので最初に書いておきます。信頼境界の中に入れたモノ(入力やその他のモノ)であっても、普通は”何をしても安全なモノ”ではありません。安全性の為に更に詳細な入力検証が必要だったり、特定の権限を持つモノだけ許可したりするモノ、条件付きで信頼境界の中に入れるモノが普通にあります。また、信頼境界から出る時(出力)のセキュリティ対策は入力対策とは独立した対策です。これはよくある誤解なので注意しましょう。

 

続きを読む

ソフトウェアセキュリティのアンチパターン

アンチパターンを知ることにより失敗を防ぐ。これはデータベース設計やソフトウェア設計で多く利用されている手法です。今回はソフトウェアセキュリティのアンチパターンを紹介します。

このエントリは不定期にメンテナンスするつもりです。

続きを読む

なぜセキュアなシステムが作れないのか?

なぜセキュアなシステムが作れないのか?この問いは

なぜバグフリーのシステムが作れないのか?1

と同類の問いです。一定規模を超えると完全にバグ/問題がないシステムを作るのは非常に困難です。どのような状況でも正常に動作する完全にバグ/問題がないシステムは簡単には作れません。しかし、バグ/問題がないシステムが容易に作れないからといって「体系的な対策を行わない」のは賢明なアプローチではありません。

このエントリではよりセキュリティ問題が少くなるアプローチを紹介します。これはセキュリティ標準やガイドラインに記載されている考え方をまとめたモノです。

ポイントは

  • 構造化が大事
  • 基礎が大事
  • 目的が大事

です。

続きを読む

PHP用入力バリデーションモジュール – validate

ブログで紹介するのを忘れていました。PHP用の入力バリデーションモジュール validateを作りました。

https://github.com/yohgaki/validate-php

PHP開発MLでの議論用に作ったので、作りかけと言える状態ですが、一応動作し使えます。

関数名はvalidate()の方が良いのでは?という意見があったので、名前は変更する予定です。valid()にしていた理由は”validate”だとあまりに一般的過ぎて、同じ名前の関数を定義しているユーザーがいるだろう、と予想したからです。自分のアプリやライブラリには名前空間を使うべきなので、モジュール関数はvalidate()にします。

いろいろ意見があったのですが、やはり入力処理における入力バリデーションとロジック処理の混同がありました。

入力処理における「形式的バリデーション」とロジック処理における「論理的/仕様的バリデーション」は別処理とした方が、構造的に優れています。この理由はまたの機会に書きます。

 

Python 2.7.14から学ぶセキュリティの基本

Python 2.7.14が2017/9/16にリリースされました。Pythonの開発はバージョン3系に移行しており、2系はセキュリティ修正のみのリリースになっています。とは言ってもモジュールの変更を見るとバグフィックスやドキュメント修正も含まれているようです。

Python 2.7.14のリリースはソフトウェアセキュリティの基本を学ぶには良い題材になります。

続きを読む

Railsユーザーが真っ先にするべきセキュリティチェック – Brakeman

Railsユーザーがソースコード検査やWebサイト診断を受ける前に真っ先に使った方が良いセキュリティ検査ツールがあまり使われていないように感じています。

Brakemanはかなり良くできたツールです。私は何年も前から補助的に使っています。

続きを読む