Schlagwort: Sicherheit

Windows Defender mit C# ansprechen 👍 👎

Windows stellt unter der Bezeichnung Antimalware Scan Interface native Funktionalität zur Interaktion mit Windows Defender bereit. Wir werden für C# also – wieder einmal – auf DllImport setzen:
Wrapper implementieren
01020304050607080910111213141516171819202122232425262728293031
public static class AmsiWrapper {    public static Result Scan(string content, string name = null) {        AmsiInitialize(nameof(AmsiWrapper), out IntPtr context);        AmsiScanString(context, content, name, IntPtr.Zero, out Result result);        AmsiUninitialize(context);
return result; }
public enum Result { Clean = 0, NotDetected = 1, Detected = 32768 }

[DllImport("Amsi")] private static extern int AmsiInitialize(string appName, out IntPtr amsiContext);
[DllImport("Amsi")] private static extern int AmsiScanString( IntPtr amsiContext, string @string, string contentName, IntPtr session, out Result result );
[DllImport("Amsi")] private static extern void AmsiUninitialize(IntPtr amsiContext);}
Die Verwendung der empfohlenen Funktion AmsiResultIsMalware ist kurioserweise leider nicht möglich, da diese schlicht nicht in Amsi.dll gefunden werden kann. Es gilt also die Hinweise von AMSI_RESULT zu beachten.

Die Überprüfung gestaltet sich nun jedoch grundsätzlich äußerst einfach durch Übergabe des fraglichen Inhalts:
Wrapper verwenden
0102030405
if(AmsiWrapper.Scan("sehrGefährlicherInhalt") == AmsiWrapper.Result.Detected) {    /* Inhalt als Bedrohung erkannt */} else {    /* Inhalt nicht als Bedrohung erkannt */}
Zum Test der Erkennung potentiell bedrohlicher Inhalte kann beispielsweise die EICAR-Testdatei dienen.

Vor einem tatsächlichen Einsatz sollten mindestens noch Überprüfungen der Rückgabewerte (→ HRESULT) mit entsprechender (Fehler-)Behandlung ergänzt werden.

Zertifikat einer Adresse mit C# ermitteln 👍 👎

Manchmal möchte man gerne Zertifikate von Webseiten automatisiert abrufen. Im Rahmen eines Monitorings bietet es sich beispielsweise an, die Gültigkeitsdauer zu überwachen. Dazu eine beispielhafte Implementierung:
Zertifikat einer Webseite ermitteln
010203040506070809
public static X509Certificate2 GetCertificate(string hostName, int port = 443) {    using(TcpClient client = new TcpClient(hostName, port)) {        using(SslStream stream = new SslStream(client.GetStream())) {            stream.AuthenticateAsClient(hostName);
return new X509Certificate2(stream.RemoteCertificate); } }}
Die Implementierung ist dabei – wie üblich – auf das Wesentliche beschränkt; es findet keine umfassende Problembehandlung statt. Sofern die Methode in größerem Kontext zum Einsatz kommen soll, empfiehlt sich auf jeden Fall ein Blick auf die beteiligten Klassen TcpClient, SslStream und X509Certificate2 im MSDN.

Nun stehen uns diverse Informationen zur Verfügung; einige Beispiele zur Ausgabe auf der Konsole:
Methode verwenden und Informationen ausgeben
010203040506
X509Certificate2 certificate = GetCertificate("coders-online.net");
Console.WriteLine(certificate.Subject); // "CN=coders-online.net"
Console.WriteLine(certificate.NotBefore); // 30.04.2017 08:01:00Console.WriteLine(certificate.NotAfter); // 29.07.2017 08:01:00
Im Besonderen sei abschließend noch auf RemoteCertificateValidationCallback hingewiesen, mit welchem sich das Verhalten bei Zertifizierungsfehlern beeinflussen lässt.

RandomNumberGenerator-Implementierung in C# für random.org 👍 👎

In einem früheren Beitrag zum Thema (Pseudo-)Zufallszahlen in C# hatte ich bereits die Klassen Random und RNGCryptoServiceProvider vorgestellt. Letztere leitet dabei von der abstrakten Klasse RandomNumberGenerator ab, welche wir im Folgenden ebenfalls als Basis für eine Klasse verwenden werden.

Unsere Klasse soll die Werte jedoch nicht selbst erzeugen, sondern vom Anbieter random.org über dessen Schnittstelle auf Basis von JSON-RPC beziehen. Der Dienst ist – zumindest derzeit und in gewissen Grenzen – kostenlos, wobei ein API-Schlüssel benötigt wird, den ihr dem Konstruktor der Klasse übergeben müsst.

Hinweis: Ich möchte vor der eigentlichen Implementierung noch darauf hinweisen, dass dieser Beitrag weder die Güte der darüber ermittelten (Pseudo-)Zufallszahlen noch die Vertrauenswürdigkeit des Anbieters bewerten soll. Dieser Beitrag soll lediglich eine sehr einfache und beispielhafte Implementierung für den Fall aufzeigen, dass ihr euch eben für diese Nutzung (beispielsweise für weniger kritische Daten oder aus reinem Interesse) entschieden habt.
Klasse implementieren
010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445
public class RandomOrg : RandomNumberGenerator {    private const string ApiMethod = "generateIntegers";    private const string ApiUrl = "https://api.random.org/json-rpc/1/invoke";    private const string ApiVersion = "2.0";
private readonly string apiKey;

public RandomOrg(string apiKey) { this.apiKey = apiKey; }
public override void GetBytes(byte[] data) { Array.Copy(this.SendRequest(data.Length), data, data.Length); }
public override void GetNonZeroBytes(byte[] data) { Array.Copy(this.SendRequest(data.Length, 1), data, data.Length); }

private byte[] SendRequest(int n, byte min = 0) { using(WebClient webClient = new WebClient()) { JavaScriptSerializer js = new JavaScriptSerializer();
dynamic data = js.Deserialize<dynamic>(webClient.UploadString(ApiUrl, js.Serialize(new { jsonrpc = ApiVersion, method = ApiMethod, @params = new { apiKey = this.apiKey, n = n, min = min, max = 255 }, id = DateTime.Now.Ticks })));
if(data.ContainsKey("error")) { throw new Exception(data["error"]["message"]); }
return Array.ConvertAll((object[]) data["result"]["random"]["data"], Convert.ToByte); } }}
Die eigentliche Verwendung gestaltet sich nun kompatibel zur Basisklasse RandomNumberGenerator und entsprechend einfach. Um beispielsweise ein byte-Feld mit fünf Zahlen zu befüllen, kann folgender Aufruf dienen:
Klasse verwenden
01020304
using(RandomOrg numberGenerator = new RandomOrg("@ToDo")) {  // API-Schlüssel eintragen    byte[] randomNumbers = new byte[5];    numberGenerator.GetBytes(randomNumbers);}

Umgang mit Spam 👍 👎

Spam ist leider nach wie vor ein sehr großes Problem im Internet. Die genauen Arten und Hintergründe zum massenhaften Spam-Versand und insbesondere Ansätze zur grundlegenden Verbesserung der Protokolle sind sicherlich interessant und einen separaten Beitrag wert, für diesen Beitrag soll es jedoch darum gehen, wie man derzeit Spam vermeiden und was man mit bereits eingegangenem Spam anfangen kann, außer ihn zu löschen.

Versand von Spam vermeiden

Idealerweise gelangt Spam erst gar nicht in Umlauf; das spart unnötige Datenverarbeitung mit allen Konsequenzen und theoretisch jeglichen weiteren Aufwand. In der Praxis ist das nur begrenzt möglich, da die Protokolle sehr liberal entworfen wurden – was grundsätzlich lobenswert, bei Spam jedoch problematisch ist.

Inhaber von Postfächern

Was erst einmal selbstverständlich klingt, wird in der Praxis leider oftmals vernachlässigt: Sichere Passwörter tragen wesentlich dazu, dass eigene Benutzerkonten nicht als Absender für Spam fungieren. Wie üblich sollte das Passwort natürlich auch nur für genau diesen Zweck verwendet werden. Problematisch sind diese grundsätzlich "guten" Benutzerkonten insbesondere deshalb, weil sie meist aus den ordentlich konfigurierten Netzen größerer Anbieter stammen, die nicht einfach pauschal als "bekannte" Spam-Versender blockiert werden können.

Nicht zuletzt sollte auch sichergestellt sein, dass sich keine Schadprogramme auf dem eigenen Rechner befinden, welche beispielsweise eMails an Kontakte aus dem Adressbuch zu senden versuchen. Auch eigene Web-Anwendungen sollten immer auf dem aktuellsten Stand sein.

Betreiber von Mailservern

Ein ordentlich konfigurierter Mailserver, der nur authentifizierte Benutzer zulässt und insbesondere nicht als offenes Mail-Relay fungiert, ist selbstverständlich Grundvoraussetzung, um Spam bereits im Ansatz zu vermeiden. Die genaue Konfiguration hängt vom eingesetzten Dienst ab und würde den Rahmen dieses Beitrages sprengen. Üblicherweise gibt es dazu jedoch umfassende Leitfäden der Anbieter.

Ein weiterer Ansatz ist es, Spam an sich zu erkennen und von der weiteren Verarbeitung, insbesondere dem externen Versand, auszuschließen. So ist es beispielsweise möglich, den Umfang der Versandtätigkeit zu überwachen und ggf. auch einzuschränken. Ein durchschnittlicher Webhosting-Kunde wird beispielsweise eher selten mehrere tausend eMails in der Minute einreichen – hier können serverseitige Maßnahmen greifen, die derartige Auffälligkeiten erkennen. Möglicherweise ist es sinnvoll, die Anzahl der Nachrichten pro Zeiteinheit einzuschränken und nur nach vorheriger Rücksprache mit dem Kunden vorübergehend freizugeben.

Darüber hinaus ist nicht zu unterschätzen, dass die Zugangsdaten sehr vieler Benutzerkonten oftmals sehr unsicher gewählt werden und daher leicht zu "ermitteln" sind, bzw. von anderen Portalen kopiert werden können, sofern gleiche Zugangsdaten verwendet wurden. Es sollte daher überwacht werden, ob auffällige Zugriffe erfolgen – dieses Vorhaben kann beispielsweise durch Programme wie Fail2ban unterstützt werden. Auch Web-Anwendungen der Kunden, die oftmals nicht auf dem aktuellsten Stand sind, sind zu beachten.

Empfang von Spam vermeiden

Die meisten Anbieter leisten hier Vorarbeit, sodass der gröbste Spam gar nicht erst in dein Postfach gelangt, sondern bereits serverseitig abgewiesen wird. Alternativ wird teilweise auch nur eine Markierung eingesetzt, beispielsweise indem dem Betreff "[SPAM]" vorangestellt wird.

Inhaber von Postfächern

Du solltest deine eMail-Adresse(n) auf jeden Fall nicht überall verstreut angeben. Die meisten eMail-Programme bieten darüber hinaus standardmäßig oder aber zumindest über entsprechende Erweiterungen die Möglichkeit, Spam über bestimmte Kriterien zu erkennen. Die Erkennungsrate steigert sich bei den etwas besseren Programmen mit der Zeit, es können jedoch auch falsche Einstufungen (false positive) vorkommen.

Weniger der direkten Vermeidung, als vielmehr der Aufklärung dienlich ist der Ansatz, für jeden Dienst, bei dem du deine eMail-Adresse angeben sollst, eine individuelle und nicht erratbare Adresse zu erzeugen, die du nur dort verwendest (jedoch durchaus in einem Postfach mit anderen zusammen sammeln kannst). So kannst du feststellen, aus welcher Richtung du Spam erhältst und mit dem Anbieter Rücksprache halten, wie deine nur dort verwendete Adresse, die nur ihm bekannt sein sollte und nicht öffentlich einsehbar ist, Spam erhalten konnte. Möglicherweise wurde in einem solchen Fall unberechtigt auf die Daten(-bank) zugegriffen. Indirekt lässt sich mit diesem Ansatz Spam vermeiden, indem die fragliche Adresse schlicht gelöscht und ggf. eine neue erzeugt wird.

Betreiber von Mailservern

Es besteht grundsätzlich die Möglichkeit, einzelnen IP-Adressen oder sogar ganzen Adressbereichen die Verbindung zu verweigern. Darüber hinaus können eingehende Nachrichten über externe Programme wie SpamAssassin oder auch über bereits im Mailserver implementierte Funktionalität auf Spam geprüft werden.

Eine weitergehende Option ist das Einbinden von DNS-basierten Blacklisten, wobei die IP-Adresse eingehender Verbindungen gegen entsprechende Dienste geprüft und darauf basierend entschieden wird, ob die Nachricht angenommen wird. Die Anbieter dieser Dienste sammeln dazu auffällige Adressen in ihren Datenbanken. Bekannte Anbieter, die ich auch selbst auf meinem Server einsetze, sind beispielsweise die Folgenden:

Bitte informiert euch jedoch – insbesondere bei geplantem kommerziellen Einsatz – über die genauen Nutzungsbedingungen. Wie ihr die entsprechenden Dienste automatisiert mit C# ansprechen könnt, habe ich bereits in einem separaten Beitrag beschrieben.

Zuletzt sei noch auf die Möglichkeit des Greylistings hingewiesen, wobei eingehende eMails bei unbekannten Absendern zuerst abgewiesen werden. Hierbei wird ausgenutzt, dass korrekt konfigurierte Mailserver die Zustellung nach einer gewissen Zeit nochmals versuchen – Spammer vermeiden diesen Aufwand oftmals. Der Erfolg mit dieser Methode kann durchaus beachtlich sein, sorgt jedoch leider auch dafür, dass "dringende" eMails teilweise nur stark verzögert eingehen, was natürlich lästig sein kann.

Spam behandeln

Ist trotz aller Maßnahmen eine Spam-Nachricht im eigenen Postfach gelandet, so sollte man selbstverständlich keinesfalls irgendwelche Links anklicken (auch keine angeblichen "abmelden"-Links), Dateianhänge öffnen oder dem (angeblichen) Absender antworten. Bevor die Nachricht jedoch gelöscht wird, kann man durchaus noch sinnvolle Sachen damit anstellen.

Den Betreibern der verantwortlichen Server kann man eine Information zukommen lassen, dass man Spam erhalten hat. Dies ermöglicht dem Betreiber des Mailservers, der die Nachricht verschickt bzw. weitergeleitet hat, seinen Kunden darauf hinzuweisen oder ggf. auch zu sperren. Betreiber von Servern, auf die durch Links in den Spam-Nachrichten verwiesen wird, können u. U. auch interessiert sein, da nicht selten Sicherheitslücken auf legitimen Webseiten missbraucht werden, um beispielsweise Schadcode zu verbreiten. Größere Unternehmen reagieren nicht selten auch mit ihrer Rechtsabteilung, wenn beispielsweise (Ruf-)Schädigung durch Phishing droht, was dem Ganzen nochmals etwas mehr Nachdruck verleiht.

Die meisten direkt sichtbaren Domain-Angaben bei Spam-Nachrichten sind jedoch gefälscht, d. h. eine einfache Whois-Abfrage ist hier meist nicht zielführend. Vielmehr muss der eigentliche Server ausfindig gemacht (→ Untersuchung der eMail-Kopfzeilen) und über die zuständige Regional Internet Registry der passende Ansprechpartner ermittelt werden.

Leider ist es jedoch nicht ganz trivial, die richtigen Adressaten herauszufinden und für Laien nahezu unmöglich. Hier kann es eher passieren, dass man die Falschen "beschuldigt" und diese entsprechende Meldungen ab einem gewissen Ausmaß schlicht ignorieren. Hier helfen jedoch Anbieter weiter, die sich darauf spezialisiert haben:

  • abuse.net
    Dieser Dienst ermittelt zu einer Domain den Kontakt für Missbrauchsfälle, jedoch muss man dazu die "verantwortliche" Domain bereits kennen. Wie man diesen Dienst automatisiert (mit C#) ansprechen kann, erkläre ich in einem separaten Beitrag.
  • SpamCop
    Dieser Dienst nimmt die meiste Arbeit ab und ermittelt bei Eingabe einer vollständigen Spam-Nachricht (inkl. Kopfzeilen) die passenden Empfänger. Selbstverständlich empfiehlt sich jedoch eine Kontrolle, da in bestimmten Konstellationen die Automatismen unzureichend sind. An eine spezielle Adresse können Spam-Nachrichten auch direkt weitergeleitet werden.

Selbstverständlich ist das keine Garantie dafür, dass sich der Anbieter auch ernsthaft darum kümmert – hier gibt es leider auch uninteressierte Zeitgenossen. Ich melde jedoch generell alle Spam-Nachrichten und habe damit durchaus überwiegend gute Erfahrungen gemacht und erhalte hin und wieder auch persönliche Antworten.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche