Skip to content

Commit

Permalink
private key coredump protection for Linux/FreeBSD
Browse files Browse the repository at this point in the history
platforms not supporting coredump exclusion using mmap/madvise flags
fall back to plain old malloc(3).
  • Loading branch information
djmdjm committed Aug 20, 2024
1 parent cc048ca commit d922762
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions sshkey.c
Original file line number Diff line number Diff line change
Expand Up @@ -746,9 +746,23 @@ sshkey_prekey_alloc(u_char **prekeyp, size_t len)
u_char *prekey;

*prekeyp = NULL;
#if defined(MAP_CONCEAL)
if ((prekey = mmap(NULL, SSHKEY_SHIELD_PREKEY_LEN, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE|MAP_CONCEAL, -1, 0)) == MAP_FAILED)
return SSH_ERR_SYSTEM_ERROR;
#elif defined(MAP_NOCORE)
if ((prekey = mmap(NULL, SSHKEY_SHIELD_PREKEY_LEN, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE|MAP_NOCORE, -1, 0)) == MAP_FAILED)
return SSH_ERR_SYSTEM_ERROR;
#elif defined(MADV_DONTDUMP)
if ((prekey = mmap(NULL, SSHKEY_SHIELD_PREKEY_LEN, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return SSH_ERR_SYSTEM_ERROR;
(void)madvise(prekey, len, MADV_DONTDUMP);
#else
if ((prekey = calloc(1, len)) == NULL)
return SSH_ERR_ALLOC_FAIL;
#endif
*prekeyp = prekey;
return 0;
}
Expand All @@ -758,7 +772,11 @@ sshkey_prekey_free(void *prekey, size_t len)
{
if (prekey == NULL)
return;
#if defined(MAP_CONCEAL) || defined(MAP_NOCORE) || defined(MADV_DONTDUMP)
munmap(prekey, len);
#else
freezero(prekey, len);
#endif
}

static void
Expand Down

0 comments on commit d922762

Please sign in to comment.