[strongSwan-dev] Memwipe of loaded secrets through VICI

Jean-Francois HREN jean-francois.hren at stormshield.eu
Thu Sep 30 10:40:28 CEST 2021


Hello, 

I went through the code loading secrets (either private keys or PSKs) using VICI in swanctl and found several places where they were not memwipe. 
I added necessary calls to memwipe and tested it : 
---------------------------------------------------------------------------------------------------------------------------- 
diff --git a/src/libcharon/plugins/vici/vici_message.c b/src/libcharon/plugins/vici/vici_message.c 
index df5b85c64..5ce37c91a 100644 
--- a/src/libcharon/plugins/vici/vici_message.c 
+++ b/src/libcharon/plugins/vici/vici_message.c 
@@ -644,6 +644,17 @@ METHOD(vici_message_t, dump, bool, 
return FALSE; 
} 

+CALLBACK(clear_strings, void, 
+ void *ptr) 
+{ 
+ char *str; 
+ 
+ str = (char*)ptr; 
+ 
+ memwipe(str, strlen(str)); 
+ free(str); 
+} 
+ 
METHOD(vici_message_t, destroy, void, 
private_vici_message_t *this) 
{ 
@@ -651,7 +662,11 @@ METHOD(vici_message_t, destroy, void, 
{ 
chunk_clear(&this->encoding); 
} 
- this->strings->destroy_function(this->strings, free); 
+ else 
+ { 
+ memwipe(this->encoding.ptr, this->encoding.len); 
+ } 
+ this->strings->destroy_function(this->strings, clear_strings); 
free(this); 
} 

diff --git a/src/libstrongswan/credentials/keys/shared_key.c b/src/libstrongswan/credentials/keys/shared_key.c 
index 97209953a..039398cd2 100644 
--- a/src/libstrongswan/credentials/keys/shared_key.c 
+++ b/src/libstrongswan/credentials/keys/shared_key.c 
@@ -77,7 +77,7 @@ METHOD(shared_key_t, destroy, void, 
{ 
if (ref_put(&this->ref)) 
{ 
- free(this->key.ptr); 
+ chunk_clear(&this->key); 
free(this); 
} 
} 
diff --git a/src/libstrongswan/plugins/pem/pem_builder.c b/src/libstrongswan/plugins/pem/pem_builder.c 
index 3b84eb7ea..9ca96a4d2 100644 
--- a/src/libstrongswan/plugins/pem/pem_builder.c 
+++ b/src/libstrongswan/plugins/pem/pem_builder.c 
@@ -147,7 +147,7 @@ static status_t pem_decrypt(chunk_t *blob, encryption_algorithm_t alg, 
} 
crypter->destroy(crypter); 
memcpy(blob->ptr, decrypted.ptr, blob->len); 
- chunk_free(&decrypted); 
+ chunk_clear(&decrypted); 

/* determine amount of padding */ 
last_padding_pos = blob->ptr + blob->len - 1; 
@@ -354,7 +354,7 @@ static status_t pem_to_bin(chunk_t *blob, bool *pgp) 
memcpy(blob->ptr, chunk.ptr, chunk.len); 
blob->len = chunk.len; 
} 
- free(chunk.ptr); 
+ chunk_clear(&chunk); 
if (status != INVALID_ARG) 
{ /* try again only if passphrase invalid */ 
break; 
diff --git a/src/libstrongswan/utils/chunk.c b/src/libstrongswan/utils/chunk.c 
index ac19fafb4..5ab25ee42 100644 
--- a/src/libstrongswan/utils/chunk.c 
+++ b/src/libstrongswan/utils/chunk.c 
@@ -445,6 +445,20 @@ bool chunk_unmap(chunk_t *public) 
return ret; 
} 

+/** 
+ * See header. 
+ */ 
+bool chunk_unmap_clear(chunk_t *public) 
+{ 
+ mmaped_chunk_t *chunk; 
+ 
+ chunk = (mmaped_chunk_t*)public; 
+ if (!chunk->wr && chunk->map != MAP_FAILED) 
+ memwipe(chunk->map, chunk->len); 
+ 
+ return chunk_unmap(public); 
+} 
+ 
/** hex conversion digits */ 
static char hexdig_upper[] = "0123456789ABCDEF"; 
static char hexdig_lower[] = "0123456789abcdef"; 
diff --git a/src/libstrongswan/utils/chunk.h b/src/libstrongswan/utils/chunk.h 
index a5eb5ed3b..94045479c 100644 
--- a/src/libstrongswan/utils/chunk.h 
+++ b/src/libstrongswan/utils/chunk.h 
@@ -139,6 +139,18 @@ chunk_t *chunk_map(char *path, bool wr); 
*/ 
bool chunk_unmap(chunk_t *chunk); 

+/** 
+ * munmap() a chunk previously mapped with chunk_map() after clearing it (only 
+ * if not a writeable map) 
+ * 
+ * When unmapping a writeable map, the return value should be checked to 
+ * ensure changes landed on disk. 
+ * 
+ * @param chunk pointer returned from chunk_map() 
+ * @return TRUE of changes written back to file 
+ */ 
+bool chunk_unmap_clear(chunk_t *chunk); 
+ 
/** 
* Convert a chunk of data to hex encoding. 
* 
diff --git a/src/swanctl/commands/load_creds.c b/src/swanctl/commands/load_creds.c 
index 2c1947dd1..c6c24d233 100644 
--- a/src/swanctl/commands/load_creds.c 
+++ b/src/swanctl/commands/load_creds.c 
@@ -445,7 +445,7 @@ static void load_keys(load_ctx_t *ctx, char *type, char *dir) 
{ 
load_key(ctx, path, type, *map); 
} 
- chunk_unmap(map); 
+ chunk_unmap_clear(map); 
} 
else 
{ 
@@ -552,7 +552,7 @@ static void load_containers(load_ctx_t *ctx, char *type, char *dir) 
if (map) 
{ 
load_encrypted_container(ctx, rel, path, type, *map); 
- chunk_unmap(map); 
+ chunk_unmap_clear(map); 
} 
else 
{ 
---------------------------------------------------------------------------------------------------------------------------- 

Jean-François HREN 
Developper - Network Security R&D 
[ http://www.stormshield.eu/ ] 
	STORMSHIELD 
2/6 Parc de l'Horizon 
59650 Villeneuve d'Ascq - FRANCE 
Mobile : +33 (0)6 23 08 80 81 
[ https://twitter.com/Stormshield | Twitter ] . [ https://www.linkedin.com/company/22425?trk=cws-btn-overview-0-0 | LinkedIn ] . [ http://www.stormshield.eu/ | www.stormshield.eu ] 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.strongswan.org/pipermail/dev/attachments/20210930/5fec14d2/attachment.html>


More information about the Dev mailing list