今回もMOPS関連の話題です。MOPSでmysqlnd
MySQL Native Driverとは?
MySQL Native Driver
mysqlndはlibmysqlとは異なり、
MOPSで報告されたmysqlndの脆弱性
MOPSでは以下のmysqlnd関連の脆弱性が報告されました。
- php_
mysqlnd_ ok_ read関数のヒープメモリ情報リーク  - php_
mysqlnd_ rset_ header_ read関数のバッファオーバーフロー  - php_
mysqlnd_ read_ error_ from_ line関数のバッファオーバーフロー  - php_
mysqlnd_ auth_ write関数のスタックオーバーフロー  
これらの脆弱性はMOPSの主催者でもあるStefan Esser氏によって発見された脆弱性です。これらの脆弱性の中身を紹介します。
php_mysqlnd_ok_read関数のヒープメモリ情報リーク   
この脆弱性は、
以下が問題のコードです。
/* There is a message */
if (packet->header.size > (size_t) (p - buf) && (i = php_mysqlnd_net_field_length(&p))) {
    packet->message = mnd_pestrndup((char *)p, MIN(i, buf_len - (p - begin)), FALSE);
    packet->message_len = i;
} else {
    packet->message = NULL;
}
この packet->message_
php_mysqlnd_rset_header_read関数のバッファオーバーフロー    
このバグは先ほどの脆弱性で問題点を指摘されている php_
if (packet->header.size  > (size_t) (p - buf) && (len = php_mysqlnd_net_field_length(&p))) {
    packet->info_or_local_file = mnd_emalloc(len + 1);
    memcpy(packet->info_or_local_file, p, len);
    packet->info_or_local_file[len] = '\0';
    packet->info_or_local_file_len = len;
}
lenはsingned intとして定義されています。64bit/
php_mysqlnd_read_error_from_line関数のバッファオーバーフロー     
php_
f (buf_len > 2) {
    *error_no = uint2korr(p);
    p+= 2;
    /* sqlstate is following */
    if (*p == '#') {
        memcpy(sqlstate, ++p, MYSQLND_SQLSTATE_LENGTH);
        p+= MYSQLND_SQLSTATE_LENGTH;
    }
    error_msg_len = buf_len - (p - buf);
    error_msg_len = MIN(error_msg_len, error_buf_len - 1);
    memcpy(error, p, error_msg_len);
} else {
    *error_no = CR_UNKNOWN_ERROR;
    memcpy(sqlstate, unknown_sqlstate, MYSQLND_SQLSTATE_LENGTH);
}
error_
これも前の問題と同様に64bit/
php_mysqlnd_auth_write関数のスタックオーバーフロー   
典型的なスタックオーバーフロー脆弱性です。
char buffer[AUTH_WRITE_BUFFER_LEN];
register char *p= buffer + MYSQLND_HEADER_SIZE; /* start after the header */
(省略)
memset(p, 0, 23); /* filler */
p+= 23;
if (!packet->send_half_packet) {
    len = strlen(packet->user);
    memcpy(p, packet->user, len);
    ...
スタック上に作られたバッファpに対して、
ユーザ名のほかにもデータベース名にも同様のバッファオーバーフロー脆弱性があります。Stefan Esser氏によると、
オープンソースとセキュリティ
いくつかのオープンソースプロジェクトに関わってみれば分かることですが、
PHPのソースコードをコミット
オープンソースモデルで開発しているプロジェクトであっても、
まとめ
今回はMOPSでレポートされたmysqlndの脆弱性が基本的なソースコード検査で見つかることを紹介しました。この脆弱性はPHP本体の脆弱性ですが、
mysqlndのコードはネットワーク経由のデータを不用意に信用してしまうことによって脆弱にとなっていました。Webアプリケーションもまったく同じです。ネットワーク経由で送られたデータはもちろん、
データを利用する場合は常にデータソースとデータの利用のされ方に注意しなければならないことは言語やアプリケーションを問いません。
