Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- AlterTable
ALTER TABLE "LiteLLM_ClaudeCodePluginTable" ADD COLUMN IF NOT EXISTS "approval_status" TEXT DEFAULT 'active';
ALTER TABLE "LiteLLM_ClaudeCodePluginTable" ADD COLUMN IF NOT EXISTS "review_notes" TEXT;
ALTER TABLE "LiteLLM_ClaudeCodePluginTable" ADD COLUMN IF NOT EXISTS "reviewed_by" TEXT;
ALTER TABLE "LiteLLM_ClaudeCodePluginTable" ADD COLUMN IF NOT EXISTS "reviewed_at" TIMESTAMP(3);

-- CreateIndex
CREATE INDEX IF NOT EXISTS "LiteLLM_ClaudeCodePluginTable_approval_status_idx" ON "LiteLLM_ClaudeCodePluginTable"("approval_status");
25 changes: 15 additions & 10 deletions litellm-proxy-extras/litellm_proxy_extras/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -1338,17 +1338,22 @@ model LiteLLM_AccessGroupTable {
}
// Claude Code Plugin Marketplace table
model LiteLLM_ClaudeCodePluginTable {
id String @id @default(uuid())
name String @unique
version String?
description String?
manifest_json String?
files_json String? @default("{}")
enabled Boolean @default(true)
created_at DateTime? @default(now())
updated_at DateTime? @default(now()) @updatedAt
created_by String?
id String @id @default(uuid())
name String @unique
version String?
description String?
manifest_json String?
files_json String? @default("{}")
enabled Boolean @default(true)
approval_status String? @default("active")
review_notes String?
reviewed_by String?
reviewed_at DateTime?
created_at DateTime? @default(now())
updated_at DateTime? @default(now()) @updatedAt
created_by String?

@@index([approval_status])
@@map("LiteLLM_ClaudeCodePluginTable")
}

Expand Down
341 changes: 334 additions & 7 deletions litellm/proxy/_lazy_openapi_snapshot.json

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions litellm/proxy/_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,10 @@ class LiteLLMRoutes(enum.Enum):
# Create/update/delete and test_connection stay admin-only.
"/search_tools/list",
"/search_tools/ui/available_providers",
# Self-service skill submission. Approve/reject stay admin-only.
"/claude-code/marketplace.json",
"/claude-code/plugins",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Low: Unbounded persistent skill submissions

An internal user can create an arbitrary number of uniquely named pending skills, while the request fields have no length limits, submissions have no per-owner quota, and the list endpoint has no pagination. An attacker can continuously grow this table and force plugin-list requests to load and serialize all of their records; add bounded field lengths, a per-owner pending-submission limit, and pagination before exposing the create route.

"/claude-code/plugins/{plugin_name}",
]
+ spend_tracking_routes
+ key_management_routes
Expand Down
Loading
Loading