*pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ ! /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p; ************************ SNIP ************************ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; ! /* Enter response type, length and copy payload */ *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload); bp += payload; 先頭バイトはメッセージの種類 (request /response) 次の 16 bit を payload (ペイロード長) に格納 レスポンス用 buffer を allocate リクエストから指定された長さのデー タをレスポンスのペイロードとして コピー。 Heartbeat パケットを超 えた領域もコピーしてしまう *p *buffer Heartbeat パケット Heartbeat パケット 隣接するプロセスメモリ