1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00
Go to file
Simon Tatham c193fe9848 Switch to RFC 6979 for DSA nonce generation.
This fixes a vulnerability that compromises NIST P521 ECDSA keys when
they are used with PuTTY's existing DSA nonce generation code. The
vulnerability has been assigned the identifier CVE-2024-31497.

PuTTY has been doing its DSA signing deterministically for literally
as long as it's been doing it at all, because I didn't trust Windows's
entropy generation. Deterministic nonce generation was introduced in
commit d345ebc2a5, as part of the initial version of our DSA
signing routine. At the time, there was no standard for how to do it,
so we had to think up the details of our system ourselves, with some
help from the Cambridge University computer security group.

More than ten years later, RFC 6979 was published, recommending a
similar system for general use, naturally with all the details
different. We didn't switch over to doing it that way, because we had
a scheme in place already, and as far as I could see, the differences
were not security-critical - just the normal sort of variation you
expect when any two people design a protocol component of this kind
independently.

As far as I know, the _structure_ of our scheme is still perfectly
fine, in terms of what data gets hashed, how many times, and how the
hash output is converted into a nonce. But the weak spot is the choice
of hash function: inside our dsa_gen_k() function, we generate 512
bits of random data using SHA-512, and then reduce that to the output
range by modular reduction, regardless of what signature algorithm
we're generating a nonce for.

In the original use case, this introduced a theoretical bias (the
output size is an odd prime, which doesn't evenly divide the space of
2^512 possible inputs to the reduction), but the theory was that since
integer DSA uses a modulus prime only 160 bits long (being based on
SHA-1, at least in the form that SSH uses it), the bias would be too
small to be detectable, let alone exploitable.

Then we reused the same function for NIST-style ECDSA, when it
arrived. This is fine for the P256 curve, and even P384. But in P521,
the order of the base point is _greater_ than 2^512, so when we
generate a 512-bit number and reduce it, the reduction never makes any
difference, and our output nonces are all in the first 2^512 elements
of the range of about 2^521. So this _does_ introduce a significant
bias in the nonces, compared to the ideal of uniformly random
distribution over the whole range. And it's been recently discovered
that a bias of this kind is sufficient to expose private keys, given a
manageably small number of signatures to work from.

(Incidentally, none of this affects Ed25519. The spec for that system
includes its own idea of how you should do deterministic nonce
generation - completely different again, naturally - and we did it
that way rather than our way, so that we could use the existing test
vectors.)

The simplest fix would be to patch our existing nonce generator to use
a longer hash, or concatenate a couple of SHA-512 hashes, or something
similar. But I think a more robust approach is to switch it out
completely for what is now the standard system. The main reason why I
prefer that is that the standard system comes with test vectors, which
adds a lot of confidence that I haven't made some other mistake in
following my own design.

So here's a commit that adds an implementation of RFC 6979, and
removes the old dsa_gen_k() function. Tests are added based on the
RFC's appendix of test vectors (as many as are compatible with the
more limited API of PuTTY's crypto code, e.g. we lack support for the
NIST P192 curve, or for doing integer DSA with many different hash
functions). One existing test changes its expected outputs, namely the
one that has a sample key pair and signature for every key algorithm
we support.
2024-04-06 09:30:57 +01:00
charset sbcsgen.pl: handle \r\n line endings. 2022-09-01 20:43:23 +01:00
cmake Side-channel tester: align memory allocations. 2024-04-01 13:10:49 +01:00
contrib authplugin-example.py: Flush stderr. 2023-04-19 14:18:58 +01:00
crypto Switch to RFC 6979 for DSA nonce generation. 2024-04-06 09:30:57 +01:00
doc Update version number for 0.80 release. 2023-12-16 13:08:16 +00:00
icons New script to draw the icons as SVG. 2022-03-18 12:55:01 +00:00
keygen Add some missing #includes. 2022-09-03 11:59:12 +01:00
otherbackends Prevent sending double-EOF in raw backend. 2023-04-19 14:28:36 +01:00
proxy Refactor confirm_weak to use SeatDialogText. 2023-11-29 07:29:29 +00:00
ssh Terrapin warning: say if reconfiguration can help. 2023-12-13 18:49:17 +00:00
stubs Refactor confirm_weak to use SeatDialogText. 2023-11-29 07:29:29 +00:00
terminal Recognise and discard the APC terminal escape sequence. 2023-11-18 09:11:33 +00:00
test Switch to RFC 6979 for DSA nonce generation. 2024-04-06 09:30:57 +01:00
unix Side-channel tester: align memory allocations. 2024-04-01 13:10:49 +01:00
utils Side-channel tester: align memory allocations. 2024-04-01 13:10:49 +01:00
windows windows/utils/registry.c: allow opening reg keys RO. 2023-12-16 13:06:49 +00:00
.gitignore Add .gitignore rules for in-tree builds. 2021-04-19 18:26:56 +01:00
aqsync.c Build outgoing SSH agent requests in a strbuf. 2018-05-25 14:36:16 +01:00
be_list.c Merge be_*.c into one ifdef-controlled module. 2021-11-26 17:58:55 +00:00
Buildscr Update version number for 0.80 release. 2023-12-16 13:08:16 +00:00
Buildscr.cv Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
callback.c Add lots of missing 'static' keywords. 2020-01-29 06:44:18 +00:00
cgtest.c Richer data type for interactive prompt results. 2021-12-28 18:08:31 +00:00
CHECKLST.txt CHECKLST.txt: suggest writing Windows Store blurb ahead of time. 2023-11-18 09:09:55 +00:00
clicons.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
CMakeLists.txt CMakeLists.txt: explicitly ask for C99. 2023-11-18 09:09:55 +00:00
cmdgen.c cmdgen: Fix docs and usage messages. 2022-10-20 23:55:19 +01:00
cmdline.c Restrict -pwfile / -pw to apply to server prompts only. 2022-10-23 14:13:55 +01:00
config.c Make it clearer that detached SSH cert is optional. 2023-07-19 17:15:23 +01:00
console.c Refactor confirm_weak to use SeatDialogText. 2023-11-29 07:29:29 +00:00
console.h Mention the host name in host-key prompts. 2021-09-16 14:33:59 +01:00
defs.h Switch to RFC 6979 for DSA nonce generation. 2024-04-06 09:30:57 +01:00
dialog.c Fix uninitialised field in ctrl_fileselect. 2022-07-24 14:08:56 +01:00
dialog.h Replace integer context2 encoding in conf_editbox_handler. 2022-09-01 20:43:23 +01:00
errsock.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
import.c Add a batch of missing 'static's. 2022-09-03 12:02:48 +01:00
LATEST.VER Update version number for 0.80 release. 2023-12-16 13:08:16 +00:00
ldisc.c ldisc: fix unwanted double-action of ^U. 2023-04-19 14:28:36 +01:00
LICENCE It's a new year. 2023-04-19 14:28:36 +01:00
licence.pl Separate the functions of licence.pl. 2021-04-17 13:52:27 +01:00
logging.c logging: allow &H to expand to serial line. 2023-07-16 16:05:48 +01:00
marshal.h Formatting: realign run-on parenthesised stuff. 2022-08-03 20:48:46 +01:00
misc.h Add a missing prototype. 2022-09-03 11:59:12 +01:00
mksrcarc.sh Updates to mksrcarc.sh. 2022-09-01 20:43:23 +01:00
mkunxarc.sh Integrate the 'doc' subdir into the CMake system. 2021-05-03 17:01:55 +01:00
mpint.h Utility function mp_resize. 2022-04-15 17:46:06 +01:00
network.h New facility, platform_start_subprocess. 2022-09-01 20:43:23 +01:00
pageant.c Formatting: another handful of mis-indented labels. 2022-08-07 18:44:11 +01:00
pageant.h winpgnt: menu options to delete/reencrypt everything. 2021-04-04 10:02:24 +01:00
pinger.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pscp.c Formatting: miscellaneous. 2022-08-03 20:48:46 +01:00
psftp.c PSFTP: fix memory leak opening two consecutive sessions. 2023-06-07 07:29:26 +01:00
psftp.h Remove FLAG_VERBOSE. 2020-01-30 06:40:21 +00:00
psftpcommon.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
psocks.c Add some missing #includes. 2022-09-03 11:59:12 +01:00
psocks.h Remove a couple of double-typedefs. 2023-11-18 09:09:55 +00:00
putty.h Refactor confirm_weak to use SeatDialogText. 2023-11-29 07:29:29 +00:00
puttymem.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
README README: remove mention of doc/Makefile. 2022-10-23 12:37:20 +01:00
release.pl Remove FTP from release machinery. 2022-09-12 09:34:01 +01:00
settings.c settings.c: missing 'const' in gppfont(). 2023-11-18 09:11:33 +00:00
sign.sh GPG key rollover. 2023-07-31 20:01:24 +01:00
ssh.h Switch to RFC 6979 for DSA nonce generation. 2024-04-06 09:30:57 +01:00
sshcr.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
sshkeygen.h Side-channel-safe rewrite of the Miller-Rabin test. 2021-08-27 18:04:49 +01:00
sshpubk.c Remove a pointless allocation. 2023-04-19 14:18:58 +01:00
sshrand.c Remove dependency of sshrand.c on SHA-512. 2020-09-13 09:11:31 +01:00
storage.h Certificate trust scope: change to a boolean-expression system. 2022-06-25 14:32:23 +01:00
timing.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
tree234.h Formatting: remove spurious spaces in 'type * var'. 2022-08-03 20:48:46 +01:00
version.h Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
x11disp.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00

This is the README for PuTTY, a free Windows and Unix Telnet and SSH
client.

PuTTY is built using CMake <https://cmake.org/>. To compile in the
simplest way (on any of Linux, Windows or Mac), run these commands in
the source directory:

  cmake .
  cmake --build .

Then, to install in the simplest way on Linux or Mac:

  cmake --build . --target install

On Unix, pterm would like to be setuid or setgid, as appropriate, to
permit it to write records of user logins to /var/run/utmp and
/var/log/wtmp. (Of course it will not use this privilege for
anything else, and in particular it will drop all privileges before
starting up complex subsystems like GTK.) The cmake install step
doesn't attempt to add these privileges, so if you want user login
recording to work, you should manually ch{own,grp} and chmod the
pterm binary yourself after installation. If you don't do this,
pterm will still work, but not update the user login databases.

Documentation (in various formats including Windows Help and Unix
`man' pages) is built from the Halibut (`.but') files in the `doc'
subdirectory. If you aren't using one of our source snapshots,
you'll need to do this yourself. Halibut can be found at
<https://www.chiark.greenend.org.uk/~sgtatham/halibut/>.

The PuTTY home web site is

    https://www.chiark.greenend.org.uk/~sgtatham/putty/

If you want to send bug reports or feature requests, please read the
Feedback section of the web site before doing so. Sending one-line
reports saying `it doesn't work' will waste your time as much as
ours.

See the file LICENCE for the licence conditions.