.mylogin.cnf Passworte wiederherstellen

isotopp image Kristian Köhntopp -
October 3, 2012
a featured image

Wie Todd Farmer in Understanding mysql_config_editor’s security aspects richtig beobachtet, speichert die neue .mylogin.cnf, die von mysql_config_editor erzeugt wird, Paßworte nicht sicher ab. Sie verschleiert sie nur.

Das Format der Datei ist wie folgt (am Beispiel von MySQL 5.6.7-RC):

  • 4 Bytes Zero (Version Information)
  • 20 Bytes Key Generation Matter
  • Wiederholend:
    • 4 Bytes Länge
    • Länge Bytes Ciphertext. Die Verschlüsselung erfolgt mit AES Encrypt , und diese Funktion ist selbst auch nicht sicher: Es handelt sich um einen aes-128-ecb mit einem NULL IV.

Der Schlüssel, der in AES 128 rein geht, muß BINARY(16) sein, aber die Funktion nimmt Strings beliebiger Länge. Sie erzeugt den tatsächlich verwendeten Key, indem sie den mitgegebenen String zyklisch in einen BINARY(16) Puffer rein XOR’t, der mit Nullbytes initialisiert worden ist.

In Code:

#! /usr/bin/php  -q
<?php
$fp = fopen(".mylogin.cnf", "r");
if (!$fp) {
  die("Cannot open .mylogin.cnf");
}

# read key
fseek($fp, 4);
$key = fread($fp, 20);

# generate real key
$rkey = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
for ($i = 0; $i < strlen($key); $i++) {
 $rkey[$i % 16] = ( $rkey[$i % 16] ^ $key[$i] );
}

# for each line
while ($len = fread($fp, 4)) {
  # as integer
  $len = unpack("V", $len);
  $len = $len[1];

  # decrypt  
  $crypt = fread($fp, $len);
  $plain = openssl_decrypt($crypt, 'aes-128-ecb', $rkey, true);

  # print
  print $plain;
}

Die Datei selber ist dann ein simples Textfile, nicht unähnlich einer .my.cnf:

server:~ # ./p.php
[default]
user = root
password = s3cret
host = localhost
[localhost]
user = root
password = s3cret
host = 127.0.0.1

Teil des Problems ist die Tatsache, daß das MySQL Protokoll das Klartextpaßwort auf dem Client in lesbar braucht, um ein Login zu ermöglichen. Wir haben Alternativen in diesem Artikel diskutiert. SSL Client Certs würden auch helfen.

Share