Auf dem Windows-Terminalserver des Rechenzentrums der Uni Rostock gibt es eine generelle Richtlinie, die das Ausfuehren von beliebigen exe-Dateien verbietet. Der Benutzer soll also keine eigenen Programme nutzen koennen. Allerdings ist java erlaubt; also kann der Nutzer beliebigen Code ausfuehren -- wenn er denn als Java-Kompilat vorliegt. Dieser Sachverhalt trieb mich zur Frage, wie weit das Verbot des Ausfuehrens geht -- und ob man es umgehen kann. Ohne Java.

Grundidee

Der Grundgedanke war simpel. Windows prueft anscheinend nur das Ausfuehren von exe-Dateien. Was ein solches Programm dann wiederum aufruft oder an Daten laedt und - wieauchimmer - zur Ausfuehrung bringt, scheint irrelevant. Wenn sich also der Code irgendwo befinden darf, warum dann nicht auch beispielsweise in einer DLL?
Das musste mal herausgefunden werden. Dazu nehme man die folgenden Zutaten:

Anlauf: Code und Kompilat

Der Code ist beinahe schon zu simpel. Dennoch:

library neb;

uses
 SysUtils, Dialogs, Classes;

{$R *.res}

procedure doMe;
var
 i: integer;
 s: string;
begin
 for i:=0 to paramcount() do
 begin
  s := s + #$d#$a + inttostr(i) + paramstr(i);
 end;
 showMessage('do me!' + #$d#$a + s);
end;

exports
 doMe;

begin
end.

Kurz zur Erlaeuterung: Zunaechst wird festgelegt, dass der Compiler mir aus meiner Eingabe eine DLL erstellen soll. Darauf folgt die Inklusion von weiteren Hilfsdateien. SysUtils, um inttostr() benutzen zu koennen, Dialogs fuer showMessage() und schliesslich noch Classes.
Danach kommt eine Kompilerdirektive und dann eine Prozedur, die die uebergebenen Parameter in einen String umwandelt und anschliessend ausgibt. Zum Abschluss wird noch erklaert, welche Funktion exportiert werden soll. Nach dem Kompilieren habe ich eine handliche kleine neb.dll, die ich in mein Heimatverzeichnis auf dem restriktiven Testrechner kopiere.
Dann kommt der mit Spannung erwartete Moment.

Absprung


Und siehe da...

Landung und Fazit

Tja, was soll man sagen. Geschafft. Ich habe meinen eigenen Code zur Ausfuehrung gebracht, obwohl es eine Gruppenrichtlinie gibt, die genau das verhindern will. Allerdings wurde keine exe-Datei ausgefuehrt, die ich aufrufe (selbst, wenn ich versuchen wuerde, sie aus der DLL heraus aufzurufen. Schade, aber ich kann immer noch beliebigen Inhalt in eine DLL packen und ausfuehren. Ich frage mich, ob es eine Systemrichtlinie gibt, die auch das Unterbinden kann. Im Zweifelsfall waere es wohl ein Ansatz, die Ausfuehrung von rundll32 zu verbieten... die Frage ist dann nur, an welchen Stellen ueberall dieses Programm benoetigt wird. Dennoch, Sieg! \o/
Wirklich?
Streng genommen eigentlich nicht. Denn durch die Gruppenrichtlinie wird nur das Ausfuehren von beliebigen ausfuehrbaren Dateien verhindert. Und eine DLL ist an sich keine solche. Stattdessen wird hier ein erlaubtes Programm genutzt, um -- genau wie im Abstract fuer Java beschrieben -- ueber weitere Mechanismen weiteren Code zu laden und zur Ausfuehrung zu bringen. Mehr eigentlich nicht.
Also ein halbdurchlaessiges Loch. Der "gewoehnliche" Nutzer, der sich seinen supertollen IM-Clienten (jetzt mit extraviel Werbung!) herunterlaed und ausfuehren moechte wird erfolgreich abgehalten. Aber einen Menschen mit Zugang zu einem Kompiler und dem Wissen, wie man eine shared Library fuer Windows erstellt haelt es nicht mehr.
Und selbst dann -- der Programmcode sitzt immer noch im Berechtigungskontext des aktuellen Nutzers. Als solcher hat er immer noch keinen Zugriff auf die wirklich spannenden Sachen. Dazu muesste man schon dem System etwas unterschieben... aber das fuehrte hier nun wirklich zu weit.

Nachtrag: Was ist eigentlich rundll32?

Dieses Programm tut das, was der Name sagt: Es fuehrt eine DLL aus. Aber eine DLL hat keine Einsprungspunkt wie ihn eine normale Anwendung hat, sondern enthaelt nur Funktionen, einen Initialize- und einen Finalize-Block. Deshalb muss nach dem Namen der DLL, mit Komma abgetrennt, noch der Funktionsname, der aufgerufen werden soll. Gegebenenfalls koennen auch noch weitere Parameter, die die Funktion benoetigt angegeben werden -- seine volle Bedeutung erlangt die rundll32 allerdings erst im Zusammenspiel mit Skripten, denn so koennen Windows-Systemaufrufe ausgefuehrt werden, an die man sonst nicht herankaeme.

Zur Veroeffentlichung

Ich veroeffentliche in gewissem Masse eine Sicherheitsluecke. Dessen bin ich mir sehr wohl bewusst. Ich veroeffentliche hier eine Luecke, die die Uni direkt betrifft. Auch dessen bin ich mir bewusst.
Ich bitte, einmal auf das Datum des Artikels zu schauen. Die 2008 ist kein Tippfehler. Ich habe diesen Artikel vor zwei Jahren geschrieben und damals selbstverstaendlich das Rechenzentrum ueber diese Luecke in Kenntnis gesetzt. Fuer mich selbst ist die Luecke mittlerweile mehr eine schrullige Anekdote denn ein akutes Problem.

Stichworte:


Impressum