てきとうなメモ

本の感想とか技術メモとか

MySQLのバグ

どんなバグかなと思ってリンク先を見ると

my_bool
check_scramble(const char *scramble_arg, const char *message,
               const uint8 *hash_stage2)
{
 ...
  return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE);
}

という関数でパスワードのチェックをしているのだけども(正しいパスワードだと0を返す)、memcmpの仕様は

The memcmp() function returns an integer less than, equal to, or
greater than zero if the first n bytes of s1 is found, respectively, to
be less than, to match, or be greater than the first n bytes of s2.

となっていて、memcmpは等しくない場合に0以外のintを返すが、check_scrambleはmy_bool(char)を返す。

もし0以外のintの最後のバイトが0だったらキャストによってcharの0になってパスワードが正しくみなされてしまうということらしい。

で、これはmemcmpの実装に依存するので、以下によると今のところglibcのSSE最適化したものしか該当しないらしい。

To my knowledge gcc builtin memcmp is safe, BSD libc memcmp is safe. Linux glibc
sse-optimized memcmp is not safe, but gcc usually uses the inlined
builtin version.

oss-sec: Security vulnerability in MySQL/MariaDB sql/password.c

あと、Oracleのビルドしたバイナリも対象外とのこと

Just to confirm what Sergei wrote earlier, the Oracle-produced MySQL builds do not use the gcc SSE option that exposes this problem.

MySQL Bugs: #64884: logins with incorrect password are allowed