CWE ID: 1265
Name: Unintended Reentrant Invocation of Non-reentrant Code Via Nested Calls
Während der Ausführung von Non-reentrant Code führt das Produkt einen Aufruf durch, der unbeabsichtigt eine verschachtelte Invocation des Non-reentrant Code erzeugt.
In komplexen Produkten kann ein einzelner Funktionsaufruf zu zahlreichen unterschiedlichen Code-Pfaden führen, von denen einige tief verschachtelte Aufrufe beinhalten können. Es kann schwierig sein, alle möglichen Code-Pfade vorherzusehen, die von einem gegebenen Funktionsaufruf ausgehen. In einigen Systemen kann ein externer Actor Eingaben manipulieren und dadurch eine breite Palette möglicher Control Flows erreichen. Dies ist häufig ein Anliegen bei Produkten, die Scripts aus nicht vertrauenswürdigen Quellen ausführen, wie beispielsweise Web Browser und PDF Reader. Eine Schwachstelle liegt vor, wenn einer der möglichen Code-Pfade, der sich aus einem Funktionsaufruf ergibt, den Programmzustand verändert, von dem der ursprüngliche Aufrufer annimmt, dass er während des Aufrufs unverändert bleibt.
Effektivität: High
Beschreibung: Bei der Architektur eines Systems, das nicht vertrauenswürdigen Code als Reaktion auf Ereignisse ausführt, sollte man die Ausführung der nicht vertrauenswürdigen Event Handler asynchron (asynchronous message passing) gegenüber synchroner Ausführung zum Zeitpunkt des Eintreffens jedes Ereignisses bevorzugen. Der nicht vertrauenswürdige Code sollte zu Beginn der nächsten Iteration der Thread’s Message Loop ausgeführt werden. Auf diese Weise werden Aufrufe in nicht-reentranten Code strikt serialisiert, sodass jede Operation vollständig abgeschlossen ist, bevor die nächste Operation beginnt. Besondere Aufmerksamkeit muss allen Stellen gewidmet werden, an denen Type Coercion zur Ausführung von Scripten führen kann. Die Durchführung aller benötigten Coercions zu Beginn einer Operation kann dazu beitragen, die Wahrscheinlichkeit zu verringern, dass Operationen an unerwarteten Junctures ausgeführt werden.
Effektivität: High
Beschreibung: Stellen Sie sicher, dass der betreffende Code (z.B. Funktion oder Klasse) reentrant ist, indem Sie die Nutzung von non-local Data vermeiden, den eigenen Code nicht modifizieren und keine anderen non-reentrant Code aufrufen.