- Location
- src/app/api/v1/submissions/[id]/route.ts:19
- Finding
- Unauthenticated Endpoint Publicly Exposes Complete Agent Prompts and Configuration<![CDATA[
## Vulnerability Details
**File Location**: `src/app/api/v1/submissions/[id]/route.ts:19-64`
**Vulnerability Type**: Public disclosure of sensitive agent configuration
**Risk Level**: High
### Vulnerable Code
```ts
const submission = await prisma.submission.findUnique({
where: { id },
include: {
votes: {
select: { voteType: true },
},
},
});
if (!submission) {
return NextResponse.json(
{ error: "Submission not found" },
{ status: 404 }
);
}
const data = {
id: submission.id,
openclawInstanceId: submission.openclawInstanceId,
openclawName: submission.openclawName,
description: submission.description,
amountCents: submission.amountCents,
currency: submission.currency,
proofType: submission.proofType,
proofUrl: submission.proofUrl,
proofDescription: submission.proofDescription,
transactionHash: submission.transactionHash,
verificationMethod: submission.verificationMethod,
status: submission.status,
systemPrompt: submission.systemPrompt,
modelId: submission.modelId,
modelProvider: submission.modelProvider,
tools: submission.tools,
modelConfig: submission.modelConfig,
configNotes: submission.configNotes,
createdAt: submission.createdAt.toISOString(),
updatedAt: submission.updatedAt.toISOString(),
legitVotes: submission.votes.filter((v) => v.voteType === "LEGIT").length,
suspiciousVotes: submission.votes.filter(
(v) => v.voteType === "SUSPICIOUS"
).length,
};
return NextResponse.json({ data });
```
The corresponding storage path accepts these values without field-level confidentiality controls:
```ts
const { tools, modelConfig, ...rest } = parsed.data;
const submission = await prisma.submission.create({
data: {
...rest,
submitterIpHash: ipHash,
...(agentId && { agentId }),
...(tools && { tools: tools as unknown as import("@prisma/client").Prisma.InputJsonValue }),
...(modelConfig && { modelConfig: modelConfig as unknown as import("@prisma/client").P
...[truncated 1778 chars]
- Remediation
- <![CDATA[
## Remediation Suggestions
- Define an explicit allowlist of fields safe for unauthenticated responses.
- Keep `systemPrompt`, `tools`, `modelConfig`, `configNotes`, and sensitive proof material private by default.
- Require explicit, informed, field-level consent before publication.
- Provide separate public and owner-only API response models.
- Apply authentication and ownership checks to private submission details.
- Scan prompt, configuration, and notes fields for credentials, tokens, private keys, and sensitive URLs before storage or publication.
- Redact detected secrets and reject submissions that contain high-confidence credentials.
- Allow submitters to edit, unpublish, and delete sensitive configuration.
]]>