Skip to content

Security Model ​

AWSim is a development emulator. This page states what it assumes, so you can tell whether your deployment matches those assumptions.

Trust Boundary ​

AWSim assumes a trusted local context and trusts its callers.

By default there is no authentication and no authorization: any client that can reach the port can call any API. That is the correct default for the primary use case, a developer running AWSim on their own machine or a CI job running it as a throwaway container.

It is not a suitable default for a shared host or a network anyone untrusted can reach.

Features That Make Outbound Requests ​

Several emulated services fetch URLs supplied by the caller. This is correct emulation of the AWS service, and it also means a caller can induce AWSim to make requests on their behalf:

FeatureWhat it fetches
API Gateway HTTP integrationsThe integration URI configured on a route
Cognito federationThe identity provider's JWKS and discovery endpoints
Bedrock backendThe configured upstream model endpoint
RDS Data API, LambdaContainer images, when a container runtime is in use

On a trusted network this is the feature working. On an exposed instance it is a server-side request forgery primitive. Bear it in mind before exposing AWSim.

Hardening ​

Four gates are available, all off by default. They are independent and compose:

SettingWhat it does
AWSIM_IAM_ENFORCEEvaluates IAM policies on every request. Keys bound to an IAM user are enforced; unbound keys act as administrators so the first users can be created. See IAM enforcement
AWSIM_REQUIRE_SIGNED_REQUESTSRejects any request whose access key does not resolve to a known IAM user, with InvalidClientTokenId
AWSIM_VERIFY_SIGV4Cryptographically verifies every SigV4 signature against the bound secret, rejecting forgeries with SignatureDoesNotMatch
AWSIM_REQUIRE_OPERATOR_AUTHGates the admin UI and admin endpoints behind a login. See operator auth

To restrict reachability instead, bind loopback:

bash
awsim --bind 127.0.0.1

The default binds all interfaces, because publishing a container port requires it. When AWSim starts on a non-loopback address with no gate enabled, it logs a one-line notice saying so.

Container Posture ​

The published image runs as an unprivileged user (uid 65532), not root. If you mount a volume at /data that is owned by root, the process cannot write to it; either chown it to 65532:65532 or let Docker create the volume.

What Is Verified ​

The following were checked directly rather than assumed:

  • SigV4 signature comparison and the operator bootstrap token comparison both use constant-time equality.
  • Cognito stores passwords with bcrypt and signs tokens with RS256; no none algorithm path exists.
  • DynamoDB's SQLite layer binds every caller-supplied value as a parameter and interpolates only static column lists, so it is not injectable.
  • Archive extraction, and every path built from caller-supplied text, is contained by a shared helper that rejects traversal components.

What This Page Is Not ​

AWSim is not hardened for exposure to an untrusted network, and the gates above do not make it so. They make it usable in a semi-trusted setting such as a shared development host. Do not put it on the public internet.

Released under MIT / Apache-2.0 License