Gentoo Linux Security Weekend

Last weekend, Gentoo Linux developers a3li and keytoaster came around and with help from p-y and underling via IRC, we killed the huge backlog of open CVEs in our tracker, voted on about 100 security bugs, drafted several dozens of GLSAs and were hunting bugs on GLSAMaker2. We also had good company from (non-security) developer idl0r on saturday. ­čÖé

During the week, we polished up some GLSAs and since sunday, we send these (a lot more to come!):

OpenSSL: Multiple vulnerabilities
Wireshark: Multiple vulnerabilities
Bugzilla: Multiple vulnerabilities
Dovecot: Multiple vulnerabilities
GnuTLS: Multiple vulnerabilities
PHP: Multiple vulnerabilities
vsftpd: Denial of Service
feh: Multiple vulnerabilities
Conky: Privilege escalation
Wget: User-assisted file creation or overwrite
Adobe Flash Player: Multiple vulnerabilities

Thanks for helping out, everyone!

Here are some impressions:

 

 

 

 

 

Posted in english, Gentoo, Linux, Security | Tagged , , , , , , , | Leave a comment

byebye, SLES 9

Heute kam wenig ├╝berraschend eine Mail von Novell, dass der SLES 9 Support nun nach 7 Jahren zu Ende ist – au├čer man ist LTS Kunde – was wohl ziemlich teuer wird und nur f├╝r Gro├čunternehmen Sinn macht. SLES9 ist so derma├čen angegraut, beim Blick auf die Paketversionen wird man schon leicht Nostalgisch… ;D

 

Interessant sind die Statistiken:

Gesamte Updates: 1565
Security: 767
Empfohlen: 718
Optional: 72
YaST: 8

Das CVE-Tracking war im ersten Jahr nicht vollst├Ąndig, daher sind die Nummer eigentlich etwas h├Âher.

Insgesamte CVE-Eintr├Ąge: 1447

Top CVE-Kanidaten:

127 IBM Java 5
125 IBM Java 1.4.2
84 kernel
66 SUN Java 1.4.2
76 clamav
68 ethereal
58 mozilla
44 cups
32 mysql
31 libpng
28 freetype2
24 ruby
21 XFree86
20 libexif
18 mailman
18 horde
16 quagga
17 tomcat
16 apache2
15 openssh
15 gd
14 python
13 yast2-packagemanager-devel
13 km_nss
12 openssl
12 samba
11 tk
10 pcre

Interessant, dass der Kernel sogar schlimmer als Mozilla war…ich dachte das w├Ąre unm├Âglich… :/ Clamav mit 76 L├Âchern finde ich aber auch eine ziemliche Katastrophe, zumal das ja auch oftmals auf Mailgateways l├Ąuft…

Posted in Linux, Rechenzentrum, Security | Tagged , , , , | 2 Comments

FreeDOS usb boot

Jeder kennt das Problem: immer wieder mal ben├Âtigt man einen USB Stick mit einem DOS wegen BIOS Updates, muss einen zickigen RAID-Controller flashen oder sonstiges… hier eine Kurzanleitung dazu, wie man einen bootbaren USB-Stick mit FreeDOS erstellt.

Vorbereiten der Umgebung

mkdir -p /tmp/usbboot/exec/file-system
cd /tmp/usbboot
mkdir build && cd build

Tool zum Schreiben der Daten auf USB-Stick herunterladen, entpacken, compilieren

wget "http://prdownloads.sourceforge.net/advancemame/makebootfat-1.4.tar.gz?download" -O - | tar -xvzf -
cd makebootfat*
./configure && make
cp makebootfat ../../exec
cd ..

N├Âtige FreeDOS-Binaries und MBR herunterladen

wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/kernels.zip
wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/commandx.zip
wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/unstablx.zip
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.04.tar.gz -O - | tar -xzvf - syslinux-4.04/mbr/mbr.bin
mv syslinux-4.04/mbr/mbr.bin ../exec

Nun extrahiert man die relevanten Dateien aus den .zips und kopiert sie an die passende Stelle:

unzip kernels.zip
unzip commandx.zip 
unzip unstablx.zip
find ./ -name command.com -exec mv '{}' ../exec/file-system ';'
find ./ -name kernel.sys -exec mv '{}' ../exec/file-system ';'
 
for file in fat12.bin fat16.bin fat32lba.bin
do
	find ./ -name $file -exec mv '{}' ../exec ';'
done
 
cd .. && rm -fr build && cd exec

An dieser Stelle kopiert man alle Dateien, die nachher auf dem Stick liegen sollen nach ./file-system. Daraufhin bef├╝llt man den USB-Stick per makebootfat und r├Ąumt auf.

./makebootfat -o /dev/sdb -E 255 -1 fat12.bin -2 fat16.bin -3 fat32lba.bin -m mbr.bin ./file-system
cd ../../
rm -fr usbboot

Getestet zuletzt am 17.09.2017 – sofern es nicht mehr funktioniert, bitte kurz kommentiere, dann aktualisiere ich ggfs. den Blogeintrag.

Posted in Info, Rechenzentrum, Uncategorized | Tagged , , , , , , | 4 Comments

LD_PRELOAD magic

Wenn man z.B. ein Programm hat, dass pr├╝ft, ob man eine bestimmte CPU hat – z.B. weil es nicht unter qemu verwendet werden soll – kann es sinnvoll sein, den Check zu umgehen, bzw. dem Programm vorzugaukeln, dass alles OK ist. Hierf├╝r kann man idealerweise LD_PRELOAD nutzen, welches einen bestehenden Library Call ├╝berl├Ądt. Im Detail l├Ąuft das wie folgt ab:

– man findet die Adresse des originalen Library Calls per dlsym()
– man deklariert die Funktion, sie ├╝berl├Ądt die originale Funktion (hier: open())
– man schreibt in der Funktion je nach ├╝bergebenem Parameter um, zur├╝ckliefert wird
– oder man f├╝hrt die Originalfunktion aus

/*
* open_preload.c
*/
 
#define _GNU_SOURCE
#include <sys/syscall.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dlfcn.h>
#include <dirent.h>
 
static void init (void) __attribute__ ((constructor));
 
int (*real_open)(__const char *name, int flags, mode_t mode);
 
static void init (void)
{
        real_open = dlsym(RTLD_NEXT,"open");
}
 
int open(const char *pathname, int flags, mode_t mode)
{
	if (strcmp(pathname,"/proc/cpuinfo") == 0)
	{
		return(real_open("/tmp/cpuinfo",flags,mode));
	}
	else
	{
        	return(real_open(pathname,flags,mode));
	}
 
}

Das Ganze compiliert und testet man dann wie folgt:

[sb@machine ~]$ echo test > /tmp/cpuinfo
[sb@machine ~]$ gcc -g -fpic -shared -ldl -o open_preload.so open_preload.c
[sb@machine ~]$ LD_PRELOAD="./open_preload.so" cat /proc/cpuinfo 
test
[sb@machine ~]$

Das f├╝hlt sich schon ein wenig nach RootKit-Programmierung an. ­čśë

Posted in Linux, Uncategorized | Tagged , | 2 Comments

Paketverlust mit D-Link DGS-1210-48

Beim Testen von zwei brandneuen D-Link DGS-1210-48 fiel auf, dass auf dem Ger├Ąt Paketverlust auftritt. Je gr├Â├čer die Pakete, desto h├Âher war auch der Verlust – bis zu 7%. Das ist nat├╝rlich nicht akzeptabel. Nach einigem ├ťberlegen hatte ich eine Idee woran es lag:


Tats├Ąchlich behob das Umstellen dann auch das Problem. Offensichtlich gibt es hier ein Problem damit, dass der Switch die Sendeleistung bei kurzen Kabeln (wie sie im Rechenzentrum im Access-Layer ├╝blich sind) herunterschraubt. Eigentlich schade, denn grade die Stromsparfeatures machen den Switch interessant. Ansonsten machen die Ger├Ąte bisher aber einen ganz soliden Eindruck. ­čÖé

EDIT 21.08.2016: ich habe alle DGS nun gegen etwas solideres ausgetauscht – die DGS hatten ├╝ber 3 Jahre eine Ausfallrate von ~75%!

Posted in Rechenzentrum | Tagged , , , , , | 5 Comments

awesome: Laptop Batteriestatus anzeigen

Hier ein weiterer Tipp f├╝r awesome: der Laptop Batteriestatus soll angezeigt werden. Zuerst kopiert man das von mir gestern programmierte Tool cbatt nach /home/name/cbatt.sh, dann tr├Ągt man folgendes in der rc.lua ein:

mybattmon = widget({ type = "textbox", name = "mybattmon", align = "right" })
function battery_status ()
        local fd=io.popen("/home/name/cbatt.sh", "r")
        local line=fd:read()
        return line
end
 
mybattmon.text = " " .. battery_status() .. " "
my_battmon_timer=timer({timeout=30})
my_battmon_timer:add_signal("timeout", function()
    mybattmon.text = " " .. battery_status() .. " "
end)
my_battmon_timer:start()

Unter mywibox[s].widgets = { … } f├╝gt man dann noch an der gew├╝nschten Stelle mybattmon hinzu, und fertig ist die Chose. Der Timeout legt fest, wie oft das Script aufgerufen wird; jede Sekunde w├Ąre m.A. arg ├╝bertrieben und verk├╝rzt die Akkulaufzeit sicherlich.

Wer wie im Vorpost mehrere Rechner hat, und die Batterieanzeige z.B. nur auf dem Laptop anzeigen will, nutzt folgenden Schnippsel um das Ganze zu erweitern:

    -- hostname auslesen
    a=io.popen("uname -n");
    io.input(a)
    if io.read() == "laptop" then
    	batt=1
    end
 
    -- Add widgets to the wibox - order matters
    mywibox[s].widgets = {
        {
            mylauncher,
            mytaglist[s],
            mypromptbox[s],
            layout = awful.widget.layout.horizontal.leftright
        },
        mylayoutbox[s],
        mytextclock,
	batt == 1 and mybattmon,		-- Batterie nur beim richtigen Host hinzuf├╝gen
        s == 1 and mysystray or nil,
        mytasklist[s],
        layout = awful.widget.layout.horizontal.rightleft
    }

Posted in desktop, Linux | Tagged , , , , , | 6 Comments

awesome: individuelle Hintergrundbilder pro Host

Wer sein ~ in einem Versionskontrollsystem wie z.B. git pflegt, trackt damit seine gesamten Daten, um z.B. auf verschiedenen Rechnern immer gleiche Datenbest├Ąnde incl. Versionierung zu haben. Das Problem dabei ist, dass der Windowmanager (hier: awesome) f├╝r die verschiedenen Ger├Ąte ggfs. auch andere Einstellungen braucht, z.B. f├╝r das Hintergrundbild. ├ťber den uname des Systems kann man einfach unterscheiden, wo das Script grade aktuell ausgef├╝hrt wird und erspart sich das Pflegen von 2 Konfigurationen. Hierzu erstellt man z.B. unter Gentoo die ~/.config/awesome/theme.lua wie folgt:

theme_path = "/usr/share/awesome/themes/default/theme.lua"
theme = dofile(theme_path)
a=io.popen("uname -n");
io.input(a)
 
if io.read() == "laptop" then
theme.wallpaper_cmd = { "awsetbg /home/user/real_1280x800.jpg" }
else
theme.wallpaper_cmd = { "awsetbg /home/user/real_1920x1280.jpg" }
end
 
return theme

Voila – es wird immer das korrekt dimensionierte Wallpaper geladen.

Posted in desktop, Linux | Tagged , , , , , , | 2 Comments

Linuxtag

Linux Tag LogoMittwoch ist es soweit: der Linuxtag beginnt! Das Programm kann sich meiner Meinung nach wie immer sehen lassen, pers├Ânlich finde ich Donnerstag und Freitag am Interessantesten und werde dann auch mit einem Kollegen vor Ort sein.

Hoffentlich ist zwischen den ganzen Vortr├Ągen auch gen├╝gend Zeit daf├╝r, etwas am Gentoo-Stand vorbeizuschauen…

Posted in Gentoo, Info, Linux | Tagged , , | 2 Comments

Firewalls suck: Sonicwall

Leider gibt es einige Firewallhersteller, die es wirklich verdient h├Ątten, ihre Firewalls selbst benutzen zu m├╝ssen. In der Serie “Firewalls suck” werde ich etwas zu dem Themenkomplex schreiben – man k├Ânnte dies ruhig als Rant verstehen. ­čśë

Im ersten Beitrag der Serie geht es um Sonicwall, den ich nicht mehr so sonderlich mag. Dies liegt an mehreren Dingen:

Regel-Limit

Es gibt bei einigen Modellen (wohlgemerkt: mit Gigabit Ethernet) von Seiten Sonicwalls eine Beschr├Ąnkung auf 300 Regeln von Zone zu Zone. Wenn man ca. 200 Server hat, die viele Services f├╝r verschiedene Gruppen von Usern haben, und auch vielleicht auch noch hundert VMs, wird das sehr, sehr eng. Auch wenn man mit Gruppen arbeitet. Leider steht von diesem Limit nichts im Produktdatenblatt – und Sonicwall m├Âchte es nicht per Firmwareupdate entfernen. Man soll doch bitte ein gr├Â├čeres Modell kaufen, mit einem Limit von 600 Regeln von Zone zu Zone. Klar gern, wir wissen grade eh nicht wohin mit unserem Geld!

SonicWALL Content Filtering Service (CFS)

Dieser Service macht Deep Packet Inspection und guckt sich auch HTTP Header genau an. Leider macht das bei HTTP Traffic von Zone zu Zone bei mehreren Sonicwall-Modellen Probleme und ├Ąu├čert sich darin, dass der Payload nur noch teilsweise ankommt und irgendwann einfach abgeschnitten wird. Das Deaktivieren des CFS im versteckten “DIAG.html” Men├╝ schafft Abhilfe – allerdings erlischt damit wohl auch die Garantie (?). CFS ist ├╝brigens auch aktiv, wenn man das IDS nicht nutzt (nichtmal lizensiert hat) und zieht immer Performance. Dauerhafte Abhilfe gibt es hier nicht, nur den Workaround.

TCP-Header Änderungen

Nicht nur CFS greift in den Traffic ein, sondern auch auf TCP-Ebene passieren “lustige” Dinge als Sicherheitsma├čnahme, so werden z.B. TCP-Sequenznummern umgeschrieben, was viel Freude bei der Untersuchung von komischen Netzwerkfehlern erzeugt. Kann ja nicht schaden, sein detailliertes Wissen ├╝ber TCP/IP mal wieder in der Praxis anzuwenden und sich 1-2 Tage mit Lowlevel-Debugging zu besch├Ąftigen.

Lizenzserver

Irgendwie gef├Ąllt es mir nach dem kleinen Malheur bei Sonicwall nicht mehr so ganz, dass die Ger├Ąte immer mal wieder Kontakt zum Sonicwall-Server ben├Âtigen, damit IDS, CFS usw. nicht ausfallen.

IPv6

In der Produkt├╝bersicht steht, dass v6 unterst├╝tzt wird. Allerdings nicht, dass das nur im Bridged-Modus der Fall ist und bei weitem nicht alle Features enthalten sind, die man ├╝berlicherweise zum Betrieb als ‘normale’ v6-Firewall ben├Âtigt. ­čÖü Aber was soll die Haarspalterei!1!! ;(

Service und QS

Vom Service kann ich nichts Gutes berichten – als 24/7/365 Kunde mit Active-Passive Cluster wird einem schonmal am Telefon mitgeteilt, dass der zust├Ąndige Kollege bereits im Wochenende sei und dass das Problem grade nicht bearbeitet werden kann (kann doch bis Montag warten!!?). Grunds├Ątzlich wird verlangt, ein bestimmtes oder das neuste Firmwareupdate einzuspielen, bevor sich der Support das Problem ├╝berhaupt genauer ansieht. Bei einem vom Support verlangten Update wu├čte selbiger aber eigentlich, dass das Routing dort nicht ganz korrekt funktioniert und somit einen viel schlimmeren Ausfall verursachen wird als das eigentliche Problem. Eher ung├╝nstig ist dann auch, dass die defekte Firmware seit Monaten auf der Sonicwall-Webseite als aktuellste Download-Version bereitsteht und der Support immer mal wieder Kunden ├╝ber das Problem stolpern l├Ą├čt. Naja, so lernt der man dann nach nur 30 Minuten Wartezeit an der Hotline das qualifizierte Servicepersonal kennen! Das schafft gute Kundenbindung.

Leider basiert das hier auf der Realit├Ąt – f├╝r jeden einzelnen Fall habe ich Ticketnummern in petto. Alles in Allem regt mich der unf├Ąhige Service bei Sonicwall am meisten auf… ­čÖü

Posted in Rant, Rechenzentrum, Security | Tagged , , , | 11 Comments

Linux Kernel Regression mit git finden

Falls man nach einem Kernel Upgrade pl├Âtzlich Probleme bekommt und googlen nicht mehr hilft, muss man ggfs. selbst herausfinden, warum nun etwas nicht mehr funktioniert. Herzlichen Gl├╝ckwunsch: eine typische Kernel Regression. Zuerst laden wir einmal die neuste Kernelversion aus dem git Repository von kernel.org ins passende Verzeichnis:

cd /usr/src
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6

Zeit f├╝r einen Kaffee! Nachdem wir die etwa 600MB runtergeladen haben, sagen wir git nun, dass wir einen Fehler “bisect”-en wollen. Hierbei wird eine Bin├Ąre Suche durchgef├╝hrt, denn mehrere hundert bis tausend Kernel-Commits wollen effizient ausgetestet werden. Daf├╝r sagt man dem Kernel, welche Version noch gut war und welche schlecht:

git bisect start
git bisect good v2.6.36
git bisect bad v2.6.37

Continue reading

Posted in Linux | Tagged , , | 4 Comments