What's Changed
[1.3.60] — 2026-06-09
Added
- IAM —
CreateLoginProfile,GetLoginProfile,UpdateLoginProfile,DeleteLoginProfile— models whether an IAM user has a console password (the signal that a user is a human).CreateLoginProfilestoresUserName,CreateDate, andPasswordResetRequiredwithout persisting the password value (seed-side).GetLoginProfilereturnsNoSuchEntity(404) when no profile exists.UpdateLoginProfileupdatesPasswordResetRequired.DeleteLoginProfileremoves the profile. All four operations match the real AWS request/response shapes exactly so identity-discovery agents can distinguish humans from service accounts usingget-login-profile. Contributed by @lahmish. - IAM —
CreateVirtualMFADevice,EnableMFADevice,DeactivateMFADevice,ResyncMFADevice,ListMFADevices,ListVirtualMFADevices,DeleteVirtualMFADevice— full virtual MFA device lifecycle.CreateVirtualMFADevicereturnsSerialNumber(ARN formarn:aws:iam::<acct>:mfa/<name>) plusBase32StringSeedandQRCodePNGblobs (base64-encoded).EnableMFADeviceaccepts any TOTP codes (seed-side lenience).ListVirtualMFADevicessupportsAssignmentStatusfilter (Assigned/Unassigned/Any; defaultAny).DeleteVirtualMFADevicereturnsDeleteConflict(409) for assigned devices. Contributed by @lahmish. - IAM —
GetAccountAuthorizationDetails— the one-shot identity graph. ReturnsUserDetailList(inline policies, attached managed policies, group memberships, tags),GroupDetailList,RoleDetailList(inline policies, attached managed policies, instance profiles, tags, assume-role document url-encoded), andPolicies(customer-managed, with url-encoded version documents).Filter.member.Nhonored:User,Group,Role,LocalManagedPolicy.IsTruncated=false; pagination optional. Contributed by @lahmish. - IAM —
CreateSAMLProvider,GetSAMLProvider,ListSAMLProviders,UpdateSAMLProvider,DeleteSAMLProvider,ListOpenIDConnectProviders— SAML IdP CRUD plus OIDC provider enumeration. Accepts any non-emptySAMLMetadataDocument(real AWS requires valid XML ≥1000 chars; that validation is seed-side).GetSAMLProviderreturnsSAMLMetadataDocument,CreateDate,ValidUntil, andTags.ListOpenIDConnectProvidersreturns{Arn}entries (create/get/delete existed previously). Enables agents to enumerate federated IdPs cross-referenced with role trust policies. Contributed by @lahmish. - IAM —
GenerateServiceLastAccessedDetails,GetServiceLastAccessedDetails— Access Advisor generate→get job handshake. Returns a UUIDJobId.GetServiceLastAccessedDetailsreturnsJobStatus=COMPLETEDand an emptyServicesLastAccessedlist (no CloudTrail data). Contributed by @lahmish.
Fixed
- Cognito —
RespondToAuthChallenge/AdminRespondToAuthChallengemerge CUSTOM_AUTH verify result into the pending challenge round — the verify result was appended as a second, metadata-lesssessionentry, splitting one round across two records. AWS records oneChallengeResultper round, carrying bothchallengeMetadata(fromCreateAuthChallenge) andchallengeResult(fromVerifyAuthChallengeResponse) — multi-round flows that read both fields from the same element (e.g. magic-link → SMS-OTP) never advanced. The pending round is now updated in place. Contributed by @AdigaAkhil. - SQS — out-of-range numeric attributes rejected with
InvalidAttributeValue—CreateQueueandSetQueueAttributesaccepted any value and stored it verbatim, soVisibilityTimeout=99999(and every other numeric attribute) was silently kept. NowVisibilityTimeout(0..43200),MaximumMessageSize(1024..262144),MessageRetentionPeriod(60..1209600),DelaySeconds(0..900),ReceiveMessageWaitTimeSeconds(0..20), andKmsDataKeyReusePeriodSeconds(60..86400) are validated against the AWS ranges and rejected withInvalidAttributeValue(400) when outside the documented bounds or non-numeric. Reported by @dcabib. - EventBridge —
anything-buthonors nestedprefix/suffix/wildcardcontent filters —{"anything-but": {"prefix": "TEST-"}}(andsuffix/wildcardvariants) was silently ignored at dispatch and every event matched regardless of the field value, because the handler only recognized literal and list-of-literal forms. The nested-matcher form per AWS docs is now negated correctly: an event whose field matches the nested filter is excluded. Reported by @aldirrix. - ElastiCache — Redis container respawned after restart — with
PERSIST_STATE=1, restored cluster metadata reportedCacheClusterStatus=availablebut the persisted Docker container id no longer existed, so the endpoint was unreachable even thoughDescribeCacheClusterslooked healthy. Restored clusters and replication groups are now marked pending respawn atrestore_statetime and lazily spawned (under a lock to prevent concurrent first-requests from double-spawning) on the first dispatcher call — endpoint metadata is rewritten to the freshly-spawned container before any caller can read it. Failures are logged once and cleared from the pending set (no retry storm). Reported by @ItsSmiffy.