diff --git a/lib/config/defaults.spec.ts b/lib/config/defaults.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f71d89c812fa947f5fffc8f6a3d17b0a304ac4ec
--- /dev/null
+++ b/lib/config/defaults.spec.ts
@@ -0,0 +1,44 @@
+import { getDefault } from './defaults';
+import type { RenovateOptions } from './types';
+
+describe('config/defaults', () => {
+  describe('getDefault()', () => {
+    it('returns new instances of arrays when called repeatedly', () => {
+      const option: RenovateOptions = {
+        type: 'array',
+        description: 'thing',
+        name: 'thing',
+      };
+      const array1 = getDefault(option);
+      const array2 = getDefault(option);
+
+      // Equal values, different objects
+      expect(array2).toEqual(array2);
+      expect(array1).not.toBe(array2);
+    });
+
+    it('returns true for boolean values', () => {
+      const option: RenovateOptions = {
+        type: 'boolean',
+        description: 'thing',
+        name: 'thing',
+      };
+      const val = getDefault(option);
+
+      expect(val).toBe(true);
+    });
+
+    ['string', 'object', 'integer'].forEach((type: string) => {
+      it(`returns null for ${type} values`, () => {
+        const option: RenovateOptions = {
+          type: type as 'string' | 'object' | 'integer',
+          description: 'thing',
+          name: 'thing',
+        };
+        const val = getDefault(option);
+
+        expect(val).toBeNull();
+      });
+    });
+  });
+});
diff --git a/lib/config/defaults.ts b/lib/config/defaults.ts
index b4e4b7241c697e774ba49daca94dc19b804df760..43c18286bffb4688536fd4a4617da00661a78e44 100644
--- a/lib/config/defaults.ts
+++ b/lib/config/defaults.ts
@@ -1,17 +1,21 @@
 import { getOptions } from './options';
 import type { AllConfig, RenovateOptions } from './types';
 
-const defaultValues = {
-  boolean: true,
-  array: [],
-  string: null,
-  object: null,
-  integer: null,
+// Use functions instead of direct values to avoid introducing global references.
+// In particular, we want a new array instance every time we request a default array
+// instead of sharing a single instance - mutation of this value could cause serious problems.
+// See https://github.com/mend/renovate-on-prem/issues/290 for an example
+const defaultValueFactories = {
+  boolean: () => true,
+  array: () => [],
+  string: () => null,
+  object: () => null,
+  integer: () => null,
 } as const;
 
 export function getDefault(option: RenovateOptions): any {
   return option.default === undefined
-    ? defaultValues[option.type]
+    ? defaultValueFactories[option.type]()
     : option.default;
 }