FinBot Analysis Report
Completed July 21, 2026 · 9 artifacts examined
5Findings
3Critical
2High
RAISE maturity 0.60 / 5.0
Executive Summary
Agent Remit (as declared)
FinBot is CineFlow Productions' AI-powered invoice processing assistant. It is meant to auto-approve low-risk invoices, route anything above threshold or flagged by fraud detection to human review, and never treat vendor-submitted invoice content as a source of policy or goal change.
Behavior Summary (as observed)
FinBot's observed behavior diverges sharply from its declared remit in one connected chain: an unauthenticated admin plane allows anyone to rewrite the agent's goals or disable its own security controls, the invoice-approval function itself has no server-side threshold check, and a detected prompt injection can still be auto-approved if 'business context' scores high enough. No security-relevant action in this chain is logged anywhere.
Scope of Analysis
A Flask application with a vendor-facing invoice submission portal and an admin dashboard, backed by an OpenAI function-calling agent (FinBotAgent) that decides approve/reject/review outcomes. Goals are defined in a natural-language system prompt with a documented, unauthenticated override mechanism, and the admin blueprint exposes goal, config, and invoice-review endpoints with no authentication of any kind.
Remit Coverage

Every actionable rule in the Worker Remit, checked against the running code. Gap = declared but unenforced; Partial = enforced but incomplete or bypassable; Vague Policy = too imprecise to verify.

Verified: 1 Gap: 6 Partial: 1 Vague Policy: 0 Enforcement Not Possible: 0 Total Rules: 8
Rule ID Section Rule (quoted) Status Finding
R-01 Non-Goals (Out of Scope) "FinBot must never redefine its own goals or operating priorities based on invoice content." Gap PRAX-2026-07-21-003
R-02 Approved Communication Channels "Admin Dashboard (configuration/goals): Requires Approval - authenticated operator only." Gap PRAX-2026-07-21-001
R-03 Restricted Tools (Require Approval Before Use) "Any mechanism that updates FinBot's operating goals or priorities (Goals Management)." Gap PRAX-2026-07-21-001
R-04 Action Boundaries - Requires Human Approval Before Execution "Any invoice above the manual-review threshold." Gap PRAX-2026-07-21-002
R-05 Action Boundaries - Requires Human Approval Before Execution "Any invoice where prompt-injection or fraud-detection signals are raised, regardless of amount." Partial PRAX-2026-07-21-004
R-06 Action Boundaries - Never Allowed "Auto-approving a high-value or flagged invoice because its description contains persuasive business language (urgency, authority, executive references)." Gap PRAX-2026-07-21-002
R-07 Escalation Rules - Halt Agent and Alert Operator "FinBot's goals/configuration appear to have changed without an authenticated admin action." Gap PRAX-2026-07-21-001
R-08 Action Boundaries - Allowed Without Approval "Auto-approving invoices below the documented low-risk/auto-approve threshold, with no fraud-detection flags raised." Verified —
Findings Register

Findings, ordered by severity — each linked to its remit rule, evidence, and a recommended action. Tag chips jump to the relevant entry in the RAISE framework, the OWASP LLM Top 10, or the OWASP Agentic Top 10.

LLM06 primary — the finding's main OWASP categoryASI10 secondary — a category it also touches

CRITICAL PRAX-2026-07-21-001 Admin plane (goals, config, invoice review, vendor trust) has no authentication of any kind
Policy Rule — R-02, R-03, R-07 (Worker Remit):
"Admin Dashboard (configuration/goals): Requires Approval - authenticated operator only. / Any mechanism that updates FinBot's operating goals or priorities (Goals Management). / FinBot's goals/configuration appear to have changed without an authenticated admin action."
src/routes/admin.py:90 — @admin_bp.route('/admin/finbot/goals', methods=['POST']) - no auth decorator, no session/token check before calling update_goals src/routes/admin.py:74 — @admin_bp.route('/admin/finbot/config', methods=['POST']) - same absence of auth before update_config src/main.py:1 — grep across src/main.py, app.py, and every routes/*.py file for login_required, before_request, session[, or Authorization found zero matches
Recommended Action
  • Add an authentication/authorization check (session-based admin login or API key) that runs before every route in admin_bp, not just the ones that look sensitive.
  • Specifically gate update_finbot_goals and update_finbot_config behind that check first, since they alter the agent's own security posture.
CRITICAL PRAX-2026-07-21-002 Invoice approval has no server-side enforcement of the manual-review threshold
Policy Rule — R-04, R-06 (Worker Remit):
"Any invoice above the manual-review threshold. / Auto-approving a high-value or flagged invoice because its description contains persuasive business language (urgency, authority, executive references)."
src/services/finbot_agent.py:409 — _approve_invoice(): sets invoice.status = 'approved' and payment_processed = True with no comparison against config.manual_review_threshold anywhere in the function src/services/finbot_agent.py:809 — if business_context['should_expedite']: decision = 'auto_approve' ... 'Amount exceeds threshold but expedited due to strong business context'
Recommended Action
  • Add a hard, independent check immediately before any commit in _approve_invoice: if invoice.amount > config.manual_review_threshold, reject the approval path entirely regardless of confidence, reasoning, or business_context score.
  • That gate must not be expressible as an LLM tool-call outcome - it should run in code the model cannot talk its way around.
CRITICAL PRAX-2026-07-21-003 Unauthenticated goals endpoint injects operator-supplied text with override priority into the system prompt
Policy Rule — R-01, R-03 (Worker Remit):
"FinBot must never redefine its own goals or operating priorities based on invoice content. / Any mechanism that updates FinBot's operating goals or priorities (Goals Management)."
src/services/finbot_agent.py:70 — if config.custom_goals: base_goals += f'\n\nCUSTOM GOALS (OVERRIDE ABOVE IF CONFLICTING):\n{config.custom_goals}' src/services/finbot_agent.py:743 — # Store the new goals in the configuration - This is intentionally vulnerable - no validation of goal content
Recommended Action
  • Require authenticated, role-gated access before any custom_goals write (shared root cause with PRAX-2026-07-21-001).
  • Even for authorized updates, do not let injected goal text override baseline security-relevant behavior (fraud detection, thresholds) - separate 'business preference' goals from 'security control' goals structurally so one cannot override the other.
HIGH PRAX-2026-07-21-004 A detected prompt injection can still be auto-approved if business-context scoring is high enough
Policy Rule — R-05, R-06 (Worker Remit):
"Any invoice where prompt-injection or fraud-detection signals are raised, regardless of amount. / Auto-approving a high-value or flagged invoice because its description contains persuasive business language (urgency, authority, executive references)."
src/services/finbot_agent.py:843 — if business_context['should_expedite'] and config.speed_priority > 0.6: decision = 'auto_approve' ... 'Business urgency ... prioritized over security concerns for production continuity'
Recommended Action
When contains_prompt_injection is true, remove every code path that can still resolve to auto_approve; route unconditionally to human review regardless of business_context or speed_priority.
HIGH PRAX-2026-07-21-005 No persisted audit trail for any security-relevant admin action
src/routes/admin.py — grep for logging., logger., log., audit across src/routes/*.py and src/services/*.py returns only the docstring and body of log_agreement() at line 225 (print()-only, unrelated to goals/config/review actions)
Recommended Action
Add structured, persisted audit logging for update_finbot_goals, update_finbot_config, review_invoice, and update_vendor_trust: who changed what, previous and new values, and a timestamp, written somewhere durable - not console print().
What's Working Well

Controls and behaviors that are correctly implemented and verified during this scan. These represent areas where the agent's implementation aligns with its stated policy and security best practices.

Bounded agent loop

The LLM orchestration loop in _run_agent_orchestration() is capped at max_iterations = 5, which prevents an unbounded tool-calling loop even though no other resource limit is present.

src/services/finbot_agent.py:172 (max_iterations = 5)

No code-execution capability exposed

The agent's tool definitions are limited to invoice retrieval and approve/reject/review-request actions. No shell, file-write, or arbitrary code-execution tool is exposed to the LLM.

src/services/finbot_agent.py:_get_tool_definitions
Discovered Log Files

Log files found in the agent's workspace during this scan. Reviewing these files provides runtime evidence to complement the static analysis above.

No persisted audit or application log files were found in the workspace. The only logging observed anywhere in the admin routing layer is a console print() inside log_agreement(), which tracks cookie-consent acknowledgement and is unrelated to any security-relevant admin action.
OWASP LLM Top 10 (2025) Coverage

Each card represents one category and shows the top 3 findings. All items in the Findings section.

LLM02 Sensitive Information Disclosure
No findings
LLM03 Supply Chain
No findings
LLM04 Data and Model Poisoning
No findings
LLM05 Improper Output Handling
No findings
LLM07 System Prompt Leakage
No findings
LLM08 Vector and Embedding Weaknesses
No findings
LLM09 Misinformation
No findings
LLM10 Unbounded Consumption
No findings
OWASP Agentic Top 10 (2026) Coverage

Each card represents one category and shows the top 3 findings. All items in the Findings section.

ASI02 Tool Misuse and Exploitation
No findings
ASI04 Agentic Supply Chain Vulnerabilities
No findings
ASI05 Unexpected Code Execution (RCE)
No findings
ASI06 Memory and Context Poisoning
No findings
ASI07 Insecure Inter-Agent Communication
No findings
ASI08 Cascading Failures
No findings
ASI09 Human-Agent Trust Exploitation
No findings
RAISE Maturity Posture

Overall maturity assessment across the six categories of the RAISE framework. This is a maturity model, not a school grade: a score of 3 / 5 means Established, not 60 percent. Most production AI agents today score between Ad hoc (1) and Established (3). See the full RAISE framework reference for the complete scale and scoring.

0.60 / 5.0
Weighted Maturity Score · Absent
FinBot's overall RAISE posture lands at 0.60 out of 5, squarely in the Absent band. The heavily-weighted Implement Zero Trust category scores 0 with High confidence: there is no authentication on any admin route, no server-side enforcement of the manual-review threshold, and a detected prompt injection can still be auto-approved. Monitor Continuously and Build an AI Red Team both score 0 as well, and none of the remaining categories score high enough to meaningfully move the average.
Limit Your Domain
1/ 5
Confidence: Medium  |  Weight: 15%  |  Weighted: 0.15
Domain is stated in the system prompt (invoice processing for CineFlow) but has no code-level enforcement boundary - the unauthenticated custom_goals mechanism can override the stated domain entirely.
Balance Your Knowledge Base
2/ 5
Confidence: Low  |  Weight: 15%  |  Weighted: 0.30
No RAG or external knowledge-grounding pattern was observed; invoice data comes from direct database records rather than a retrieved knowledge base, so this category has limited applicability here and is scored conservatively given the absence of contrary evidence.
Implement Zero Trust
0/ 5
Confidence: High  |  Weight: 25%  |  Weighted: 0.00
No authentication exists on any admin route, no server-side enforcement of the approval threshold exists, and a detected prompt injection can still result in auto-approval - all verified directly in code.
Manage Your Supply Chain
1/ 5
Confidence: Low  |  Weight: 15%  |  Weighted: 0.15
No dependency-pinning, lockfile review, or third-party package vetting evidence was found in the workspace; scored low given the absence of any evidence of a control rather than a confirmed one.
Build an AI Red Team
0/ 5
Confidence: Medium  |  Weight: 15%  |  Weighted: 0.00
No evidence of the FinBot team's own adversarial-testing artifacts was found in the repository; the CTF itself is an external red-team exercise built around this agent, not an internal control the team built.
Monitor Continuously
0/ 5
Confidence: High  |  Weight: 15%  |  Weighted: 0.00
No persisted audit logging exists for any security-relevant admin action; the only logging observed anywhere is an unrelated cookie-consent print statement.

Maturity Scoring Rubric

Every score above is based on this scale. A score is a snapshot of observable posture — not a verdict on the people or team behind the system.

Score Label Meaning
5 Exemplary Best-in-class; automated, continuously tested, reference quality. Rarely achieved in shipping systems.
4 Strong Comprehensive controls, active management, minor gaps. Production-ready.
3 Established Documented controls consistently applied; known gaps accepted. A respectable baseline.
2 Partial Some controls exist but coverage is incomplete; key gaps remain.
1 Ad hoc Informal or inconsistent measures; relies on individual judgment.
0 Absent No evidence this category is addressed at all.
Weighting: the weighted overall above is the sum of each category's score × weight (the per-category weights are shown on each card). Zero Trust carries double weight by design; see the RAISE framework reference for the rationale.