コンピュータセキュリティ担当者が言語を分析/監査できるようにしてください。
セキュリティ担当者は、出荷前にプログラムの脆弱性を発見できる必要があります。理想的には、早期に呼び出され、開発中にコードベースについてコメントできますが、多くの場合そうではありません。
言語またはコアライブラリの新しいバージョンがリリースされたとき、以前は安全だったものがもはやなくなる可能性があります。
- ライブラリがより強力になる可能性があります。たとえば、URLライブラリがサポートされるようになりました
javascript:
- 文字列やバイトをコードに変換する新しい方法があるかもしれません:例えば、
eval
または逆シリアル化ライブラリ
- 言語リフレクション技術がより強力になる可能性があります。たとえば、ローカル変数の公開
これらの変更は、プログラムが持つ悪用可能な権限の量を増やすことができますが、プログラムが使用する権限の量(悪意のないクライアントを処理する場合)は変更されていないため、セキュリティ担当者は集中的にせずにそれを把握することは困難です再監査。
そのため、言語を設計およびバージョン管理する際に私たちについて考えてください。以下にいくつかのヒントを示します。
プログラムを分解できるいくつかのプリミティブを定義します。
HTML5はこの方法で特に悪いです。彼らは明らかにセキュリティに多くの考えを入れており、非常に優秀な人々を持っていますが<video>
、古いもののように新しいプログラム要素を指定したり、新しいもの<video>
と古いものの<img>
両方を指定できる共通の抽象化を作成する代わりに、<video>
まだ独自のセキュリティ結果を伴う別の一時プログラム要素。
(静的に型付けされていなくても)静的分析を受け入れやすい言語にします。
セキュリティ担当者は、静的分析を使用してパターンを見つけ、プログラムの一部を除外して、本当にトリッキーな部分に集中できるようにします。
どの識別子がローカル変数であり、どの識別子がそうでないかは明らかです。
たとえば、JavaScriptの古いバージョンと同じ間違いを犯さないでください。これによりx
、以下のローカル変数参照かどうかを判断できなくなります(古いバージョンの仕様のリテラルの読み取りによると)。
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
分解可能なセキュリティを許可する
多くの安全なシステムは、セキュリティの特性を保持する安全なカーネルを中心に設計されているため、セキュリティ担当者は、少量のコードの分析に集中でき、ほとんどのプログラマーが{annoying、pedantic、paranoid}セキュリティ担当者に対処する必要がなくなります。
あなたの言語でそのようなカーネルを書くことが可能であるべきです。あなたの言語のセキュリティプロパティの1つが、URLの特定のサブセットのみがフェッチされるということである場合、カーネルライターはコードを介してすべてのURLフェッチを行うために何かを行うことができますか?または、静的なビルドチェック(インポートの確認など)で同じ機能を提供できます。
Newspeakなどの一部の言語では、オブジェクト機能モデルを使用しています。これは素晴らしく、分解可能なセキュリティを得るための素晴らしい方法です。
しかし、それができない場合、モジュールグラフを静的に分析可能なアーティファクトにすることで、かなりのメリットが得られます。モジュールがファイルI / Oモジュールに到達できないことを証明できる場合(TCBのモジュール内のコードを呼び出すことを除く)、そのモジュールから問題のクラス全体を除外できます。
組み込みスクリプト言語の権限を制限する
多くの便利なシステムは、動的な(関数型の)言語で書かれた多くのコードを開始する静的なコアとして構成されています。
また、スクリプト言語を埋め込むと、システムの拡張性が大幅に向上します。
ただし、スクリプト言語はVMの完全な権限を持つべきではありません。
埋め込みスクリプト言語を許可することを選択した場合、実行者が実行できることを簡単に制限できるようにします。ここでは、オブジェクト機能モデル(上記のニュースピークに関するコメントを参照)が非常に適切です。そのため、スクリプト言語でコードを評価する場合、呼び出し元は実行するコードとそのコードのすべてのグローバル変数を渡す必要があります。
eval
スクリプト言語として組み込まれている言語として扱う
言語が独自のコンパイラを呼び出して文字列をコードに変換できる場合、埋め込みスクリプト言語と同じようにサンドボックス化できるようにします。
単純な同時実行モデルを使用する
セキュリティ担当者は、セキュリティプロパティが維持されているかどうかを判断しようとするときに競合状態を心配する必要はありません。
スレッドをセトリングする前のスレッド化の代替手段を、ほとんどセキュリティ保護が不可能なデフォルトオプションとして検討してください。
1つの簡単な方法は、E、Verilog、およびJavaScriptで見られるようなイベントループの同時実行です。
引用の混乱を助長しないでください
一部の言語はグルー言語であり、多くの異なる言語の文字列を処理することになります。
たとえば、JavaScriptは多くの場合、HTML、CSS、XML、JSON、さらにはJavaScriptの文字列を構成します。プログラマーがプレーンテキスト文字列を組み合わせて他の言語の文字列を作成する際に適切にエンコードすることを覚えるのは非常に難しいため、当然ながらJSプログラムにはあらゆる種類の引用混乱問題があります:XSSは最悪です。
文字列構成機能を含める場合は、プログラマのセキュリティ負担を軽減してください。DSL、衛生マクロ、組み込みテンプレート言語は、ライブラリまたは言語開発者に適切に逃げる負担を開発者から遠ざけることで、これを実現する優れた方法です。