From 39b23d64fe5e194ee36e05314b485455dbca4776 Mon Sep 17 00:00:00 2001
From: Michael Kriese <michael.kriese@visualon.de>
Date: Tue, 3 Jan 2023 13:29:07 +0100
Subject: [PATCH] feat: better sanitize (#19646)

---
 lib/config/secrets.ts                    | 2 +-
 lib/modules/datasource/docker/index.ts   | 5 +++++
 lib/modules/datasource/go/index.ts       | 5 ++---
 lib/modules/manager/bundler/artifacts.ts | 3 ---
 lib/workers/global/index.spec.ts         | 8 ++++++++
 lib/workers/global/index.ts              | 8 ++++++++
 6 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/lib/config/secrets.ts b/lib/config/secrets.ts
index 9e3037f9d9..3198a99b32 100644
--- a/lib/config/secrets.ts
+++ b/lib/config/secrets.ts
@@ -124,7 +124,7 @@ export function applySecretsToConfig(
   // Add all secrets to be sanitized
   if (is.plainObject(secrets)) {
     for (const secret of Object.values(secrets)) {
-      addSecretForSanitizing(String(secret));
+      addSecretForSanitizing(secret);
     }
   }
   // TODO: fix types (#9610)
diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts
index 624646ce1a..49c98a3802 100644
--- a/lib/modules/datasource/docker/index.ts
+++ b/lib/modules/datasource/docker/index.ts
@@ -21,6 +21,7 @@ import type {
 } from '../../../util/http/types';
 import { hasKey } from '../../../util/object';
 import { regEx } from '../../../util/regex';
+import { addSecretForSanitizing } from '../../../util/sanitize';
 import {
   ensurePathPrefix,
   ensureTrailingSlash,
@@ -181,6 +182,8 @@ export async function getAuthHeaders(
       logger.warn('Failed to obtain docker registry token');
       return null;
     }
+    // sanitize token
+    addSecretForSanitizing(token);
     return {
       authorization: `Bearer ${token}`,
     };
@@ -247,6 +250,8 @@ async function getECRAuthToken(
     const data = await ecr.getAuthorizationToken({});
     const authorizationToken = data?.authorizationData?.[0]?.authorizationToken;
     if (authorizationToken) {
+      // sanitize token
+      addSecretForSanitizing(authorizationToken);
       return authorizationToken;
     }
     logger.warn(
diff --git a/lib/modules/datasource/go/index.ts b/lib/modules/datasource/go/index.ts
index 007b886af2..8bd8f4629a 100644
--- a/lib/modules/datasource/go/index.ts
+++ b/lib/modules/datasource/go/index.ts
@@ -92,10 +92,9 @@ export class GoDatasource extends Datasource {
 // istanbul ignore if
 if (is.string(process.env.GOPROXY)) {
   const uri = parseUrl(process.env.GOPROXY);
-  if (uri?.username) {
-    addSecretForSanitizing(uri.username, 'global');
-  }
   if (uri?.password) {
     addSecretForSanitizing(uri.password, 'global');
+  } else if (uri?.username) {
+    addSecretForSanitizing(uri.username, 'global');
   }
 }
diff --git a/lib/modules/manager/bundler/artifacts.ts b/lib/modules/manager/bundler/artifacts.ts
index 317cc4e4b1..25055a1782 100644
--- a/lib/modules/manager/bundler/artifacts.ts
+++ b/lib/modules/manager/bundler/artifacts.ts
@@ -17,7 +17,6 @@ import {
 } from '../../../util/fs';
 import { getRepoStatus } from '../../../util/git';
 import { newlineRegex, regEx } from '../../../util/regex';
-import { addSecretForSanitizing } from '../../../util/sanitize';
 import { isValid } from '../../versioning/ruby';
 import type {
   UpdateArtifact,
@@ -146,8 +145,6 @@ export async function updateArtifacts(
           // TODO: fix me, hostrules can missing all auth
           const creds = getAuthenticationHeaderValue(hostRule);
           authCommands.push(`${hostRule.resolvedHost} ${creds}`);
-          // sanitize the authentication
-          addSecretForSanitizing(creds);
         }
         return authCommands;
       },
diff --git a/lib/workers/global/index.spec.ts b/lib/workers/global/index.spec.ts
index 73e072a1f8..f4b25e25ee 100644
--- a/lib/workers/global/index.spec.ts
+++ b/lib/workers/global/index.spec.ts
@@ -6,6 +6,7 @@ import * as _presets from '../../config/presets';
 import { CONFIG_PRESETS_INVALID } from '../../constants/error-messages';
 import { DockerDatasource } from '../../modules/datasource/docker';
 import * as _platform from '../../modules/platform';
+import * as secrets from '../../util/sanitize';
 import * as _repositoryWorker from '../repository';
 import * as _configParser from './config/parse';
 import * as _limits from './limits';
@@ -25,12 +26,16 @@ const platform: jest.Mocked<typeof _platform> = _platform as never;
 const presets = mocked(_presets);
 const limits = _limits;
 
+const addSecretForSanitizing = jest.spyOn(secrets, 'addSecretForSanitizing');
+
 describe('workers/global/index', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     logger.getProblems.mockImplementationOnce(() => []);
     configParser.parseConfigs = jest.fn();
     platform.initPlatform.mockImplementation((input) => Promise.resolve(input));
+    delete process.env.AWS_SECRET_ACCESS_KEY;
+    delete process.env.AWS_SESSION_TOKEN;
   });
 
   it('handles config warnings and errors', async () => {
@@ -39,7 +44,10 @@ describe('workers/global/index', () => {
       maintainYarnLock: true,
       foo: 1,
     });
+    process.env.AWS_SECRET_ACCESS_KEY = 'key';
+    process.env.AWS_SESSION_TOKEN = 'token';
     await expect(globalWorker.start()).resolves.toBe(0);
+    expect(addSecretForSanitizing).toHaveBeenCalledTimes(2);
   });
 
   it('resolves global presets immediately', async () => {
diff --git a/lib/workers/global/index.ts b/lib/workers/global/index.ts
index e6793e63a1..d601e357c3 100644
--- a/lib/workers/global/index.ts
+++ b/lib/workers/global/index.ts
@@ -20,6 +20,7 @@ import { getProblems, logger, setMeta } from '../../logger';
 import * as hostRules from '../../util/host-rules';
 import * as queue from '../../util/http/queue';
 import * as throttle from '../../util/http/throttle';
+import { addSecretForSanitizing } from '../../util/sanitize';
 import * as repositoryWorker from '../repository';
 import { autodiscoverRepositories } from './autodiscover';
 import { parseConfigs } from './config/parse';
@@ -109,6 +110,13 @@ export async function resolveGlobalExtends(
 export async function start(): Promise<number> {
   let config: AllConfig;
   try {
+    if (is.nonEmptyStringAndNotWhitespace(process.env.AWS_SECRET_ACCESS_KEY)) {
+      addSecretForSanitizing(process.env.AWS_SECRET_ACCESS_KEY, 'global');
+    }
+    if (is.nonEmptyStringAndNotWhitespace(process.env.AWS_SESSION_TOKEN)) {
+      addSecretForSanitizing(process.env.AWS_SESSION_TOKEN, 'global');
+    }
+
     await instrument('config', async () => {
       // read global config from file, env and cli args
       config = await getGlobalConfig();
-- 
GitLab