1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-18 19:41:01 -05:00

New feature: k-i authentication helper plugins.

In recent months I've had two requests from different people to build
support into PuTTY for automatically handling complicated third-party
auth protocols layered on top of keyboard-interactive - the kind of
thing where you're asked to enter some auth response, and you have to
refer to some external source like a web server to find out what the
right response _is_, which is a pain to do by hand, so you'd prefer it
to be automated in the SSH client.

That seems like a reasonable thing for an end user to want, but I
didn't think it was a good idea to build support for specific
protocols of that kind directly into PuTTY, where there would no doubt
be an ever-lengthening list, and maintenance needed on all of them.

So instead, in collaboration with one of my correspondents, I've
designed and implemented a protocol to be spoken between PuTTY and a
plugin running as a subprocess. The plugin can opt to handle the
keyboard-interactive authentication loop on behalf of the user, in
which case PuTTY passes on all the INFO_REQUEST packets to it, and
lets it make up responses. It can also ask questions of the user if
necessary.

The protocol spec is provided in a documentation appendix. The entire
configuration for the end user consists of providing a full command
line to use as the subprocess.

In the contrib directory I've provided an example plugin written in
Python. It gives a set of fixed responses suitable for getting through
Uppity's made-up k-i system, because that was a reasonable thing I
already had lying around to test against. But it also provides example
code that someone else could pick up and insert their own live
response-provider into the middle of, assuming they were happy with it
being in Python.
This commit is contained in:
Simon Tatham
2022-09-01 19:38:46 +01:00
parent 1f32a16dc8
commit 15f097f399
12 changed files with 1309 additions and 46 deletions

32
ssh.h
View File

@ -1917,3 +1917,35 @@ bool ssh_transient_hostkey_cache_verify(
bool ssh_transient_hostkey_cache_has(
ssh_transient_hostkey_cache *thc, const ssh_keyalg *alg);
bool ssh_transient_hostkey_cache_non_empty(ssh_transient_hostkey_cache *thc);
/*
* Protocol definitions for authentication helper plugins
*/
#define AUTHPLUGIN_MSG_NAMES(X) \
X(PLUGIN_INIT, 1) \
X(PLUGIN_INIT_RESPONSE, 2) \
X(PLUGIN_PROTOCOL, 3) \
X(PLUGIN_PROTOCOL_ACCEPT, 4) \
X(PLUGIN_PROTOCOL_REJECT, 5) \
X(PLUGIN_AUTH_SUCCESS, 6) \
X(PLUGIN_AUTH_FAILURE, 7) \
X(PLUGIN_INIT_FAILURE, 8) \
X(PLUGIN_KI_SERVER_REQUEST, 20) \
X(PLUGIN_KI_SERVER_RESPONSE, 21) \
X(PLUGIN_KI_USER_REQUEST, 22) \
X(PLUGIN_KI_USER_RESPONSE, 23) \
/* end of list */
#define PLUGIN_PROTOCOL_MAX_VERSION 2 /* the highest version we speak */
enum {
#define ENUMDECL(name, value) name = value,
AUTHPLUGIN_MSG_NAMES(ENUMDECL)
#undef ENUMDECL
/* Error codes internal to this implementation, indicating failure
* to receive a meaningful packet at all */
PLUGIN_NOTYPE = 256, /* packet too short to have a type */
PLUGIN_EOF = 257 /* EOF from auth plugin */
};