Skip to content

ruflo@3.38.20 production tree: 1 critical (protobufjs) + 12 high transitive on the live embedding path; plus an undocumented MCP HTTP rate limit (~51 calls/0.3s) #3157

Description

@ruvnet

npm audit --omit=dev on a bare ruflo@3.38.20 install: 1 critical + 12 high transitive, with the critical on the live embedding path

Context: standing up ruflo mcp start -t http as a private, IAM-gated Cloud Run service for ruvnet/ruClip (ruClip#1, cognitum-one/ruclip ADR-0001/0002). Before shipping the image we audited its production tree: the published package, fresh npm i ruflo@3.38.20 in an empty directory, nothing else installed.

npm audit --omit=dev
38 vulnerabilities (25 moderate, 12 high, 1 critical)

High/critical by package, as npm reports them:

critical protobufjs
high     @claude-flow/cli, @huggingface/transformers, @xenova/transformers, onnxruntime-node,
         onnxruntime-web, onnx-proto, adm-zip, agentdb, agentic-flow,
         @opentelemetry/sdk-node, @opentelemetry/propagator-jaeger

Two import paths reach the critical protobufjs (npm ls protobufjs):

ruflo@3.38.20 → @claude-flow/cli@3.38.20
  ├─ agentdb@3.0.0-alpha.20 → @huggingface/transformers@4.2.0 → onnxruntime-web → protobufjs
  └─ agentdb@3.0.0-alpha.20 → @opentelemetry/sdk-node@0.218.0 → …grpc-js → @grpc/proto-loader → protobufjs

Why it matters for a hosted bridge specifically: the transformers/onnxruntime path is not dormant — every memory_store through the bridge generates a 384-dim embedding (hasEmbedding: true, embeddingDimensions: 384 in the store response), so that code executes on every write from a network-reachable service. --tools limits which tools are callable; it doesn't change which packages load.

Related: the repo's own CVE gate (Audit root (critical-blocking), CVE Audit Gate workflow) currently fails on main for an unrelated reason — npm error notarget No matching version found for @claude-flow/mcp@3.0.0-alpha.10 (run 33467634804) — so it isn't surfacing this today. Not filing a PR: the fix is version bumps in agentdb/@claude-flow/cli dependency ranges, a maintainer call on compatibility (onnxruntime in particular).

One more operational finding from the same session, for whoever owns the HTTP transport: the bridge enforces a per-client rate limit that fires after ~51 calls within ~0.3 s and had not cleared 65 s later (fresh process clears it). Paced at ~1.3 calls/s it never fires (40 store+retrieve pairs, p50 16 ms / 11 ms). The string Rate limit exceeded isn't in v3/@claude-flow/cli/src, so it's coming from a dependency — worth documenting the threshold/window and exposing a knob, since a control plane fanning out several calls per heartbeat across many devices will hit it.

Downstream, cognitum-one/ruclip ADR-0002 records the posture (private service, IAM-gated, exact-name --tools allowlist, pinned version, this issue linked) rather than treating the allowlist as a supply-chain control.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions