• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision7018 (tree)
Time2018-01-11 22:19:57
Authordoda

Log Message

サーバからの SSH_MSG_KEXINIT で、name-list が長すぎる時に落ちるのを修正

name-list を格納する為のバッファのサイズが 1024 バイトで、name-list が
それより長かった場合に BoF を起こしていた。
OpenSSH が対応している暗号方式をすべて有効にしても 1024 バイトには
行かないので通常は問題とならないが、悪意のあるサーバに接続した時に
問題となる可能性がある。

OpenSSH でも以下のように設定すれば再現が可能。

Ciphers chacha20-poly1305@openssh.com,chacha20-poly1305@openssh.com,chacha20…略…ssh.com,aes256-ctr

Change Summary

Incremental Difference

--- trunk/ttssh2/ttxssh/ssh.c (revision 7017)
+++ trunk/ttssh2/ttxssh/ssh.c (revision 7018)
@@ -4827,7 +4827,7 @@
48274827 {
48284828 char buf[1024];
48294829 char *data;
4830- int len, i, size;
4830+ int len, size;
48314831 int offset = 0;
48324832 char *msg = NULL;
48334833 char tmp[1024+512];
@@ -4883,10 +4883,11 @@
48834883 // キー交換アルゴリズムチェック
48844884 size = get_payload_uint32(pvar, offset);
48854885 offset += 4;
4886- for (i = 0; i < size; i++) {
4887- buf[i] = data[offset + i];
4886+
4887+ if (size >= sizeof(buf)) {
4888+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed kex algorithms is too long.");
48884889 }
4889- buf[i] = '\0'; // null-terminate
4890+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
48904891 offset += size;
48914892
48924893 logprintf(LOG_LEVEL_VERBOSE, "server proposal: KEX algorithm: %s", buf);
@@ -4903,10 +4904,11 @@
49034904 // ホストキーアルゴリズムチェック
49044905 size = get_payload_uint32(pvar, offset);
49054906 offset += 4;
4906- for (i = 0; i < size; i++) {
4907- buf[i] = data[offset + i];
4907+
4908+ if (size >= sizeof(buf)) {
4909+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed hostkey algorithms is too long.");
49084910 }
4909- buf[i] = 0;
4911+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
49104912 offset += size;
49114913
49124914 logprintf(LOG_LEVEL_VERBOSE, "server proposal: server host key algorithm: %s", buf);
@@ -4931,10 +4933,11 @@
49314933 // クライアント -> サーバ暗号アルゴリズムチェック
49324934 size = get_payload_uint32(pvar, offset);
49334935 offset += 4;
4934- for (i = 0; i < size; i++) {
4935- buf[i] = data[offset + i];
4936+
4937+ if (size >= sizeof(buf)) {
4938+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed encryption algorithms (client to server) is too long.");
49364939 }
4937- buf[i] = 0;
4940+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
49384941 offset += size;
49394942
49404943 logprintf(LOG_LEVEL_VERBOSE, "server proposal: encryption algorithm client to server: %s", buf);
@@ -4951,10 +4954,11 @@
49514954 // サーバ -> クライアント暗号アルゴリズムチェック
49524955 size = get_payload_uint32(pvar, offset);
49534956 offset += 4;
4954- for (i = 0; i < size; i++) {
4955- buf[i] = data[offset + i];
4957+
4958+ if (size >= sizeof(buf)) {
4959+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed encryption algorithms (server to client) is too long.");
49564960 }
4957- buf[i] = 0;
4961+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
49584962 offset += size;
49594963
49604964 logprintf(LOG_LEVEL_VERBOSE, "server proposal: encryption algorithm server to client: %s", buf);
@@ -4971,10 +4975,11 @@
49714975 // MAC(Message Authentication Code)アルゴリズムの決定 (2004.12.17 yutaka)
49724976 size = get_payload_uint32(pvar, offset);
49734977 offset += 4;
4974- for (i = 0; i < size; i++) {
4975- buf[i] = data[offset + i];
4978+
4979+ if (size >= sizeof(buf)) {
4980+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed MAC algorithms (client to server) is too long.");
49764981 }
4977- buf[i] = 0;
4982+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
49784983 offset += size;
49794984
49804985 logprintf(LOG_LEVEL_VERBOSE, "server proposal: MAC algorithm client to server: %s", buf);
@@ -4995,10 +5000,11 @@
49955000
49965001 size = get_payload_uint32(pvar, offset);
49975002 offset += 4;
4998- for (i = 0; i < size; i++) {
4999- buf[i] = data[offset + i];
5003+
5004+ if (size >= sizeof(buf)) {
5005+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed MAC algorithms (server to client) is too long.");
50005006 }
5001- buf[i] = 0;
5007+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
50025008 offset += size;
50035009
50045010 logprintf(LOG_LEVEL_VERBOSE, "server proposal: MAC algorithm server to client: %s", buf);
@@ -5022,10 +5028,11 @@
50225028 // (2005.7.9 yutaka)
50235029 size = get_payload_uint32(pvar, offset);
50245030 offset += 4;
5025- for (i = 0; i < size; i++) {
5026- buf[i] = data[offset + i];
5031+
5032+ if (size >= sizeof(buf)) {
5033+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed compression algorithms (client to server) is too long.");
50275034 }
5028- buf[i] = 0;
5035+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
50295036 offset += size;
50305037
50315038 logprintf(LOG_LEVEL_VERBOSE, "server proposal: compression algorithm client to server: %s", buf);
@@ -5041,10 +5048,11 @@
50415048
50425049 size = get_payload_uint32(pvar, offset);
50435050 offset += 4;
5044- for (i = 0; i < size; i++) {
5045- buf[i] = data[offset + i];
5051+
5052+ if (size >= sizeof(buf)) {
5053+ logputs(LOG_LEVEL_WARNING, __FUNCTION__ ": server proposed compression algorithms (server to client) is too long.");
50465054 }
5047- buf[i] = 0;
5055+ strncpy_s(buf, sizeof(buf), data+offset, _TRUNCATE);
50485056 offset += size;
50495057
50505058 logprintf(LOG_LEVEL_VERBOSE, "server proposal: compression algorithm server to client: %s", buf);
--- trunk/doc/ja/html/about/history.html (revision 7017)
+++ trunk/doc/ja/html/about/history.html (revision 7018)
@@ -2982,6 +2982,7 @@
29822982 <li>シリアルポート接続時に <a href="../menu/file.html">[File]</a> メニューの [SSH SCP] が無効にならない問題を修正した。</li>
29832983 <li>暗号方式で aes128-gcm@openss.com または aes256-gcm@openssh.com を使用時、MAC 方式のネゴシエーションが行えなかった時に接続を切る問題を修正した。</li>
29842984 <li>暗号方式で aes128-gcm@openss.com または aes256-gcm@openssh.com を使用時、"About TTSSH" ダイアログで使用していない MAC 方式を表示する問題を修正した。</li>
2985+ <li>暗号方式等のネゴシエーション時、サーバの提案が長すぎる時に落ちる問題を修正した。</li>
29852986 </ul>
29862987 </li>
29872988 </ul>
--- trunk/doc/en/html/about/history.html (revision 7017)
+++ trunk/doc/en/html/about/history.html (revision 7018)
@@ -2976,6 +2976,7 @@
29762976 <!--li>シリアルポート接続時に <a href="../menu/file.html">[File]</a> メニューの [SSH SCP] が無効にならない問題を修正した。</li-->
29772977 <li>When using aes128-gcm@openssh.com or aes256-gcm@openssh.com as symmetric cipher algorithm, connection is terminated if MAC algorithm cannot negotiate.</li>
29782978 <li>When using aes128-gcm@openssh.com or aes256-gcm@openssh.com as symmetric cipher algorithm, un-used MAC algorithm is displayed on "About TTSSH" dialog.</li>
2979+ <li>Application fault is occurred if server proposes a very long string in the algorithm negotiation.</li>
29792980 </ul>
29802981 </li>
29812982 </ul>
Show on old repository browser