test(mosaic): control brain config owner binding
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { afterEach, describe, expect, it } from 'vitest';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
||||
import { tmpdir } from 'node:os';
|
||||
import { join } from 'node:path';
|
||||
@@ -30,6 +30,7 @@ function fixture(): { readonly root: string; readonly directory: string; readonl
|
||||
}
|
||||
|
||||
afterEach((): void => {
|
||||
vi.restoreAllMocks();
|
||||
for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
@@ -41,6 +42,19 @@ describe('security-critical brain configuration reads', (): void => {
|
||||
expect(secure.readBrainConfigSecure(config.file, config.root)).toBe('{"version":1}\n');
|
||||
});
|
||||
|
||||
it('rejects a managed root owned by a UID other than the running principal', async (): Promise<void> => {
|
||||
const secure = await loadSecureConfig();
|
||||
const config = fixture();
|
||||
if (typeof process.getuid !== 'function') throw new Error('test requires POSIX getuid');
|
||||
const processWithUid = process as typeof process & { getuid: () => number };
|
||||
const actualUid = processWithUid.getuid();
|
||||
vi.spyOn(processWithUid, 'getuid').mockReturnValue(actualUid + 1);
|
||||
|
||||
expect(() => secure.readBrainConfigSecure(config.file, config.root)).toThrow(
|
||||
/config-ancestor-owner-unsafe/,
|
||||
);
|
||||
});
|
||||
|
||||
it('rejects a group/world-writable policy file', async (): Promise<void> => {
|
||||
const secure = await loadSecureConfig();
|
||||
const config = fixture();
|
||||
|
||||
Reference in New Issue
Block a user