入力バリデーションで許可した文字で発生するリスク
入力バリデーションでほぼ全てのインジェクションリスクを回避/防止できるケースは以前書いたブログで紹介しています。 今回は趣向を変えて、入力バリデーションで許可してしまった文字で発生するリスクをざっと紹介します。 ※ ここで紹介する考え方は脆弱なブラックリスト型です。より安全な方法はホワイトリスト型の考え方です。参考: ほぼ全てのインジェクション攻撃を無効化/…
正しく動作するソフトウェアの作り方
ソフトウェアを開発している時に困るのは、ソフトウェアが正しく動作しないケース、に対応する事です。 実用的なソフトウェア作るよりもプロトタイプを作る方が簡単であるのは、ソフトウェアが正しく動作しないケース、に対応する必要がないことが大きな理由です。ソフトウェアが正しく動作しないケースに対応するには、様々な例外的な状態(入力データとソフトウェアの内部状態)全てに…
インジェクション攻撃は3種類ある
インジェクション攻撃、とは言ってもそのインジェクション対象によって影響が異なります。インジェクション攻撃の対象によって2種類、コードとデータ、に分類できます。Webシステムの場合、リクエストのインジェクションを別のインジェクション攻撃と考えた方が解りやすいので、大まかに分類して3種類に分類できます。 インジェクション脆弱性は絶対に避けなければならない脆弱性で…
今のソフトウェアセキュリティが不十分である原因とは?
ソフトウェアのセキュリティを向上させよう!と日々奮闘している方も多いと思います。しかし現在、ソフトウェアセキュリティは十分、と言える情報からは程遠い状態です。 なにが足りないのか?なぜ不十分になるのか?基本的な部分の見落としに原因があります。 (さらに…)
今さら聞けない「コード」と「データ」の話
ビルドを繰り返して時間があったので、ついついとても長いデータの話を書いてしまいました。今さら聞けない「コード(機能)」と「データ」の話として、もっと単純化してみます。 当然の話なのですが、現実には当たり前ではなかったりします。 「データ」のセキュリティを考慮しないセキュリティ対策はあり得ないのですが、多くのプログラムは「コード(機能)」のセキュリティに偏重し…
命令と引数を分離すれば安全、と考えてしまう”とんでもない誤解”はどこから生まれるのか?
SQL文やコマンド実行には命令と引数を分離するAPIがあります。便利なAPIなのですが、安全性について根本的な勘違いが多いです。 プリペアードクエリ系のAPIさえ使っていれば安全 execv系のAPIさえ使っていれば安全 これらは大きな勘違いです。 データ処理の安全性は”出力先”の処理に依存する SQLのデータもコマンド実行のデータも、そのデータ出力の安全性…