Bug #52748 Semi-Sync ACK packet isn't check for length
| Submitted: | 11 Apr 2010 19:43 | Modified: | 20 Jul 2010 14:13 |
|---|---|---|---|
| Reporter: | Jan Kneschke | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Replication | Severity: | S1 (Critical) |
| Version: | 5.5.2 | OS: | Any |
| Assigned to: | Zhenxing He | CPU Architecture: | Any |
[12 Apr 2010 9:00]
Sveta Smirnova
Thank you for the report. > Send a binlog filename in the ACK packet that is > FN_LENGTH: How can I do this? MySQL server refuses to start with such file name for binary log.
[12 Apr 2010 13:54]
Jan Kneschke
I used the modified version of MySQL Proxy's replicant plugin to trigger it, but you can also just change plugins/semisync/semisync_slave.cc:
int ReplSemiSyncSlave::slaveReply(...) {
...
uchar reply_buffer[REPLY_MAGIC_NUM_LEN
+ REPLY_BINLOG_POS_LEN
+ REPLY_BINLOG_NAME_LEN + 255]; /* <--- to-crash: get some more room */
int reply_res, name_len = strlen(binlog_filename);
function_enter(kWho);
/* Prepare the buffer of the reply. */
reply_buffer[REPLY_MAGIC_NUM_OFFSET] = kPacketMagicNum;
int8store(reply_buffer + REPLY_BINLOG_POS_OFFSET, binlog_filepos);
memcpy(reply_buffer + REPLY_BINLOG_NAME_OFFSET,
binlog_filename,
name_len); /** to-crash: no trailing 0 */
/* to-crash: and now append a 255 char long string to make it over run the static buffer on the master */
memset(reply_buffer + EPLY_BINLOG_NAME_OFFSET + name_len, 'A', 255);
[13 Apr 2010 19:43]
Sveta Smirnova
Thank you for the feedback. I still can not reproduce it in mysql-next-mr tree (5.6.99). Could you please try this tree in your environment and inform us if problem still exists?
[5 May 2010 7:19]
Zhenxing He
will check the length and use strncpy to make the code safer.
[24 May 2010 2:53]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/108969 3057 He Zhenxing 2010-05-24 BUG#52748 Semi-Sync ACK packet isn't check for length Check the length and use strncpy to make the code safer.
[24 May 2010 2:57]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/108970 3057 He Zhenxing 2010-05-24 BUG#52748 Semi-Sync ACK packet isn't check for length Check the length and use strncpy to make the code safer.
[31 May 2010 8:59]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/109588 3057 He Zhenxing 2010-05-31 BUG#52748 Semi-Sync ACK packet isn't check for length Check the length and use strncpy to make the code safer.
[1 Jun 2010 8:54]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/109659 3132 He Zhenxing 2010-06-01 BUG#52748 Semi-Sync ACK packet isn't check for length Check the length and use strncpy to make the code safer. @ plugin/semisync/semisync_master.cc replace strcpy with strncpy to make the code safer
[1 Jun 2010 9:00]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/109661 3077 He Zhenxing 2010-06-01 [merge] BUG#52748 Semi-Sync ACK packet isn't check for length Check the length and use strncpy to make the code safer.
[1 Jun 2010 9:15]
Zhenxing He
pushed to 5.1-rep-semisync and trunk-bugfixing
[1 Jun 2010 10:24]
Zhenxing He
pushed to next-mr-bugfixing
[2 Jun 2010 10:57]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/109943 3133 He Zhenxing 2010-06-02 Post fix for bug#52748
[15 Jun 2010 8:16]
Bugs System
Pushed into 5.5.5-m3 (revid:alik@sun.com-20100615080459-smuswd9ooeywcxuc) (version source revid:marko.makela@oracle.com-20100601134335-ccthwwru23kn09qw) (merge vers: 5.1.48) (pib:16)
[15 Jun 2010 8:33]
Bugs System
Pushed into mysql-next-mr (revid:alik@sun.com-20100615080558-cw01bzdqr1bdmmec) (version source revid:marko.makela@oracle.com-20100601134335-ccthwwru23kn09qw) (pib:16)
[20 Jul 2010 14:13]
Paul DuBois
Noted in 5.5.5 changelog. ACK packets in semisynchronous replication were not checked for length and malformed packets could cause a server crash.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.075 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: Sending a crafted ACK packet in a semi-sync replication triggers a segfault. int ReplSemiSyncMaster::readSlaveReply(NET *net, uint32 server_id, const char *event_buf) { ... char log_file_name[FN_REFLEN]; ... strcpy(log_file_name, (const char*)packet + REPLY_BINLOG_NAME_OFFSET); How to repeat: Send a binlog filename in the ACK packet that is > FN_LENGTH: * 4 byte mysql-packet-header * 0xef as semi-sync magic * 8 byte log-pos * rest is log-filename like: [0000] 09 04 00 00 ef 47 03 00 00 00 00 00 00 61 61 61 .....G.......aaa [0010] 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa [0020] 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa ... [0400] 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaa leads to as stack-overrun: Thread 20 (process 57663): #0 0x00007fff85274886 in __kill () #1 0x00007fff85314e4f in __abort () #2 0x00007fff852f952c in __stack_chk_fail () #3 0x0000000100a7da49 in ReplSemiSyncMaster::readSlaveReply () #4 0x6161616161616161 in ?? () The length of the log_file_name is not checked: int ReplSemiSyncMaster::readSlaveReply(NET *net, uint32 server_id, const char *event_buf) { ... char log_file_name[FN_REFLEN]; ... strcpy(log_file_name, (const char*)packet + REPLY_BINLOG_NAME_OFFSET); Suggested fix: Check the length of the binlog filename that it is less than FN_LENGTH.