セキュリティと実行時のコード生成Security and On-the-Fly Code Generation

ライブラリによっては、コードを生成し、それを実行することによって、呼び出し元のためになんらかの処理を行います。Some libraries operate by generating code and running it to perform some operation for the caller. 基本的に問題となるのは、より低い信頼度のコードの代わりに生成し、そのコードをより高い信頼度で実行することです。The basic problem is generating code on behalf of lesser-trust code and running it at a higher trust. 呼び出し側がコードの生成に影響を及ぼすと問題はさらに悪化するため、安全と考えられるコードだけが生成されることを確認してください。The problem worsens when the caller can influence code generation, so you must ensure that only code you consider safe is generated.

常に、どのようなコードが生成されているのかを知る必要があります。You need to know exactly what code you are generating at all times. これは、ユーザーから取得する値を厳しく制御することが必要であることを意味します。これらの値は、引用符で囲まれた文字列、ID、またはそれ以外です。引用符で囲まれた文字列は予期しないコード要素を含まないようにエスケープ処理が必要で、ID は有効な ID かどうかをチェックする必要があります。This means that you must have strict controls on any values that you get from a user, be they quote-enclosed strings (which should be escaped so they cannot include unexpected code elements), identifiers (which should be checked to verify that they are valid identifiers), or anything else. コンパイルされたアセンブリは変更できるため、変更によってその ID に異常な文字が含まれると、セキュリティが脅かされます。このため、ID にも危険性があります。ただし、これがセキュリティ脆弱性になることは稀です。Identifiers can be dangerous because a compiled assembly can be modified so that its identifiers contain strange characters, which will probably break it (although this is rarely a security vulnerability).

リフレクション出力を指定してコードを生成することをお勧めします。これは、上記の多くの問題を防ぐのに役立ちます。It is recommended that you generate code with reflection emit, which often helps you avoid many of these problems.

コードをコンパイルするときに、悪意のあるプログラムがなんらかの方法でコードを変更できるかどうかを考慮します。When you compile the code, consider whether there is some way a malicious program could modify it. コンパイラがソース コードを読み取る前、またはコードが .dll を読み込む前に、悪意のあるコードがソース コードを変更できる時間的なすきまがないかどうかを確認します。Is there a small window of time during which malicious code can change source code on disk before the compiler reads it or before your code loads the .dll file? ある場合は、ファイル システムのアクセス制御リストを適切に使用して、これらのファイルが格納されているディレクトリを保護する必要があります。If so, you must protect the directory containing these files, using an Access Control List in the file system, as appropriate.

関連項目See also