mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05:00
Add a new SSH2 bug: some servers apparently claim to be able to do
DH group exchange, but choke when you actually try it. Never automatically enabled; manual control only. [originally from svn r1982]
This commit is contained in:
parent
b2c7474747
commit
a394f20829
@ -1,4 +1,4 @@
|
|||||||
\versionid $Id: config.but,v 1.41 2002/09/23 09:55:11 jacob Exp $
|
\versionid $Id: config.but,v 1.42 2002/09/26 18:37:33 simon Exp $
|
||||||
|
|
||||||
\C{config} Configuring PuTTY
|
\C{config} Configuring PuTTY
|
||||||
|
|
||||||
@ -2005,7 +2005,7 @@ server, communication will fail.
|
|||||||
|
|
||||||
This is an SSH2-specific bug.
|
This is an SSH2-specific bug.
|
||||||
|
|
||||||
\S{config-ssh-bug-ssh} \q{Requires padding on SSH2 RSA signatures}
|
\S{config-ssh-bug-sig} \q{Requires padding on SSH2 RSA signatures}
|
||||||
|
|
||||||
\cfg{winhelp-topic}{ssh.bugs.rsapad2}
|
\cfg{winhelp-topic}{ssh.bugs.rsapad2}
|
||||||
|
|
||||||
@ -2024,6 +2024,23 @@ to talking to OpenSSH.
|
|||||||
|
|
||||||
This is an SSH2-specific bug.
|
This is an SSH2-specific bug.
|
||||||
|
|
||||||
|
\S{config-ssh-bug-dhgex} \q{Chokes on Diffie-Hellman group exchange}
|
||||||
|
|
||||||
|
\cfg{winhelp-topic}{ssh.bugs.dhgex2}
|
||||||
|
|
||||||
|
We have anecdotal evidence that some SSH servers claim to be able to
|
||||||
|
perform Diffie-Hellman group exchange, but fail to actually do so
|
||||||
|
when PuTTY tries to. If your SSH2 sessions spontaneously close
|
||||||
|
immediately after opening the PuTTY window, it might be worth
|
||||||
|
enabling the workaround for this bug to see if it helps.
|
||||||
|
|
||||||
|
We have no hard evidence that any specific version of specific
|
||||||
|
server software reliably demonstrates this bug. Therefore, PuTTY
|
||||||
|
will never \e{assume} a server has this bug; if you want the
|
||||||
|
workaround, you need to enable it manually.
|
||||||
|
|
||||||
|
This is an SSH2-specific bug.
|
||||||
|
|
||||||
\H{config-file} Storing configuration in a file
|
\H{config-file} Storing configuration in a file
|
||||||
|
|
||||||
PuTTY does not currently support storing its configuration in a file
|
PuTTY does not currently support storing its configuration in a file
|
||||||
|
3
putty.h
3
putty.h
@ -372,7 +372,8 @@ typedef struct {
|
|||||||
enum {
|
enum {
|
||||||
BUG_AUTO, BUG_OFF, BUG_ON
|
BUG_AUTO, BUG_OFF, BUG_ON
|
||||||
} sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
|
} sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
|
||||||
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2;
|
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2,
|
||||||
|
sshbug_dhgex2;
|
||||||
} Config;
|
} Config;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -309,6 +309,7 @@ void save_settings(char *section, int do_host, Config * cfg)
|
|||||||
write_setting_i(sesskey, "BugHMAC2", cfg->sshbug_hmac2);
|
write_setting_i(sesskey, "BugHMAC2", cfg->sshbug_hmac2);
|
||||||
write_setting_i(sesskey, "BugDeriveKey2", cfg->sshbug_derivekey2);
|
write_setting_i(sesskey, "BugDeriveKey2", cfg->sshbug_derivekey2);
|
||||||
write_setting_i(sesskey, "BugRSAPad2", cfg->sshbug_rsapad2);
|
write_setting_i(sesskey, "BugRSAPad2", cfg->sshbug_rsapad2);
|
||||||
|
write_setting_i(sesskey, "BugDHGEx2", cfg->sshbug_dhgex2);
|
||||||
close_settings_w(sesskey);
|
close_settings_w(sesskey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -583,6 +584,7 @@ void load_settings(char *section, int do_host, Config * cfg)
|
|||||||
}
|
}
|
||||||
gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &cfg->sshbug_derivekey2);
|
gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &cfg->sshbug_derivekey2);
|
||||||
gppi(sesskey, "BugRSAPad2", BUG_AUTO, &cfg->sshbug_rsapad2);
|
gppi(sesskey, "BugRSAPad2", BUG_AUTO, &cfg->sshbug_rsapad2);
|
||||||
|
gppi(sesskey, "BugDHGEx2", BUG_AUTO, &cfg->sshbug_dhgex2);
|
||||||
|
|
||||||
close_settings_r(sesskey);
|
close_settings_r(sesskey);
|
||||||
}
|
}
|
||||||
|
15
ssh.c
15
ssh.c
@ -183,6 +183,7 @@ static const char *const ssh2_disconnect_reasons[] = {
|
|||||||
#define BUG_CHOKES_ON_RSA 8
|
#define BUG_CHOKES_ON_RSA 8
|
||||||
#define BUG_SSH2_RSA_PADDING 16
|
#define BUG_SSH2_RSA_PADDING 16
|
||||||
#define BUG_SSH2_DERIVEKEY 32
|
#define BUG_SSH2_DERIVEKEY 32
|
||||||
|
#define BUG_SSH2_DH_GEX 64
|
||||||
|
|
||||||
static int ssh_pkt_ctx = 0;
|
static int ssh_pkt_ctx = 0;
|
||||||
|
|
||||||
@ -1742,6 +1743,14 @@ static void ssh_detect_bugs(char *vstring)
|
|||||||
ssh_remote_bugs |= BUG_SSH2_RSA_PADDING;
|
ssh_remote_bugs |= BUG_SSH2_RSA_PADDING;
|
||||||
logevent("We believe remote version has SSH2 RSA padding bug");
|
logevent("We believe remote version has SSH2 RSA padding bug");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg.sshbug_dhgex2 == BUG_ON) {
|
||||||
|
/*
|
||||||
|
* These versions have the SSH2 DH GEX bug.
|
||||||
|
*/
|
||||||
|
ssh_remote_bugs |= BUG_SSH2_DH_GEX;
|
||||||
|
logevent("We believe remote version has SSH2 DH group exchange bug");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_ssh_init(unsigned char c)
|
static int do_ssh_init(unsigned char c)
|
||||||
@ -3648,6 +3657,9 @@ static int do_ssh2_transport(unsigned char *in, int inlen, int ispkt)
|
|||||||
/* List key exchange algorithms. */
|
/* List key exchange algorithms. */
|
||||||
ssh2_pkt_addstring_start();
|
ssh2_pkt_addstring_start();
|
||||||
for (i = 0; i < lenof(kex_algs); i++) {
|
for (i = 0; i < lenof(kex_algs); i++) {
|
||||||
|
if (kex_algs[i] == &ssh_diffiehellman_gex &&
|
||||||
|
(ssh_remote_bugs & BUG_SSH2_DH_GEX))
|
||||||
|
continue;
|
||||||
ssh2_pkt_addstring_str(kex_algs[i]->name);
|
ssh2_pkt_addstring_str(kex_algs[i]->name);
|
||||||
if (i < lenof(kex_algs) - 1)
|
if (i < lenof(kex_algs) - 1)
|
||||||
ssh2_pkt_addstring_str(",");
|
ssh2_pkt_addstring_str(",");
|
||||||
@ -3754,6 +3766,9 @@ static int do_ssh2_transport(unsigned char *in, int inlen, int ispkt)
|
|||||||
pktin.savedpos += 16; /* skip garbage cookie */
|
pktin.savedpos += 16; /* skip garbage cookie */
|
||||||
ssh2_pkt_getstring(&str, &len); /* key exchange algorithms */
|
ssh2_pkt_getstring(&str, &len); /* key exchange algorithms */
|
||||||
for (i = 0; i < lenof(kex_algs); i++) {
|
for (i = 0; i < lenof(kex_algs); i++) {
|
||||||
|
if (kex_algs[i] == &ssh_diffiehellman_gex &&
|
||||||
|
(ssh_remote_bugs & BUG_SSH2_DH_GEX))
|
||||||
|
continue;
|
||||||
if (in_commasep_string(kex_algs[i]->name, str, len)) {
|
if (in_commasep_string(kex_algs[i]->name, str, len)) {
|
||||||
kex = kex_algs[i];
|
kex = kex_algs[i];
|
||||||
break;
|
break;
|
||||||
|
22
windlg.c
22
windlg.c
@ -548,6 +548,8 @@ enum { IDCX_ABOUT =
|
|||||||
IDC_BUGD_DERIVEKEY2,
|
IDC_BUGD_DERIVEKEY2,
|
||||||
IDC_BUGS_RSAPAD2,
|
IDC_BUGS_RSAPAD2,
|
||||||
IDC_BUGD_RSAPAD2,
|
IDC_BUGD_RSAPAD2,
|
||||||
|
IDC_BUGS_DHGEX2,
|
||||||
|
IDC_BUGD_DHGEX2,
|
||||||
sshbugspanelend,
|
sshbugspanelend,
|
||||||
|
|
||||||
selectionpanelstart,
|
selectionpanelstart,
|
||||||
@ -1044,6 +1046,9 @@ char *help_context_cmd(int id)
|
|||||||
case IDC_BUGS_RSAPAD2:
|
case IDC_BUGS_RSAPAD2:
|
||||||
case IDC_BUGD_RSAPAD2:
|
case IDC_BUGD_RSAPAD2:
|
||||||
return "JI(`',`ssh.bugs.rsapad2')";
|
return "JI(`',`ssh.bugs.rsapad2')";
|
||||||
|
case IDC_BUGS_DHGEX2:
|
||||||
|
case IDC_BUGD_DHGEX2:
|
||||||
|
return "JI(`',`ssh.bugs.dhgex2')";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1391,6 +1396,13 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
|
|||||||
SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_SETCURSEL,
|
SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_SETCURSEL,
|
||||||
cfg.sshbug_rsapad2 == BUG_ON ? 2 :
|
cfg.sshbug_rsapad2 == BUG_ON ? 2 :
|
||||||
cfg.sshbug_rsapad2 == BUG_OFF ? 1 : 0, 0);
|
cfg.sshbug_rsapad2 == BUG_OFF ? 1 : 0, 0);
|
||||||
|
SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_RESETCONTENT, 0, 0);
|
||||||
|
SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Auto");
|
||||||
|
SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Off");
|
||||||
|
SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"On");
|
||||||
|
SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_SETCURSEL,
|
||||||
|
cfg.sshbug_dhgex2 == BUG_ON ? 2 :
|
||||||
|
cfg.sshbug_dhgex2 == BUG_OFF ? 1 : 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct treeview_faff {
|
struct treeview_faff {
|
||||||
@ -1994,6 +2006,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
|
|||||||
IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20);
|
IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20);
|
||||||
staticddl(&cp, "Requires &padding on SSH2 RSA signatures",
|
staticddl(&cp, "Requires &padding on SSH2 RSA signatures",
|
||||||
IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20);
|
IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20);
|
||||||
|
staticddl(&cp, "Chokes on &Diffie-Hellman group exchange",
|
||||||
|
IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX2, 20);
|
||||||
endbox(&cp);
|
endbox(&cp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3612,6 +3626,14 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
|
|||||||
index == 1 ? BUG_OFF : BUG_ON);
|
index == 1 ? BUG_OFF : BUG_ON);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IDC_BUGD_DHGEX2:
|
||||||
|
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||||
|
int index = SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2,
|
||||||
|
CB_GETCURSEL, 0, 0);
|
||||||
|
cfg.sshbug_dhgex2 = (index == 0 ? BUG_AUTO :
|
||||||
|
index == 1 ? BUG_OFF : BUG_ON);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case WM_HELP:
|
case WM_HELP:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user