Stoa Agent Risk Report

Repository: support-desk

Full repository scan · Stoa v0.1.2

9 agent candidates · 5 integrations · 3 critical findings

At a glance

9
Agent candidates
5
High-exposure candidates
3
Critical findings
1
Suppressed findings
14
Files scanned

Findings by severity

31327
CriticalHighMediumLowInfo

Agent risk map

Each candidate, ranked by static exposure: high-impact capabilities, sensitive integrations, and finding severity. Static evidence does not prove runtime reachability.

account_agent
19
crew
19
billing_agent
19
billing_executor
19
escalation_agent
9
research_agent
4
support_widget
3
triage_agent
0
workflow
0
SevereElevatedModerateLow

Static exposure combines high-impact capabilities, sensitive integrations, and finding severity per candidate. Higher means more to review first, not a proven exploit.

Expand any candidate below for the evidence, capabilities, integrations, and findings.

account_agentSevere exposure

agents/account_agent.py · High confidence

1 critical3 info
  • database_write
  • email_send
Details & evidence

Detected because

  • CrewAI agent construct at line 17
  • Agent execution or orchestration call at line 27

Detection score: 8 · symbol: account_agent

Stack

Frameworks: crewai · Providers:

Capabilities (static evidence)

  • database_write
  • email_send

Integrations · call sites

  • sendgrid × 4

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
criticalSEC00215Possible hardcoded password
DB_PASSWORD = "Sup3rS3cretPr0d!2026"
Load the password from a secret manager or environment variable.
infoCTRL00117Authentication control not observed
Authentication control not observed for candidate account_agent
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00217Input validation control not observed
Input validation control not observed for candidate account_agent
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00317Rate limiting control not observed
Rate limiting control not observed for candidate account_agent
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
crewSevere exposure

agents/account_agent.py · High confidence

1 critical3 info
  • database_write
  • email_send
Details & evidence

Detected because

  • CrewAI agent construct at line 17
  • Agent execution or orchestration call at line 27

Detection score: 8 · symbol: crew

Stack

Frameworks: crewai · Providers:

Capabilities (static evidence)

  • database_write
  • email_send

Integrations · call sites

  • sendgrid × 4

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
criticalSEC00215Possible hardcoded password
DB_PASSWORD = "Sup3rS3cretPr0d!2026"
Load the password from a secret manager or environment variable.
infoCTRL00117Authentication control not observed
Authentication control not observed for candidate crew
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00217Input validation control not observed
Input validation control not observed for candidate crew
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00317Rate limiting control not observed
Rate limiting control not observed for candidate crew
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
billing_agentSevere exposure

agents/billing_agent.py · High confidence

1 critical1 high1 medium3 info
  • payment_access
  • +3 more
Details & evidence

Detected because

  • LangChain agent construct at line 27
  • Tool or function schema at line 22
  • LLM provider import or reference at line 20

Detection score: 8 · symbol: billing_agent

Stack

Frameworks: langchain · Providers: openai

Capabilities (static evidence)

  • database_read
  • external_http
  • payment_access
  • tool_calling

Integrations · call sites

  • postgres × 2
  • stripe × 2

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
criticalSEC00116Possible hardcoded API credential
OPENAI_FALLBACK_KEY = "sk-pro…[REDACTED:2f5a2a55d8ba]"
Load the credential from a secret manager or environment variable.
infoCTRL00127Authentication control not observed
Authentication control not observed for candidate billing_agent
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00227Input validation control not observed
Input validation control not observed for candidate billing_agent
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00327Rate limiting control not observed
Rate limiting control not observed for candidate billing_agent
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
highSEC00338Interpolated SQL statement
cursor.execute(f"SELECT id, total_cents FROM invoices WHERE customer_id = {customer_id}")
Use parameterized queries instead of string interpolation.
mediumNET00243Request timeout not observed
requests.post("https://ledger.corp-internal.example-desk.io/api/v1/sync", json=payload)
Pass an explicit timeout so a hung upstream cannot stall the agent.
billing_executorSevere exposure

agents/billing_agent.py · High confidence

1 critical1 high1 medium3 info
  • payment_access
  • +3 more
Details & evidence

Detected because

  • LangChain agent construct at line 27
  • Tool or function schema at line 22
  • LLM provider import or reference at line 20

Detection score: 8 · symbol: billing_executor

Stack

Frameworks: langchain · Providers: openai

Capabilities (static evidence)

  • database_read
  • external_http
  • payment_access
  • tool_calling

Integrations · call sites

  • postgres × 2
  • stripe × 2

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
criticalSEC00116Possible hardcoded API credential
OPENAI_FALLBACK_KEY = "sk-pro…[REDACTED:2f5a2a55d8ba]"
Load the credential from a secret manager or environment variable.
infoCTRL00127Authentication control not observed
Authentication control not observed for candidate billing_executor
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00227Input validation control not observed
Input validation control not observed for candidate billing_executor
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00327Rate limiting control not observed
Rate limiting control not observed for candidate billing_executor
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
highSEC00338Interpolated SQL statement
cursor.execute(f"SELECT id, total_cents FROM invoices WHERE customer_id = {customer_id}")
Use parameterized queries instead of string interpolation.
mediumNET00243Request timeout not observed
requests.post("https://ledger.corp-internal.example-desk.io/api/v1/sync", json=payload)
Pass an explicit timeout so a hung upstream cannot stall the agent.
escalation_agentElevated exposure

agents/escalation_agent.py · Medium confidence

1 medium3 info
  • messaging
  • +3 more
Details & evidence

Detected because

  • LLM provider invocation at line 20
  • Tool or function schema at line 13
  • LLM provider import or reference at line 9

Detection score: 5 · symbol: escalation_agent

Stack

Frameworks: — · Providers: anthropic

Capabilities (static evidence)

  • customer_support
  • external_http
  • messaging
  • tool_calling

Integrations · call sites

  • slack × 1
  • zendesk × 3

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
infoCTRL00120Authentication control not observed
Authentication control not observed for candidate escalation_agent
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00220Input validation control not observed
Input validation control not observed for candidate escalation_agent
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00320Rate limiting control not observed
Rate limiting control not observed for candidate escalation_agent
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
mediumREL00144Swallowed exception
except Exception:
Handle or log the exception instead of silently discarding it.
research_agentModerate exposure

agents/research_agent.py · High confidence

1 medium3 info
  • +2 more
Details & evidence

Detected because

  • OpenAI Agents SDK agent construct at line 9
  • Agent execution or orchestration call at line 21

Detection score: 8 · symbol: research_agent

Stack

Frameworks: openai_agents_sdk · Providers:

Capabilities (static evidence)

  • external_http
  • web_search

Integrations · call sites

None observed.

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
infoCTRL0019Authentication control not observed
Authentication control not observed for candidate research_agent
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL0029Input validation control not observed
Input validation control not observed for candidate research_agent
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL0039Rate limiting control not observed
Rate limiting control not observed for candidate research_agent
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
mediumNET00131Insecure non-local HTTP endpoint
"http://legacy-kb.corp-intranet-desk.com/search",
Use HTTPS for non-local endpoints.
support_widgetModerate exposure

web/support_widget.ts · Medium confidence

3 info
  • zendesk
  • +3 more
Details & evidence

Detected because

  • LLM provider invocation at line 13
  • Tool or function schema at line 7
  • LLM provider import or reference at line 3

Detection score: 5 · symbol: support_widget

Stack

Frameworks: — · Providers: openai

Capabilities (static evidence)

  • customer_support
  • external_http
  • tool_calling

Integrations · call sites

  • zendesk × 1

Attribution

Last touched by: unknown

Findings in this file

SeverityRuleLineFinding
infoCTRL00113Authentication control not observed
Authentication control not observed for candidate support_widget
Confirm authentication is enforced before this agent acts; it was not observed in this file.
infoCTRL00213Input validation control not observed
Input validation control not observed for candidate support_widget
Confirm inputs are validated before this agent acts; validation was not observed in this file.
infoCTRL00313Rate limiting control not observed
Rate limiting control not observed for candidate support_widget
Confirm rate limiting exists for this agent's actions; it was not observed in this file.
triage_agentLow exposure

agents/triage_agent.py · Medium confidence

3 info
    Details & evidence

    Detected because

    • PydanticAI agent construct at line 3

    Detection score: 5 · symbol: triage_agent

    Stack

    Frameworks: pydantic_ai · Providers:

    Capabilities (static evidence)

    None observed.

    Integrations · call sites

    None observed.

    Attribution

    Last touched by: unknown

    Findings in this file

    SeverityRuleLineFinding
    infoCTRL0013Authentication control not observed
    Authentication control not observed for candidate triage_agent
    Confirm authentication is enforced before this agent acts; it was not observed in this file.
    infoCTRL0023Input validation control not observed
    Input validation control not observed for candidate triage_agent
    Confirm inputs are validated before this agent acts; validation was not observed in this file.
    infoCTRL0033Rate limiting control not observed
    Rate limiting control not observed for candidate triage_agent
    Confirm rate limiting exists for this agent's actions; it was not observed in this file.
    workflowLow exposure

    orchestrator.py · Medium confidence

    3 info
      Details & evidence

      Detected because

      • LangGraph agent construct at line 37
      • LLM provider import or reference at line 14

      Detection score: 6 · symbol: workflow

      Stack

      Frameworks: langgraph · Providers: openai

      Capabilities (static evidence)

      None observed.

      Integrations · call sites

      None observed.

      Attribution

      Last touched by: unknown

      Findings in this file

      SeverityRuleLineFinding
      infoCTRL00137Authentication control not observed
      Authentication control not observed for candidate workflow
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL00237Input validation control not observed
      Input validation control not observed for candidate workflow
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL00337Rate limiting control not observed
      Rate limiting control not observed for candidate workflow
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.

      All findings

      Everything the scan found, grouped. Sections are collapsed so the report leads with the map; nothing is omitted.

      Security findings (4)
      SeverityRuleLocationConfidenceFindingRemediation
      criticalSEC002agents/account_agent.py:15HighPossible hardcoded password
      DB_PASSWORD = "Sup3rS3cretPr0d!2026"
      Load the password from a secret manager or environment variable.
      criticalSEC001agents/billing_agent.py:16HighPossible hardcoded API credential
      OPENAI_FALLBACK_KEY = "sk-pro…[REDACTED:2f5a2a55d8ba]"
      Load the credential from a secret manager or environment variable.
      criticalSEC001tests/test_billing.py:3LowPossible hardcoded API credential
      FAKE_STRIPE_STYLE_KEY = "sk-pro…[REDACTED:654c43ce84ef]"
      Load the credential from a secret manager or environment variable.
      highSEC003agents/billing_agent.py:38MediumInterpolated SQL statement
      cursor.execute(f"SELECT id, total_cents FROM invoices WHERE customer_id = {customer_id}")
      Use parameterized queries instead of string interpolation.
      Reliability findings (3)
      SeverityRuleLocationConfidenceFindingRemediation
      mediumNET002agents/billing_agent.py:43LowRequest timeout not observed
      requests.post("https://ledger.corp-internal.example-desk.io/api/v1/sync", json=payload)
      Pass an explicit timeout so a hung upstream cannot stall the agent.
      mediumREL001agents/escalation_agent.py:44HighSwallowed exception
      except Exception:
      Handle or log the exception instead of silently discarding it.
      mediumNET001agents/research_agent.py:31MediumInsecure non-local HTTP endpoint
      "http://legacy-kb.corp-intranet-desk.com/search",
      Use HTTPS for non-local endpoints.
      Review prompts (27)

      Review prompts are observations, not confirmed vulnerabilities: a control was not observed in the scanned file, but may exist elsewhere.

      SeverityRuleLocationConfidenceFindingRemediation
      infoCTRL001agents/account_agent.py:17LowAuthentication control not observed
      Authentication control not observed for candidate crew
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL001agents/account_agent.py:17LowAuthentication control not observed
      Authentication control not observed for candidate account_agent
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002agents/account_agent.py:17LowInput validation control not observed
      Input validation control not observed for candidate account_agent
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL002agents/account_agent.py:17LowInput validation control not observed
      Input validation control not observed for candidate crew
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003agents/account_agent.py:17LowRate limiting control not observed
      Rate limiting control not observed for candidate crew
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL003agents/account_agent.py:17LowRate limiting control not observed
      Rate limiting control not observed for candidate account_agent
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001agents/billing_agent.py:27LowAuthentication control not observed
      Authentication control not observed for candidate billing_executor
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL001agents/billing_agent.py:27LowAuthentication control not observed
      Authentication control not observed for candidate billing_agent
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002agents/billing_agent.py:27LowInput validation control not observed
      Input validation control not observed for candidate billing_executor
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL002agents/billing_agent.py:27LowInput validation control not observed
      Input validation control not observed for candidate billing_agent
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003agents/billing_agent.py:27LowRate limiting control not observed
      Rate limiting control not observed for candidate billing_executor
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL003agents/billing_agent.py:27LowRate limiting control not observed
      Rate limiting control not observed for candidate billing_agent
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001agents/escalation_agent.py:20LowAuthentication control not observed
      Authentication control not observed for candidate escalation_agent
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002agents/escalation_agent.py:20LowInput validation control not observed
      Input validation control not observed for candidate escalation_agent
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003agents/escalation_agent.py:20LowRate limiting control not observed
      Rate limiting control not observed for candidate escalation_agent
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001agents/research_agent.py:9LowAuthentication control not observed
      Authentication control not observed for candidate research_agent
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002agents/research_agent.py:9LowInput validation control not observed
      Input validation control not observed for candidate research_agent
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003agents/research_agent.py:9LowRate limiting control not observed
      Rate limiting control not observed for candidate research_agent
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001agents/triage_agent.py:3LowAuthentication control not observed
      Authentication control not observed for candidate triage_agent
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002agents/triage_agent.py:3LowInput validation control not observed
      Input validation control not observed for candidate triage_agent
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003agents/triage_agent.py:3LowRate limiting control not observed
      Rate limiting control not observed for candidate triage_agent
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001orchestrator.py:37LowAuthentication control not observed
      Authentication control not observed for candidate workflow
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002orchestrator.py:37LowInput validation control not observed
      Input validation control not observed for candidate workflow
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003orchestrator.py:37LowRate limiting control not observed
      Rate limiting control not observed for candidate workflow
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      infoCTRL001web/support_widget.ts:13LowAuthentication control not observed
      Authentication control not observed for candidate support_widget
      Confirm authentication is enforced before this agent acts; it was not observed in this file.
      infoCTRL002web/support_widget.ts:13LowInput validation control not observed
      Input validation control not observed for candidate support_widget
      Confirm inputs are validated before this agent acts; validation was not observed in this file.
      infoCTRL003web/support_widget.ts:13LowRate limiting control not observed
      Rate limiting control not observed for candidate support_widget
      Confirm rate limiting exists for this agent's actions; it was not observed in this file.
      Suppressed findings (1)
      RuleLocationFindingReason
      SEC003tools/database.py:40Interpolated SQL statementtable name comes from the REPORT_TABLES enum above