Skip to content

Commit e86ab20

Browse files
Zeroize SFTP file payload buffers before freeing
1 parent c9f877d commit e86ab20

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

.github/workflows/os-check.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ jobs:
7272
'',
7373
'--enable-all',
7474
'--enable-sftp',
75+
'--enable-sftp --disable-sftp-zeroize',
7576
'--enable-scp',
7677
'--enable-keyboard-interactive',
7778
'--enable-shell',

configure.ac

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ AC_ARG_ENABLE([sftp],
151151
[AS_HELP_STRING([--enable-sftp],[Enable SFTP support (default: disabled)])],
152152
[ENABLED_SFTP=$enableval],[ENABLED_SFTP=no])
153153

154+
# SFTP buffer zeroization
155+
AC_ARG_ENABLE([sftp-zeroize],
156+
[AS_HELP_STRING([--disable-sftp-zeroize],[Disable zeroization of SFTP file payload buffers before free (default: enabled)])],
157+
[ENABLED_SFTP_ZEROIZE=$enableval],[ENABLED_SFTP_ZEROIZE=yes])
158+
154159
# SSHD
155160
AC_ARG_ENABLE([sshd],
156161
[AS_HELP_STRING([--enable-sshd],[Enable SSHD support (default: disabled)])],
@@ -235,6 +240,8 @@ AS_IF([test "x$ENABLED_SCP" = "xyes"],
235240
[AM_CPPFLAGS="$AM_CPPFLAGS -DWOLFSSH_SCP"])
236241
AS_IF([test "x$ENABLED_SFTP" = "xyes"],
237242
[AM_CPPFLAGS="$AM_CPPFLAGS -DWOLFSSH_SFTP"])
243+
AS_IF([test "x$ENABLED_SFTP_ZEROIZE" = "xno"],
244+
[AM_CPPFLAGS="$AM_CPPFLAGS -DWOLFSSH_NO_SFTP_BUFFER_ZERO"])
238245
AS_IF([test "x$ENABLED_FWD" = "xyes"],
239246
[AM_CPPFLAGS="$AM_CPPFLAGS -DWOLFSSH_FWD"])
240247
AS_IF([test "x$ENABLED_TERM" = "xyes"],
@@ -342,6 +349,7 @@ AS_ECHO([" * psuedo-terminal: $ENABLED_TERM"])
342349
AS_ECHO([" * echoserver shell support: $ENABLED_SHELL"])
343350
AS_ECHO([" * scp: $ENABLED_SCP"])
344351
AS_ECHO([" * sftp: $ENABLED_SFTP"])
352+
AS_ECHO([" * sftp buffer zeroize: $ENABLED_SFTP_ZEROIZE"])
345353
AS_ECHO([" * sshd: $ENABLED_SSHD"])
346354
AS_ECHO([" * ssh client: $ENABLED_SSHCLIENT"])
347355
AS_ECHO([" * agent: $ENABLED_AGENT"])

src/wolfsftp.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,12 @@ static int wolfSSH_SFTP_buffer_set_size(WS_SFTP_BUFFER* buffer, word32 sz)
470470
return WS_BAD_ARGUMENT;
471471
}
472472

473+
#ifndef WOLFSSH_NO_SFTP_BUFFER_ZERO
474+
/* wipe any payload in the region being trimmed off before shrinking */
475+
if (buffer->data != NULL && sz < buffer->sz) {
476+
ForceZero(buffer->data + sz, buffer->sz - sz);
477+
}
478+
#endif
473479
buffer->sz = sz;
474480
return WS_SUCCESS;
475481
}
@@ -793,12 +799,15 @@ static int wolfSSH_SFTP_buffer_read(WOLFSSH* ssh, WS_SFTP_BUFFER* buffer,
793799
static void wolfSSH_SFTP_buffer_free(WOLFSSH* ssh, WS_SFTP_BUFFER* buffer)
794800
{
795801
if (ssh != NULL && buffer != NULL) {
796-
buffer->idx = 0;
797-
buffer->sz = 0;
798802
if (buffer->data != NULL) {
803+
#ifndef WOLFSSH_NO_SFTP_BUFFER_ZERO
804+
ForceZero(buffer->data, buffer->sz);
805+
#endif
799806
WFREE(buffer->data, ssh->ctx->heap, DYNTYPE_BUFFER);
800807
buffer->data = NULL;
801808
}
809+
buffer->idx = 0;
810+
buffer->sz = 0;
802811
}
803812
}
804813

@@ -1424,6 +1433,9 @@ static void wolfSSH_SFTP_RecvSetSend(WOLFSSH* ssh, byte* buf, int sz)
14241433

14251434
/* free up existing data if needed */
14261435
if (buf != state->buffer.data && state->buffer.data != NULL) {
1436+
#ifndef WOLFSSH_NO_SFTP_BUFFER_ZERO
1437+
ForceZero(state->buffer.data, state->buffer.sz);
1438+
#endif
14271439
WFREE(state->buffer.data, ssh->ctx->heap, DYNTYPE_BUFFER);
14281440
state->buffer.data = NULL;
14291441
}

0 commit comments

Comments
 (0)