Skip to content

Commit ae214ce

Browse files
SNOW-2316658: fixed session token leakage (#930)
Co-authored-by: Harry Xi <[email protected]>
1 parent b3dfbb8 commit ae214ce

File tree

7 files changed

+65
-3
lines changed

7 files changed

+65
-3
lines changed

cpp/logger/SFLogger.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ void log_masked_va_list(FILE* fp, const char *fmt, va_list args)
2020
sf_fprintf(fp, "%s", maskedMsg.c_str());
2121
}
2222

23+
void terminal_mask(char *in_data, size_t datasize, char *out_masked, size_t masked_bufsize){
24+
if(in_data == NULL || in_data[0] == '\0' || datasize == 0 || out_masked == NULL || masked_bufsize == 0){
25+
log_error("Error in masking text on terminal; check values of parameters passed in\n");
26+
return;
27+
}
28+
std::string text(in_data, datasize);
29+
std::string maskedMsg = Snowflake::Client::SecretDetector::maskSecrets(text);
30+
size_t copysize = (std::min)(masked_bufsize - 1, maskedMsg.length());
31+
sf_strncpy(out_masked, masked_bufsize, maskedMsg.c_str(), copysize);
32+
out_masked[copysize] = '\0';
33+
}
34+
2335
std::string Snowflake::Client::SFLogger::getMaskedMsg(const char* fmt, ...)
2436
{
2537
va_list args;

cpp/logger/SecretDetector.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Client
2020

2121
boost::regex SecretDetector::ENCRYPTION_CREDS_IN_JSON_PATTERN = boost::regex("\"(encryptionMaterial|creds)\"\\s*:\\s*\\{.*?\\}", boost::regex::icase);
2222

23-
boost::regex SecretDetector::TOKEN_IN_JSON_PATTERN = boost::regex("\"(mastertoken|token)\":(\\t|\\s+)\"[a-zA-Z0-9=/_+-:]+\"", boost::regex::icase);
23+
boost::regex SecretDetector::TOKEN_IN_JSON_PATTERN = boost::regex("\"?(mastertoken|token|Snowflake Token|oldSessionToken|sessionToken)\"?(\\s*)?(:|=)(\\.*)?(\\t|\\s+)?\"[a-zA-Z0-9=/_+-:]+\"", boost::regex::icase);
2424

2525
std::string SecretDetector::maskAwsKeys(std::string text)
2626
{

include/snowflake/logger.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ void log_set_path(const char* path);
9898

9999
void log_close();
100100

101+
void terminal_mask(char *data, size_t size, char* masked, size_t masked_bufsize);
102+
101103
#if defined(__cplusplus)
102104
}
103105
#endif

lib/connection.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,8 @@ json_copy_string(char **dest, cJSON *data, const char *item) {
687687
}
688688
sf_strncpy(*dest, blob_size, blob->valuestring, blob_size);
689689

690-
if (strcmp(item, "token") == 0 || strcmp(item, "masterToken") == 0) {
690+
if (strstr(item, "token") || strstr(item, "Token") || strstr(item, "TOKEN") ||
691+
strstr(item, "key") || strstr(item, "Key") || strstr(item, "KEY")) {
691692
log_debug("Item and Value; %s: ******", item);
692693
} else {
693694
log_debug("Item and Value; %s: %s", item, *dest);

lib/http_perform.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ int my_trace(CURL *handle, curl_infotype type,
9696
const char *text;
9797
(void) handle; /* prevent compiler warning */
9898

99+
char masked[5000] = {'\0'};
100+
99101
switch (type) {
100102
case CURLINFO_TEXT:
101103
sf_fprintf(stderr, "== Info: %s", data);
@@ -123,7 +125,8 @@ int my_trace(CURL *handle, curl_infotype type,
123125
break;
124126
}
125127

126-
dump(text, stderr, (unsigned char *) data, size, config->trace_ascii);
128+
terminal_mask(data, size, masked, sizeof(masked));
129+
dump(text, stderr, (unsigned char *) masked, strlen(masked), config->trace_ascii);
127130
return 0;
128131
}
129132

tests/test_unit_connect_parameters.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,13 @@ void test_connect_with_renew(void** unused) {
235235

236236
// renew session
237237
CURL* curl = curl_easy_init();
238+
sf_bool debug = SF_BOOLEAN_TRUE;
239+
// turn on DEBUG mode to test with debug mode logging as well
240+
snowflake_global_set_attribute(SF_GLOBAL_DEBUG, &debug);
238241
sf_bool renew_result = renew_session(curl, sf, &sf->error);
239242
curl_easy_cleanup(curl);
243+
debug = SF_BOOLEAN_FALSE;
244+
snowflake_global_set_attribute(SF_GLOBAL_DEBUG, &debug);
240245
if (!renew_result)
241246
{
242247
dump_error(&sf->error);

tests/test_unit_logger.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,35 @@ void test_client_config_stdout() {
412412
remove(configFilePath);
413413
}
414414

415+
/* Test terminal masking*/
416+
void test_terminal_mask() {
417+
418+
char masked[450] = "\0";
419+
char *token = "\"oldSessionToken\":.\"ver:3-hint:92019686956010-ETMsDgAAAZnuCZEqABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwEAABAAEFvTRpZh3vTIN0aeQGHgtZUAAACgEe4rGMIhP+9VB6W02vfgNxd7TzjF7V9CFNiobWsPKfRaVm0e+Pgan+NKiWqJGeYPY0kNDKc+iZZArOgYb3bj0JaU2ovmSRTzEKF4/oQdunFrob66HU+x5piBINNQ327tcSglCOBKxAmjHwQxv+C3t7Yzsaa1I10VUA3fRwGcMlluuCC/7ucFnLUeSESYzImlmWBtftQS/giLDli9CyghpgAUblZOu/WGGryesNxqKCr2qHxYUrQ=\"";
420+
terminal_mask(token, strlen(token), masked, sizeof(masked));
421+
assert_string_not_equal(token, masked);
422+
423+
char *expected = "\"oldSessionToken\": ****";
424+
assert_string_equal(masked, expected);
425+
426+
char *token1 = "Snowflake Token=\"ver:3-hint:92019686956010-ETMsDgAAAZnuCZDdABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwEAABAAEE8nWQwJCW8y71MmS0MTiQAAADAKKvKBOXVEWiCRMEHtrZlROAljOWTb1wDD6rIgPC8odgqH9ieZZuxfm5GmPkP2DasqFfBMDxk0sw1ZWqE2c7Sos+tUSh09EKraNoANaMSMsL71u7JKMtSIPJ907FVM0xeDw924bYTY1+D3gKvVn93nzdAZto8pOPVs9ag0MlmFrQQH0RLuLAMgAx4ZBkyeoeuTco0A3PNoedb/kvIpfIQWtukVDuXJmCetZQxATxXVuu3cXisGg7I8Mu/VJqd/iABScY0nslPWxaodfF0nwZ4fquJWUaQ==\"";
427+
masked[0] = '\0';
428+
terminal_mask(token1, strlen(token1), masked, sizeof(masked));
429+
expected = "\"Snowflake Token\": ****";
430+
assert_string_equal(masked, expected);
431+
432+
char *token2 = "this text is not meant to be masked";
433+
masked[0] = '\0';
434+
terminal_mask(token2, strlen(token2), masked, sizeof(masked));
435+
assert_string_equal(token2, masked);
436+
437+
char *token3 = "";
438+
masked[0] = '\0';
439+
terminal_mask(token3, strlen(token3), masked, sizeof(masked));
440+
expected = "";
441+
assert_string_equal(masked, expected);
442+
}
443+
415444
void test_log_creation() {
416445
char logname[] = "dummy.log";
417446

@@ -484,6 +513,7 @@ void test_log_creation_no_permission_to_home_folder(){
484513
setenv("HOME", homedirOrig, 1);
485514
}
486515

516+
487517
/**
488518
* Tests masking secret information in log
489519
*/
@@ -580,6 +610,14 @@ void test_mask_secret_log() {
580610
"\"masterToken\":\t\"ETM:sDgAAA-XI0IS9NABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAEEb/xAQlmT+mwIx9G32E+ikAAACA/CPlEkq//+jWZnQkOj5VhjayruDsCVRGS/B6GzHUugXLc94EfEwuto94gS/oKSVrUg/JRPekypLAx4Afa1KW8n1RqXRF9Hzy1VVLmVEBMtei3yFJPNSHtfbeFHSr9eVB/OL8dOGbxQluGCh6XmaqTjyrh3fqUTWz7+n74+gu2ugAFFZ18iT+DStK0TTdmy4vBC6xUcHQ==\"",
581611
"\"masterToken\": ****"
582612
},
613+
{//21
614+
"\"Snowflake Token\"=\"ver:3-hint:92019686956010-ETMsDgAAAZnuCZDdABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwEAABAAEE8nWQwJCW8+y71MmS0MTiQAAADAKKvKBOXVEWiCRMEHtrZlROAljOWTb1wDD6rIgPC8odgqH9ieZZuxfm5GmPkP2DasqFfBMDxk0sw1ZWqE2c7Sos+tUSh09EKraNoANaMSMsL71u7JKMtSIPJ907FVM0xeDw924bYTY1+D3gKvVn93nzdAZto8pOPVs9ag0Mlm+FrQQH0RLuLAMgAx4ZBkyeoeuTco0A3PNoedb/HkvIpfIQWtukVDuXJmCetZQxATxXVuu3cXisGg7I8Mu/VJqd/iABScY0nslPWxaodfF0nwZ4fquJWUaQ==\"",
615+
"\"Snowflake Token\": ****"
616+
},
617+
{//22
618+
"\"oldSessionToken\":.\"ver:3-hint:92019686956010-ETMsDgAAAZnuCZEqABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwEAABAAEFvTRpZh3vTIN0aeQGHgtZUAAACgEe4rGMIhP+9VB6W02vfgNxd7TzjF7V9CFNiobWsPKfRaVm0e+Pgan+NKiWqJGeYPY0kNDKc+iZZArOgYb3bj0JaU2ovmSRTzEKF4/oQdunFrob66HU+x5piBINNQ327tcSglCOBKxAmjHwQxv+C3t7Yzsaa1I10VUA3fRwGcMlluuCC/7ucFnLUeSESYzImlmWBtftQS/giLDli9CyghpgAUblZOu/WGGryesNxqKCr2qHxYUrQ=\"",
619+
"\"masterToken\": ****"
620+
},
583621
};
584622

585623
char * line = NULL;
@@ -618,6 +656,7 @@ int main(void) {
618656
cmocka_unit_test(test_client_config_log_no_level),
619657
cmocka_unit_test(test_client_config_log_no_path),
620658
cmocka_unit_test(test_client_config_stdout),
659+
cmocka_unit_test(test_terminal_mask),
621660
#endif
622661
cmocka_unit_test(test_log_creation),
623662
#ifndef _WIN32

0 commit comments

Comments
 (0)