Versioned security assessment

Report ID: SA-FDC80E2F

7/9/2026, 11:53:46 PM

openserv-ideaboard-api security assessment v1

Skill Security Certification Report

Audit History
Audit model: codex Historical report
Skill name
openserv-ideaboard-api
Version
v1
Maintainer
internet-court
Coverage
8 Files scanned · 1,541 Lines analyzed
Policy version
Unavailable

Highest confirmed finding severity

High

15 confirmed security findings require attention.

Installation context

Historical evidence

This report may not describe the currently installable artifact. Open the current Skill page for install guidance.

Open current Skill page

This report does not block or authorize the manifest or ZIP.

Most command, filesystem, and reconnaissance findings are false positives caused by Markdown backticks, TypeScript template literals, placeholders, and API path documentation. Real risk remains from outbound OpenServ API calls, environment-based credential handling, and get-api-key.ts printing live API and wallet secrets. No prompt injection language was found in the reviewed files.

Report position

Historical report

Open audit history before using this report to install.

Audit attestation

Not attestable

The required immutable binding is incomplete.

Human verification

Not verified

No human verification is recorded for this report.

Coverage

8 Files scanned · 1,541 Lines analyzed

72 items shown for review

Limitations

This report does not claim runtime or sandbox execution and does not prove the absence of side effects.

Evidence chain

Follow the evidence from source binding to the install contract. Available evidence supports verification; it is not a safety guarantee.

  1. Source

    Binding unavailable

  2. Artifact

    Identity incomplete

  3. Audit

    Complete

  4. Install contract

    Open manifest to verify

    Open manifest

Capabilities observed

Observed means this report recorded supporting evidence. Not recorded does not prove that a capability is absent.

Contains scripts

May execute code included with the Skill.

Not recorded by this audit

Network access

May connect to external services.

Observed in 48 evidence locations

Filesystem access

May read or write local files.

Observed in 1 evidence location

Env variables

May read values from the process environment.

Observed in 32 evidence locations

External commands

May invoke commands or programs outside the Skill.

Observed in 50 evidence locations

Capability review items (57)
High
Generic API/secret keys
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
console.log(`OPENSERV_API_KEY=${data.apiKey}`);
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
console.log(`WALLET_PRIVATE_KEY=${privateKey}`);
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
const API_KEY = process.env.OPENSERV_API_KEY;
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
"x-openserv-key": API_KEY,
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
const API_KEY = process.env.OPENSERV_API_KEY;
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
"x-openserv-key": API_KEY,
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
High
Generic API/secret keys
headers: { 'x-openserv-key': process.env.OPENSERV_API_KEY },
The code or runnable documentation handles OPENSERV_API_KEY or WALLET_PRIVATE_KEY. This is legitimate, but live credentials can be exposed or misused if mishandled.
Low
HTTP client library
import axios from "axios";
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: "https://api.launch.openserv.ai",
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
dotenv library
import "dotenv/config";
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
HTTP client library
import axios from "axios";
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: "https://api.launch.openserv.ai",
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Environment variable access (dot notation)
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable access (dot notation)
if (!process.env.WALLET_PRIVATE_KEY) {
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
if (!process.env.WALLET_PRIVATE_KEY) {
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
dotenv library
import "dotenv/config";
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
HTTP client library
import axios from "axios";
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: "https://api.launch.openserv.ai",
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Environment variable access (dot notation)
const API_KEY = process.env.OPENSERV_API_KEY;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable access (dot notation)
const ideaId = process.env.IDEA_ID;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
const API_KEY = process.env.OPENSERV_API_KEY;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
const ideaId = process.env.IDEA_ID;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
dotenv library
import "dotenv/config";
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
HTTP client library
import axios from "axios";
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: "https://api.launch.openserv.ai",
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
` curl "https://api.launch.openserv.ai/ideas/${idea._id}"`,
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Environment variable access (dot notation)
const API_KEY = process.env.OPENSERV_API_KEY;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
const API_KEY = process.env.OPENSERV_API_KEY;
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
dotenv library
import "dotenv/config";
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Hardcoded URL
curl 'https://api.launch.openserv.ai/ideas?sort=hot&limit=10'
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl 'https://api.launch.openserv.ai/ideas/:id'
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl -X POST 'https://api.launch.openserv.ai/ideas' \
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl -X POST 'https://api.launch.openserv.ai/ideas/:id/pickup' \
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl -X POST 'https://api.launch.openserv.ai/ideas/:id/ship' \
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl -X POST 'https://api.launch.openserv.ai/ideas/:id/upvote' \
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
curl -X POST 'https://api.launch.openserv.ai/ideas/:id/comment' \
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
import axios from 'axios';
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
import axios from 'axios';
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({ baseURL: 'https://api.launch.openserv.ai' });
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
import axios from 'axios';
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
HTTP client library
const api = axios.create({
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
**Base URL:** `https://api.launch.openserv.ai`
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: 'https://api.launch.openserv.ai',
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
const api = axios.create({ baseURL: 'https://api.launch.openserv.ai' });
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Hardcoded URL
baseURL: 'https://api.launch.openserv.ai',
The example or API reference directs requests to OpenServ endpoints. This is intended behavior, but it is real outbound network access.
Low
Environment variable access (dot notation)
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable access (dot notation)
headers: { 'x-openserv-key': process.env.OPENSERV_API_KEY },
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.
Low
Environment variable object
headers: { 'x-openserv-key': process.env.OPENSERV_API_KEY },
The example uses dotenv or process.env to load configuration. This is expected for the workflow, but environment access is real and should be scoped.

Risk findings

Confirmed security concerns are separated from items that still need review.

Confirmed security concerns (15)

RISK-001 High
Environment file access
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-002 High
Crypto seed/private key mention
const privateKey =
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-003 High
Crypto seed/private key mention
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-004 High
Crypto seed/private key mention
const account = privateKeyToAccount(privateKey);
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-005 High
Crypto seed/private key mention
console.log(`WALLET_PRIVATE_KEY=${privateKey}`);
The code prints or returns wallet private key material. That can expose credentials through terminals, logs, or caller output.
RISK-006 High
Crypto seed/private key mention
return { apiKey: data.apiKey, user: data.user, privateKey };
The code prints or returns wallet private key material. That can expose credentials through terminals, logs, or caller output.
RISK-007 High
Environment file access
const API_KEY = process.env.OPENSERV_API_KEY;
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-008 High
Environment file access
const API_KEY = process.env.OPENSERV_API_KEY;
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-009 High
Environment file access
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-010 High
Environment file access
headers: { 'x-openserv-key': process.env.OPENSERV_API_KEY },
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-011 High
Crypto seed/private key mention
const privateKey =
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-012 High
Crypto seed/private key mention
(process.env.WALLET_PRIVATE_KEY as `0x${string}`) || generatePrivateKey();
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-013 High
Crypto seed/private key mention
const account = privateKeyToAccount(privateKey);
The code or runnable documentation creates, reads, or uses wallet private key material. This is sensitive and requires careful handling.
RISK-014 High
Credential Disclosure Through Console Output
examples/get-api-key.ts prints the returned API key and generated WALLET_PRIVATE_KEY to stdout for .env setup. Shared terminals, command logs, or CI logs could retain those secrets.
The file directly logs data.apiKey and the generated privateKey. This is a clear secret exposure path when output is captured.
RISK-015 Medium
Authenticated External Actions by Agents
The skill guides agents to submit ideas, pick up work, ship services, upvote, and comment with an API key. These are intentional workflows, but they create account-visible side effects.
The workflow language explicitly tells agents to perform authenticated Ideaboard actions. The risk is business-logic impact, not hidden code execution.

Remediation

Suggested fixes recorded by this audit. Applying them is the maintainer’s responsibility.

  1. FIX-001
    High
    get-api-key.ts prints full API key and wallet private key values.
    Do not print full secrets. Write them to a protected secret store or show masked values after explicit user confirmation.
  2. FIX-002
    High
    Examples read and send OPENSERV_API_KEY through environment variables and headers.
    Recommend a dedicated low-privilege wallet and API key, and document secret storage outside source control.
  3. FIX-003
    Medium
    The skill describes authenticated actions that publish, claim, upvote, comment, or ship work.
    Require explicit user confirmation before every POST request that changes Ideaboard state.
  4. FIX-004
    Low
    Examples make outbound requests to api.launch.openserv.ai.
    Clearly disclose network destinations and avoid sending credentials to any non-OpenServ endpoint.

Expert evidence

Immutable subject identity, scanner metadata, dismissed matches, and source-level evidence.

Artifact subject

Marketplace commit
Unavailable
Content hash
Unavailable
Tree hash
Unavailable
Skill path
Unavailable
Audit payload hash
Unavailable

Analysis metadata

Audit model: codex

Analysis state: Complete

Scope is limited to the recorded files, lines, methods, and evidence. No runtime or sandbox execution is claimed.

Verify and export

The manifest and lockfile bind install artifacts to cryptographic hashes. This integrity claim is separate from the security assessment.

Audit attestation: not_attestable