[gnutls-devel] GnuTLS | srptool:possible stack buffer overflow with large SRP groups (#1777)
Read-only notification of GnuTLS library development activities
gnutls-devel at lists.gnutls.org
Fri Dec 19 17:29:14 CET 2025
Mikhail created an issue: https://gitlab.com/gnutls/gnutls/-/issues/1777
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 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!
--
Reply to this email directly or view it on GitLab: https://gitlab.com/gnutls/gnutls/-/issues/1777
You're receiving this email because of your account on gitlab.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gnupg.org/pipermail/gnutls-devel/attachments/20251219/f225e56a/attachment-0001.html>
More information about the Gnutls-devel
mailing list