Sicherheit und dynamische Codegenerierung
Die Funktionsweise einiger Bibliotheken besteht darin, Code zu generieren und diesen auszuführen, um eine Operation für den Aufrufer durchzuführen. Das grundlegende Problem hierbei ist das Generieren von Code für weniger vertrauenswürdigen Code, der dann auf der Ebene einer höheren Vertrauenswürdigkeit ausgeführt wird. Das Problem ist noch gravierender, wenn der Aufrufer Einfluss auf die Codegenerierung hat. Deshalb müssen Sie sicherstellen, dass ausschließlich Code generiert wird, den Sie als sicher bewerten.
Sie müssen sich jederzeit über die Art des jeweils generierten Codes bewusst sein. Dies bedeutet, dass Sie immer die vollständige Kontrolle über von Benutzern erhaltene Werte haben müssen, unabhängig davon, ob es sich um in Anführungszeichen eingeschlossene Zeichenfolgen (die mit einem Escapezeichen versehen sein müssen, damit keine unerwarteten Codeelemente enthalten sind), Bezeichner (deren Gültigkeit überprüft werden muss) oder sonstige Werte handelt. Bezeichner können ein Problem darstellen, da eine kompilierte Assembly so geändert werden kann, dass ihre Bezeichner ungewöhnliche Zeichen enthalten, die sie u. U. zerstören können (obwohl dies selten eine Sicherheitslücke darstellt).
Es empfiehlt sich, Code mit der Reflektionsausgabe zu generieren, die häufig die Vermeidung diesbezüglicher Probleme unterstützt.
Beim Kompilieren des Codes müssen Sie Überlegungen anstellen, ob dieser durch ein bösartiges Programm manipuliert werden kann. Gibt es eine kurze Zeitspanne, in der bösartiger Code den Quellcode auf der Festplatte ändern kann, bevor dieser vom Compiler gelesen wird bzw. bevor der Code die DLL-Datei lädt? Wenn dies der Fall ist, muss das Verzeichnis mit den betreffenden Dateien geschützt werden, indem nach Bedarf die Codezugriffssicherheit oder eine Zugriffssteuerungsliste verwendet wird.
Wenn ein Aufrufer den generierten Code so beeinflussen kann, dass ein Compilerfehler auftritt, kann auch hier eine Sicherheitslücke vorliegen.
Führen Sie den generierten Code mit den geringsten möglichen Berechtigungen aus. Verwenden Sie entweder PermitOnly oder Deny.