Skip to content

Commit

Permalink
tpm2: add some extra validation of device string before using it
Browse files Browse the repository at this point in the history
Let's add some extra validation before constructing and using the .so
name to load. This isn't really security sensitive, given that we
used secure_getenv() to get the device string (and it thus should have
been come from a trusted source) but let's better be safe than sorry.

(cherry picked from commit 50a0851)
  • Loading branch information
poettering authored and bluca committed Nov 22, 2022
1 parent b322808 commit 542dbc6
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions src/shared/tpm2-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,15 +174,27 @@ int tpm2_context_init(const char *device, struct tpm2_context *ret) {

param = strchr(device, ':');
if (param) {
/* Syntax #1: Pair of driver string and arbitrary parameter */
driver = strndupa_safe(device, param - device);
if (isempty(driver))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "TPM2 driver name is empty, refusing.");

param++;
} else {
} else if (path_is_absolute(device) && path_is_valid(device)) {
/* Syntax #2: TPM device node */
driver = "device";
param = device;
}
} else
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid TPM2 driver string, refusing.");

log_debug("Using TPM2 TCTI driver '%s' with device '%s'.", driver, param);

fn = strjoina("libtss2-tcti-", driver, ".so.0");

/* Better safe than sorry, let's refuse strings that cannot possibly be valid driver early, before going to disk. */
if (!filename_is_valid(fn))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "TPM2 driver name '%s' not valid, refusing.", driver);

dl = dlopen(fn, RTLD_NOW);
if (!dl)
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Failed to load %s: %s", fn, dlerror());
Expand Down

0 comments on commit 542dbc6

Please sign in to comment.