Wint3rmute/redmine-mcp
criticalModel Context Protocol (MCP) Server for Redmine project management system
MCP server (purpose undetermined)
58 this.fetchRedmine = createRedmineClient({
59 baseUrl: config.redmine.url,
60 apiKey: config.redmine.apiKey,
61 timeout: config.redmine.timeout,
62 });// Exploitable if MCP is exposed to untrusted prompts or if an attacker gains access to the server process.
The Redmine API key is read from configuration and passed in plaintext to the Redmine client. The config likely stores the key in an environment variable or file, but it is transmitted and used in memory without encryption. If an attacker gains access to the process memory or logs, they could retrieve the API key.
ImpactAn attacker with access to the server process (e.g., via compromised LLM or network exposure) could extract the Redmine API key, gaining full access to the Redmine instance with the same permissions as the configured user.
FixUse a secrets manager or environment variable with restricted access. Avoid logging the API key. Consider using short-lived tokens or OAuth if supported.
283 const data = await this.fetchRedmine(`/issues/${args.issue_id}.json`);// Exploitable if MCP is exposed to untrusted prompts; limited by Redmine API's own validation.
The issue_id parameter is directly interpolated into the URL path without validation. While the Redmine API may reject invalid IDs, an attacker could inject path traversal sequences (e.g., '../') or special characters to manipulate the API request, potentially accessing unintended endpoints or causing unexpected behavior.
ImpactAn attacker could potentially access other Redmine API endpoints by manipulating the issue_id parameter, leading to information disclosure or unauthorized actions.
FixValidate that issue_id is a positive integer (or matches expected format) before using it in the URL. Use parameterized queries or URL encoding.
694 const data = (await this.fetchRedmine(`/projects/${args.project_id}/memberships.json`, {
695 params,
696 })) as RedmineMembershipsResponse;// Exploitable if MCP is exposed to untrusted prompts; limited by Redmine API's own validation.
The project_id parameter is directly interpolated into the URL path without validation. An attacker could inject path traversal or special characters to access other API endpoints.
ImpactAn attacker could potentially access other Redmine API endpoints by manipulating the project_id parameter, leading to information disclosure or unauthorized actions.
FixValidate that project_id is a positive integer or a known project identifier before using it in the URL.
532 const data = await this.fetchRedmine<{
533 project: { time_entry_activities: Array<{ id: number; name: string }> };
534 }>(`/projects/${args.project_id}.json?include=time_entry_activities`);// Exploitable if MCP is exposed to untrusted prompts; limited by Redmine API's own validation.
The project_id parameter is directly interpolated into the URL path without validation. An attacker could inject path traversal or special characters to access other API endpoints.
ImpactAn attacker could potentially access other Redmine API endpoints by manipulating the project_id parameter, leading to information disclosure or unauthorized actions.
FixValidate that project_id is a positive integer or a known project identifier before using it in the URL.