srptool:possible stack buffer overflow with large SRP groups

Hello!

I used SAST tool Svace to analyze gnutls 3.8.11 and encountered a possible buffer overflow in function _srp_crypt. In particular, the static buffer result in _srp_crypt() is only 1024 bytes, while the 8192-bit SRP group code produces base64-encoded verifier of 1366 characters.

I've checked it manually on Ubuntu 24.04.2 LTS by creating tpasswd.conf file and then tried to create verifier with 8192-bit SRP group by specifying --index=7:

~$ srptool --passwd-conf ~/tpasswd.conf --passwd ~/tpasswd --username testuser --index=7

gdb showed this:

(gdb) break srptool.c:468
Breakpoint 1 at 0x2dce: file srptool.c, line 468.
(gdb) run --passwd-conf ~/tpasswd.conf --passwd ~/tpasswd --username testuser --index=7
Starting program: /usr/local/bin/srptool --passwd-conf ~/tpasswd.conf --passwd ~/tpasswd --username testuser --index=7

<...>

Enter password: 

Breakpoint 1, _srp_crypt (username=0x7fffffffe21e "testuser", 
    passwd=0x55555557f130 "admin", salt_size=16, g=0x7fffffffb050, 
    n=0x7fffffffb040) at srptool.c:468
468    sprintf(result, "%s:%s", txt_verifier.data, txt_salt.data);
(gdb) print result
$1 = '\000' <repeats 113 times>
(gdb) print txt_verifier.size
$2 = 1366
(gdb)

However, program doesn't crash in this case in my env. But I've noticed, that I cannot then verify such password:

~$ srptool --verify --passwd-conf ~/tpasswd.conf --passwd ~/tpasswd --username testuser
Enter password: 
Encoding error

At the current moment I didn't find precise cause of such behavior because I'm newbie to gnutls srptool source code but I think it may be connected with out-of-bounds write, explained above..

At least, for addressing buffer overflow we could, f.e:

  • increase the static buffer size to 2048 bytes (sufficient for all currently supported groups),
  • replace sprintf() with snprintf() to prevent overflow even if the buffer were accidentally too small.

But unfortunately it doesn't help with Encoding error -- error remains. I wanted to open MR at first but for now I don't know how to deal with Encoding error, so fix would be incomplete or even wrong. Probably, I may misunderstand something important here, so sorry if I'm mistaking.

Thank you upfront for your time and expertise!

Edited by Mikhail Dmitrichenko