Skip to content

Commit d149f66

Browse files
committed
fix: delete docker-compose.yml after container startup
SECURITY: The docker-compose.yml file contains sensitive environment variables (GITHUB_TOKEN, etc.) and was accessible via the /tmp volume mount. Now deleted immediately after docker compose up succeeds, since Docker only needs the file during startup. - Added fs.unlinkSync call after successful container startup - Added test verifying compose file is deleted - Logs debug message on successful deletion
1 parent 13244a6 commit d149f66

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

src/docker-manager.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,6 +1528,20 @@ describe('docker-manager', () => {
15281528

15291529
await expect(startContainers(testDir, ['github.com'])).rejects.toThrow();
15301530
});
1531+
1532+
it('should delete docker-compose.yml after containers start (security: removes sensitive env vars)', async () => {
1533+
// Create a docker-compose.yml file with sensitive data
1534+
const composeFile = path.join(testDir, 'docker-compose.yml');
1535+
fs.writeFileSync(composeFile, 'environment:\n GITHUB_TOKEN: secret123\n');
1536+
1537+
mockExecaFn.mockResolvedValueOnce({ stdout: '', stderr: '', exitCode: 0 } as any);
1538+
mockExecaFn.mockResolvedValueOnce({ stdout: '', stderr: '', exitCode: 0 } as any);
1539+
1540+
await startContainers(testDir, ['github.com']);
1541+
1542+
// docker-compose.yml should be deleted after containers start
1543+
expect(fs.existsSync(composeFile)).toBe(false);
1544+
});
15311545
});
15321546

15331547
describe('stopContainers', () => {

src/docker-manager.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,20 @@ export async function startContainers(workDir: string, allowedDomains: string[],
932932
stdio: 'inherit',
933933
});
934934
logger.success('Containers started successfully');
935+
936+
// SECURITY: Immediately delete docker-compose.yml after containers start
937+
// This file contains sensitive environment variables (tokens, secrets) that
938+
// would otherwise be readable by the agent via the /tmp mount until cleanup.
939+
// Docker Compose only needs the file at startup, not during execution.
940+
const composeFile = path.join(workDir, 'docker-compose.yml');
941+
try {
942+
if (fs.existsSync(composeFile)) {
943+
fs.unlinkSync(composeFile);
944+
logger.debug('Deleted docker-compose.yml (contained sensitive environment variables)');
945+
}
946+
} catch (err) {
947+
logger.debug('Could not delete docker-compose.yml:', err);
948+
}
935949
} catch (error) {
936950
// Check if this is a healthcheck failure
937951
const errorMsg = error instanceof Error ? error.message : String(error);

0 commit comments

Comments
 (0)