← Legacy view v2 (rp.*)

xvirobotics/metabot

https://github.com/xvirobotics/metabot · lang: typescript · LOC: · source: both

Quality
80.1
Grade A-
Security
64.3
Findings
100
1 critical · 24 high
Status
completed
May 31, 2026 01:23
info: 34 medium: 29 high: 24 low: 12 critical: 1
Top rules by occurrence
RuleSeverityCount
AGT015 Remote install command pipes network code directly to a she… medium 9
JRN002 Browser storage is used for session token material medium 7
AIC003 Duplicated implementation block across source files low 7
MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) high 6
SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier low 4
SEC040 innerHTML XSS — template literal with server-supplied data high 4
SEC020 Secret Printed to Logs high 4
MINED045 Ts Non Null Assertion info 4
MINED054 Ts As Any info 4
MINED044 Js Console Log Prod info 4
First 100 findings (severity-sorted)
critical JRN001 Token handoff appears to use a callback URL or fragment
web/src/hooks/useWebSocket.ts:43 · conf 0.88
Token handoff appears to use a callback URL or fragment
high MINED027 React State Array Mutation CWE-682
web/src/components/office/engine/movement.ts:85 · conf 1.00
[MINED027] React State Array Mutation: state.X.push/splice/sort followed by setState — React skips re-render on mutated reference.
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:16 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v4`: `uses: actions/checkout@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:19 · conf 0.90
[MINED115] Action `actions/setup-node` pinned to mutable ref `@v4`: `uses: actions/setup-node@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the …
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:40 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v4`: `uses: actions/checkout@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/ci.yml:41 · conf 0.90
[MINED115] Action `actions/setup-node` pinned to mutable ref `@v4`: `uses: actions/setup-node@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the …
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/docs.yml:19 · conf 0.90
[MINED115] Action `actions/checkout` pinned to mutable ref `@v4`: `uses: actions/checkout@v4` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made the tj-a…
high MINED115 GitHub Action pinned to mutable ref (not 40-char SHA) CWE-829
.github/workflows/docs.yml:20 · conf 0.90
[MINED115] Action `actions/setup-python` pinned to mutable ref `@v5`: `uses: actions/setup-python@v5` resolves at workflow-run time. Tags and branches can be re-pushed by the action owner; that made …
high MINED118 Dockerfile FROM not pinned by sha256 digest CWE-829
Dockerfile:2 · conf 0.90
[MINED118] Dockerfile FROM `node:20-slim` not pinned by digest: `FROM node:20-slim` resolves the tag at build time. The registry CAN re-push a different image for the same tag, so every build is pote…
high MINED118 Dockerfile FROM not pinned by sha256 digest CWE-829
Dockerfile:25 · conf 0.90
[MINED118] Dockerfile FROM `node:20-slim` not pinned by digest: `FROM node:20-slim` resolves the tag at build time. The registry CAN re-push a different image for the same tag, so every build is pote…
high SEC020 Secret Printed to Logs
src/api/routes/rtc-routes.ts:85 · conf 0.85
[SEC020] Secret Printed to Logs: Debug or diagnostic code appears to print a credential-bearing value. This is a frequent AI-assisted coding failure: the helper exposes the exact value needed for tro…
high SEC020 Secret Printed to Logs
src/memory/memory-server.ts:312 · conf 0.92
[SEC020] Secret Printed to Logs: Debug or diagnostic code appears to print a credential-bearing value. This is a frequent AI-assisted coding failure: the helper exposes the exact value needed for tro…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
src/utils/http.ts:46 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
web/src/components/chat/FilePreviewContent.tsx:40 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
web/src/components/chat/helpers.ts:62 · conf 1.00
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input: Outbound HTTP request to a user-controlled URL without allowlist validation. Attackers can probe internal services (169.25…
high SEC040 innerHTML XSS — template literal with server-supplied data
src/api/routes/rtc-routes.ts:152 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC040 innerHTML XSS — template literal with server-supplied data
src/api/skill-hub-store.ts:283 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC040 innerHTML XSS — template literal with server-supplied data
src/feishu/card-builder.ts:161 · conf 1.00
[SEC040] innerHTML XSS — template literal with server-supplied data: Setting .innerHTML with a template literal that interpolates server-supplied or user-supplied data is the canonical stored/reflect…
high SEC085 JS: child_process.exec with non-literal
src/engines/codex/executor.ts:27 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC085 JS: child_process.exec with non-literal
src/sync/markdown-to-blocks.ts:97 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC085 JS: child_process.exec with non-literal
web/src/components/chat/AssistantMessage.tsx:132 · conf 1.00
[SEC085] JS: child_process.exec with non-literal: child_process.exec with user-derived input enables command injection. Ported from eslint-plugin-security detect-child-process (Apache-2.0).
high SEC100 CORS permissive Access-Control-Allow-Origin: *
src/memory/memory-server.ts:47 · conf 1.00
[SEC100] CORS permissive Access-Control-Allow-Origin: *: Permissive CORS policy (`*` origin) allows any website to make authenticated cross-origin requests. Especially dangerous when combined with `A…
high SEC128 Async function without await — fire-and-forget Promise (AI mistake)
src/api/async-task-store.ts:40 · conf 1.00
[SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call invoked without `await` returns an unhandled Promise. The outer function resolves before the inner work comple…
high SEC128 Async function without await — fire-and-forget Promise (AI mistake)
src/api/budget-manager.ts:177 · conf 1.00
[SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call invoked without `await` returns an unhandled Promise. The outer function resolves before the inner work comple…
high SEC128 Async function without await — fire-and-forget Promise (AI mistake)
src/api/circuit-breaker.ts:102 · conf 1.00
[SEC128] Async function without await — fire-and-forget Promise (AI mistake): Async call invoked without `await` returns an unhandled Promise. The outer function resolves before the inner work comple…
medium AGT007 localStorage write failures are swallowed silently
web/src/store.ts:75 · conf 0.80
localStorage write failures are swallowed silently
medium AGT013 Agent auto-approve or skip-permissions mode is easy to enable
docs/troubleshooting.md:33 · conf 0.68
Agent auto-approve or skip-permissions mode is easy to enable
medium AGT015 Remote install command pipes network code directly to a shell
docs/features/wechat.md:21 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
docs/features/wechat.zh.md:24 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
docs/getting-started/installation.zh.md:8 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
docs/index.md:46 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
docs/index.zh.md:46 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
docs/landing/index.html:536 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
README_EN.md:50 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
README.md:50 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT015 Remote install command pipes network code directly to a shell
uninstall.sh:4 · conf 0.70
Remote install command pipes network code directly to a shell
medium AGT016 Codex session log reader may expose prompts or tool-call content
src/engines/codex/executor.ts:18 · conf 0.73
Codex session log reader may expose prompts or tool-call content
medium DKR001 Docker final stage has no non-root USER
Dockerfile:25 · conf 0.82
Docker final stage has no non-root USER
medium ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors.
src/wechat/wechat-sender.ts:43 · conf 1.00
[ERR002] Empty Catch Block: Empty catch blocks hide errors.
medium ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors.
web/src/components/team/TeamWorkspace.tsx:47 · conf 1.00
[ERR002] Empty Catch Block: Empty catch blocks hide errors.
medium ERR002 [ERR002] Empty Catch Block: Empty catch blocks hide errors.
web/src/hooks/useStreamingASR.ts:37 · conf 1.00
[ERR002] Empty Catch Block: Empty catch blocks hide errors.
medium JRN002 Browser storage is used for session token material
src/memory/static/app.js:13 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
src/memory/static/app.js:20 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
src/memory/static/app.js:577 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
src/memory/static/app.js:583 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
src/memory/static/app.js:592 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
web/src/store.ts:195 · conf 0.82
Browser storage is used for session token material
medium JRN002 Browser storage is used for session token material
web/src/store.ts:198 · conf 0.82
Browser storage is used for session token material
medium SEC015 Insecure Randomness for Security
src/api/rtc-token.ts:104 · conf 1.00
[SEC015] Insecure Randomness for Security: Weak PRNG used in security-sensitive context. Output is predictable.
medium SEC045 eval()/exec() on stored or user-supplied data
src/api/activity-store.ts:51 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
medium SEC045 eval()/exec() on stored or user-supplied data
src/api/skill-hub-store.ts:87 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
medium SEC045 eval()/exec() on stored or user-supplied data
src/api/team-manager.ts:32 · conf 1.00
[SEC045] eval()/exec() on stored or user-supplied data: eval() and exec() on data — even admin-stored data — is a lateral-movement vector after any one credential compromise. Sandboxes (__builtins__ …
medium SEC087 JS: weak Math.random for crypto
src/api/rtc-token.ts:104 · conf 1.00
[SEC087] JS: weak Math.random for crypto: Math.random() is not cryptographically secure; using it for tokens/keys/nonces is predictable. Ported from gosec G404 / eslint detect-pseudoRandomBytes conce…
medium SEC091 Go: net/http server without timeouts
src/api/http-server.ts:60 · conf 1.00
[SEC091] Go: net/http server without timeouts: HTTP server without ReadHeaderTimeout/ReadTimeout/WriteTimeout is vulnerable to Slowloris. Ported from gosec G112 + G114 (Apache-2.0).
low AIC003 Duplicated implementation block across source files
src/engines/claude/persistent-executor.ts:12 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
src/engines/kimi/executor.ts:115 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
src/feishu/card-builder.ts:10 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
web/src/components/team/TeamChatPanel.tsx:17 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
web/src/store.ts:31 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
web/src/types.ts:3 · conf 0.86
Duplicated implementation block across source files
low AIC003 Duplicated implementation block across source files
web/src/types.ts:125 · conf 0.86
Duplicated implementation block across source files
low DKC006 Compose service does not declare a runtime user
docker-compose.yml:3 · conf 0.56
Compose service does not declare a runtime user
low DKC010 Compose service lacks no-new-privileges hardening
docker-compose.yml:3 · conf 0.62
Compose service lacks no-new-privileges hardening
low DKR008 .dockerignore misses sensitive defaults
.dockerignore · conf 0.72
.dockerignore misses sensitive defaults
low DKR011 Dockerfile installs recommended OS packages
Dockerfile:7 · conf 0.72
Dockerfile installs recommended OS packages
low DKR011 Dockerfile installs recommended OS packages
Dockerfile:30 · conf 0.72
Dockerfile installs recommended OS packages
info MINED043 Http Not Https CWE-319
· conf 0.20
[MINED043] Http Not Https (and 2 more): Same pattern found in 2 additional files. Review if needed.
info MINED043 Http Not Https CWE-319
src/api/http-server.ts:115 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED043 Http Not Https CWE-319
src/api/routes/file-routes.ts:38 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED043 Http Not Https CWE-319
src/api/routes/team-routes.ts:21 · conf 1.00
[MINED043] Http Not Https: Hardcoded http:// (not localhost) for endpoints that handle credentials or data.
info MINED044 Js Console Log Prod CWE-532
· conf 0.20
[MINED044] Js Console Log Prod (and 2 more): Same pattern found in 2 additional files. Review if needed.
info MINED044 Js Console Log Prod CWE-532
spike/persistent-executor-test.ts:24 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED044 Js Console Log Prod CWE-532
src/index.ts:355 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED044 Js Console Log Prod CWE-532
web/src/components/ErrorBoundary.tsx:24 · conf 1.00
[MINED044] Js Console Log Prod: console.log left in code. Should be replaced with logger or removed.
info MINED045 Ts Non Null Assertion CWE-476
· conf 0.20
[MINED045] Ts Non Null Assertion (and 7 more): Same pattern found in 7 additional files. Review if needed.
info MINED045 Ts Non Null Assertion CWE-476
src/api/routes/rtc-routes.ts:242 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED045 Ts Non Null Assertion CWE-476
src/api/routes/team-routes.ts:62 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED045 Ts Non Null Assertion CWE-476
src/api/rtc-voice-chat.ts:85 · conf 1.00
[MINED045] Ts Non Null Assertion: x! asserts not null - bypasses null checks - TypeError if wrong.
info MINED052 Ts Any Typed CWE-704
· conf 0.20
[MINED052] Ts Any Typed (and 24 more): Same pattern found in 24 additional files. Review if needed.
info MINED052 Ts Any Typed CWE-704
src/api/activity-store.ts:135 · conf 1.00
[MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety.
info MINED052 Ts Any Typed CWE-704
src/api/bots-config-writer.ts:128 · conf 1.00
[MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety.
info MINED052 Ts Any Typed CWE-704
src/api/http-server.ts:149 · conf 1.00
[MINED052] Ts Any Typed: : any used as type annotation. Defeats TypeScript type safety.
info MINED054 Ts As Any CWE-704
· conf 0.20
[MINED054] Ts As Any (and 11 more): Same pattern found in 11 additional files. Review if needed.
info MINED054 Ts As Any CWE-704
spike/persistent-executor-test.ts:28 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED054 Ts As Any CWE-704
src/api/http-server.ts:58 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED054 Ts As Any CWE-704
src/api/peer-manager.ts:275 · conf 1.00
[MINED054] Ts As Any: Casting to any (as any) bypasses type checking entirely.
info MINED055 Npm Install No Lockfile CWE-1357
setup.sh:46 · conf 1.00
[MINED055] Npm Install No Lockfile: Production image runs npm install (resolves new versions on every build) instead of npm ci.
info MINED056 React Key As Index CWE-682
web/src/components/chat/AssistantMessage.tsx:38 · conf 1.00
[MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re-order.
info MINED056 React Key As Index CWE-682
web/src/components/chat/FilePanel.tsx:134 · conf 1.00
[MINED056] React Key As Index: key={index} in map() — re-renders the wrong elements on re-order.
info MINED058 React Dangerously Set Html CWE-79
web/src/components/chat/FilePreviewContent.tsx:155 · conf 1.00
[MINED058] React Dangerously Set Html: dangerouslySetInnerHTML bypasses Reacts JSX escaping. Pair with DOMPurify or never use with user data.
info SEC020 Secret Printed to Logs
· conf 0.20
[SEC020] Secret Printed to Logs (and 1 more): Same pattern found in 1 additional files. Review if needed.
info SEC020 Secret Printed to Logs
src/wechat/wechat-bot.ts:39 · conf 0.15
[SEC020] Secret Printed to Logs: Debug or diagnostic code appears to print a credential-bearing value. This is a frequent AI-assisted coding failure: the helper exposes the exact value needed for tro…
info SEC029 Server-Side Request Forgery (SSRF) — outbound HTTP from user input
· conf 0.20
[SEC029] Server-Side Request Forgery (SSRF) — outbound HTTP from user input (and 7 more): Same pattern found in 7 additional files. Review if needed.
info SEC040 innerHTML XSS — template literal with server-supplied data
· conf 0.20
[SEC040] innerHTML XSS — template literal with server-supplied data (and 1 more): Same pattern found in 1 additional files. Review if needed.
info SEC045 eval()/exec() on stored or user-supplied data
· conf 0.20
[SEC045] eval()/exec() on stored or user-supplied data (and 4 more): Same pattern found in 4 additional files. Review if needed.
info SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier
· conf 0.20
[SEC118] UUIDv1 / UUIDv3 used for security-sensitive identifier (and 4 more): Same pattern found in 4 additional files. Review if needed.
info SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier
src/api/activity-store.ts:72 · conf 0.10
[SEC118] UUIDv1 / UUIDv3 used for security-sensitive identifier: UUIDv1 encodes the MAC address and timestamp, making it predictable. Used as a session token or password-reset key, it's enumerable.
info SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier
src/api/async-task-store.ts:54 · conf 0.10
[SEC118] UUIDv1 / UUIDv3 used for security-sensitive identifier: UUIDv1 encodes the MAC address and timestamp, making it predictable. Used as a session token or password-reset key, it's enumerable.
info SEC118 UUIDv1 / UUIDv3 used for security-sensitive identifier
src/api/rtc-voice-chat.ts:126 · conf 0.10
[SEC118] UUIDv1 / UUIDv3 used for security-sensitive identifier: UUIDv1 encodes the MAC address and timestamp, making it predictable. Used as a session token or password-reset key, it's enumerable.
info SEC128 Async function without await — fire-and-forget Promise (AI mistake)
· conf 0.20
[SEC128] Async function without await — fire-and-forget Promise (AI mistake) (and 12 more): Same pattern found in 12 additional files. Review if needed.

Reading from rp.scan + rp.finding + rp.rule (unified schema, R78 series). Legacy data path unchanged. Compare with /scan/a731985b-1d29-4908-8399-00852d6c06f2/.