|
Virus - ProgrammeQuelle: BAYRISCHE HACKERPOST NR. 3
Virus-Programme stellen ein häufig unbekanntes oder zumindest unbeachtetes (verdrängtes ?) Risiko für Grossrechenanlagen bzw. deren Betreiber dar. Da diese Problematik in der bundesdeutschen Fachpresse bisher so gut wie gar nicht angesprochen wurde, geben wir im folgenden einen kleinen Überblick: Ein VIRUS-Programm ist ein Programm, das in einem Grossrechner angesiedelt, sich in andere, im selben Rechner befindliche Programme reinkopiert und aus diesen so auch Viren macht. Dabei kann das neu, oder, um bei der Analogie zu bleiben, infizierte Programm, auch eine weiterentwickelte Art des Virus darstellen- Solche Programme können lange Zeit unbemerkt in dem Rechner umherwandern, wodurch auch die regelmässig gezogenen Backups mit Viren durchsetzt sind. Erst wenn ein Auslöser dazukommt, wird die eigentliche Zerstörung vorgenommen, In pascal-ähnlicher Notation könnte so ein Virus folgendermassen aussehen: - -------- - --- - --- - - ------program virus: (1234567. subroutine infizieren-exec: - (loop: file = Öffne Exec-File; if erste Zeile = 1234567 then goto loop Virus vorne an File anhängen;
subrautine zerstören: (Zerstören , was zerstört werden soll) subroutine auslöser: - (Wird TRL). falls Auslöser gedrückt) main-program- - (infizieren-exec if auslöser then zerstören; goto next;) next:) (1) Einfaches Beispiel: Virus "V"
Dieser Virus durchsucht alle ExecProgramrne (ausführbaren Programme), ob in deren erster Zeile 1234567 steht, d.h. das Programm bereits infiziert ist. Falls nicht, wird das Programm ebenfalls infiziert. Das Interessante an dieser Art von Programmen ist, dass sie sich auch durch Netzwerke rasch fortpflanzen können: Sobald User B am Rechner Y das (infizierte) Programm von User A auf seinem Rechner laufen lässt, sind auch alle Programme von User A infiziert. Allerdings lässt sich so ein Virus auch für nicht-zerstörerische Zwecke verwenden: Wird ein Kompressionsprogramm als Virus verwendet, so werden automatisch alle Files, verkleinert, und das Virusprogramm setzt sich als Dekompressor vor das geschrumpfte Programm. Allerdings muss das Programm vor jeder Infektion nochmals nachfragen, da sich sonst wieder unvorhersehbare Ergebnisse einstellen können: Nach Versuchen zu urteilen, kann eine Platzersparnis bis zu 50% erreicht werden, wobei die Ausführungsgeschwindigkeit wegen der Dekompression etwas absinkt. Beispiel: program compress-virus: - (01234567: subroutine infizieren-exec:=(loop:file = öffne exec-file; if erste Zeile = 01234567 then goto loop; cornpress file; decompress an file vorneanstellen;
main-program: (if erlaubnis then infizieren-exec; decompress rest-der-file: decompresste file ausführen; (2) Virus zum Komprimieren "C"
Um nur ein Timesharing-System zu einem vorgegebenen Zeitpunkt unbenutzbar zu machen. kann man Virus V folgendermassen abwandeln: subroutine zerstören: -(loop: goto loop,) subroutine auslöser;= (if jahr= 1984 then TRUE else FALSE; (3) Modifiziertes Programm V
Am 1.1.1985 wären alle infizierten Programme, sobald sie aufgerufen werden, dazu übergegangen, nur noch leere Schleifen auszuführen (subroutine zerstören). Wenn der Auslösezeitpunkt genügend spät nach der ersten Infektion des Systems angelegt ist, so dass man sicher sein kann. dass praktisch alle Programme verseucht sind, ist der Fehler wohl nur noch sehr schlecht wieder rauszukriegen, da auch alle dazu nötigen Utilities versaut sind. Werden diese wieder von einer "sauberen" Quelle reinkopiert, so sind sie im Nu auch wieder angesteckt, sobald irgend ein infiziertes Programm im betreffenden Benutzerbereich aufgerufen wird. Schutz vor Viren
Durch die Vernetzung und gleichzeitige Benutzung derselben Daten und Programme ist prinzipiell jede Multiuser-Rechenanlage gegen Viren anfällig, da der Rechner i mer "durchlässig" ist. Die sicherste Methode des Schutzes vor Viren ist demnach die Abschottung des Rechners gegenüber anderen Benutzern und Rechnern, was aber in den meisten Fällen dem Sinn der Übung zuwider läuft. Jedoch kann man den Benutzerkreis in einzelne, und nun zwingend völlig getrennte Bereiche aufteilen, so dass ein infizierter Bereich nicht auch noch die anderen anstecken kannFührt man zugleich auch noch verschiedene Schutzcodes für die Files ein (z.B. durch den Benutzer nur ausführbar, weder lesbar noch beshreibbar), so ist wieder eine gewisse Barriere gegen die Infektion errichtet. Wobei diese natürlich wieder durch einen Virus, der diese Schwelle zuerst runtersetzt, sich dann reinkopiert, und dann den ursprünglichen Zustand wieder herstellt, umgangen werden kann. Behebung der Infektion
Analog zum biologischen Modell kann man in Rechnern die eingedrungenen Viren wieder unschädlich machen. Dazu muss man zuerst feststellen, ob ein Programm ein Virus ist, um dann eine Möglichkeit zu finden, den Virus unschädlich zu machen. Um festzustellen, dass ein Programm P einen Virus darstellt, muss man überprüfen, ob P andere Programme infiziert. Dies geht aber auch nicht so einfach, da man den Virus V wieder so modifizieren könnte, dass er nur dann andere Programme infiziert. wenn eine VirusPrüfroutine D angezeigt hat, dass V kein Virus ist. program kein -virus:=
main-program: (if D(kein-virus) then (infizieren if auslöse; Ihen zerstören, goto next, +(4) Unauffindbarer Virus KV
Nun wird der neu Virus KV nur dann andere Programme infizieren und als Virus arbeiten, wenn die Entscheidungsroutine D festgestellt hat, dass KV eben kein Virus ist. Evolution von Viren
Um die Auffindbarkeit von Viren zu erschweren, kann man sich selbst modifizierbare Virusprogramme einsetzen. program evolutions - virus:subroutine print-zufalls-befehl: (print zufalls-variablennamen, zufalls -variablerinamen; loop: if zufalls- bit = 0 then (print zufalls-operator, zufalls -variableriname; goto loop ) print strichpunkt; subroutine kopiere-zufall -in-virus- (loop: copy evolutions-virus to virus till strichpunkt if zufalls-bit -0 then print zufalls-befehl, it end-of-input-file goto loop,
main-program~ (kopiere-zufall-in-virus-, infizieren it auslösiiir then zerstören, goto next; next;)(5) Selbstmodifizierender Virus EV
Dieser Virus kann auch mit einem Vergleichsprogramm, das zwei Programme vergleicht, nicht gefunden werden, da der kopierte Virus immer eine neü Anweisung enthält, die zwar auf den Programmablauf keinen Eirifluss hat, aber die Viren unterschiedlich aussehen lässt. Man kann aber noch weitergehen. Sind zwei Programme gleich, so führen sie verschiedene Operationen aus, während zwei verschiedene Prograrnme die gleichen Operationen ausführen: progra. unauffindbarer -virus:=
subroutirie kopiere -unauffindbar;= (copy unauffindbarer - virus to file till zeilenbeginn =zzz-; if file= P1l then print"if D(P1,P2) then print 1;"; ~A-1 - i! file - P2 then print ' if D(P1 , P2) then print 0~'%
copy unauffindbarer-virus lt file till end-of-input-file; main-program= ( if random -bit = 0 then file - P1 else file - P2; kopiere -unauffindbar; zzz; infizieren if auslöser then zerstören; goto next; next)(6) Unauffindbarer, selbstmodifizierender Virus UEV
Das Programm UEV entwickelt sich zu zwei Programmtypen P1 und P2. Ist das Programm vom Typ P1, wird die Zeile zzz zu: if D(P1,P2) then print 1 ' und wenn das Programm vom Typ P2 ist, wird dieselbe Zeile zu: O(P1,P2) then print 0; Beide Programme benutzen eine Eritscheidungsroutine D, die bestimmt, ob die Programme gleich sind. Sagt D, dass beide gleich sind, so gibt P1 eine 1 aus und P2 eine 0, was der Aussage von D widerspricht. Damit ist die Routine D zum Auffinden der Viren für die Katz. Da Pl und P2 Weiterentwicklungen des selben Programmes sind, ist die Ähnlichkeit der Weiterentwicklungen eines Prog!ammes nicht vorhersagbar. Anstatt zu versuchen, Viren durch Übereinstimmung der Programme zu finden, kann man auch versuchen, sie durch Vergleich derTätigkeiten zweier Programme zu finden. Da aber ein Virus als Teil eines Benutzerprogrammes auftritt und auch selbst nur zulässige Operationen ausführt, ist auch dies einigermassen schwierig. Wie gezeigt, ist es nahezu unmöglich, in einem einmal infizierten System alle enthaltenen Viren zu finden und auszumerzen. Bestenfalls kann man ein Gleichgewicht zwischen Viren und Heilungsprogrammen erreicht werden, speziell dann, wenn beide Programmarten selbstmodifizierend arbeiten. Eine noch relativ gute Möglichkeit, um wenigstens das Ausmass der Infektion überprüfen zu können, ist eine Aufzeichnung, wer von wo aus welches Programm wann aufgerufen hat. Solche Möglichkeiten bieten bisher aber nur einige wenige Systeme. PRAXIS
Der erste Virus wurde am 3, 11. 1983 auf einer VAX 11/750 unter Unix geboren. Er wurde zunächst ins Programm "vd", das die File-Strukturen unter Unix grafisch anzeigt, eingebunden (und den Benutzern bakanntgegeben, da es ja nur ein Experiment sein sollte). Der Virus war, wie bei den gezeigten Beispielen, am Anfang des Programmes angesiedelt. Um die Infektion nachverfolgen zu können, wurden einige Vorsichtsmassnahmen verwirklicht, Alle Infektionen mussten per Hand bestätigt werden und es wurde nichts zerstört. In den fünf ausgeführten Experimenten wurden dem Eindringling für weniger als eine Stunde alle Privilegien zugestanden. Die kürzeste Zeit lag bei 5 Minuten, der Durchschnitt unter einer halben Stunde. Das Ergebnis war so verheerend, dass die Rechnerbetreiber die Experimente daraufhin stoppen ließen. (Typisches Verhalten, wenn Fehler in Systemen entdeckt werden, besser zudecken als beheben-)Weitere Versuche wurden auf einem TOPS-20 (DEC-20), einer anderen VAX unter VMS und einer IBM/370 unter VM/370 geplant: Ein erfahrener TOPS-20-Programrnierer hatte den entsprechenden Virus in 6 Stunden fertig, ein VM1370-Neuling brauchte 30 Stunden mit Beistand eines erfahrenen Programmierers, und ein VMS-Anfänger hatte binnen 20 Stunden seinen Prototypen am Laufen- Aber leider wurden auch hier die entsprechenden Versuche von den Rechnerbetreibern bald untersagt. Ein weiterer Virus-Angriff wurde irn März 1984 gestartet, Begleiturnstände sehr behindernd: Nur 26 Stunden Zugang zum Rechner für einen 110&ungewohnten Benutzer und einen Programmierer, der 5 Jahre lang keine 1108 mehr bedient hatte- Jedoch stand der erste Virus bereits nach 18 Stunden. Nach weiteren 8 Stunden wurden die Ergebnisse den Programmierern, Verwaltern und Sicherheitsbeauftragten vorgeführt: Der Virus bewegte sich ohne Probleme über die Grenzen der Benutzerbereiche hinweg und erreichte höhere Prioritäten, wodurch das gesamte System infiziert werden kann. Der Virus bestand aus 5 Zeilen Assembler, ca. 200Zeifen Fortran und etwa 50 Kommandozeilen. Im August 1984 konnte ein weiterer Versuch auf einer VAX unter Unix gestartet werden. Sobald der Virus auch den Bereich des Sysops erreicht hatte, war er im Nu (unter einer Minute) über das gesamte System verteilt. Als beste Möglichkeit, den Sysop zu erreichen, stellte sich das Anbieten eines infizierten Programms im Bulletin Board des Systems heraus, da die Sysops, neugierig wie immer, so schnell wie möglich diese Programme ausprobieren wollen. Zusammenfassung
Virusprogramme können in relativ kurzer Zeit entwickelt werden, es ist einfach, sie so zu gestalten, dass sie nur wenige oder gar keine Spuren hinterlassen, und sie können ohne grosse Probleme die vom System errichteten Schranken umgehen. Genauso, wie sie sich in einem Computer verbreiten können, können sie auch durch Netzwerke wandern. Absoluten Schutz bieten nur völlig abgeschottete Systeme. Alle anderen Verfahren sind entweder extrem zeitaufwendig oder ungenau. Und nun ganz zum Schluss noch ein Bonbon für alle, die bis hierher durchgehalten haben: Eine Anwendung eines sehr speziellen, aber überaus praktischen Virus ist ein geänderter C-Compiler in einem Unix-System, der immer dann, wenn das Login-Programm compiliert word, einen neuen User JOSHUA hinzufügt. Sowas soll - unbestätigten Meldungen zufolge - in der amerikantschen National Security Agency (NSA - US Verfassungsschutz) schon laufen- Die Bayrische Hackerpost erscheint in unregelmäßigen Abstanden. Für nen kleinen Blauen gibt's 5 Ausgaben- BI-P c/o Basis, Adalbertstr-41b, D-8000 München 40virislhl ws
|
[HaBi 1]
Virus - Programme