Bitte macht das nicht nach – Bughunting mit Tools

Vor ein paar Tagen gab es die Nachricht, daß u.a. Curl mit ChatGPT generierten Fehlerberichten zu gespammt wird, die nur völlig nutzlose Zeitverschwendung darstellt, weil die Tools Sachen falsch einschätzen. Das ist Exim jetzt auch passiert.

Bitte macht das nicht nach – Bughunting mit Tools

An sich ist es eine super Sache, daß sich Menschen um die Sicherheit Ihrer Produkte Gedanken machen und aktiv helfen wollen, bei Problemen einzugreifen. Leider machen einige Tools den Entwicklern von OpenSource Projekten das Leben schwer ( siehe Curl ).

Auch wenn im Pullrequest kein ChatGPT drin war, mußte sich jemand heute um so eine Zeitverschwendungsmeldung kümmern. In diesem Fall war das Ich und das Projekt um das es ging Exim:

Damit alle Verstehen um was es geht:

Exim ist in C programmiert, eine Sprache die schon in den 70er benutzt wurde. Dem entsprechend sind die Standard-Funktionen extrem „schmal“ und ohne Rechenzeitverbrennung programmiert worden, meint: Geschwindigkeit war wichtiger als Sicherheit, weil es „noch keine Exploits gab“ und, hauptsächlich, die CPUs weniger leisten konnten.

strcpy() ist eine eingebaute C-Funktion die Inhalte von Speicher A in Speicher B kopiert, bis diese auf eine 0 trifft.  Die binäre Null also 0x00 gilt in C als Stringterminator, also das Ende eines Textstrings. (Das ging genau so lange gut, bis UTF kam , aber das ist eine andere Geschichte.) strcpy(ZIEL,QUELLE) kopiert also genau solange Bytes von der Quelle ins Ziel, bis ein 0x00 kommt, EGAL ob der Speicherbereich „ZIEL“ ausreichend groß ist, um die kopierte Datenanzahl aufzunehmen. Wenn er es nicht ist, kommt es zum BUFFER-OVERFLOW und damit zu potentiellen Remote-Code-Executions, aber meistens nur zum Programmabsturz.

strncpy() ist eine Funktion, die genau das gleiche macht wie strcpy() nur, daß fest vorgegeben wird, wie viel kopiert werden kann, was das überschreiben des Zielspeichers verhindert, außer man gibt da einfach quatsch als Länge an, dann natürlich nicht mehr 😉

Beim Pullrequest im Eximsource gings um

  if ((int)strlen(pw->pw_dir) + (int)strlen(filename) + 1 > sizeof(buffer))
    {
    printf("exim_lock: expanded file name %s%s is too long", pw->pw_dir,
      filename);
    exit(EXIT_FAILURE);
    }

  strcpy(buffer, pw->pw_dir);
  strcat(buffer, filename);
  filename = buffer;
}

. Das sollte so ersetzt werden:

– strcpy(buffer, pw->pw_dir);
+ strncpy(buffer, pw->pw_dir);

Leider braucht strncpy() 3 Argumente, nämlich auch die Größe des Zielspeichers:

char *strncpy(char dst[restrict .dsize], const char *restrict src, size_t dsize);

Wenn man da nur 2 Argumente liefert, schlägt das Kompilieren des Sources fehl, außer irgendeine Compiler Magie erkennt die Funktion und füllt den dritten Parameter heimlich auf. Sich darauf zu verlassen ist genauso fahrlässig, wie noch strcpy() zu benutzen, ohne vorher geprüft zu haben, ob das sicher klappen kann.

Die Eximdevs haben das aber bereits richtig gemacht:

  if ((int)strlen(pw->pw_dir) + (int)strlen(filename) + 1 > sizeof(buffer))
    {
    printf("exim_lock: expanded file name %s%s is too long", pw->pw_dir,
      filename);
    exit(EXIT_FAILURE);
    }

  strcpy(buffer, pw->pw_dir);
  strcat(buffer, filename);
  filename = buffer;
}

Der Test steht nur,Sourcecode bedingt, etwas weiter davon weg, weil man keine If-Than-Else Anweisung benutzt hat, sondern eine If-Not-Error Anweisung gemacht hat.  Es wird also der Fehlerfall abgefragt und dann ein Fehler ausgegeben,statt abzufragen ob das funktionieren kann, es dann zu tun und ANSONSTEN einen Fehler auszugeben.

Das ist völlig legitim, auch wenn ich persönlich das nicht so gemacht hätte, weil es dem Compiler erlaubt, etwas einfacheren Programmcode zu erzeugen.

Bitte nicht nachmachen

Wie Ihr oben selbst sehen könnt, ist alles ok gewesen. Irgendein Tool wird über strcpy() gestolpert sein und das routinemäßig der Person vor dem Monitor mitgeteilt haben. Die hatte aber keine Lust nachzusehen, ob überhaupt ein Problem vorliegt, oder keinen Plan davon, wie C funktioniert ( übrigens nicht meine Lieblingssprache 😉 ) und es dann einfach gemeldet.

Bitte macht das nicht nach! Das kostet uns als Entwickler einfach nur unnötige Zeit. Nehmt das Ergebnis und analysiert selbst nach, ob es überhaupt ein Problem gibt. Da haben alle was von, weil Ihr lernt was dazu, egal wie die Sache ausgeht, und ggf. habt Ihr auch ein Problem gefunden, das wirklich gelöst werden muß.

Beispiel:

Wenn ich …

char *ziel[500];
char *quellel[200];

memset(quelle,0,200);
strcpy(ziel,quelle);
return;

… habe, würde so ein Tool das strcpy() reklamieren, es könnte aber NIEMALS ein Problem darstellen. Wer als Mensch den Code sieht, versteht das auch, das Tool hat aber nur „grep ’strcpy(‚ sourcefile.c“ gemacht. Zum Problem wird so etwas hier:

function a(char* quelle) {

  char *ziel[500];
  strcpy(ziel,quelle);
  return;
}

Weil nichts über die Quelle, deren wahre Länge und Inhalt usw. bekannt ist. Hier muß man jetzt tatsächlich mit strncpy() arbeiten, um seinen Speicherbereich zu schützen:

function a(char* quelle) {

  char *ziel[500];
  strncpy(ziel,quelle,sizeof(ziel));
  return;
}

Und jetzt viel Spaß beim C lernen 😉

 

An die IT der Stadt Braunschweig in Sachen MAILSERVER – 2024 Edition

Ihr erinnert Euch noch an diesen Artikel aus dem Jahr 2021?

An die IT der Stadt Braunschweig in Sachen MAILSERVER

Da gibt es ein unrühmliches Update 😀

An die IT der Stadt Braunschweig in Sachen MAILSERVER – 2024 Edition

Im Jahr 2021 hatte ich einen offenen Brief an die IT-Verantwortlichen der Stadt Braunschweig geschickt, den könnte Ihr digital oben lesen. Weil wir gerade Mailserverprobleme einer anderen Stadtverwaltung bearbeiten, dachte ich mir, schau doch mal nach, was daraus geworden ist. Hier die 2024 – Edition 😀

Liebe IT-Verantwortliche der Stadt Braunschweig,

wie wir Euch im Jahre 2018, und dann nochmal im Jahr 2021, mitgeteilt haben, sind Eure SSL-Zertifikate im Mailserver nichts wert. Glauben Sie schon wieder nicht? Bitte schön:

# openssl s_client –connect mailin02.braunschweig.de:25 -starttls smtp -verify_hostname mailin02.braunschweig.de
CONNECTED(00000003)
depth=0 CN = braunschweig.de
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = braunschweig.de
verify error:num=62:hostname mismatch
verify return:1
depth=0 CN = braunschweig.de
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = braunschweig.de
verify return:1

Certificate chain
0 s:CN = braunschweig.de
i:C = US, O = Let’s Encrypt, CN = R10
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Aug 20 10:47:48 2024 GMT; NotAfter: Nov 18 10:47:47 2024 GMT

Server certificate
—–BEGIN CERTIFICATE—–
MIIE7jCCA9agAwIBAgISBJuzUCXTWYKiCMJPi/QRdpaNMA0GCSqGSIb3DQEBCwUA

Jetzt heißen Eure Mailserver für die Domain braunschweig.de aber nicht braunschweig.de sondern:

;; QUESTION SECTION:
;braunschweig.de. IN MX

;; ANSWER SECTION:
braunschweig.de. 300 IN MX 10 mailin02.braunschweig.de.
braunschweig.de. 300 IN MX 20 mailin01.braunschweig.de.

Also kann auch hier wieder nicht festgestellt werden, daß wir wirklich mit dem richtigen Mailserver reden.

Damit gilt leider, was auch schon 2018 galt: schlecht gesetuped.

Es gibt aber auch Positives zu melden: Die Stadt nutzt Let’s Encrypt für die Zertifikate und kann TLS 1.3, was, wie wir leider feststellen müssen, auch in 2024 keine Selbstverständlichkeit ist.

CPanel Scammails: Ihr Konto hat komische Aktivitäten

Man merkt, daß Apple mittlerweise 20% am Desktopmarkt hat, es kommen immer mehr Scammails mit Applebezug rein, so auch diese:

geschwärzte Scammail von CPanel

Der „Link“ geht zu über ein OneDrive in Taiwan zu einer gehackten Webseite:

h.t.t.p.s.://sdfn3ysu8egzq#########c2o5ze8yq.on.drv.tw/www.ezrahubsteel.com/#system@XXXXXXXXXXXXXXXXX.de
(leicht modifiziert, damit bots da nicht hingehen)

Natürlich ist das alles Schwachsinn, weil es das Konto gar nicht gibt und cPanel-Webmail  auch nicht. Also ab damit in die Digitale Mülltonne 🙂