Most recent
navigate open esc close Corpus index built 2026-06-07 23:58 UTC

← All engagement records

HIGH · case-study May 25, 2026

Stock.ai (EMOR AI) — Partial-Auth Failure, Open Vector Store, and Third-Party Research Leak

Sector
Commercial
Severity
HIGH

Date: 2026-05-25 Target: 20.193.252.230 ASN: AS8075 Microsoft Azure, Pune, Maharashtra, India Severity: HIGH


What Was Found

F1 — Partial-Auth Failure on LangGraph API (HIGH)

DCWF KSAT coverage

Auto-derived from DCWF AI work-role rule files (ksat-tag).

  • 672 (AI Test & Evaluation Specialist): K7003, K7004, S7068, S7075, T5904
  • 733 (AI Risk & Ethics Specialist): K7040, K7051
  • overlap (Common AI KSATs (all 5 roles)): K1158, K22, K6935, K7003, K942

Port 8000 serves a FastAPI/LangGraph backend for Stock.ai v1.0.0 with a real JWT + Google OAuth implementation. The developer added authentication correctly on list-level routes and then missed every individual resource route. The result is a selective auth bypass across the API:

EndpointAuth
GET /conversationsRequired — lock in OpenAPI spec
GET /conversations/{id}None
POST /conversations/newNone
DELETE /conversations/{id}None
GET /portfolio/{user_id}None
GET /pdf/{filename}None
POST http://20.193.252.230:8000/conversations/new
→ {"conversation_id":"a47769a9-1ce7-45b8-bc8c-e9ba2c97f2b5"}

GET http://20.193.252.230:8000/conversations/a47769a9-1ce7-45b8-bc8c-e9ba2c97f2b5
→ {"messages":[],"created_at":"...","updated_at":"..."}

No Bearer token required on either call. User IDs are guessable (sequential integers) or derivable via the email-oracle at /auth/forgot-password, which returns distinct error messages for registered versus unregistered accounts.

Distinct auth failure class. The developer thought about authentication and built it. The list route is protected. The individual resource routes are not. At scale this pattern appears in apps where auth middleware is applied at the router prefix level and resource routes are registered outside that prefix.

F2 — Weaviate Vector DB Open (HIGH)

Port 8080 serves Weaviate 1.33.1 (commit c87f308) with no auth on any endpoint. Seven document collections are enumerable and readable via GraphQL and the REST API:

CollectionContents
TextCollectionsFinancial PDF text — title, content, filename, stock, quarter, year
TextEmbeddingsSame schema, second pipeline iteration
ImageCollectionsPDF images — base64-encoded, captioned
ImageEmbeddingsImage vectors
DocumentCollectionPyPdf2PyPDF2 parser iteration
DocumentCollectionuatnewUAT test collection
ImageCaptiontestTest collection

The multiple collection iterations make the development history readable: three distinct pipeline experiments (PyPDF2, uatnew, production) all left exposed in the same instance.

Vectorizer config in the Weaviate schema reveals the operator:

"text2vec-openai": {
  "isAzure": true,
  "resourceName": "oai-hrresume-emor-dev-inc",
  "deploymentId": "text-embedding-ada-002"
}

oai-hrresume-emor-dev-inc: the Azure OpenAI resource name encodes the company (emor), an earlier product (hrresume), and the Azure environment (dev-inc). EMOR AI, Thane, Maharashtra, markets an AI phone receptionist for US small businesses under the EMOR Voice brand. Stock.ai is an unreleased second product.

F3 — 62 Arihant Capital Analyst Reports Accessible Without Auth (HIGH)

The /pdf/{filename} endpoint serves files from the document corpus by filename alone, no auth. The Weaviate schema exposes the filename list. 62 proprietary Arihant Capital Markets equity research reports covering Q4FY25 through Q2FY26 are accessible:

GET http://20.193.252.230:8000/pdf/Bajaj%20Auto_Q1FY26%20Result%20Update.pdf
→ 200 OK — 448KB PDF binary, full analyst report

Sample report range: Bajaj Auto, Birlasoft, HDFC Bank, INFY, ICICI Bank, L&T Technology, Mahindra & Mahindra, Maruti Suzuki, Persistent Systems, Piramal Enterprises. 52 filings confirmed, all production analyst reports.

These are not public documents. Arihant Capital distributes these to registered clients. EMOR AI’s Stock.ai indexed them to power the RAG-backed financial query system and serves them via an unauthenticated file endpoint.

The finding involves two parties: EMOR AI (the deployment operator) and Arihant Capital (whose research is indexed and served without evident authorization). Both require independent notification.

F4 — PostgreSQL TCP Open (SURFACE)

Port 5432 accepts connections from the public internet. Credential state not probed. Stock.ai uses PostgreSQL as the user/conversation state backend; the Weaviate schema was populated on 2 February 2026.


Stack Map

PortServiceVersionAuthSeverity
8000LangGraph FastAPI — Stock.ai1.0.0Partial (list routes only)HIGH
8080Weaviate1.33.1NoneHIGH
5432PostgreSQLTCP open, credential state unknownSURFACE
80/8081Flutter web appPublic frontend

Attribution

EMOR AI, Thane, Maharashtra, India. Contact: inquiries@emorai.com. Azure OpenAI resource oai-hrresume-emor-dev-inc in Pune (AS8075). Company site: emorai.com. App deployment timestamp: schema created 2 February 2026, frontend deployed 11 March 2026.


Thesis Placement

Partial-auth is a variant of the auth-on-default failure class. The developer implemented JWT correctly on some routes and missed others. Authentication intent was present; execution was incomplete. At the data layer, Weaviate’s default no-auth posture (Insight #13) propagates to the deployment regardless of what the application layer does. Two independent failures on the same host.

The Arihant Capital research exposure is a third-party data-class finding: operator A indexes operator B’s proprietary content without evident authorization. EMOR AI’s data exposure creates a secondary leak of Arihant Capital’s commercial research product.

See also: LangGraph Server Survey (2026-05-25) · LangGraph Deployment Gap