Binary Planting: Beispiel und Problemlösung

In meinem letzten Artikel über Binary Planting habe ich beschrieben wie überbewertet diese Sicherheitslücke in Wirklichkeit ist. Das Binary Planting beschreibt letztendlich nur die Arbeitsweise von Windows. Wer weiß wie es funktioniert kann sich leicht gegen Angriffe schützen. In diesem Artikel demonstriere ich diese "angebliche" Sicherheitslücke an einem Beispiel und zeige wie das Problem gelöst werden kann.
Zuerst schreiben wir hierfür ein kleines Programm in C#. Das Programm liest eine Textdatei ein und gibt deren Inhalt in der Console aus. Nachdem dies geschehen ist wird der Windows Rechner gestartet.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace FileViewer
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (String str in args)
            {
                Console.Write(System.IO.File.ReadAllText( str ));
            }

            Process.Start("calc.exe");
            Console.ReadLine();
        }
    }
}
Nun brauchen wir noch eine Testdatei mit der wir unser Programm testen können. Ich habe hier eine Datei geschrieben, mit dem Satz "Das ist ein Test!" als Inhalt. Diese Datei habe ich in einen Ordner namens Share gelegt. Dieser Ordner ist in einem Netzwerk und kann daher von jedem benutzt werden um Dateien auszutauschen. In einem Unternehmen sind solche Ordner durchaus üblich.
Wir können unser Programm testen, indem wir diese Testdatei damit öffnen. Das geschieht am einfachsten indem man die Datei auf das Icon unseres Programmes mit der Maus zieht.

Soweit funktioniert alles wie gewollt. Die Testdatei wird eingelesen und angezeigt. Anschließend wird der Rechner ausgeführt. Nun erstellen wir eine Datei, die den Virus, Wurm, etc darstellt. Für mein Beispiel habe ich eine einfache WPF-Anwendung benutzt die einen Totenschädel zeigt.
<Window x:Class="MyVirus.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Virus" Height="188" Width="209">
    <Grid>
        <Label Content="☠" Height="212" HorizontalAlignment="Left" Margin="4,-54,0,0" Name="label1" VerticalAlignment="Top" Width="191" FontSize="172" />
    </Grid>
</Window>
Dieses Programm kopieren wir nun in den gleichen Ordner in dem sich die Testdatei befindet und benennen es in calc.exe um. Dieser Ordner ist im Netzwerk freigegeben. Jeder könnte also die Datei dort hineinkopiert haben. Umso mehr Dateien in diesem Ordner sind, umso schwerer ist es solche Schädlinge sofort zu bemerken. Nun ziehen wir noch einmal die Testdatei in das Icon unseres Programmes und schauen was passiert.
Die Testdatei wird wie gewohnt eingelesen. Anstelle des Rechners wird nun jedoch der Virus gestartet. Dieses Problem verschlimmer sich, wenn man das ganze auf Dll-Dateien anwendet. Normalerweise starten andere Programme nur sehr selten andere Exe-Dateien, dafür jedoch duzende Dll-Dateien. Viele davon werden zudem überhaupt nicht benötigt und falls diese nicht existieren auch ignoriert. Falls jedoch eine gefälschte Datei vorliegt wird diese als die gewünschte Datei angesehen und aufgerufen.
Der Programmierer muss also zum einen darauf achten wirklich die richtige Datei auszuführen, und zum anderen darauf zu schauen, dass diese Datei auch in dem richtigen Ordner vorliegt.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace FileViewer
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (String str in args)
            {
                Console.Write(System.IO.File.ReadAllText( str ));
            }

            String calcdir = Environment.GetEnvironmentVariable("SystemRoot") + "\\system32\\calc.exe";

            if (File.Exists(calcdir))
            {
                Process.Start(calcdir);
            }
            Console.ReadLine();
        }
    }
}
Der Benutzer selbst kann natürlich nicht jedes Programm nach belieben verändern. Für ihn ist es wichtig die Datei immer in einer Sicheren Umgebung zu öffnen. Powerpoint Präsentationen sollten beispielsweise zuerst auf den eigenen Rechner gezogen werden bevor diese geöffnet werden. Zudem ist es immer sinnvoll nach Dll- und Exe-Dateien ausschau zu halten.
Bookmark and Share

3 Kommentare:

Anonym hat gesagt…

Hi,

hab gerade den Beitrag gelesen. KA, ob Binary Planting inzwischen immernoch so ein großes Thema ist, aber bezüglich .NET Assemblies sei hier noch erwähnt, dass es hier einen sog. Publickeytoken gibt. Also quasi eine digitale Signatur, die das Programm gefälschte Binarys erkennen lässt.

Wen es interessiert, dem seien hier das sn.exe-Tool und der Suchbegriff "publickeytoken" ans Herz gelegt.

Gruß
Stefan

Felix hat gesagt…

Also, mein Kollege aus dem Programmierer-Pool hat sich in der Vergangenheit schon ziemlich häufig über Binary Planting aufgeregt. Ich denke, viele können mit den Tipps etwas anfangen.

Reiner hat gesagt…

Super Artikel, hat mir echt weitergeholfen. lg

Kommentar veröffentlichen