neotoma has tenant isolation gap in relationship query endpoints
The /list_relationships and /retrieve_graph_neighborhood endpoints call getAuthenticatedUserId (confirming a valid session exists) but do not pass the resolved user ID into the Supabase query as an .eq("user_id", userId) filter. As a result, queries return rows from all users rather than scoping to the authenticated caller's data.
/list_relationships (src/actions.ts):
getAuthenticatedUserId but does not apply .eq("user_id", userId) to the relationships query.or() string interpolation for entity ID matching without input validation/retrieve_graph_neighborhood (src/actions.ts):
v0.13.0
An unauthenticated caller is rejected at the auth middleware layer. The gap requires a second user account on the instance.
An authenticated user with a known cross-user entity ID can retrieve relationship edges and graph neighborhood data belonging to another user. No write capability is exposed.
Low under current conditions — no multi-tenant deployments exist. Escalates to Medium the moment two or more user accounts share an instance.
.eq("user_id", userId) to all Supabase queries in both handlersisNeotomaEntityId before query construction.or() string interpolation with separate scoped .eq() callsFix tracked in #365 (list_relationships) and #366 (retrieve_graph_neighborhood). Gate gap tracked in #372.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도(심각도 등급 추정치) | 20.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 20.00 |
VPI 공식 vpi-v1 기준