| 4826 |
} |
} |
| 4827 |
|
|
| 4828 |
|
|
| 4829 |
// キー交換開始前のチェック (SSH2_MSG_KEXINIT) |
/* |
| 4830 |
// ※当該関数はデータ通信中にも呼ばれてくる可能性あり |
* キー交換開始前のチェック (SSH2_MSG_KEXINIT) |
| 4831 |
|
* ※当該関数はデータ通信中にも呼ばれてくる可能性あり |
| 4832 |
|
* |
| 4833 |
|
* SSH2_MSG_KEXINIT: |
| 4834 |
|
* byte SSH_MSG_KEXINIT |
| 4835 |
|
* byte[16] cookie (random bytes) |
| 4836 |
|
* name-list kex_algorithms |
| 4837 |
|
* name-list server_host_key_algorithms |
| 4838 |
|
* name-list encryption_algorithms (c2s) |
| 4839 |
|
* name-list encryption_algorithms (s2c) |
| 4840 |
|
* name-list mac_algorithms (c2s) |
| 4841 |
|
* name-list mac_algorithms (s2c) |
| 4842 |
|
* name-list compression_algorithms (c2s) |
| 4843 |
|
* name-list compression_algorithms (s2c) |
| 4844 |
|
* name-list languages (c2s) |
| 4845 |
|
* name-list languages (s2c) |
| 4846 |
|
* boolean first_kex_packet_follows |
| 4847 |
|
* uint32 0 (reserved for future extension) |
| 4848 |
|
*/ |
| 4849 |
static BOOL handle_SSH2_kexinit(PTInstVar pvar) |
static BOOL handle_SSH2_kexinit(PTInstVar pvar) |
| 4850 |
{ |
{ |
| 4851 |
char buf[1024]; |
char buf[1024]; |
| 5112 |
goto error; |
goto error; |
| 5113 |
} |
} |
| 5114 |
|
|
| 5115 |
|
// 言語(クライアント -> サーバ) |
| 5116 |
|
// 現状では未使用。ログに記録するだけ。 |
| 5117 |
|
if (!grab_payload(pvar, 4) |
| 5118 |
|
|| !grab_payload(pvar, size = get_uint32(data))) { |
| 5119 |
|
// 言語の name-list が取れないという事は KEXINIT パケットのフォーマット自体が想定外であり |
| 5120 |
|
// 異常な状態であるが、通信に必要なアルゴリズムはすでにネゴ済みで通信自体は行える。 |
| 5121 |
|
// 今まではこの部分のチェックを行っていなかったので、警告を記録するのみで処理を続行する。 |
| 5122 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (language client to server)"); |
| 5123 |
|
goto skip; |
| 5124 |
|
} |
| 5125 |
|
data += 4; |
| 5126 |
|
|
| 5127 |
|
if (size >= sizeof(buf)) { |
| 5128 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed language (client to server) is too long."); |
| 5129 |
|
} |
| 5130 |
|
strncpy_s(buf, sizeof(buf), data, _TRUNCATE); |
| 5131 |
|
data += size; |
| 5132 |
|
|
| 5133 |
|
logprintf(LOG_LEVEL_VERBOSE, "server proposal: language client to server: %s", buf); |
| 5134 |
|
|
| 5135 |
|
// 言語(サーバ -> クライアント) |
| 5136 |
|
// 現状では未使用。ログに記録するだけ。 |
| 5137 |
|
if (!grab_payload(pvar, 4) |
| 5138 |
|
|| !grab_payload(pvar, size = get_uint32(data))) { |
| 5139 |
|
// 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。 |
| 5140 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (language server to client)"); |
| 5141 |
|
goto skip; |
| 5142 |
|
} |
| 5143 |
|
data += 4; |
| 5144 |
|
|
| 5145 |
|
if (size >= sizeof(buf)) { |
| 5146 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed language (server to client) is too long."); |
| 5147 |
|
} |
| 5148 |
|
strncpy_s(buf, sizeof(buf), data, _TRUNCATE); |
| 5149 |
|
data += size; |
| 5150 |
|
|
| 5151 |
|
logprintf(LOG_LEVEL_VERBOSE, "server proposal: language server to client: %s", buf); |
| 5152 |
|
|
| 5153 |
|
// first_kex_packet_follows: |
| 5154 |
|
// KEXINIT パケットの後に、アルゴリズムのネゴ結果を推測して鍵交換パケットを送っているか。 |
| 5155 |
|
// SSH_MSG_KEXINIT の後の鍵交換はクライアント側から送るのでサーバ側が 1 にする事はないはず。 |
| 5156 |
|
if (!grab_payload(pvar, 1)) { |
| 5157 |
|
// 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。 |
| 5158 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (first_kex_packet_follows)"); |
| 5159 |
|
goto skip; |
| 5160 |
|
} |
| 5161 |
|
if (data[0] != 0) { |
| 5162 |
|
// 前述のようにサーバ側は 0 以外にする事はないはずなので、警告を記録する。 |
| 5163 |
|
logprintf(LOG_LEVEL_WARNING, __FUNCTION__ ": first_kex_packet_follows is not 0. (%d)", data[0]); |
| 5164 |
|
} |
| 5165 |
|
data++; |
| 5166 |
|
|
| 5167 |
|
// reserved: 現状は常に 0 となる。 |
| 5168 |
|
if (!grab_payload(pvar, 4)) { |
| 5169 |
|
// 言語(クライアント -> サーバ) と同様に、問題があっても警告のみとする。 |
| 5170 |
|
logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": truncated packet (reserved)"); |
| 5171 |
|
goto skip; |
| 5172 |
|
} |
| 5173 |
|
if ((size = get_uint32(data)) != 0) { |
| 5174 |
|
logprintf(LOG_LEVEL_INFO, __FUNCTION__ ": reserved data is not 0. (%d)", size); |
| 5175 |
|
} |
| 5176 |
|
|
| 5177 |
skip: |
skip: |
| 5178 |
// 決定した方式をログに出力 |
// 決定した方式をログに出力 |
| 5179 |
logprintf(LOG_LEVEL_VERBOSE, "KEX algorithm: %s", |
logprintf(LOG_LEVEL_VERBOSE, "KEX algorithm: %s", |