system_command: redact secrets in stdout/stderr

We already redact secrets when printing the command-line invocation
itself. Make sure that stdout/stderr doesn't leak secrets either.
This commit is contained in:
Caleb Xu 2021-11-10 08:59:53 -05:00
parent df2ded4e96
commit 227b8148eb
No known key found for this signature in database
GPG Key ID: 2F67B6BC86DC4F00
2 changed files with 26 additions and 2 deletions

View File

@ -53,10 +53,10 @@ class SystemCommand
each_output_line do |type, line|
case type
when :stdout
$stdout << line if print_stdout?
$stdout << redact_secrets(line, @secrets) if print_stdout?
@output << [:stdout, line]
when :stderr
$stderr << line if print_stderr?
$stderr << redact_secrets(line, @secrets) if print_stderr?
@output << [:stderr, line]
end
end

View File

@ -282,6 +282,30 @@ describe SystemCommand do
end
end
context "when running a process that prints secrets" do
it "does not leak the secrets" do
redacted_msg = /#{Regexp.escape("username:******")}/
expect {
described_class.run! "echo",
args: %w[username:hunter2],
verbose: true,
print_stdout: true,
secrets: %w[hunter2]
}.to output(redacted_msg).to_stdout
end
it "does not leak the secrets set by environment" do
redacted_msg = /#{Regexp.escape("username:******")}/
expect {
ENV["PASSWORD"] = "hunter2"
described_class.run! "echo",
args: %w[username:hunter2],
print_stdout: true,
verbose: true
}.to output(redacted_msg).to_stdout
end
end
context "when a `SIGINT` handler is set in the parent process" do
it "is not interrupted" do
start_time = Time.now