世にはいろいろな種類の言葉があり、どれ一つ意味を持たないものはありません。 | |
新約聖書 コリントの信徒への手紙一 14 章 10 節) |
言語には固有の問題がたくさんあります。 下記にその問題の多くを要約して挙げておきます。
関連する警告と実際に利用できる防御機構をすべて有効にしてください。 コンパイル言語では、コンパイル時と実行時の両方が対象になります。 一般的にセキュリティに関連しているプログラムでは、警告をすべて有効にして、 きちんとコンパイルすべきです。
「セーフ・モード」(つまり、実行動作に制約をかけられるモード)が利用できるなら、 そうしてください。 インタプリタ言語の多くは、そのようなモードを用意しています。 一般的に、セーフ・モードに頼って、それだけで防御を行ってはいけません。 セーフ・モードを持っている言語の大部分は、言語のセキュリティを十分に分析 しているとは言えません。そうなると、そこを狙ってさまざまな手段を見つけ出して しまうのが通例です。 しかしコードを書くに当たっては、コードがセーフ・モードを使わなくても安全で あるようにし、さらにセーフ・モードをかけて、最終的には何重にも防御をかかる ようにします(おおかた、攻撃者はアプリケーションのコードとセーフ・モード両者 を壊さなければならなくなります)。
言語に含まれている危険で古臭い操作は避けてください。 「危険」とは、操作を正しく行うのが難しいものを指します。 たとえば、言語の多くには「不思議な」機構や機能があります。つまり、「正しい」 動作を推測して、試行錯誤して使用するものです。一般的にはこれらは避けるべき です。攻撃者が試行錯誤してそれにつけこみ、予測できない何か危険なことができる かもしれないからです。 よく起るエラーに、「オフ・バイ・ワン(off-by-one)」エラーがあります。 これは、境界値が 1 つずれることで、結果的にエラーとなる脆弱性です。 普通、オフ・バイ・ワンエラーの発生が最小限になるようにコードを書いてください。 言語に標準規約があるなら(たとえば、ループの書き方)、それに従ってください。
言語の基盤となる部分(たとえば、ランタイム・ライブラリ)が利用でき、 それが安全であるかを確認してください。
文字列のガーベジ・コレクションを自動的に行う言語において、機密データ(特に 秘密鍵やパスワード)を慎重にすぐ削除してください。
自分が使用している操作方法を正確に理解しておいてください。 ドキュメントにある操作方法それぞれを調べてください。 関連する可能性がないと確認できない限り、返り値は無視しないでください。 「signed」の値と「unsigned」の値の違いを無視しないでください。 例外をサポートしていない C のような言語では特に困難ですが、方法はあります。