Skip to content

[BUG] REST calls for unimplemented operations are answered by another service sharing the path #6426

Open

Description

@slang25

Service

Several REST services: AppSync, AppIntegrations, AppRegistry, MQ, Security Hub, Macie, Connect, Inspector, Lake Formation, Bedrock Agents

AWS API Action

Operations Floci doesn't implement for the signed service, whose path another service's controller also owns (full list below)

Expected behavior

Floci doesn't implement these operations, so I'd expect UnknownOperationException, the same as any other unimplemented operation.

Actual behavior

The request is answered by whichever service owns the same path, and writes go to that service's state. For example, AppRegistry's CreateApplication creates an AppConfig application, and AppSync's CreateApi creates an API Gateway v2 API.

I found these with a sweep that called every operation of every REST service in botocore (10,369 calls, placeholder values for required members). These are the 31 calls that reached another service's route:

Signed for Operations Path Answered by
appsync CreateApi, DeleteApi, GetApi, ListApis /v2/apis API Gateway v2
appintegrations CreateApplication, DeleteApplication, GetApplication, ListApplications /applications AppConfig
servicecatalog-appregistry CreateApplication, DeleteApplication, GetApplication, ListApplications /applications AppConfig
mq 7 *Configuration* operations /v1/configurations MSK
securityhub CreateMembers, ListMembers /members Macie
securityhub ListStandardsControlAssociations /associations CodeGuru
macie2 DescribeClassificationJob /jobs/{jobId} IoT
connect CreateRule, ListRules /rules/{InstanceId} IoT
connect ListWorkspaces /workspaces/{InstanceId} Prometheus
inspector2 GetClustersForImage /cluster/get DSQL
lakeformation CommitTransaction /CommitTransaction RDS Data
bedrock-agent *ResourcePolicy /resourcepolicy/{resourceArn} Bedrock AgentCore

None of these are operations Floci claims to support, so the impact is limited to clients calling something unimplemented and getting another service's response (or side effect) back instead of an error.

Reproduction

aws --endpoint-url http://localhost:4566 servicecatalog-appregistry create-application --name from-appregistry
aws --endpoint-url http://localhost:4566 appconfig list-applications
# 💥 lists a new AppConfig application: {"Items": [{"Id": "adbe849"}]}
#    (no name, since AppRegistry sends `name` and AppConfig reads `Name`)

Environment

  • Floci version / image tag: floci/floci:nightly (repro), sweep run against main at 99171dcbe
  • How you're running Floci: Docker

Notes

I tried fixing this in #6368 by refusing a REST request that reaches a controller owned by a service it isn't signed as. That turned out to be the wrong shape: CloudFront viewer requests signed for an S3 origin need to reach CloudFront's serving route, the IAM route-enforcement tests deliberately check a request against the route it reached whatever its scope, and several test suites sign every call with one scope. So I've backed it out.

I'm not sure what the right fix is, if any is worth it. Maybe a 404 for the specific conflicting operations, rather than a general rule? Raising it here so it's recorded, and I'd love to hear what you think.

Activity

  1. Ankit-cs commented on Oct 25, 2026

    @Ankit-cs

    Assign this to me @hectorvent i want to work on the above issue and try to fix it.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions