Search/iss
Known CVEs
0
Highest CVSS
—
In KEV
0
Vendor
realsecure sentry
Connections
35 relationships
Identity-aware AI data agents with AWS Lake Formation and Trusted Identity Propagation
You’re building a data agent that lets business users ask questions about lakehouse data in natural language. You’ve already built governance policies that control who can access which datasets. The challenge is making the agent respect those rules without rebuilding them in your application code. When a user asks a question, the agent maps it to data and constructs a query. The tool runs under its own AWS Identity and Access Management (IAM) role, so AWS Lake Formation sees the tool’s credentials, not the person behind the request. This leaves you with two inadequate options: restrict tool access (limiting self-service analytics) or rebuild access controls in application code (moving governance out of the data layer). In this post, we show you a different approach: identity-aware AI data agents that propagate each user’s identity through every hop, from the user, through the agent, into the tool, so Lake Formation evaluates the user’s grants. Your application code makes no authorization decisions, existing Lake Formation policies work without modifications, and AWS CloudTrail records the actual person who accessed the data. In this post, you learn how to: Set up per-user data access controls for AI agents querying your lakehouse without rewriting your existing Lake Formation governance policies by configuring Amazon Bedrock AgentCore to carry each user’s identity through trusted identity propagation (TIP). Ensure auditability and compliance by performing a server-side token exchange inside AWS Lambda that converts the identity token into Lake Formation credentials scoped to the real user, with CloudTrail recording every query. Validate the pattern end-to-end by testing with multiple users and confirming per-user query results and CloudTrail audit evidence. The building blocks in this post, OAuth 2.0 token delegation, AWS IAM Identity Center , Lake Formation, and Lambda are well-documented individually. The new constraint is that a foundation model (FM) now sits in the middle of the propagation chain. The FM is the agent’s brain, it decides which tools to call and what arguments to pass and anything that enters its context (prompts, tool schemas, arguments) is accessible within that trust boundary. So, the user’s identity token must reach the tool, but it must do so on the HTTP transport layer, bypassing the FM’s reasoning layer entirely. This post demonstrates the three Amazon Bedrock AgentCore configurations that achieve that. Whether you’re building agents on Strands, LangGraph, or a similar framework, this post gives you a deployable pattern on Amazon Bedrock AgentCore. Security engineers will find the identity-transport and audit properties relevant, and data platform owners will see how existing Lake Formation grants extend to AI workloads with no changes. Solution overview Figure 1: Solution overview With this pattern (shown in Figure 1), your data agent can query Lake Formation governed data with per-user access controls, full CloudTrail audit trails, and no changes to your existing governance policies. Here’s how it works. Two tokens travel through the system. An access_token authenticates the request at each trust boundary ( Bedrock AgentCore Runtime , Bedrock AgentCore Gateway ). An id_token carries your identity and is exchanged, server-side, for the identity context that Lake Formation evaluates. A separate TIP role carries only the IAM permissions needed to call service APIs, it has no Lake Formation data grants. Lake Formation evaluates only the propagated user identity, not the TIP role. The request flow is: User to UI: The user authenticates with an OpenID Connect (OIDC) identity provider (IdP). This post uses Amazon Cognito , but you can use any OIDC provider, such as Okta. The UI receives an id_token and an access_token . UI to Bedrock AgentCore Runtime: The UI calls the agent running in AgentCore Runtime over HTTPS. The access_token goes in the standard Authorization header. The id_token goes in a custom header: X-Amzn-Bedrock-AgentCore-Runtime-Custom-IdToken . The HTTP body contains only the user’s prompt. AgentCore Runtime to agent code: The runtime validates the access_token against the configured JSON Web Token (JWT) authorizer, then passes the request to the agent container with both headers accessible through context.request_headers . Agent to Bedrock AgentCore Gateway: The agent opens a Model Context Protocol (MCP) connection to an AgentCore gateway, including both headers on the connection. The AgentCore gateway validates the access_token and forwards the custom header to its Lambda target. AgentCore Gateway to Lambda: The propagated headers arrive in context.client_context.custom[‘bedrockAgentCorePropagatedHeaders’] . Lambda to the data layer: Lambda validates the id_token , exchanges it for an identity context, assumes a role with that context, and runs the Amazon Athena query under the user’s identity. Lake Formation evaluates grants against the real user. Athena returns only the rows and columns that the user is entitled to see. CloudTrail records the assumed role with an onBehalfOf entry identifying the human. Now that you’ve seen the end-to-end flow, the following sections walk through each piece, starting with what you need to have in place before you build. Prerequisites This post assumes you have the working knowledge of OAuth 2.0, IAM, and Lake Formation grants. An IAM Identity Center instance with a trusted token issuer (TTI) configured to accept your OIDC IdP’s tokens. An OAuth Application in IAM Identity Center configured for CreateTokenWithIAM with the JWT Bearer grant. Lake Formation governing your AWS Glue Data Catalog, with grants already assigned to users or groups. An Athena workgroup and an Amazon Simple Storage Service (Amazon S3) bucket for query results. An OIDC IdP. The reference implementation uses Amazon Cognito as the demo IdP, but the pattern is IdP-agnostic. Auth0, Microsoft Entra ID, Okta, Ping, or any OIDC-compliant provider works identically, if your TTI accepts its tokens. This post doesn’t walk through setting up any of these components. The existing AWS documentation covers each one. For more information, see the links in the preceding list and the related resources at the end of this post. The three Bedrock AgentCore configuration steps Three Bedrock AgentCore features make this pattern work. Together they form the chain of custody for the user’s id_token from the moment it arrives at the Bedrock AgentCore Runtime to the moment Lambda uses it. Configure the runtime request header allow list Bedrock AgentCore Runtime doesn’t pass request headers into the agent container by default. You opt in by declaring an allow list, either through agentcore configure or directly in the runtime configuration: # .bedrock_agentcore.yaml request_header_configuration: requestHeaderAllowlist: - Authorization - X-Amzn-Bedrock-AgentCore-Runtime-Custom-IdToken AgentCore Runtime supports two types of forwarded headers: The standard Authorization header for OAuth inbound JWT authentication ( access_token ), and Custom headers prefixed with X-Amzn-Bedrock-AgentCore-Runtime-Custom- The id_token in this pattern uses a custom header. Inside the agent, the allow listed headers arrive as a dictionary object on the request context. The following Python code runs in the agent container: from bedrock_agentcore.runtime import BedrockAgentCoreApp ID_TOKEN_HEADER = "X-Amzn-Bedrock-AgentCore-Runtime-Custom-IdToken" app = BedrockAgentCoreApp() @app.entrypoint def invoke(payload, context): request_headers = getattr(context, "request_headers", None) or {} id_token = "" access_token = "" for key, value in request_headers.items(): if key.lower() == ID_TOKEN_HEADER.lower(): id_token = value elif key.lower() == "authorization": access_token = value.replace("Bearer ", "") # ... build MCP headers and call the Gateway The agent code reads the id_token from the HTTP transport and forwards it (also on the HTTP transport) to the next hop. It doesn’t treat the token as a tool argument and doesn’t inject it into a prompt. Key takeaway: The runtime allow list is the first gate. Without it, the id_token doesn’t reach your agent code. Configure AgentCore Gateway metadata for header propagation An AgentCore Gateway is the Model Context Protocol (MCP) endpoint the agent talks to. When AgentCore Gateway invokes a Lambda target, it doesn’t forward arbitrary request headers by default. You configure which headers to propagate using metadataConfiguration.allowedRequestHeaders on the target: from aws_cdk import aws_bedrockagentcore as agentcore self.gateway_target = agentcore.CfnGatewayTarget( self, "AthenaTarget", name="athena-executor", gateway_identifier=self.gateway.attr_gateway_identifier, target_configuration=agentcore.CfnGatewayTarget.TargetConfigurationProperty( mcp=agentcore.CfnGatewayTarget.McpTargetConfigurationProperty( lambda_=agentcore.CfnGatewayTarget.McpLambdaTargetConfigurationProperty( lambda_arn=lambda_function_arn, tool_schema=... # execute_athena_query ), ), ), metadata_configuration=agentcore.CfnGatewayTarget.MetadataConfigurationProperty( allowed_request_headers=["X-Amzn-Bedrock-AgentCore-Runtime-Custom-IdToken"], ), ... ) Notice that the tool schema doesn’t include an id_token parameter; there’s no token parameter on any tool. The FM doesn’t see, select, or pass an id_token because the token isn’t part of the tool’s contract. It travels parallel to the tool call, on the HTTP connection, through metadataConfiguration . This is a critical property for security. If you put the id_token in the tool schema instead, the FM becomes responsible for passing it, which means the token lands in prompts, traces, memory, and logs. Keeping the token off the tool contract keeps it out of the FM entirely. Key takeaway: The metadataConfiguration of the AgentCore gateway is the second gate. It controls which headers cross from the agent into the Lambda function without touching the tool schema. Read propagated headers in Lambda On the Lambda side, the propagated header arrives not in the event body but in the client context, under a specific key. The following Python code runs in the Lambda function: ID_TOKEN_HEADER = "X-Amzn-Bedrock-AgentCore-Runtime-Custom-IdToken" def lambda_handler(event, context): client_ctx = getattr(context.client_context, "custom", {}) or {} propagated_headers = client_ctx.get("bedrockAgentCorePropagatedHeaders", {}) id_token = propagated_headers.get(ID_TOKEN_HEADER) if not id_token: return {"statusCode": 400, "body": {"error": "missing id_token"}} # Tool arguments from the agent's call (no id_token here) query = event["query"] database = event["database"] workgroup = event["workgroup"] output_location = event["output_location"] # ... validate token, exchange, run query The event dictionary contains the tool’s declared parameters and nothing else. You reach the id_token only through context.client_context.custom[‘bedrockAgentCorePropagatedHeaders’] . That’s the handoff point. Key takeaway: The id_token arrives through the client context rather than tool arguments; the FM has no access to it. The Lambda is the only component that reads the token. Perform the server-side token exchange After Lambda has the id_token , it validates the token and exchanges it for an identityContext . This step uses standard IAM Identity Center TIP mechanics. That it happens inside Lambda rather than anywhere else is what keeps the identity context from crossing a process boundary. import boto3, jwt, time def exchange_and_assume(id_token: str, user_sub: str): # 1. Validate id_token against the OIDC IdP's JWKS. claims = validate_id_token(id_token) # signature, exp, aud, iss, token_use # 2. Exchange for an Identity Center identityContext. sso_oidc = boto3.client("sso-oidc") resp = sso_oidc.create_token_with_iam( clientId=OAUTH_APPLICATION_ARN, grantType="urn:ietf:params:oauth:grant-type:jwt-bearer", assertion=id_token, ) identity_context = resp["awsAdditionalDetails"]["identityContext"] # 3. AssumeRole with ProvidedContexts sts = boto3.client("sts") assumed = sts.assume_role( RoleArn=TIP_ROLE_ARN, RoleSessionName=f"agent-tip-{user_sub[:8]}-{int(time.time())}", ProvidedContexts=[{ "ProviderArn": "arn:aws:iam::aws:contextProvider/IdentityCenter", "ContextAssertion": identity_context, }], ) creds = assumed["Credentials"] return boto3.Session( aws_access_key_id=creds["AccessKeyId"], aws_secret_access_key=creds["SecretAccessKey"], aws_session_token=creds["SessionToken"], ) Two properties come out of this exchange: The identityContext is created and consumed inside a single Lambda invocation. It doesn’t get returned to the agent, the gateway, or the UI. The resulting boto3.Session holds short-lived credentials whose underlying identity assertion is the real user. When the session calls Athena, the query runs with the user’s identity propagated. Lake Formation sees the user, not the Lambda function’s role. Everything after this, including the Athena query and result formatting, is standard boto3. Configure Lake Formation grants You need one grant to the IAM Identity Center user or group. That’s the whole story at the Lake Formation layer. aws lakeformation grant-permissions \ --principal DataLakePrincipalIdentifier=arn:aws:identitystore:::user/<USER_ID> \ --resource '{"Table":{"DatabaseName":"iceberg_db","Name":"trip_details"}}' \ --permissions SELECT This is the grant Lake Formation evaluates at query time. You add column-level and row-level filters to the same user or group the same way. Nothing here is aware of or specific to AI agents. If you already have a Lake Formation grants model for human users, you already have the grants this pattern needs. Understanding the TIP role: The TIP role that Lambda assumes has no Lake Formation data grants. It holds only IAM permissions to call the service APIs: athena:* for query runs, glue:* for catalog reads, lakeformation:GetDataAccess for the query plan handshake, and Amazon S3 access for the Athena output bucket. When Lambda assumes this role with an identityContext attached through ProvidedContexts , Lake Formation evaluates only the propagated user identity against its grants. The role itself is transparent to the authorization decision. In the more common agent runs as a role pattern, the role carries the grants, which is why per-user governance breaks. Here the role carries no grants; it’s a session vehicle, not an authorization subject. Test the pattern end-to-end Two users, same question, different outcomes. User A has SELECT on trip_details . They ask the agent for five records from the table. Figure 2: Five records are requested and returned by the agent User B has no grant on trip_details . They ask the same question. Figure 3: User doesn’t have access to the data No code changed between the two interactions. No parameter was toggled. Lake Formation made the decision based on the propagated identity. The CloudTrail record for the AssumeRole call shows the delegation: { "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "requestParameters": { "roleArn": "arn:aws:iam::<ACCOUNT_ID>:role/<TIP_ROLE_NAME>", "roleSessionName": "agent-tip-<user_sub_prefix>-<timestamp>", "providedContexts": [{ "providerArn": "arn:aws:iam::aws:contextProvider/IdentityCenter", "contextAssertion": "<identity-context-assertion>" }] }, "userIdentity": { "type": "AssumedRole", "onBehalfOf": { "userId": "<IDENTITY_STORE_USER_ID>", "identityStoreArn": "arn:aws:identitystore::<ACCOUNT_ID>:identitystore/<ID>" } } } The onBehalfOf block closes the audit loop. Each query the agent runs on a user’s behalf has a CloudTrail record naming that user, with no additional instrumentation in your code. Security properties Four properties follow from this architecture. These are the core value propositions of the identity-aware pattern: The id_token never reaches the foundation model: It travels on HTTP headers at every hop, and Lambda reads it from context.client_context.custom . It’s not a parameter on any tool. The FM has no path to it: not in tool arguments, not in prompts, not in memory, not in traces. The identity context stays inside a single Lambda invocation: It’s derived from the id_token , used immediately in an AssumeRole call, and discarded. It doesn’t go back to the agent, the gateway, or the UI. Authorization decisions live in Lake Formation, against the real user only: The TIP role the Lambda function assumes has no data grants. Lake Formation evaluates the propagated user identity. No code path in the agent, gateway, or Lambda function performs authorization logic. The audit trail requires no extra work: The CloudTrail AssumeRole event with onBehalfOf identifies the human user for every query. You get the same audit fidelity you would have for human users accessing data directly. Deploy the pattern To deploy this pattern, you need to configure four things: An OIDC IdP with a TTI in IAM Identity Center accepting its tokens, and an Identity Center OAuth Application configured for CreateTokenWithIAM . Bedrock AgentCore Runtime running your agent container with requestHeaderAllowlist covering Authorization and your custom id_token header. Bedrock AgentCore Gateway with a Lambda target whose metadataConfiguration.allowedRequestHeaders includes the id_token header. The Lambda target’s tool schema has no id_token parameter. Lambda reading the id_token from context.client_context.custom[‘bedrockAgentCorePropagatedHeaders’] , performing the token exchange through sso-oidc:CreateTokenWithIAM , and calling sts:AssumeRole with ProvidedContexts to get the TIP-bearing session. Conclusion When an AI agent queries a governed lakehouse, the data layer needs to know who’s asking, not which role the agent is running under. This post showed you how to resolve that by treating the agent as an OAuth delegated actor. The user’s token travels alongside the agent’s HTTP transport but doesn’t enter the model’s context, and the token exchange that produces query-time credentials happens server-side inside Lambda, scoped to a single invocation. The three Bedrock AgentCore features that make this composable ( requestHeaderAllowlist on runtime, metadataConfiguration.allowedRequestHeaders on gateway, and bedrockAgentCorePropagatedHeaders on Lambda) are specific to building on Bedrock AgentCore. Everything downstream of Lambda is IAM Identity Center and Lake Formation functionality. If you’re building agents that read governed data, you don’t have to choose between a single over-permissioned service role and per-user code paths. The identity the data layer evaluates can be the real user, the audit trail can name the real user, and the foundation model doesn’t need to know the user’s token exists. The result is a clean separation: the user’s identity travels end-to-end, the model never sees it, and the data layer enforces it exactly as if the user queried directly. Related resources Trusted Identity Propagation with AWS IAM Identity Center AWS Lake Formation User Guide Amazon Bedrock AgentCore Runtime custom headers Amazon Bedrock AgentCore Gateway header propagation RFC 7523 – JWT Bearer Profiles for OAuth 2.0 Amazon Bedrock AgentCore Runtime A2A protocol contract If you have feedback about this post, submit comments in the Comments section below. Thiyagarajan Mani Thiyagarajan is a Sr. Delivery Consultant at AWS. With over 20 years of experience, he architects modern data platforms spanning lakehouses, ingestion pipelines, and generative and agentic AI applications. He specializes in transforming legacy data ecosystems into scalable, cloud-centered architectures that unlock advanced analytics and intelligent automation for customers. Outside work, he enjoys time with family and riding bikes. Mihir Borkar Mihir is a Senior Solutions Architect at AWS, partnering with ISVs to build and scale their platforms. With a decade of experience across data architecture and delivery, his background in enterprise-scale engagements gives him a builder’s perspective, bridging architecture strategy with practical implementation. Outside work, he explores the latest developments in cloud technologies and AI/ML. Philippe Duplessis-Guindon Philippe is a Delivery Consultant at AWS, where he has worked on a wide range of generative AI projects, touching on most aspects from infrastructure and DevOps to software development and AI/ML. After earning his bachelor’s in software engineering and a master’s in computer vision and machine learning from Polytechnique Montréal, he joined AWS to help customers accelerate their generative AI journeys. Umang Khambhalikar Umang is a Senior Consultant at AWS Professional Services, specializing in data and AI. He helps enterprise customers design and implement secure, governed data platforms and agentic AI solutions using services like Amazon Bedrock AgentCore, AWS Lake Formation, and AWS Glue. Umang brings over 19 years of IT consulting experience to solving complex challenges at the intersection of security, data governance, and generative AI.
aws.amazon.comOct 6, 2026extracted
Architecting resilient authentication with Amazon Cognito multi-Region replication
Your consumer identity and access management (CIAM) system is the foundation of your customer experience. It’s how users sign in, access services, and engage with your applications. As your business scales across geographies, ensuring authentication is always available becomes a core architectural requirement. However, building multi-Region authentication has traditionally required complex custom replication solutions that synchronize user data, manage consistency, and handle failover, all adding significant operational overhead. Amazon Cognito simplifies this with multi-Region replication (MRR) , which automatically replicates user pools across AWS Regions with near-real-time synchronization, built-in failover, and seamless sign-in, while keeping operational complexity and costs optimized. In this post, we show you how to prepare your user pool for MRR, provide architectural decisions and reference architectures for business to consumer (B2C), business to business (B2B), and machine to machine (M2M) use cases, and practical guidance on implementing failover strategies. Amazon Cognito MRR at a glance Amazon Cognito MRR creates a replica user pool in another AWS Region (a replica Region) that shares the same user pool ID as your primary user pool. The primary user pool (the user pool in your primary Region) remains authoritative, and its configurations (app client IDs, client secrets), user data (attributes, hashed credentials, group memberships), and external identity provider (IdP) settings are replicated to the replica with eventual consistency . The user pool in the replica Region (replica user pool) supports user authentication operations (such as sign-in, token generation and revocation) and read-only operations towards user pool configurations and user attributes (such as list users and groups and describe user pool configurations). Write operations against user pool configurations and updating user attributes aren’t enabled in the replica user pool and can only be made in the primary user pool. Amazon Cognito returns an Action temporarily unavailable error when using managed login, or an OperationNotEnabledException when using an AWS SDK for those operations. See Supported API operations in secondary Regions for a list of API operations supported in replica Regions. JSON web tokens (JWTs) and active sessions are interoperable between Regions; for example, a refresh token issued by the primary Region is accepted in the replica Region to retrieve new ID and access tokens. While this post primarily focuses on MRR architecture patterns and considerations, you can visit the following posts to learn more about MRR basics and the next-generation infrastructure behind it: Improve your application resilience with Amazon Cognito multi-Region replication Amazon Cognito unlocks advanced capabilities with next-generation infrastructure Prepare for multi-Region replication In this section, we show you architectural decisions and preparation work for a successful MRR deployment. Apply a multi-Region customer managed key Without MRR enabled, data is encrypted at rest with an AWS owned AWS Key Management Service (AWS KMS) key and encrypted in transit with TLS 1.2 and TLS 1.3 with hybrid post-quantum key exchange . Before enabling MRR, you must configure your user pool to use a customer managed key. This must be a symmetric multi-Region AWS KMS customer managed key . Architectural considerations for your KMS key: You only need to set up one replica multi-Region key for your customer managed key because Amazon Cognito MRR supports only one additional replica Region. You own the administration of the customer managed key, including key policies, rotation, and deletion. You can also consider a key rotation strategy before enabling MRR or enable automatic key rotation. Follow least-privilege principles in KMS key policy and scope the KMS key to your user pool only. You can do so by applying a condition statement: kms:EncryptionContext:aws:cognito-idp:<userpool-arn> . See the data encryption section in the Amazon Cognito developer guide for a full example key policy. Choose a multi-Region OIDC issuer In each ID and access tokens, Amazon Cognito includes a default Issuer claim in the JWT payload, referred as iss , to represent the identity provider that issued the token. The OpenID Connect (OIDC) specification dictates that the iss format must be a URL that uses https scheme and publishes a JSON metadata document about the identity provider available at the <iss>/.well-known/openid-configuration path. The metadata document must also include the JSON Web Key (JWK) document in the <iss>/.well-known/jwks.json path, which contains the signing keys to validate the token signatures for its integrity. The original issuer type follows the format as https://cognito-idp.<region>.amazonaws.com/<userpool_id> . However, this issuer URL format and the OIDC well-known metadata are regional resources. As part of the MRR capability, Cognito introduces a new multi-Region OIDC issuer type, the updated issuer, and follows the format as https://issuer-cognito-idp.<region>.amazonaws.com/<userpool_id> . This new updated issuer type replaces the original single Region type and maintains availability of the issuer endpoint regardless of the state of primary or replica Region. Based on the issuer URL format you select, your OpenID Connect discovery endpoint is hosted at <iss>/.well-known/openid-configuration and your JSON Web Key Set (JWKS) endpoint at <iss>/.well-known/jwks.json . Both original type and updated type are supported with the Amazon Cognito MRR capability. You can change the issuer type at any stage in your MRR journey, and the newly issued tokens, including those generated by refresh tokens, will reflect the most current issuer type configurations. We recommend adopting the updated issuer type. With the updated issuer type, the OpenID Connect discovery document and JWKS endpoint remain consistent and available regardless of which Region is servicing requests. This means your applications can always fetch signing keys for token verification, even during a regional impairment. To adopt the updated issuer type, update your applications and downstream dependencies to validate against the new updated iss value. If you use the aws-jwt-verify library, update to v5.2.1 or later that supports updated issuer type. Plan this as a coordinated deployment; existing ID and access tokens with the original issuer type remain valid and accepted by Amazon Cognito endpoints until they expire. When using an existing refresh token to exchange for a new set of ID and access tokens, new tokens always carry the current issuer format configuration at the time of token refresh operation, providing interoperability across two issuer formats. If you can’t immediately adopt the multi-Region issuer—for example, because downstream services or third-party integrations validate the iss claim against a hard-coded original format pattern—you can enable MRR while continuing to use the original issuer type . However, in this configuration the OIDC discovery endpoint and JWKS endpoint are tied to a single Region and might be unavailable during a regional impairment. Your multi-Region application might not be able to fetch public keys dynamically and validate token signatures. To mitigate this, it’s a good practice to implement a JWKS caching strategy in your token verification layer. Cache the signing keys locally (respecting the Cache-Control headers) so your applications can continue to validate tokens using cached keys when the JWKS endpoint is unreachable. This approach lets you benefit from MRR for user authentication while maintaining token verification continuity until you’re ready to complete the issuer migration. To learn more about the original and updated issuer types, see the Amazon Cognito user pools as an OIDC issuer section of the developer guide. Configure regional service dependencies Amazon Cognito user pools support several integrations with AWS services for extended customization functionalities. Those AWS services are regional services and must be configured independently in the replica Region, including: AWS Lambda – Lambda triggers (for example, pre-authentication, pre-token generation, and others) are invoked in different authentication stages and should be deployed in the replica Region and attached to the replica user pool to match customized behaviors in the primary user pool. When deploying Lambda triggers, you can adopt the same logic for both primary and replica user pools and access to downstream resources or set up a different logic to characterize different behaviors when requests are served in the replica Region. AWS WAF – WAF web access control lists (web ACLs) are associated to protect the user pool from unwanted requests. When accepting traffic to the replica user pool, create matching WAF web ACLs in the replica Region. Amazon Simple Notification Service (Amazon SNS) – If you send text messages (for example, SMS-based multi-factor authentication (MFA), passwordless authentication, or SMS notifications), configure Amazon SNS in the replica Region. SNS requires additional set up (origination identities, spending limits) in each Region, and sender ID registration time depends on several factors . Amazon Simple Email Service (Amazon SES) – If you use Amazon SES for email delivery, verify sending domains and email addresses in the replica Region and configure your replica user pool accordingly. Amazon CloudWatch – If you export user activity logs from Amazon Cognito to a CloudWatch log group, or monitor service quotas in CloudWatch, configure alarms and analytics accordingly. Use infrastructure-as-code tools like AWS CloudFormation or AWS Cloud Development Kit (AWS CDK) to maintain consistent configurations and deployments across Regions and environments. You should also monitor for any configuration drifts between assets. Consider automatic domain failover For authentication use cases that rely on managed login and OAuth 2.0 endpoints—including federated authentication and M2M authorization—Amazon Cognito supports automatic failover to the replica Region with an Amazon Route 53 health check . Cognito uses the health status of Route 53 health check to control whether traffic routes to the primary or replica user pool. The health check can be set up to monitor the health of an endpoint, a CloudWatch alarm, or a calculated number of other health checks, so you determine what triggers a healthy or unhealthy state and can adjust traffic routing as needed. Both the Amazon Cognito prefix domain (for example, auth.us-east-1.amazoncognito.com ) and custom domain (for example, auth.example.com ) support automatic domain failover. Your domain serves as the single entry point for the user pool OAuth 2.0 endpoints and directs traffic to the managed login pages. Cognito automatically fails over domain traffic to the replica Region when a Route 53 health check becomes unhealthy and fails back to the primary Region when the check is healthy. You don’t need to create another prefix domain in the replica user pool for failover use cases. With the automatic failover capability, you can use a single domain to serve external IdP configurations, including redirect URIs and SAML assertion consumer URLs. For example, use https://auth.example.com/saml2/logout to send SAML 2.0 sign-out responses. Because the domain can serve traffic to both the primary and replica Regions and remains unchanged across Regions, your external IdP configurations stay consistent across Regions, and existing federated users continue to authenticate without disruption. This means that you can enable MRR without having to contact external IdP admins to update configurations; all existing configurations will continue to work. For SDK-based authentication use cases without managed login, a custom domain isn’t strictly required. We recommend configuring a custom endpoint for SDK requests to simplify failover orchestration, so you don’t have to modify the Region parameter in the SDK configuration. Behind your custom endpoint, you can use the same Route 53 health check or a custom load balancing strategy to proxy API requests to primary or replica Region endpoints. You might also consider load balancing user authentication traffic, by referring to an X-Amz-Target HTTP header (for example, X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth ), to both the primary and replica Regions, while keeping user sign-up operations in the primary Region. If you use both managed login and SDK authentication in the same user pool, you can consider using the custom domain as the custom endpoint of the SDK for a streamlined operation, where Route 53 health check initiates failover and failback between the primary and replica Regions. Plan for TOTP MFA alternatives Time-Based One-Time Password (TOTP) MFA isn’t supported in replica user pools. Users configured to use TOTP MFA must authenticate through the primary Region. If your application relies on TOTP as a second factor, this limitation requires careful planning because you want to enable an alternative MFA for your users, such as SMS OTP, email OTP, or passkey. Review quotas When you activate a replica user pool, you gain a separate set of default quotas in the replica Region. Previously reserved higher quotas for your user pool in the primary Region aren’t carried over to the replica Region. Data sovereignty When selecting a replica Region for your user pool, consider your organization’s data sovereignty and residency requirements, as user identity data will be replicated to and stored in that Region. For guidance on navigating compliance, continuity, and control obligations that may influence your Region selection, see Practical digital sovereignty: Navigating the pillars of compliance, continuity, and control . Reference architectures In this section, we show you reference architectures for common authentication patterns using the Amazon Cognito MRR capability. Each architecture demonstrates how Cognito MRR works with different authentication use cases. Managed login and federation Amazon Cognito managed login provides a fully managed authentication UI that handles sign-in, sign-up, and federation flows. With MRR, managed login endpoints are served from the healthy user pool based on your Route 53 health check configuration. Managed login also includes OAuth 2.0 endpoints and can be used with local Cognito accounts and federated users. Figure 1 depicts a reference architecture for using managed login to authenticate Cognito users. Figure 1: Cognito MRR reference architecture for managed login and federation use cases When using Amazon Cognito with managed login, the process flow is: The user visits the application and is redirected to the managed login to begin the authentication flow. Managed login uses the Route 53 health check to control traffic routing. If the health check returns a healthy status, all traffic to the managed login flows to the primary Region user pool for user authentication. For a federated user, the primary Region user pool redirects the user to a federated IdP or social IdP for authentication. After successful authentication, Amazon Cognito creates or updates user attributes depending on whether it’s a new user signing in for first time or an existing user. If the health check returns an unhealthy status, all traffic to the managed login flows to the replica Region user pool. Cognito users will authenticate against the replica user pool. The replica Region user pool endpoint redirects federated users to external IdPs. However, any user creation or attribute update against replica user pool will fail until the health check returns healthy and traffic routes back to the primary Region. M2M architecture In an M2M architecture, services authenticate using the OAuth 2.0 client credentials grant. This flow doesn’t involve users; instead, backend services exchange client credentials for access tokens. Figure 2: Cognito MRR reference architecture for machine-to-machine use case The authentication flow is: Application clients send a POST request to the Amazon Cognito /token endpoint with client credentials. Managed login uses the Route 53 health check to determine whether traffic should flow to the primary or replica user pool. If the health check returns a healthy status, traffic to the /token endpoint will flow to the primary Region user pool. If the health check returns an unhealthy status, traffic to the /token endpoint will flow to the replica Region user pool. After the health check returns to a healthy status, traffic will return to routing to the primary user pool. SDK-based architecture For applications that use AWS SDK or Amazon Cognito APIs directly (rather than through managed login), the authentication flow is embedded in your application code. This gives you more control over the user experience but requires additional considerations for failover. Figure 3: Cognito MRR reference architecture for SDK use cases The process shown in Figure 3 is: The user visits the application and signs in through a custom UI (using APIs or SDKs). (Optional) An Amazon Route 53 health check is configured to perform a health check against regional proxy endpoints and determine traffic routing. You can also use a custom health check or your DNS resolver to make traffic routing determinations. If the health check returns a healthy status, all traffic to the proxy endpoints will flow to the primary Region proxy for user authentication. You can also choose to load balance user authentication traffic across both the primary and backup Regions. The primary Region Amazon API Gateway proxy forwards user requests to the Amazon Cognito regional endpoint. If the health check returns an unhealthy status, all traffic will flow to the replica Region proxy. The replica Region API Gateway proxy begins forwarding user requests to the Amazon Cognito regional endpoint until the health check returns to healthy status. In an SDK-based architecture, Amazon Cognito regional endpoints can also be called directly. You can also set up custom routing to use replica Region endpoints to load balance user authentication requests by routing read-only requests to both the primary and replica Region endpoints while keeping write requests in the primary Region. Failover strategies Now that you’ve set up multi-Region replication with Amazon Cognito, the next step is to test and monitor your multi-Region configuration. In this section, we walk through strategies for monitoring your endpoints, determining when to trigger failover, and testing your failover readiness. Monitor with Route 53 health checks Failover for Managed Login and all OAuth 2.0 flows is driven by Amazon Route 53 health checks associated with your Amazon Cognito prefix or custom domain. You’re responsible for what determines the state of this health check. The health check isn’t tied to your DNS CNAME record but is the signal that tells Amazon Cognito whether to route traffic to the primary or replica Region for all managed login endpoints. When the health check fails, Amazon Cognito routes traffic to the replica user pool. When the health check recovers, traffic is restored to the primary user pool. A practical approach to get started to build a health check: Create a synthetic canary – Use Amazon CloudWatch Synthetics to run a canary that periodically exercises an actual authentication flow against your primary Region. For example, the canary can perform a client credentials token request against your Amazon Cognito domain’s /oauth2/token endpoint or execute a full AdminInitiateAuth API call with test credentials. This validates that the end-to-end authentication path is functional, not just that an endpoint is responding. Tie the canary to a CloudWatch alarm – Configure a CloudWatch alarm on the canary’s SuccessPercent CloudWatch metric . Set a threshold that accounts for transient errors (for example, alarm when success drops below 90% for three consecutive evaluation periods). Connect the alarm to your Route 53 health check (optional) – Create a Route 53 health check that monitors the CloudWatch alarm. When the alarm enters the ALARM state, the health check fails, and Amazon Cognito routes traffic to the replica user pool. If you prefer to rely on human intervention, skip this step and instead configure the CloudWatch alarm alert your operations team to manually invert the health check. After you have your health check, associate it with your Amazon Cognito domain using the UpdateUserPoolDomain API or the Amazon Cognito console. Authentication-only compared to full-stack failover Before implementing failover, consider how your authentication layer relates to the rest of your application stack. There are two common patterns: Authentication-only failover – Your application remains in a single Region, but authentication traffic fails over to the Amazon Cognito replica if only the primary Region’s authentication service is impaired. This works when your application can continue operating with tokens already issued (for example, cached JWTs, active sessions) and when downstream APIs don’t depend on the same Region as your user pool. Consider this option when the rest of your stack has its own availability model. Full-stack failover – Your entire application—compute, data stores, APIs, and authentication—fails over to a replica Region. In this model, Amazon Cognito MRR is one component of a broader multi-Region architecture where authentication flows have tight dependencies on regional resources (such as Lambda triggers calling regional Amazon DynamoDB tables, or post-authentication logic writing to a regional event bus) that must be co-located with the user pool. Use Amazon Application Recovery Controller (ARC) to coordinate failover across all components with a single action. ARC provides three capabilities that are particularly relevant for multi-Region authentication architectures: Routing controls – Extremely reliable data plane controls that let you shift DNS traffic across Regions, with safety rules that prevent partial or unintended failovers (for example, preventing you from failing over authentication without also failing over the dependent API layer). Readiness checks – Continuous monitoring of resource quotas, capacity, and network routing policies in your secondary Region, so you have confidence that the replica environment—including your Amazon Cognito replica user pool and its regional dependencies—can handle production traffic before you failover. Region switch – Centralized, automated, and observable multi-Region recovery orchestration across multiple AWS accounts and resources, so you can execute a coordinated failover of your Cognito user pool alongside databases, compute, and APIs in a single recovery plan. ARC is particularly valuable when your Amazon Cognito Lambda triggers, WAF rules, SNS and SES configurations, and downstream services all need to switch Regions in lockstep. Rather than managing failover for each component independently, you can use ARC to define a single recovery group that treats your authentication stack and application stack as one unit. To learn more about the capabilities and use cases of ARC, see Introducing Amazon Route 53 Application Recovery Controller . The right choice depends on your recovery scope. Map the dependencies in your authentication flow: if your Lambda triggers call regional DynamoDB tables or your post-authentication logic writes to a regional event bus, those tight couplings point to full-stack failover. If your application validates tokens independently and doesn’t make real-time calls back to Amazon Cognito after token issuance, authentication-only failover keeps both your blast radius and operational overhead smaller. Determine when to failover Triggering failover too aggressively risks unnecessary disruptions; too conservatively risks a drop in desired availability. Here are the factors to balance: Monitor authentication flow health – Validate that critical flows are functioning, including managed login endpoint availability and token endpoint responses. Use composite health checks – Combine multiple signals. For example, require both the managed login and token endpoints to be healthy. Set appropriate thresholds – Configure failure thresholds (for example, three consecutive failures) to distinguish transient errors from genuine impairments. Consider downstream dependencies – Factor in Lambda triggers, external IdPs, and other regional services. Client side retry logic – For SDK-based single-page application (SPA) architectures, consider implementing client-side retry logic with Region failover. When the primary Region is unavailable, your application should detect the failure and redirect authentication of API calls to the replica Region’s Amazon Cognito endpoint. Understanding and determining the recovery time objective (RTO) and recovery point objective (RPO) should also be the key factor in determining when and why to failover. See the Establishing RPO and RTO Targets for Cloud Applications blog post to learn more. Test failover readiness If using Route 53 health check, start by manually inverting your Route 53 health check during a maintenance window. In the Route 53 console, enable Invert health check status to force the health check into a failed state; this triggers failover to the replica Region without requiring any infrastructure changes. While traffic is routing to the replica Region, validate that your critical authentication flows (sign-in, token refresh, federation) work correctly, then disable the inversion to restore traffic to the primary. This test confirms your end-to-end failover path is functional. When you’re confident in the basic failover path, graduate to more realistic failure simulations with AWS Fault Injection Service (FIS) . Create FIS experiment templates that disrupt your primary Region’s Amazon Cognito dependencies; for example, block network access to a dependent resource or inject latency into downstream API calls. Use FIS stop conditions (guardrails) to automatically halt experiments if unexpected impacts are detected. These experiments validate not just that failover triggers correctly, but that your replica Region handles real authentication load under degraded conditions. We recommend conducting failover tests on a predefined and regular cadence and after any significant changes to your authentication architecture. Document your runbooks and make sure your operations team is familiar with both the failover and recovery procedures. Conclusion In this post, we built on the foundational knowledge of the Amazon Cognito MRR capability and showed you how to architect resilient authentication for real-world use cases: Preparation considerations – Multi-Region KMS keys, OIDC issuer transitions, regional dependencies, and TOTP MFA considerations Reference architectures – B2C, B2B, and M2M patterns using managed login, plus SDK-based approaches Failover strategies – Route 53 health checks, ARC integration, and testing with health check inversion and AWS FIS To get started, make sure your user pool is on the Essentials or Plus feature plan , configure your multi-Region KMS key and OIDC issuer, and create your first replica. For step-by-step setup instructions, see Multi-Region replication for user pools If you have feedback or thoughts about this post, submit comments below. If you have questions, start a new thread on Amazon Cognito re:Post or contact AWS Support . Abrom Douglas III Abrom is a Senior Solutions Architect within AWS Identity with over 20 years of software engineering and security experience, specializing in identity and access management. He loves speaking with customers about how identity and access management can provide secure outcomes that enable both business and technology initiatives. In his free time, he enjoys cheering for Arsenal FC, photography, travel, volunteering, and competing in duathlons. Edward Sun Edward is a Senior Security Specialist Solutions Architect focused on identity and access management. He loves helping customers throughout their cloud transformation journey with architecture design, security best practices, migration, and cost optimizations. Outside of work, Edward enjoys hiking, golfing, and cheering for his alma mater, the Georgia Bulldogs.
aws.amazon.comSep 15, 2026extracted
Leaked n8n API Tokens Exposed Live Instances to Credential Theft
GitGuardian researchers found 321 n8n instances accepting API tokens exposed in public GitHub commits and demonstrated four ways attackers could use them to access sensitive data and downstream credentials without exploiting a software vulnerability. We scanned public GitHub commits for exposed n8n API tokens and identified 4,576 unique credentials associated with 1,255 hostnames. Of the 896 instances reachable at the time of testing, 321 accepted at least one leaked token. That means leaked credentials provided authenticated access to 36% of the reachable instances we tested, or roughly 26% of all hostnames identified in the commits. The implications extend well beyond n8n. Organizations use the automation platform to connect databases, source code repositories, cloud environments, artificial intelligence services, customer support platforms, and other internal systems. A sufficiently privileged n8n token can expose workflow definitions and execution data, allow attackers to use stored credentials, and, in some configurations, enable them to extract the underlying credential values. To measure the potential blast radius, we reproduced four practical attack techniques in a controlled n8n environment. Each required only documented REST API functionality and standard HTTP requests. No CVE exploitation or specialized tooling was necessary. Why n8n is a high-value target n8n is an open-source, low-code workflow automation platform with AI agent support and hundreds of built-in integrations. Organizations use it to connect internal tools, automate pipelines, implement business logic, and orchestrate API integrations across their technology stacks. The platform can be self-hosted or deployed through n8n.cloud, and its open-source repository has attracted nearly 200,000 GitHub stars. An n8n instance runs workflows composed of nodes. Some nodes trigger workflows on a schedule or through webhooks, while others transform data, execute code, or connect to external services using stored credentials such as API keys, tokens, and database passwords. Those credentials are encrypted at rest using a master secret called N8N_ENCRYPTION_KEY. But n8n still needs to decrypt and use them whenever a workflow runs. An attacker with sufficient API privileges may therefore be able to reference those credentials in new workflows and make the instance use them on the attacker's behalf. With more than 100,000 instances visible through Shodan and more than 50 security advisories published since January 2026, n8n has attracted the same attention as other high-value integration platforms. As of March 31, 2026, 58% of the instances we scanned were running a version affected by at least one known security advisory. Several recent CVEs allowed attackers to escape execution sandboxes and gain arbitrary read or write access to the host filesystem. CVE-2025-68613, an expression injection vulnerability with a CVSS score of 9.9, was added to the U.S. Cybersecurity and Infrastructure Security Agency's Known Exploited Vulnerabilities catalog on March 11, 2026, confirming exploitation in the wild. Leaked API tokens create a separate risk. An attacker does not necessarily need to exploit an n8n vulnerability if a valid credential already provides authenticated access to the instance. We found 321 instances accepting leaked tokens GitGuardian Public Monitoring scans public sources for exposed credentials. For this research, we collected every n8n API token it had identified in public GitHub commits since April 2025. Our pipeline extracted the n8n hostname committed alongside each token, sent a read-only validation request to the associated instance, and recorded the response. The scan produced: The 321 confirmed instances represent approximately 36% of the 896 reachable instances and 26% of all 1,255 hostnames identified in the commits. We ran the same process against n8n Model Context Protocol API keys found in the same commit set. MCP tokens allow AI assistants to call n8n workflows through the Model Context Protocol, making them a newer exposure surface than the REST API. Of 372 MCP tokens identified, seven were still valid at the time of testing, or roughly 2%. Why leaked n8n tokens can remain valid An n8n API key is a signed JSON Web Token with an "aud": "public-api" audience claim. A decoded token looks like this: { "sub": "efdf9cca-049a-46aa-afdc-172f0824f6cb", "iss": "n8n", "aud": "public-api", "jti": "aac8a7a8-c8c4-4855-8e8b-2806e90b16e1", "iat": 1781551662 } The token records its issuance time in the iat claim. Older n8n API keys frequently contain no exp claim defining when they expire. n8n introduced a 30-day default expiration in version 1.78.0 in February 2025, but many of the tokens found during the research had been generated without an expiration date. A key committed to GitHub months earlier could therefore remain usable until someone explicitly deleted or revoked it. In practice, n8n API keys behave differently from self-contained JWTs that can be validated using their signatures alone. The key must also still exist in the n8n database. A token exposed in GitHub remains dangerous as long as the instance continues to recognize it. Testing a candidate token requires one read-only request with the key passed through the X-N8N-API-KEY header: curl -s -o /dev/null -w "%{http_code}" \ -H "X-N8N-API-KEY: " \ https://n8n.example.com/api/v1/workflows GET /api/v1/workflows returns workflow definitions available to the authenticated user. A 200 response confirms that the token is accepted. A 401 indicates that the token is invalid, has been removed from the database, or failed signature verification. A 404 can indicate that the public API is disabled on the instance. The request makes no changes to the target instance. The instance URL is often committed beside the token An n8n API key is useful only when an attacker can identify the instance that accepts it. In public GitHub commits, however, the hostname and token frequently appear together. A .env file is one common example: N8N_URL="http://n8n.redacted.cloud:5678" N8N_API_KEY="eyJhREDACTEDPWw4" We also found a newer pattern associated with Claude Code permission files. Claude Code can store permitted shell commands in .claude/settings.json or .claude/settings.local.json. When users configure Claude Code to interact with n8n, they may place both the instance URL and API key directly inside an approved curl command. Bash(curl -s "https://automation.redacted.fr/api/v1/workflows" \ -H "X-N8N-API-KEY: eyJhREDACTEDegE") These settings files can then be committed to a repository without the same .gitignore safeguards that developers commonly apply to .env files. The same hostname-and-token pairing appeared under several other variable names, including: N8N_MCP_URL N8N_WEBHOOK_BASE_URL process.env.N8N_URL os.getenv("N8N_HOST", "...") Because the hostname was usually available in the same commit as the token, our pipeline did not require a separate infrastructure discovery step. What an authenticated n8n token exposes An n8n API token provides access according to the permissions of the user who created it. In practice, many of the exposed tokens appeared to belong to instance owners or administrators, likely because those were the users configuring the integrations and committing the keys. Depending on the account's role, the public REST API may expose: GET /api/v1/users : Usernames, email addresses, account creation dates, and pending invitations. Some information is restricted to instance owners. GET /api/v1/workflows : Full workflow definitions, including node configuration, JavaScript or Python code in Code nodes, SQL queries, and secrets hard-coded in workflow parameters. GET /api/v1/credentials : Credential names, types, and sharing information, but not the underlying values. This endpoint is restricted to owners and administrators. GET /api/v1/executions : Workflow execution history. Adding?includeData=true may return the complete input and output payload from each run. GET /api/v1/data-tables : Rows from tables visible to the authenticated user. GET /api/v1/variables : Variable names and their contents. This endpoint is restricted to owners and administrators. Workflow definitions create the most immediate exposure because the API returns complete node configurations. If a developer placed an API key or token directly in a node parameter rather than using n8n's credential store, the value may appear in plaintext. The credential endpoint itself does not return stored secret values. However, as our controlled tests demonstrate, an attacker with permission to create and execute workflows may be able to reference a stored credential and make n8n use or transmit it. The audit endpoint provides an attack map n8n's audit endpoint can provide an authenticated user with a security report for the instance: curl -H "X-N8N-API-KEY: $JWT" \ -d "{}" \ -H "Content-Type: application/json" \ https://$N8N_INSTANCE/api/v1/audit The response may identify: Potential SQL injection exposures in workflows Nodes with filesystem access Unprotected webhooks The running n8n version, which can be matched against known CVEs Unused credentials High-risk or community-installed nodes Enabled security features Node allowlists and blocklists Telemetry settings For a legitimate administrator, this information supports security reviews. For an attacker holding a leaked privileged token, it can provide a prioritized map of the instance's most promising attack paths. Four attack techniques against a fully patched instance GitGuardian did not perform the following exploitation techniques against exposed third-party systems. We reproduced them in a controlled n8n deployment built specifically for the research. The test workflow contained three deliberate weaknesses: A web form stored submissions in a data table accessible through authenticated workflows. An OpenAI node processed each submission using a stored credential object. An HTTP Request node published the output to GitHub using a token hard-coded in its node parameters. Using that environment, we demonstrated four techniques, progressing from passive enumeration to active credential exfiltration. Technique 1: Enumerating the instance GET /api/v1/users returned four accounts: the instance owner, two active users, and one pending registration. GET /api/v1/workflows returned nine complete workflow definitions. In the target workflow, the parameters of an HTTP Request node contained a GitHub token in plaintext. This first technique required no workflow modification. The exposed information was already available through read operations permitted to the authenticated account. Technique 2: Using a stored OpenAI credential GET /api/v1/credentials listed every stored credential object, including one named "OpenAI account." The endpoint revealed its name, type, and identifier, but not the API key itself. We created a workflow with a Schedule trigger and an OpenAI node referencing the credential by its ID, then activated it. Two tricks make this work. The Schedule trigger automatically fires after roughly 10 seconds, giving the workflow time to complete. GET /api/v1/executions?includeData=true then retrieves the complete execution record. Because n8n persists every node's full output, the OpenAI response appears in plaintext. We successfully ran arbitrary OpenAI prompts using the instance's stored credential without ever seeing its value. Technique 3: Reading the data table The same two tricks apply. We created a workflow with a Schedule trigger and a Data Table node configured to retrieve all rows, then activated it. GET /api/v1/executions?includeData=true returned the execution record seconds later, with every row in plaintext. Four rows were exfiltrated, including names, email addresses, form responses, and processing statuses. The workflow was then deleted. Technique 4: Exfiltrating the raw OpenAI credential The fourth technique went beyond using a stored credential and extracted its underlying value. We started an HTTP listener, then created a workflow with a Schedule trigger and an HTTP Request node. The key trick is that the HTTP Request node can use a stored n8n credential as its authentication method while sending requests to any URL. We configured the node to use the stored OpenAI credential and pointed it at our listener. When the workflow fired, n8n attached the credential value as a Bearer token in the outgoing Authorization header. The listener captured the raw API key seconds after activation. The workflow was then deleted. Together, these techniques show how an attacker can progress from a leaked n8n token to broader credential and data exposure using legitimate platform functionality: Enumerate users, workflows, and security configuration. Identify stored credential objects and hard-coded secrets. Use stored credentials without viewing their values. Read data available to workflows. Cause n8n to transmit a stored credential to attacker-controlled infrastructure. Deleting the malicious workflow also removed the associated execution records from the interface, potentially leaving defenders with limited evidence to investigate. Real-world workflows showed similar weaknesses The controlled demonstration was not based on a purely theoretical configuration. During the research, we found real n8n instances containing similarly exposed patterns. One workflow automatically backed up its own definitions to a public GitHub repository. An SSH deployment key had been hard-coded directly into one of its nodes. The repository's Git history contained earlier versions of every workflow, and the SSH key remained valid. The workflow was effectively publishing its own sensitive configuration and credentials each time it ran. The case illustrates why workflow automation platforms can create unusually large blast radii. They sit between multiple systems, process sensitive data, and routinely authenticate to external services. A weakness in one workflow can expose access far beyond the automation platform itself. Responsible disclosure produced limited responses Finding a valid exposed credential is only the first step. The risk remains until the affected organization revokes it and addresses any downstream exposure. We attempted responsible disclosure with seven organizations: Three hosting providers collectively associated with approximately 100 affected instances Four individual companies One hosting provider did not respond. Three of the four individual companies also did not respond. One company operated a bug bounty program, acknowledged the report, paid a $1,200 bounty, and revoked the credential immediately. That combination of recognition and rapid remediation was the exception. GitGuardian also made several disclosures directly to n8n during the research. n8n acknowledged the reports, said it was aware of the issues and planned to address them, and subsequently closed the reports. At the time of publication, GitGuardian had not independently confirmed that the related fixes had been released. Approximately 30% of the 321 affected instances were hosted on n8n.cloud or similar managed services. GitGuardian Public Monitoring already identifies exposed n8n API tokens and notifies affected developers through the company's Good Samaritan disclosure program. The findings also led GitGuardian to update its n8n API key detector and validity checks to improve detection accuracy. Takeaways A leaked n8n token is not an isolated credential exposure. A sufficiently privileged token can expose workflow definitions, hard-coded secrets, execution data, and internal tables. It can also allow an attacker to use stored credentials or, by creating a workflow that sends them to an external endpoint, extract their underlying values. No CVE or specialized tooling was required in our controlled tests. A few standard HTTP requests were enough to move from an exposed token to sensitive data and downstream credential access. An attacker could then delete the workflow and its associated execution records, leaving defenders with limited evidence inside n8n itself. Revoking the exposed n8n token is the first step, but it may not be the last. Organizations should determine which workflows, data, and downstream credentials the account could access, review the instance for unauthorized changes, and rotate connected credentials where exposure cannot be ruled out. Automation platforms create a particularly large blast radius because they sit at the center of an organization's integrations. A single token can provide a path toward source control, databases, cloud services, AI APIs, support platforms, and customer data. The risk is defined not only by the n8n instance, but by every system connected to it. About the author: Guillaume Valadon is a Staff Cybersecurity Researcher at GitGuardian, the secrets visibility and intelligence platform for securing the credentials that let code, machines, and AI agents access systems and act as trusted identities. Because attackers do not need to break in when they can log in with a valid credential, GitGuardian finds the secrets that matter across the whole secrets surface, inside and outside the perimeter, whether they are vaulted, stored, or leaked. It reveals their context and blast radius, then drives remediation at scale before one credential becomes a breach path. Trusted by 600,000+ developers and enterprises, including Snowflake, ING, BASF, Datadog, Qlik, Euronext, and Orange.
thehackernews.comAug 5, 2026extracted
n8n Token Exchange Flaw Could Let Attackers Log In as Users From Another Issuer
n8n, the workflow automation platform, handed out the wrong accounts at login. On Enterprise instances configured to trust more than one external token issuer, it matched an incoming JWT to a local user on the sub claim alone and ignored iss. A valid token from issuer A carrying a sub that belongs to someone under issuer B logged you in as them. Their password never came into it. n8n shipped the fix on June 24. The flaw is tracked as CVE-2026-59208. The CVE record did not go public until July 9. n8n credits the report to the GitHub account bearsyankees, whose profile lists Strix, which makes an AI penetration testing agent. Strix says it pointed out that the agent at the token-exchange flow and found the identity-binding bug there. Two issuers, one account Token exchange is n8n's Enterprise route for OEM partners who embed the product, an RFC 8693 implementation that spares their users a second login screen. The partner signs a short-lived JWT with its own key, n8n verifies it against a configured public key, matches the claims to a local account, and the user is in. Trusted keys go in N8N_TOKEN_EXCHANGE_TRUSTED_KEYS, and the deployment docs still tag the feature as preview. The token itself checks out. The matching is the bug. A sub value is only guaranteed to be unique inside the issuer that minted it. RFC 7519 asks that it be "scoped to be locally unique in the context of the issuer" or else globally unique. The identifier for a user is therefore the pair, iss plus sub. n8n keyed on half of it. Nothing stops two issuers from emitting the same subject string, and when they do, both land on one n8n account. How big a deal is this The flaw reaches an instance only if token exchange is switched on and the config trusts at least two external issuers. n8n says nothing else is affected. Token exchange is Enterprise-only and still flagged as a preview, so the exposed set is small and specific: OEM deployments, where trusting a second issuer is a supported configuration. What the advisory does not pin down is how an attacker gets the token. It says only that they can obtain one. The practical question is whether an ordinary user at a trusted issuer can influence the sub they receive. The public record does not answer it. GitHub's CVSS 4.0 vector marks attack requirements as present and stops there. GitHub assigned that vector. As the CNA here, it puts CVE-2026-59208 at 7.6 on CVSS 4.0, high. NVD puts the same bug at 6.8 on CVSS 3.1, medium, and has not issued a 4.0 assessment at all; its record carries CWE-287 and CWE-346. CISA's July 13 SSVC assessment records exploitation as none, and The Hacker News found no public proof-of-concept in searches on July 16. Two weeks before the June 24 fix, the maintainers patched CVE-2026-54305, another Enterprise-only flaw. It lets any authenticated user overwrite or revoke another user's stored OAuth tokens through the Dynamic Credentials endpoints. That one was a missing ownership check, not an identity binding. Different bug, same surface. The Hacker News has reached out to n8n for confirmation on the scope and impact of CVE-2026-59208 and will update this story with any response. Patch or cut the issuer list CVE-2026-59208 affects every n8n release below 2.27.4 and version 2.28.0. The fix first landed in 2.27.4 and 2.28.1. Those are the floor. On July 16, n8n's npm package carried 2.30.6 on both its latest and stable tags. It ships a new minor most weeks by its own account, so check the tag and take the newest stable build your deployment supports. If patching has to wait, work out what you are running: N8N_TOKEN_EXCHANGE_TRUSTED_KEYS holds the trusted signing keys, and a separate preview flag controls whether token exchange is on at all. Cut back to a single trusted issuer, or turn the feature off. The advisory calls both short-term measures and says neither fully remediates the risk. That is boilerplate, identical in at least three other n8n advisories, including the June 10 one. By n8n's own scope statement, an instance with token exchange off is not affected. Neither release note mentions the fix. The Hacker News checked both: between them, the 2.27.4 and 2.28.1 changelogs cover a Python import fix, a Google Ads node upgrade, an AI workflow check, and a node-building change, and nothing about identity. The advisory is where this one lives. If your upgrade decisions run on changelogs, this is the kind of fix that slips past.
thehackernews.comJul 16, 2026extracted
Red Hat extends open source technology into space
Red Hat extends open source technology into space Red Hat and Voyager Technologies announced the successful deployment of Red Hat Enterprise Linux 10.1 and Red Hat Universal Base Image (UBI) to Voyager’s LEOcloud Space Edge IaaS Micro Datacenter aboard the International Space Station (ISS). This collaboration extends a container-optimized, enterprise Linux platform into orbit, providing a more consistent and hardened operating foundation for AI-ready workloads to run in space. The milestone advances the evolution of space-based cloud services and orbital data centers (ODCs), delivering a security-enhanced operating foundation for real-time processing at the edge. As commercial and government organizations increase their reliance on space-based data, the ability to process data in orbit is increasingly critical. Running Red Hat Enterprise Linux on the Space Edge Micro Datacenter enables workloads to operate at the data source, reducing latency and operational costs while supporting a more proactive security posture for edge environments. Addressing orchestration constraints of spaced-based computing The emergence of Orbital Data Centers (ODCs) requires open innovation and extreme resilience. This collaboration addresses the unique challenges of space-based environments by optimizing for limited power and constrained hardware resources, managing data processing across delayed or disrupted network conditions, and delivering a hardened, enterprise-grade Linux foundation. By integrating these orbital workloads with existing terrestrial DevSecOps practices, Red Hat and Voyager can help organizations extend their hybrid cloud footprint with greater consistency and operational confidence. Red Hat and Voyager are laying the foundation for a new era of space-based computing, where cloud capabilities extend more consistently from Earth to low earth orbit (LEO), the lunar region and beyond. This approach helps organizations extend existing DevSecOps practices, container strategies and proactive security postures across emerging operational domains with greater operational alignment. A durable foundation for IT innovation The deployment of Red Hat Enterprise Linux 10.1 and Red Hat UBI addresses the extreme operational demands of low earth orbit through several core technology pillars: Immutable, container-native operations: By utilizing image mode, Voyager deploys a consistent, immutable operating system that resists configuration drift in harsh space conditions. Soft-reboots help minimize downtime for mission-critical space applications. Quantum-resistant security: NIST-approved, post-quantum cryptography helps safeguard sensitive data, providing a strategic and durable security posture for the edge of space. Portable workloads: Red Hat UBI provides a lightweight, container image foundation that reduces resource overhead on constrained space hardware. This enables a more portable environment for space partner integrations while maintaining a hardened, enterprise-grade Linux footprint. Hybrid cloud extension to space: Voyager extends DevSecOps practices to orbit using Podman as the container engine and Ansible Automation Platform, with containerized applications running from ground to orbit and AI-optimized tooling. “Space is the next frontier for hybrid cloud, where success depends on having a trusted, resilient cloud infrastructure wherever data is generated. Together with Voyager, we’re extending trusted open source technology into space, enabling organizations to process data in orbit and act faster with greater confidence,” said Travis Steele, chief architect of Air and Space Forces, Red Hat. “With Space Edge on the ISS, we are executing on our pathfinder vision and strategy to extend cloud services into space, providing the end user the same experience as if they are using the terrestrial cloud infrastructure. End users can now extend their terrestrial enterprise to process data where it’s generated, in space, unlocking faster insights and greater operational resilience with Red Hat,” noted Matt Magaña, president, Space, Defense & National Security, Voyager.
helpnetsecurity.comMay 11, 2026extracted
Cristoforetti (ESA): “Uno dei pilastri dell’ESA è la connettività sicura, con il progetto Deloitte-Spire otto satelliti di Cyber Protection”
Alla 2^ edizione di Space&Underwater – la Conferenza internazionale del quotidiano Cybersecurity Italia, ospitata presso la Caserma dei Carabinieri “Salvo D’Acquisto” di Roma, è intervenuta la celebre astronauta italiana dell’Agenzia spaziale europea (ESA), Samantha Cristoforetti, che ha raccontato le ultime attività dell’Agenzia e in particolare quanto accaduto al recente Consiglio ministeriale dell’Esa a Brema. “Un evento per lo spazio europeo molto importante, forse il più importante, una conferenza che si tiene ogni 3 anni ed è il momento in cui i nostri stati membri aprono il cordone della borsa il più possibile, a fronte, naturalmente, delle proposte di programmi che noi presentiamo e le richieste di budget degli associati, cioè decidono quanti soldi dare all’ESA e in base ai soldi che riceviamo, noi abbiamo la possibilità di andare nella fase di implementazione. È già stato menzionato il ministro con la delega allo Spazio per l’Italia Adolfo Urso, che nella foto ufficiale di fine Conferenza è accanto al Direttore Generale dell’Agenzia Josef Aschbacher, e alla ministra ospitante della Ricerca, della Tecnologia e dello Spazio, Dorothee Baer, che, piccola curiosità, è la prima volta, in Europa sicuramente, forse al mondo, che c’è un ministero che ha il riferimento allo Spazio nel nome, su cui la Germania ha messo molta enfasi, enfasi che è stata riflessa anche con i contributi, con la famosa apertura dei cordoni della borsa. È stato anche detto che l’Italia ha avuto una sottoscrizione complessiva intorno ai 3 miliardi e mezzo, molto simile a quella francese, mentre la Germania ha aumentato di molto il suo contributo, è sempre stato il primo paese contributore, ma quest’anno ha messo sul tavolo intorno ai 5 miliardi, quindi chiaramente è un paese che ha anche un po’ più di margine fiscale rispetto ad altri e quindi sono riusciti davvero ad incrementare significativamente la loro sottoscrizione. Vicino alla ministra Baer c’è anche il commissario europeo alla Difesa e allo Spazio, Andrius Kubilius, anche questa è una novità recente della nuova Commissione von der Leyen. Il budget complessivo dell’ESA, per il prossimo triennio, sarà di 22,3 miliardi di euro e la prossima Conferenza ministeriale dell’Agenzia si terrà nel nostro Paese”, ha detto Cristoforetti. Altro elemento di rilievo che è stato presentato alla ministeriale per la prima volta quest’anno è il programma European Resilience from Space (ERS), che è un programma di tipo cross domain: “Noi in ESA normalmente siamo strutturati con i direttorati di osservazione della Terra, chi fa la navigazione, chi fa la comunicazione sicura, chi fa l’esplorazione. Questo è un programma che invece è tematico, su questioni di resilienza e sicurezza, che va ad abbracciare le attività di più direttorati, più domini. In particolare – ha sottolineato Cristoforetti – i tre pilastri che andiamo a toccare con ERS sono Earth Observation, PNT – Precision Navigation and Timing e Secure Connectivity. Earth Observation, quindi l’osservazione della Terra, è uno di quei domini in cui, rispetto magari a tanti altri dove in Europa abbiamo un pochino da recuperare rispetto ai grandi player globali, siamo messi abbastanza bene, abbiamo una flotta di satelliti per l’osservazione della Terra che sicuramente è world class e continueremo a migliorare, perchè l’osservazione della Terra ha avuto diversi miliardi di budget e quindi continueremo a sviluppare la prossima generazione di satelliti per l’osservazione della Terra, per la meteorologia, per il monitoring del climate chang. Però, rispetto al pilastro ERS, l’idea è di cercare di fare un early technology development, quindi iniziare adesso nel 2025 lo sviluppo di tecnologie necessarie per poi andare ad implementare a partire dal 2028, quando verrà messo in piedi quello che la Commissione chiama EOGS, Earth Observation Governmental Services. Credo che sia un approccio positivo, perché le esigenze di osservazione della Terra, ma anche di connettività, ma anche di PNT, rispetto alle esigenze sovrane, se vogliamo, e di sicurezza, sono chiaramente riconosciute dalla Commissione nella proposta dell’MFF, il Quadro Finanziario Pluriennale, dove il commissario Kubilius ha rischiesto 130 miliardi tra Spazio e Difesa, quindi un aumento molto significativo rispetto al passato. Succede adesso, ma se ne parlerà nel 2028, quindi, l’idea, questo lavoro di coordinamento tra ESA e l’Unione, è quella di anticipare il più possibile con le attività di sviluppo tecnico tra il 2025 e il 2028, in questo ciclo di ministeriale, queste attività di sviluppo. Questo è uno dei pilastri”. Altro pilastro fondamentale dell’ESA, ha proseguito Cristoforetti, è federare le tante iniziative nazionali in corso, metterle a sistema per moltiplicare le capacità federali: “C’è la dimensione LEO, Low Earth Orbit. Noi tutti, immagino, conosciamo i satelliti di Galileo, sono dei satelliti situati in orbite medie, quindi intorno ai 20.000 km. Il prossimo step di sviluppo, di miglioramento di queste capacità GNSS, quindi di posizionamento, navigazione e timing, è introdurre un layer in orbita bassa. Quindi, intorno ai 400-500 km. Questo non per andare a sostituire la costellazione Galileo LEO, ma per andare ad aumentarne la capacità, quindi avere dei segnali che sono molto più forti, più precisi e, forse, molto più resistenti a potenziali interferenze ostili. Credo che il tema del GPS jamming sia molto attuale. Ecco, dei segnali che vengono in qualche modo aumentati da un layer in orbita bassa sono molto più difficili da interferire con questo tipo di segnale. E questo è il secondo pilastro”. Il terzo pilastro che ha spiegato l’astronauta italiana dell’ESA è la connettività sicura: “Sicuramente tutti quanti conoscerete Iris², che è il progetto dell’Unione per la connettività sicura. ESA ha avuto un finanziamento per anticipare alcuni sviluppi di eh tecnologia, ma anche per iniziare a pensare a quella che può essere l’evoluzione di Iris², un po’ un tentativo di sviluppare delle modalità di connessione inter-satellitari degli assetti di navigazione, degli assetti di PT, degli assetti di comunicazione, degli assetti di esplorazione della terra, in modo che possano in qualche modo parlarsi, scambiare informazioni e aumentare sia l’efficacia e il beneficio in termini di servizio all’utente, sia, anche qui, la resilienza in caso di attività di disturbo e di attività ostili. Deloitte ha annunciato accordo un accordo con Spire, che è una startup americana che ha più o meno 100 piccolissimi satelliti in orbita, con i quali studiano le interferenze, le modifiche delle comunicazioni in radiofrequenza e facendo questo riescono a fornire numerose informazioni che ci possono essere sul weather, o di sicurezza, quindi offrono dei servizi di grande utilità agli utenti con una piccola flotta di piccolissimi satelliti. Spire si è associata a Deloitte, per lanciare otto satelliti di Cyber Protection, quindi dei satelliti che dovranno essere in orbita e in qualche modo monitorare eventuali attività di cyber interferenza, cyber attacchi”. “Sono contenta che abbiamo gli Space X in Europa. Vediamo tutti questi piani, anche molto complessi, però sono sempre attività di tipo top down. Mi chiedo se sarà l’approccio giusto. Queste attività bottom up forse sono quelle che ci portano quella capacità di innovazione, quella capacità di risposta, quella agilità che in alcuni settori magari in Europa ci sono un po’ mancate e che forse un pochino continuano a mancare. Io non ho una risposta, ma è un tema su cui confrontarsi, per cercare di introdurre elemento di diversificazione nel panorama industriale. Un altro segnale positivo arriva dal settore dei lanciatori – ha affermato Cristoforetti – abbiamo riacquisito capacità sovrana europea di lanciare satelliti nello Spazio. Abbiamo lanciato Ariane 62, Vega C, una capacità che ci è mancata, che per un periodo non abbiamo avuto. Quindi abbiamo lanciato con successo Arianne 62, mentre è ritornato in volo il Vega C. Quest’anno abbiamo lanciato, credo che siamo in track entro la fine dell’anno per avere fatto sette lanci in Europa. Difficile il confronto con il numero dei lanci effettuati negli Stati Uniti, stiamo parlando di ben oltre 100 lanci all’anno, quindi abbiamo un pochino da recuperare. E quindi sia con Arianne che con Vega C abbiamo del lavoro da fare, di contenimento dei costi e di aumento della cadenza, del numero dei lanci che possiamo fare in un anno”. L’altra strada da percorrere, ha aggiunto Cristoforetti, è quella di provare a far crescere anche nuove realtà, nuovi vendor: “perché se abbiamo bisogno di lanciare tutti questi satelliti, probabilmente abbiamo anche bisogno di più operatori. a questo tende il progetto European Launcher Challenge, che mette a disposizione fondi pubblici per aziende che a loro a loro volta vogliono investire, perché credono nel loro prodotto. Aziende che sviluppano da zero dei nuovi lanciatori, all’inizio ovviamente piccoli, da qualche parte bisogna cominciare, ma se auspicabilmente una, due, tre di queste aziende avranno successo, poi potranno sviluppare ulteriormente questi lanciatori, per poter entrare un giorno in competizione con il Falcon 9 di SpaceX. C’è stato un grande supporto alla ministeriale per la European Launcher Challenge, credo che noi avessimo chiesto 400 milioni, ne abbiamo avuto 900, quindi credo che sia un davvero un bel segnale. L’altro bel segnale, questa è una cosa che conosco molto da vicino, perché sono responsabile direttamente di questo programma, è il supporto che ha avuto il progetto LEO Cargo Return Service. E qui parliamo di copiare, non c’è niente di male a copiare, è bellissimo copiare le cose più belle. Quando c’è qualcuno che fa una cosa fatta bene, copiare va benissimo. Noi con questo progetto stiamo copiando spudoratamente quello che ha fatto la NASA nel 2008, quando hanno dato a due aziende, una delle quali poi è diventata la celebre SpaceX, un contratto per sviluppare capacità di trasporto cargo per la stazione spaziale internazionale e gli hanno detto due cose: dovete investire anche i soldi vostri. Un po’ di soldi ve li diamo noi e un po’ di soldi ce li mettete voi e il rischio lo condividiamo. La seconda cosa che gli hanno detto: noi non compriamo il veicolo, noi compriamo un servizio. Il veicolo è vostro, voi siete la design authority, noi vi diciamo di che cosa abbiamo bisogno, come lo volete implementare a livello di design choices è un problema vostro e poi alla fine compriamo un servizio. E noi stiamo facendo la stessa cosa – ha sottolineato Cristoforetti – negli ultimi due anni abbiamo avuto una fase Uno, in cui abbiamo lavorato con due aziende, una è una startup, si chiama The Exploration Company, l’altra è una Big del settore, Thales Alenia Space Italia, e fortunatamente la settimana scorsa alla ministeriale abbiamo avuto abbastanza fondi per poter andare avanti e implementare la fase due, con le due aziende che continueranno a essere in competizione e auspichiamo di poter fare un volo di dimostrazione sulla stazione spaziale entro la metà del 2029. Una data che sembra lontana, ma stiamo chiedendo alle nostre aziende di essere più veloci di SpaceX. E ovviamente dobbiamo essere anche bravi e veloci noi dal punto di vista dell’ESA a supportarle. La ISS sarà deorbitata nel 2031 e vogliamo fare il volo di dimostrazione per ciò che verrà dopo, in cui vogliamo essere presenti come Europa, come partner per contribuire con le proprie capacità. La mia speranza è che con uno o entrambi di questi veicoli potremo fare come con il LEO cargo return service”. Alla domanda su chi sarà l’astronauta italiano che andrà sulla Luna con il Programma Artemis, Cristoforetti ha risposto: “L’Agenzia Spaziale Europea ha negoziato già da molto tempo, e non è una novità, tre missioni per astronauti europei non sulla superficie ma attorno alla Luna sulla stazione Gateway. E, come si sapeva, saranno svolte da un astronauta tedesco, italiano e francese. La novità della scorsa settimana è che il primo di questi voli sarà di uno dei miei colleghi tedeschi e chissà uno dei successivi. Può darsi che sia io, come naturalmente qualche altro collega. Al momento nessuno in Europa si sta addestrando attivamente o vi è stato assegnato. È ancora un po’ presto e quindi per adesso mi dedico alla mia missione terrestre che è il Leo Cargo Return Service”.
cybersecitalia.itDec 3, 2025extracted
Spyware Dante e attacchi zero-day su Chrome: come proteggersi
Una vulnerabilità zero-day in Google Chrome, sfruttata nell’operazione ForumTroll all’inizio di quest’anno, ha diffuso malware collegato al vendor italiano di spyware Memento Labs, frutto dell’acquisizione di Hacking Team da parte di IntheCyber Group. A scoprire l’operazione ForumTroll è stata Kaspersky nel mese di marzo. “Il caso dello spyware Dante, sviluppato dall’azienda Memento Labs, rappresenta l’ennesimo segnale dell’evoluzione e della pericolosa espansione del mercato globale della sorveglianza digitale”, commenta Pierluigi Paganini, analista di cyber security e Ceo Cybhorus. “Il problema degli spyware ‘ricilati’ o ‘riciclabili’ non è nuovo ed è uno dei problemi ai quali chi produce captatori o ‘trojan di Stato’ deve prestare particolare attenzione”, mette in guardia Paolo Dal Checco, consulente informatico forense e Ceo della società Forenser. “Tutto questo dovrebbe farci riflettere sul concetto di non neutralità della tecnologia e dell’importanza delle destinazioni d’uso”, aggiunge Stefano Gazzella, Dpo e Consulente Privacy & ICT Law. Ecco come mitigare il rischio, perché, secondo Sandro Sana, Ethical Hacker e membro del comitato scientifico Cyber 4.0, “se si crede che la patch del browser basti a dormire sonni tranquilli, il rischio è di sbagliare completamente”. Indice degli argomenti La campagna prendeva di mira organizzazioni russe – mezzi di comunicazione, università, centri di ricerca, organizzazioni governative e istituzioni finanziarie – con inviti ben congegnati al forum Primakov Readings che contenevano un link dannoso. Era sufficiente caricare il link in qualsiasi browser web basato su Chromium per infettare il sistema informatico. Secondo i ricercatori di Kaspersky, la diffusione del malware è avvenuta sfruttando CVE-2025-2783, una vulnerabilità zero-day di tipo sandbox escape nel browser Chrome. “Qui non stiamo parlando solo di una falla tecnico-accidentale, ma di una catena di attacco sofisticata, con sandbox bypass, loader persistente e set di strumenti per exfiltrazione, keylogging e controllo remoto“, mette in guardia Sandro Sana. Nel report, Kaspersky ha fornito ulteriori dettagli sulla catena di attacchi utilizzata nell’operazione ForumTroll: il malware utilizzato nella campagna risale almeno al 2022 e ha portato alla scoperta di altri attacchi contro organizzazioni in Russia e Bielorussia. Analizzando lo storico degli attacchi più vecchi, i ricercatori hanno trovato un malware sconosciuto che hanno identificato come spyware commerciale chiamato ‘Dante’ e sviluppato dalla società italiana Memento Labs. Gli attacchi dell’operazione ForumTroll iniziano con un’email di phishing contenente un link personalizzato e temporaneo al sito malevolo, dove uno script di convalida filtra i visitatori per assicurarsi che solo gli obiettivi di interesse vengano compromessi. Nella fase successiva, gli aggressori hanno sfruttato CVE-2025-2783 per eseguire lo shellcode sul processo di navigazione nel browser della vittima e installare un loader persistente per iniettare una DLL malevola. La DLL ha decriptato il payload principale chiamato LeetAgent, uno spyware modulare che supporta l’esecuzione di comandi, operazioni sui file, keylogging e furto di dati. I ricercatori di Kaspersky sottolineano che LeetAgent è unico per il suo utilizzo del leetspeak nell’implementazione dei comandi e ritengono che potrebbe anche essere uno strumento spyware commerciale. I ricercatori hanno ricondotto l’uso di LeetAgent agli attacchi del 2022 contro obiettivi in Russia e Bielorussia. In alcuni casi, LeetAgent è stato utilizzato per introdurre Dante. A causa delle affinità del codice di Dante con il malware RCS di Hacking Team, i ricercatori di Kaspersky sono altamente convinti che questi strumenti siano attribuibili a Memento Labs. Dante è uno spyware modulare che recupera componenti da un server di comando e controllo (C2). Se non viene ricevuta alcuna comunicazione dal server dell’autore dell’attacco per un numero specificato di giorni, il malware “elimina se stesso e tutte le tracce della sua attività”. I ricercatori non sono riusciti a recuperare alcun modulo per l’analisi, quindi le caratteristiche e le funzionalità specifiche dello spyware Dante rimangono ignote. Memento Labs è il nome di una nuova società fondata sulla ricerca e l’esperienza dell’ex Hacking Team, fornitore di spyware con sede a Milano precedentemente noto per il suo Remote Control System (RCS) venduto alle autorità come strumento di sorveglianza. Il famigerato Hacking Team ha subito una violazione nel 2015, dal cui incidente, che ha segnato il destino dell’azienda, sono emerse vendite a regimi autoritari, accesso a exploit zero-day e interazioni con clienti dei servizi segreti governativi. “Senza entrare nel merito dei legami che hanno portato competenze e soluzioni dall’ex Hacking Team a questa nuova società, per ammissione del Ceo di Memento Labs”, continua Paganini, “ci troviamo dinanzi ad un malware utilizzato da un cliente governativo che avrebbe usato una versione obsoleta, evento che apre ad una riflessione più ampia”. controlla davvero l’uso di questi strumenti una volta venduti Il problema infatti “non è soltanto tecnico, ma etico e politico: chi controlla davvero l’uso di questi strumenti una volta venduti?“, si chiede Paganini. Secondo Paganini, “il Ceo di Memento Labs afferma di aver chiesto ai clienti di cessare l’uso dello spyware, ma tale ‘autoregulation’ risulta spesso debole e priva di meccanismi di verifica indipendente per la natura stessa delle attività espletate da vendor di software di sorveglianza. Il caso Paragon ne è la dimostrazione“. Nel 2019 InTheCyber Group ha acquisito l’azienda, che ha utilizzato le risorse dell’Hacking Team per costituire Memento Labs. Quattro anni dopo, alla conferenza ISS World Middle East and Africa, Memento Labs ha presentato il suo nuovo spyware Dante, anche se i dettagli sono rimasti riservati. “Mentre illustri colleghi sostengono che le ceneri delle aziende più controverse possono sempre dare vita a nuove forme di sorveglianza”, mette in guardia Paganini, “non parlerei di ceneri in termini di cessata attività, ma in taluni casi di diversione per mascherare la metamorfosi voluta da agenzie di intelligence, per continuare ad operare lontano da occhi indiscreti“. Secondo Paganini, se “l’Italia vuole evitare di essere ricordata come la ‘culla europea dello spyware’”, invece, “deve assumersi un ruolo guida nella definizione di standard etici e legali per la cyber intelligence, promuovendo trasparenza, responsabilità e tutela dei diritti fondamentali. Il caso Dante non è solo una vicenda tecnica o di cronaca, ma un campanello d’allarme: in un mondo dove la sorveglianza diventa un’industria in piena espansione, la democrazia rischia di essere la prima vittima invisibile“, conclude Paganini. culturale Il concetto di non neutralità della tecnologia e dell’aspetto cruciale delle destinazioni d’uso richiedono dunque una riflessione. “Soprattutto negli scenari in cui il quadro delle responsabilità è – eufemisticamente parlando – particolarmente complesso da ricostruire soprattutto nei mercati in rapida evoluzione”, spiega Stefano Gazzella: infatti “il problema riguarda tanto i policy maker quanto gli utilizzatori finali: i primi in quanto chiamati a regolamentare secondo logiche di framework, i secondi in quanto bene o male avendo la titolarità della domanda possono dirigere l’offerta di tali strumenti. Finchè non si colma un gap culturale, però, ci troveremo però di fronte alla reiterazione di problemi di questo tipo”. Un software o servizio legittimo in un certo periodo o per un certo fascicolo giudiziario non deve poter essere utilizzato (o riutilizzato) in altri periodi o per altri fascicoli. Per fare un esempio più concreto, il problema equivale al fornire a un cliente un’arma che deve funzionare solo per alcuni giorni e/o contro una vittima specifica ma che il cliente è in grado di “sblocare” utilizzandola fuori da queste regole, contro chiunque e anche dopo il termine dell’incarico. La sicurezza e privacy che deriva dalle soluzioni on premise deve essere quindi soppesata con il rischio che queste ‘armi’ possano essere innescate anche in contesti diversi da quello per le quali sono state vendute o in periodi che esulano da quello legato al contratto di acquisto o all’autorizzazione dell’Autorità giudiziaria. Tra l’altro questo non è l’unico rischio, ve n’è uno ancora peggiore e cioè che le vittime del malware, una volta identificata la presenza su un proprio dispositivo, possano essere in grado di ‘modificarlo’ tramite reverse engineering per utilizzarlo contro terzi. Chiaramente le società che producono i captatori fanno particolare attenzione al fatto che i loro software non siano ‘ricilabili’ dalle vittime stesse, soprattutto per il fatto che al limite può essere facilmente disassemblabile e quindi copiabile il codice del payload – cioè il programma che spia e invia i dati a un qualche server remoto – ma non il vettore di attacco, che spesso è il punto delicato della supply chain dei sistemi d’infezione remota e captazione. Paolo Dal Checco Mentre Kaspersky ha attribuito con elevata probabilità lo spyware Dante a Memento Labs, l’autore dello zero-day che consente di eludere la sandbox di Chrome potrebbe essere un’entità diversa. Chrome ha risolto il CVE-2025-2783 nella versione 134.0.6998.178, rilasciata il 26 marzo. Anche Mozilla ha risolto il problema in Firefox, tracciato come CVE-2025-2857, nella versione 136.0.4 del browser. Ma applicare le patch non è sufficiente. “La vicenda dello zero-day nel Google Chrome sfruttato da una spyware suite italiana ridisegna la minaccia: non è più questione ‘puntuale’ ma sistemica”, conclude Sandro Sana: “Se sei CISO, non è possibile limitarsi a ‘mettere la spunta’ alla patch X: serve un presidio continuo di browser, endpoint e rete, threat-hunting attivo, e una governance che riconosca che la reputazione, e il rischio normativo, valgono oro quanto quello operativo”. Infine, “il server su cui vengono convogliati i dati (di queste soluzioni on-premise) dovrebbe essere gestito con cautela – per essere in primis conforme alle direttive e alla legislazione – e non troppo facilmente personalizzabile”, conclude Paolo Dal Checco, “altrimenti chi trova un software di captazione può essere in grado di fare reverse engineering, ricodificarlo, inviarlo a terzi anche fuori dal periodo di validità/ supporto/ concessione dello stesso e programmare la raccolta dei dati su server diversi da quelli inizialmente impostati o permessi dall’Autorità giudiziaria”. Come ci ha illustrato Stefano Gazzella, innanzitutto, è urgente colmare il divario culturale, puntare sulla consapevolezza dei rischi cyber e intanto fare quanto è necessario, come ci hanno spiegato i nostri esperti, per evitare il ripetersi di queste pericolose criticità.
cybersecurity360.itOct 30, 2025extracted
Italian spyware vendor linked to Chrome zero-day attacks
A zero-day vulnerability in Google Chrome, exploited in Operation ForumTroll earlier this year, delivered malware linked to Italian spyware vendor Memento Labs, born after IntheCyber Group acquired the infamous Hacking Team. Operation ForumTroll was uncovered by Kaspersky in March. The campaign targeted Russian organizations - media outlets, universities, research centers, government organizations, and financial institutions, with well-crafted invitations to the Primakov Readings forum that contained a malicious link. Loading the link in any Chromium-based web browser was enough to infect the computer system. Kaspersky researchers said that the malware delivery was done by exploiting CVE-2025-2783, a sandbox escape zero-day in the Chrome browser. In a report today, Kaspersky published more details about the attack chain used in Operation ForumTroll, saying that the malware used in the campaign dates back to at least 2022 and led to the discovery of other attacks on organizations in Russia and Belarus. Analyzing the old attacks, the researchers found "an unknown piece of malware that we identified as commercial spyware called “Dante” and developed by the Italian company Memento Labs." Memento Labs is the name of a new company built on the research and expertise of the former ‘Hacking Team,’ a Milan-based spyware vendor previously known for its Remote Control System (RCS) sold to authorities as a surveillance tool. Hacking Team was breached in 2015, and the incident sealed the company's fate as it revealed sales to authoritarian regimes, access to zero-day exploits, and interaction with government intelligence clients. In 2019, the firm was acquired by InTheCyber Group, which used Hacking Team's assets to form Memento Labs. Four years later, at the ISS World Middle East and Africa conference, Memento Labs presented its new Dante spyware, although the details remained private. LeetAgent and Dante Operation ForumTroll attacks start with a phishing email with a personalized, short-lived link to the malicious site, where a validator script filters visitors to make sure that only targets of interest are compromised. On the next step, the attackers exploited CVE-2025-2783 to achieve shellcode execution on the victim’s browser process and install a persistent loader to inject a malicious DLL. The DLL decrypted the main payload called LeetAgent, a modular spyware that supports command execution, file operations, keylogging, and data theft. Kaspersky researchers note that LeetAgent is unique for its use of leetspeak in command implementation, and believe that it might also be a commercial spyware tool. The researchers traced the use of LeetAgent to the attacks in 2022 against targets in Russia and Belarus. In some cases, LeetAgent was used to introduce Dante. Due to Dante's code similarities with Hacking Team's RCS malware, Kaspersky researchers have high confidence in attributing the tools to Memento Labs. Dante is a modular spyware that retrieves components from a command-and-control (C2) server. If no communication is received from the attacker's server for a specified number of days, the malware "deletes itself and all traces of its activity." The researchers could not retrieve any modules for analysis, so the specific features and capabilities of the Dante spyware remain undocumented. It is important to note that while Kaspersky attributed the advanced spyware to Memento Labs with high confidence, the author of the Chrome sandbox-escape zero-day could be a different entity. Chrome fixed CVE-2025-2783 in version 134.0.6998.178, released on March 26. Mozilla also addressed the issue in Firefox, tracked as CVE-2025-2857, in version 136.0.4 of the browser. BleepingComputer has contacted Memento Labs with a request for a comment on Kaspersky's findings, but did not receive a response by publishing time. Overall prevention scores can hide what happens after initial access. Once attackers are using valid credentials, prevention drops sharply. The Blue Report 2026 measures defenses technique by technique across 338 million simulations run in customer production environments. Get the report
bleepingcomputer.comOct 27, 2025extracted
Mem3nt0 mori – The Hacking Team is back!
In March 2025, Kaspersky detected a wave of infections that occurred when users clicked on personalized phishing links sent via email. No further action was required to initiate the infection; simply visiting the malicious website using Google Chrome or another Chromium-based web browser was enough. The malicious links were personalized and extremely short-lived to avoid detection. However, Kaspersky’s technologies successfully identified a sophisticated zero-day exploit that was used to escape Google Chrome’s sandbox. After conducting a quick analysis, we reported the vulnerability to the Google security team, who fixed it as CVE-2025-2783. We dubbed this campaign Operation ForumTroll because the attackers sent personalized phishing emails inviting recipients to the Primakov Readings forum. The lures targeted media outlets, universities, research centers, government organizations, financial institutions, and other organizations in Russia. The functionality of the malware suggests that the operation’s primary purpose was espionage. We traced the malware used in this attack back to 2022 and discovered more attacks by this threat actor on organizations and individuals in Russia and Belarus. While analyzing the malware used in these attacks, we discovered an unknown piece of malware that we identified as commercial spyware called “Dante” and developed by the Italian company Memento Labs (formerly Hacking Team). Similarities in the code suggest that the Operation ForumTroll campaign was also carried out using tools developed by Memento Labs. In this blog post, we’ll take a detailed look at the Operation ForumTroll attack chain and reveal how we discovered and identified the Dante spyware, which remained hidden for years after the Hacking Team rebrand. Attack chain In all known cases, infection occurred after the victim clicked a link in a spear phishing email that directed them to a malicious website. The website verified the victim and executed the exploit. When we first discovered and began analyzing this campaign, the malicious website no longer contained the code responsible for carrying out the infection; it simply redirected visitors to the official Primakov Readings website. Therefore, we could only work with the attack artifacts discovered during the first wave of infections. Fortunately, Kaspersky technologies detected nearly all of the main stages of the attack, enabling us to reconstruct and analyze the Operation ForumTroll attack chain. Phishing email The malicious emails sent by the attackers were disguised as invitations from the organizers of the Primakov Readings scientific and expert forum. These emails contained personalized links to track infections. The emails appeared authentic, contained no language errors, and were written in the style one would expect for an invitation to such an event. Proficiency in Russian and familiarity with local peculiarities are distinctive features of the ForumTroll APT group, traits that we have also observed in its other campaigns. However, mistakes in some of those other cases suggest that the attackers were not native Russian speakers. Validator The validator is a relatively small script executed by the browser. It validates the victim and securely downloads and executes the next stage of the attack. The first action the validator performs is to calculate the SHA-256 of the random data received from the server using the WebGPU API. It then verifies the resulting hash. This is done using the open-source code of Marco Ciaramella’s sha256-gpu project. The main purpose of this check is likely to verify that the site is being visited by a real user with a real web browser, and not by a mail server that might follow a link, emulate a script, and download an exploit. Another possible reason for this check could be that the exploit triggers a vulnerability in the WebGPU API or relies on it for exploitation. The validator sends the infection identifier, the result of the WebGPU API check and the newly generated public key to the C2 server for key exchange using the Elliptic-curve Diffie–Hellman (ECDH) algorithm. If the check is passed, the server responds with an AES-GCM key. This key is used to decrypt the next stage, which is hidden in requests to bootstrap.bundle.min.js and .woff2 font files. Following the timeline of events and the infection logic, this next stage should have been a remote code execution (RCE) exploit for Google Chrome, but it was not obtained during the attack. Sandbox escape exploit Over the years, we have discovered and reported on dozens of zero-day exploits that were actively used in attacks. However, CVE-2025-2783 is one of the most intriguing sandbox escape exploits we’ve encountered. This exploit genuinely puzzled us because it allowed attackers to bypass Google Chrome’s sandbox protection without performing any obviously malicious or prohibited actions. This was due to a powerful logical vulnerability caused by an obscure quirk in the Windows OS. To protect against bugs and crashes, and enable sandboxing, Chrome uses a multi-process architecture. The main process, known as the browser process, handles the user interface and manages and supervises other processes. Sandboxed renderer processes handle web content and have limited access to system resources. Chrome uses Mojo and the underlying ipcz library, introduced to replace legacy IPC mechanisms, for interprocess communication between the browser and renderer processes. The exploit we discovered came with its own Mojo and ipcz libraries that were statically compiled from official sources. This enabled attackers to communicate with the IPC broker within the browser process without having to manually craft and parse ipcz messages. However, this created a problem for us because, to analyze the exploit, we had to identify all the Chrome library functions it used. This involved a fair amount of work, but once completed, we knew all the actions performed by the exploit. In short, the exploit does the following: Resolves the addresses of the necessary functions and code gadgets from dll using a pattern search. Hooks the v8_inspector::V8Console::Debug function. This allows attackers to escape the sandbox and execute the desired payload via a JavaScript call. Starts executing a sandbox escape when attackers call console.debug(0x42, shellcode); from their script. Hooks the ipcz::NodeLink::OnAcceptRelayedMessage function. Creates and sends an ipcz message of the type RelayMessage. This message type is used to pass Windows OS handles between two processes that do not have the necessary permissions (e.g., renderer processes). The exploit retrieves the handle returned by the GetCurrentThread API function and uses this ipcz message to relay it to itself. The broker transfers handles between processes using the DuplicateHandle API function. Receives the relayed message back using the ipcz::NodeLink::OnAcceptRelayedMessage function hook, but instead of the handle that was previously returned by the GetCurrentThread API function, it now contains a handle to the thread in the browser process! Uses this handle to execute a series of code gadgets in the target process by suspending the thread, setting register values using SetThreadContext, and resuming the thread. This results in shellcode execution in the browser process and subsequent installation of a malware loader. So, what went wrong, and how was this possible? The answer can be found in the descriptions of the GetCurrentThread and GetCurrentProcess API functions. When these functions are called, they don’t return actual handles; rather, they return pseudo handles, special constants that are interpreted by the kernel as a handle to the current thread or process. For the current process, this constant is -1 (also equal to INVALID_HANDLE_VALUE, which brings its own set of quirks), and the constant for the current thread is -2. Chrome’s IPC code already checked for handles equal to -1, but there were no checks for -2 or other undocumented pseudo handles. This oversight led to the vulnerability. As a result, when the broker passed the -2 pseudo handle received from the renderer to the DuplicateHandle API function while processing the RelayMessage, it converted -2 into a real handle to its own thread and passed it to the renderer. Shortly after the patch was released, it became clear that Chrome was not the only browser affected by the issue. Firefox developers quickly identified a similar pattern in their IPC code and released an update under CVE-2025-2857. When pseudo handles were first introduced, they simplified development and helped squeeze out extra performance – something that was crucial on older PCs. Now, decades later, that outdated optimization has come back to bite us. Could we see more bugs like this? Absolutely. In fact, this represents a whole class of vulnerabilities worth hunting for – similar issues may still be lurking in other applications and Windows system services. To learn about the hardening introduced in Google Chrome following the discovery of CVE-2025-2783, we recommend checking out Alex Gough’s upcoming presentation, “Responding to an ITW Chrome Sandbox Escape (Twice!),” at Kawaiicon. Persistent loader Persistence is achieved using the Component Object Model (COM) hijacking technique. This method exploits a system’s search order for COM objects. In Windows, each COM class has a registry entry that associates the CLSID (128-bit GUID) of the COM with the location of its DLL or EXE file. These entries are stored in the system registry hive HKEY_LOCAL_MACHINE (HKLM), but can be overridden by entries in the user registry hive HKEY_CURRENT_USER (HKCU). This enables attackers to override the CLSID entry and run malware when the system attempts to locate and run the correct COM component. The attackers used this technique to override the CLSID of twinapi.dll {AA509086-5Ca9-4C25-8F95-589D3C07B48A} and cause the system processes and web browsers to load the malicious DLL. This malicious DLL is a loader that decrypts and executes the main malware. The payload responsible for loading the malware is encoded using a simple binary encoder similar to those found in the Metasploit framework. It is also obfuscated with OLLVM. Since the hijacked COM object can be loaded into many processes, the payload checks the name of the current process and only loads the malware when it is executed by certain processes (e.g., rdpclip.exe). The main malware is decrypted using a modified ChaCha20 algorithm. The loader also has the functionality to re-encrypt the malware using the BIOS UUID to bind it to the infected machine. The decrypted data contains the main malware and a shellcode generated by Donut that launches it. LeetAgent LeetAgent is the spyware used in the Operation ForumTroll campaign. We named it LeetAgent because all of its commands are written in leetspeak. You might not believe it, but this is rare in APT malware. The malware connects to one of its C2 servers specified in the configuration and uses HTTPS to receive and execute commands identified by unique numeric values: 0xC033A4D (COMMAND) – Run command with cmd.exe 0xECEC (EXEC) – Execute process 0x6E17A585 (GETTASKS) – Get list of tasks that agent is currently executing 0x6177 (KILL) – Stop task 0xF17E09 (FILE \x09) – Write file 0xF17ED0 (FILE \xD0) – Read file 0x1213C7 (INJECT) – Inject shellcode 0xC04F (CONF) – Set communication parameters 0xD1E (DIE) – Quit 0xCD (CD) – Change current directory 0x108 (JOB) – Set parameters for keylogger or file stealer In addition to executing commands received from its C2, it runs keylogging and file-stealing tasks in the background. By default, the file-stealer task searches for documents with the following extensions: *.doc, *.xls, *.ppt, *.rtf, *.pdf, *.docx, *.xlsx, *.pptx. The configuration data is encoded using the TLV (tag-length-value) scheme and encrypted with a simple single-byte XOR cipher. The data contains settings for communicating with the C2, including many settings for traffic obfuscation. In most of the observed cases, the attackers used the Fastly.net cloud infrastructure to host their C2. Attackers frequently use it to download and run additional tools such as 7z, Rclone, SharpChrome, etc., as well as additional malware (more on that below). The number of traffic obfuscation settings may indicate that LeetAgent is a commercial tool, though we have only seen ForumTroll APT use it. Finding Dante In our opinion, attributing unknown malware is the most challenging aspect of security research. Why? Because it’s not just about analyzing the malware or exploits used in a single attack; it’s also about finding and analyzing all the malware and exploits used in past attacks that might be related to the one you’re currently investigating. This involves searching for and investigating similar attacks using indicators of compromise (IOCs) and tactics, techniques, and procedures (TTPs), as well as identifying overlaps in infrastructure, code, etc. In short, it’s about finding and piecing together every scrap of evidence until a picture of the attacker starts to emerge. We traced the first use of LeetAgent back to 2022 and discovered more ForumTroll APT attacks on organizations and individuals in Russia and Belarus. In many cases, the infection began with a phishing email containing malicious attachments with the following names: Baltic_Vector_2023.iso (translated from Russian) DRIVE.GOOGLE.COM (executable file) Invitation_Russia-Belarus_strong_partnership_2024.lnk (translated from Russian) Various other file names mentioning individuals and companies In addition, we discovered another cluster of similar attacks that used more sophisticated spyware instead of LeetAgent. We were also able to track the first use of this spyware back to 2022. In this cluster, the infections began with phishing emails containing malicious attachments with the following names: SCAN_XXXX_ .pdf.lnk _winscan_to_pdf.pdf.lnk Rostelecom.pdf.lnk (translated from Russian) Various others The attackers behind this activity used similar file system paths and the same persistence method as the LeetAgent cluster. This led us to suspect that the two clusters might be related, and we confirmed a direct link when we discovered attacks in which this much more sophisticated spyware was launched by LeetAgent. After analyzing this previously unknown, sophisticated spyware, we were able to identify it as commercial spyware called Dante, developed by the Italian company Memento Labs. The Atlantic Council’s Cyber Statecraft Initiative recently published an interesting report titled “Mythical Beasts and where to find them: Mapping the global spyware market and its threats to national security and human rights.” We think that comparing commercial spyware to mythical beasts is a fitting analogy. While everyone in the industry knows that spyware vendors exist, their “products” are rarely discovered or identified. Meanwhile, the list of companies developing commercial spyware is huge. Some of the most famous are NSO Group, Intellexa, Paragon Solutions, Saito Tech (formerly Candiru), Vilicius Holding (formerly FinFisher), Quadream, Memento Labs (formerly Hacking Team), negg Group, and RCS Labs. Some are always in the headlines, some we have reported on before, and a few have almost completely faded from view. One company in the latter category is Memento Labs, formerly known as Hacking Team. Hacking Team (also stylized as HackingTeam) is one of the oldest and most famous spyware vendors. Founded in 2003, Hacking Team became known for its Remote Control Systems (RCS) spyware, used by government clients worldwide, and for the many controversies surrounding it. The company’s trajectory changed dramatically in 2015 when more than 400 GB of internal data was leaked online following a hack. In 2019, the company was acquired by InTheCyber Group and renamed Memento Labs. “We want to change absolutely everything,” the Memento Labs owner told Motherboard in 2019. “We’re starting from scratch.” Four years later, at the ISS World MEA 2023 conference for law enforcement and government intelligence agencies, Memento Labs revealed the name of its new surveillance tool – DANTE. Until now, little was known about this malware’s capabilities, and its use in attacks had not been discovered. The problem with detecting and attributing commercial spyware is that vendors typically don’t include their copyright information or product names in their exploits and malware. In the case of the Dante spyware, however, attribution was simple once we got rid of VMProtect’s obfuscation and found the malware name in the code. Dante Of course, our attribution isn’t based solely on the string “Dante” found in the code, but it was an important clue that pointed us in the right direction. After some additional analysis, we found a reference to a “2.0” version of the malware, which matches the title of the aforementioned conference talk. We then searched for and identified the most recent samples of Hacking Team’s Remote Control Systems (RCS) spyware. Memento Labs kept improving its codebase until 2022, when it was replaced by Dante. Even with the introduction of the new malware, however, not everything was built from scratch; the later RCS samples share quite a few similarities with Dante. All these findings make us very confident in our attribution. Why did the authors name it Dante? This may be a nod to tradition, as RCS spyware was also known as “Da Vinci”. But it could also be a reference to Dante’s poem Divine Comedy, alluding to the many “circles of hell” that malware analysts must pass through when detecting and analyzing the spyware given its numerous anti-analysis techniques. First of all, the spyware is packed with VMProtect. It obfuscates control flow, hides imported functions, and adds anti-debugging checks. On top of that, almost every string is encrypted. To protect against dynamic analysis, Dante uses the following anti-hooking technique: when code needs to execute an API function, its address is resolved using a hash, its body is parsed to extract the system call number, and then a new system call stub is created and used. In addition to VMProtect’s anti-debugging techniques, Dante uses some common methods to detect debuggers. Specifically, it checks the debug registers (Dr0–Dr7) using NtGetContextThread, inspects the KdDebuggerEnabled field in the KUSER_SHARED_DATA structure, and uses NtQueryInformationProcess to detect debugging by querying the ProcessDebugFlags, ProcessDebugPort, ProcessDebugObjectHandle, and ProcessTlsInformation classes. To protect itself from being discovered, Dante employs an interesting method of checking the environment to determine if it is safe to continue working. It queries the Windows Event Log for events that may indicate the use of malware analysis tools or virtual machines (as a guest or host). It also performs several anti-sandbox checks. It searches for “bad” libraries, measures the execution times of the sleep() function and the cpuid instruction, and checks the file system. Some of these anti-analysis techniques may be a bit annoying, but none of them really work or can stop a professional malware analyst. We deal with these techniques on an almost daily basis. After performing all the checks, Dante does the following: decrypts the configuration and the orchestrator, finds the string “DANTEMARKER” in the orchestrator, overwrites it with the configuration, and then loads the orchestrator. The configuration is decrypted from the data section of the malware using a simple XOR cipher. The orchestrator is decrypted from the resource section and poses as a font file. Dante can also load and decrypt the orchestrator from the file system if a newer, updated version is available. The orchestrator displays the code quality of a commercial product, but isn’t particularly interesting. It is responsible for communication with C2 via HTTPs protocol, handling modules and configuration, self-protection, and self-removal. Modules can be saved and loaded from the file system or loaded from memory. The infection identifier (GUID) is encoded in Base64. Parts of the resulting string are used to derive the path to a folder containing modules and the path to additional settings stored in the registry. The folder containing modules includes a binary file that stores information about all downloaded modules, including their versions and filenames. This metadata file is encrypted with a simple XOR cipher, while the modules are encrypted with AES-256-CBC, using the first 0x10 bytes of the module file as the IV and the key bound to the machine. The key is equal to the SHA-256 hash of a buffer containing the CPU identifier and the Windows Product ID. To protect itself, the orchestrator uses many of the same anti-analysis techniques, along with additional checks for specific process names and drivers. If Dante doesn’t receive commands within the number of days specified in the configuration, it deletes itself and all traces of its activity. At the time of writing this report, we were unable to analyze additional modules because there are currently no active Dante infections among our users. However, we would gladly analyze them if they become available. Now that information about this spyware has been made public and its developer has been identified, we hope it won’t be long before additional modules are discovered and examined. To support this effort, we are sharing a method that can be used to identify active Dante spyware infections (see the Indicators of compromise section). Although we didn’t see the ForumTroll APT group using Dante in the Operation ForumTroll campaign, we have observed its use in other attacks linked to this group. Notably, we saw several minor similarities between this attack and others involving Dante, such as similar file system paths, the same persistence mechanism, data hidden in font files, and other minor details. Most importantly, we found similar code shared by the exploit, loader, and Dante. Taken together, these findings allow us to conclude that the Operation ForumTroll campaign was also carried out using the same toolset that comes with the Dante spyware. Conclusion This time, we have not one, but three conclusions. 1) DuplicateHandle is a dangerous API function. If the process is privileged and the user can provide a handle to it, the code should return an error when a pseudo-handle is supplied. 2) Attribution is the most challenging part of malware analysis and threat intelligence, but also the most rewarding when all the pieces of the puzzle fit together perfectly. If you ever dreamed of being a detective as a child and solving mysteries like Sherlock Holmes, Miss Marple, Columbo, or Scooby-Doo and the Mystery Inc. gang, then threat intelligence might be the right job for you! 3) Back in 2019, Hacking Team’s new owner stated in an interview that they wanted to change everything and start from scratch. It took some time, but by 2022, almost everything from Hacking Team had been redone. Now that Dante has been discovered, perhaps it’s time to start over again. Full details of this research, as well as future updates on ForumTroll APT and Dante, are available to customers of the APT reporting service through our Threat Intelligence Portal. Contact: [email protected] Indicators of compromise Kaspersky detections Exploit.Win32.Generic Exploit.Win64.Agent Trojan.Win64.Agent Trojan.Win64.Convagent.gen HEUR:Trojan.Script.Generic PDM:Exploit.Win32.Generic PDM:Trojan.Win32.Generic UDS:DangerousObject.Multi.Generic TTP detection rules in Kaspersky NEXT EDR Expert suspicious_drop_dll_via_chrome This rule detects a DLL load within a Chrome process, initiated via Outlook. This behavior is consistent with exploiting a vulnerability that enables browser sandbox bypass through the manipulation of Windows pseudo-handles and IPC. possible_com_hijacking_by_memento_labs_via_registry This rule detects an attempt at system persistence via the COM object hijacking technique, which exploits peculiarities in the Windows COM component resolution process. This feature allows malicious actors to create custom CLSID entries in the user-specific registry branch, thereby overriding legitimate system components. When the system attempts to instantiate the corresponding COM object, the malicious payload executes instead of the original code. cve_exploit_detected This generic rule is designed to detect attempts by malicious actors to exploit various vulnerabilities. Its logic is based on analyzing a broad set of characteristic patterns that reflect typical exploitation behavior. Folder with modules The folder containing the modules is located in %LocalAppData%, and is named with an eight-byte Base64 string. It contains files without extensions whose names are also Base64 strings that are eight bytes long. One of the files has the same name as the folder. This information can be used to identify an active infection. Loader 7d3a30dbf4fd3edaf4dde35ccb5cf926 3650c1ac97bd5674e1e3bfa9b26008644edacfed 2e39800df1cafbebfa22b437744d80f1b38111b471fa3eb42f2214a5ac7e1f13 LeetAgent 33bb0678af6011481845d7ce9643cedc 8390e2ebdd0db5d1a950b2c9984a5f429805d48c 388a8af43039f5f16a0673a6e342fa6ae2402e63ba7569d20d9ba4894dc0ba59 Dante 35869e8760928407d2789c7f115b7f83 c25275228c6da54cf578fa72c9f49697e5309694 07d272b607f082305ce7b1987bfa17dc967ab45c8cd89699bcdced34ea94e126
securelist.comOct 27, 2025extracted
Securing AI agents with Amazon Bedrock AgentCore Identity
Securing AI agents with Amazon Bedrock AgentCore Identity By using Amazon Bedrock AgentCore, developers can build agentic workloads using a comprehensive set of enterprise-grade services that help quickly and securely deploy and operate AI agents at scale using any framework and model, hosted on Amazon Bedrock or elsewhere. AgentCore services are modular and composable, allowing them to be used together or independently. To get a high level overview of Amazon Bedrock AgentCore and all of the modular services, be sure to read the Introducing Amazon Bedrock AgentCore blog post. In this post, I take a deeper look at AgentCore Identity, powered by Amazon Cognito, to introduce the identity and credential management features designed specifically for AI agents and automated workloads. AgentCore Identity provides secure, scalable agent identity and access management capabilities that are compatible with existing identity providers, avoiding the need for user migration or rebuilding authentication flows. Additionally, AgentCore Identity provides a token vault to help secure user access tokens and a native integration with AWS Secrets Manager to secure API keys and OAuth client credentials for external resources and tools, helps orchestrate standard OAuth flows, and centralizes AI agent identities to a secure central directory. More specifically, here are some key features provided by AgentCore Identity: Centralized agent identity management – A unified directory feature that serves as the single source of truth for managing agent identities across your organization, providing each agent a unique identity and associated metadata. This provides each agent identity a distinct identifier using Amazon Resource Names (ARNs) and providing a central view of your agents whether they’re hosted in AWS, self-hosted, or using a hybrid deployment. Token vault – Securely store OAuth 2.0 Access and Refresh tokens, API keys, and OAuth 2.0 client secrets. Credentials are encrypted using AWS Key Management Service (AWS KMS) keys with support for customer-managed keys. The system implements strict access controls for credential retrieval, limiting access to individual agents only. For user-specific credentials such as OAuth 2.0 tokens, agents are restricted to accessing them solely on behalf of the associated user, maintaining least privilege and proper delegation mechanisms. When an expired access token is retrieved from the token vault and fails authorization with the resource server, the AI agent can use a secured refresh token to obtain and store a new access token. This allows a high security bar to be met, while improving the user experience by requiring less authentication requests to obtain new access tokens. OAuth 2.0 flow support – Provides native support for OAuth 2.0 client credentials grant, also known as two-legged OAuth (2LO), and authorization code grant, also known as three-legged OAuth (3LO). This includes built-in credential providers for popular services and support for custom integrations. The service handles OAuth 2.0 implementations while offering simple APIs for agents to access AWS resources and third-party services. Agent identity and access controls – Supports delegated authentication flow allowing agents to access resources using provided credentials while maintaining audit trails and access controls. Authorization decisions are based on the provided credentials during the delegation process. AgentCore SDK integration – Offers integration through declarative annotations that automatically handle credential retrieval and injection, reducing boilerplate code, and providing a seamless developer experience. The Bedrock AgentCore SDK provides automatic error handling for common scenarios such as token expiration and user consent requirements. Identity-aware authorization – Passes user context to agent code that allows the full access token to be forwarded to the agent code. AgentCore Identity first validates the token, then passes it to the agent where it can be decoded to obtain user context. In the case of passing an access token that does not have the full user context, the agent code can use it to call an OpenID Connect (OIDC) user info endpoint and retrieve user information. This can make sure agents get only the right access through dynamic decisions based on the user’s identity context, delivering enhanced security controls. For full details on the features of AgentCore Identity, see the AgentCore developer guide. Getting started with AgentCore Identity There are several ways to get started with Amazon Bedrock AgentCore overall and more specifically with AgentCore Identity. You can follow the steps in Introducing Amazon Bedrock AgentCore: Securely deploy and operate AI agents at any scale for several AgentCore services, or you can navigate to the developer guide and follow along in the Getting started section for AgentCore Identity. Also, be sure to look into the Bedrock AgentCore Starter Toolkit GitHub repository and AgentCore Identity samples repository. Following the previous guides and samples will help you to get up and running quickly while using the Python Bedrock AgentCore SDK. To start diving deeper into AgentCore Identity and how it can be used as a modular service, I’ll walk through an example use case involving a web application that uses AI agents. Using one of the features of the example application, the user can interact with an AI agent to help schedule meetings in their Google calendar. The AI agent will eventually be able to act on behalf of the authenticated human user. Let’s take a deeper look into this use case and better understand the end-to-end flow. End-to-end flow example The following sequence diagram (Figure 1) provides the details of an example end-to-end interaction between a human user signing in to a web application and interacting with an AI agent to perform actions on behalf of the human user. This shows how AgentCore Identity provides AI agent builders the identity primitives to create and secure AI agent identities, orchestrate a 3LO flow (following an authorization code grant flow), and securing temporary access tokens in the token vault for third-party OAuth resources, such as Google. To help understand the end-to-end flow, I’ve broken this down into three different sub-flows. The first sub-flow is user authentication—in the example, the human user needs to first sign in to the web application. Amazon Cognito is used here, but you can use the identity provider of your choice. The second sub-flow is AI agent interaction—this is how the human user is interacting with the AI agent by way of the web application. This sub-flow also handles the orchestration between the human user and the AI agent, including consent, acquiring access tokens on behalf of the user, and securing them in the token vault. The third and last sub-flow is AI agent acting on behalf of user—as the name implies, these are the actions the AI agent is taking on behalf of the human user. This could include performing actions entirely within the application itself or by accessing external resource servers, such as Google Calendar in Figure 1. Two prerequisites for the flow require setting up an OAuth 2.0 credential provider (Google is used for this flow) using the CreateOauth2CredentialProvider API, and creating your AI agent identity using the CreateWorkloadIdentity API. User authentication The user navigates to the web application. There are no existing sessions or tokens. The client will redirect the user to the Amazon Cognito managed login and the user signs in with their username and password, or uses a passwordless OTP or passkey. - Amazon Cognito happens to be used in this flow with a local Cognito user account. This can also support federated login flows with third-party identity providers, including social, SAML, or OIDC providers. After successful authentication an authorization code is returned to the application, and this is used to call the /oauth2/token endpoint to get Cognito tokens. Amazon Cognito ID, access, and refresh tokens are returned to the client. I’ll refer to this access token as the human access token going forward. AI agent interaction With the user signed in, they begin interacting with the AI agent through the web application and ask the AI agent to help with scheduling a meeting in their Google calendar. The prompt is sent to the backend where the AI agent is running along with the human access token. - This could be using AgentCore Runtime and could use Amazon Bedrock to access various large language models (LLMs). The architecture could also be expanded to use Amazon Bedrock Knowledge Bases for a retrieval-augmented generation (RAG) solution. The AI agent will first obtain its own access token from AgentCore Identity. It will also provide the human access token as a request parameter. This is using the AgentCore Identity GetWorkloadAccessTokenForJWT API. - When using the GetWorkloadAccessTokenForJWT API, AgentCore Identity will verify the human access token signature and verify the token is not expired. AgentCore Identity returns an access token for the AI agent, going forward I’ll call this the AI agent access token. Because the human access token was provided during the initial request to get the AI agent access token, the specific returned AI agent access token is bound to the human user’s identity. - AgentCore Identity will derive the human user’s identity by combing the ISS and SUB claims within the human access token. You can learn more about obtaining credentials in the AgentCore Identity developer guide. The AI agent, using its own access token, will begin the process of obtaining a third, new access token from a third-party OAuth resource, which is Google in this flow. The AI agent will call the AgentCore Identity GetResourceOauth2Token API. Because this is the initial login flow and a human user is involved, an OAuth 2.0 authorization code grant flow will begin for the OAuth resource (that is, Google). This can be referred to as a 3LO flow. - The goal of this process is to obtain a temporary access token to be used with Google calendar that will be secured in the token vault. It’s important to note that as long as this access token for Google remains active after the human user has given consent, it can continue to securely be retrieved and used by the AI agent from the token vault. The Google authorization URL will be generated by AgentCore identity service based on the pre-configured Google OAuth client. The Google authorization URL is sent to the client from the AI agent. The client will immediately redirect to Google’s authorization endpoint and begin the auth flow for the human user to sign in to Google. After a successful authentication with Google, an authorization code is returned to AgentCore Identity, and an access token is obtained following the OAuth 2.0 authorization code grant flow. The access token from Google for the user is secured in the token vault. I’ll call this third access token going forward the Google access token. - Tokens are secured in the token vault under the agent identity ID and the user ID, this way the token is bound between the agent identity, the human identity, and the Google access token. As the authorization code grant completes its process to obtain a Google access token in the backend, the user will be redirected back to the frontend of the application. This is configured as the callback URL. AI agent acting on behalf of the user The AI agent will call the GetResourceOauth2Token API again (same as step 9) and include the AI agent access token as the workloadIdentityToken request parameter. However, this time the Google access token is returned from the token vault. This provides an enhanced user experience by reducing consent fatigue and minimizing the number of authorization prompts. With the original context and intent of having the AI agent help schedule a meeting in Google calendar, the AI agent will call the Google Calendar APIs with the Google access token. - The Google access token used by the AI agent will have the https://www.googleapis.com/auth/calendar.events scope, authorizing certain calendar actions. After actions are complete between the AI agent and Google calendar, success responses (or failures) will be returned to the AI agent. - This could be an opportunity for the AI agent to perform other automated actions, such as updating a user record in the web application’s backend. After all actions of the AI agent are complete, a success response is returned to the frontend application. The previous flow describes the entire end-to-end process starting from a human user needing to sign in to the web application and ending with an AI agent performing an automated action on behalf of the user. Three different access tokens were involved in this process, and the following is a summary of these access tokens. Human access token – This is issued by an Amazon Cognito user pool (or another identity provider). This access token is used to access the web application and is used to obtain the AI agent access token using the GetWorkloadAccessTokenForJWT API. AI agent access token –This is issued by AgentCore Identity. This access token is used by the AI agent to securely access the token vault. Google access token – This is issued by Google representing the human user. This access token is what’s secured in the token vault and can be securely retrieved by the AI agent access token. Conclusion Organizations are rapidly seeking opportunities to use AI agents to automate workflows and enhance user experiences, but this adoption can introduce security and compliance challenges that can’t be ignored. Organizations must make sure that AI agents can securely access resources on behalf of users while protecting sensitive credentials and maintaining compliance at scale. AgentCore Identity addresses these fundamental challenges by providing enterprise-grade security that protects user credentials and maintains strict access controls. This helps make sure that AI agents can only access what they need when they need it. The service integrates with existing identity systems, avoiding the need for complex migrations or rebuilding authentication flows. Its centralized management of AI agent identities reduces operational overhead and strengthens security posture. For organizations scaling their AI initiatives, these capabilities translate into faster time-to-market and reduced risk of unauthorized access. By implementing AgentCore Identity, organizations can confidently deploy AI agents with built-in OAuth support and secure token management, while lowering development and maintenance costs through streamlined security controls that scale with their business needs. To learn more about building with AgentCore Identity in your organization, review some example use cases and visit the Getting started with AgentCore Identity section of the developer guide to explore prerequisites, SDK usage, best practices, and start building your first authenticated agent. Use the comments section to leave feedback and engage about this post. If you have questions about this post, start a new thread on Amazon Bedrock AgentCore re:Post or contact AWS Support.
aws.amazon.comOct 14, 2025extracted
Axiom Space aims for orbit with its Orbital Data Center Node
Google pits Marvell against Broadcom as it chases AI crownAnd Marvell just offered the Chocolate Factory a $12.2B stake to sweeten the deal SYSTEMS Cerebras CS-4 rack systems juice chips for every last drop of AI performanceNext-gen systems double per-chip performance while cramming 3x as many into a rack Security Copilot tricked into telling reseachers how to hack itselfHow to social engineer an AI's reasoning engine AI and ml Payments giant Stripe is about to drop over $7 billion to become a gateway to AI token salesAI gateways look promising as companies struggle with model orchestration ai and ml Anthropic says text watermarking scheme relies on inconsequential words'Shall I compare thee to a summer's afternoon' is the sort of thing this will make, and others look likely to adopt it Security Russians are posing as Signal support to launch phishing attacksPLUS: US takes down Iranian propaganda sites; Marketing company asks 'Why Do We Have Your Information?' And more! Security Microsoft patches failed to fix on-prem SharePoint, which is now under zero-day attackPLUS: China upgrades smartphone surveillance tools; Ring eases anti-snooping stance; and more Black Hat and DEF CON DEF CON Franklin project enlists hackers to harden critical infrastructureVoting village reports have been so successful, says Jeff Moss, that the whole of DEF CON will now be included Security EQT buys majority share in Swiss cybersecurity biz AcronisWent at equivalent of $3.5B+ valuation for entire firm, though portion sold not specified Malware Month Ten years since the first corp ransomware, Mikko Hyppönen sees no end in sightOn the plus side, infosec's a good bet for a long, stable career FOSS smashed one Microsoft monopoly. After 20 years of failure, it's time to smash anotherWord up GNOME can look like Windows – and Flashback can do it without extensionsNew 'Simple-taskbar' is an option, but there's a simpler, stabler way A moment of silence, please, for the final release of Debian on x86-32New Debian versions hit FOSSland in the form of 13.6 and 12.15 Baddies caught exploiting extensions bugs with perfect 10 scores on vulnerable Joomla websitesFlaws in iCagenda, Balbooa Forms extensions can impact open source CMS that powers a million sites worldwide Frame: A new X11 server – implemented directly in assemblyJoins yserver, Phoenix, and of course XLibre – and outlier Arcan Cinnamon 6.8 will support Wayland – if you want itNext version of Linux Mint’s desktop has both kinds of display server
go.theregister.comSep 17, 2025extracted
Bug bounties: The good, the bad, and the frankly ridiculous ways to do it
FEATURE Thirty years ago, Netscape kicked off the first commercial bug bounty program. Since then, companies large and small have bought into the idea, with mixed results. Bug bounties seem simple: a flaw finder spots a vulnerability, responsibly discloses it, and then gets a reward for their labor. But over the past decades, they've morphed into a variety of forms for commercial and government systems, using different payment techniques and platforms, and some setups are a lot more effective than others. Commercial bug bounties spread slowly at first, and the idea was initially fraught with danger for researchers. Some companies sued outsiders who found problems with their software. REG AD In 2005, Internet Security Systems (ISS) researcher Michael Lynn and the organizers of the Black Hat security conference in Las Vegas were served with a restraining order over his planned talk on serious flaws in Cisco's IOS router software. Lynn quit ISS and delivered the presentation anyway, while Cisco reps spent eight hours physically tearing pages describing the talk out of the conference handbook. REG AD But that same year, Tipping Point started the Zero Day Initiative, paying for high‑impact vulnerabilities with working proof‑of‑concepts. The practice went into turbo mode when several tech giants picked up the practice, led by Google in 2010, Facebook a year later, and then the biggie – Microsoft – in 2013. While some companies chose to run their own bounty programs, others outsourced it to platforms like HackerOne and Bugcrowd, both started in 2012. But the choice of which one to pick depends very much on the size and focus of your organization. Sorting it out in-house or outsourcing? For the biggest organizations with a large user base, the best option is to primarily run their own scheme. Katie Moussouris, who convinced Microsoft to go down the bug bounty route after a three-year fight (a process she described akin to "boiling a frog"), ran the Pentagon's first hacking competition, and was chief policy officer at HackerOne. She's now the CEO of Luta Security, a bug bounty consultancy. "If you are somebody like an Apple, Google, or Microsoft, where the sensitivity of your bugs is so high, you do not want [third-party] platforms triaging your bugs," she told us. "You also don't really want them housing the bugs at all. Any vulnerability in that third-party platform exposes your bugs." Larger organizations have a number of other advantages, she explained. Most bug bounty programs throw up a huge number of false positives or minor flaws that aren't really serious, and the biggest organizations, or those with a security bent, have the IT staff to sort out the wheat from the chaff. In addition, they have legal departments to handle the non-disclosure agreements that are an essential part of bug bounty programs. With Microsoft, she explained, the company originally set up a pilot called Project Tango (because it takes two to) where individual researchers would work for Redmond under an NDA not to release findings until Microsoft had checked them and issued a fix. REG AD In-house bug-bounty programs can also create a nice recruiting pipeline. "I used to run the one for Barracuda Networks," Eric Escobar, red team leader at Sophos Advisory Services, told us. "And in quality, 90 percent is trash, but the 10 percent that you got were like gold, it's incredible." He continued, "We hired several people out of the bug bounty program because they were finding such good stuff regularly. We did the cost analysis and thought if this person's finding this many bugs consistently per month, we're losing money if we don't hire them; they're making more than a solid AppSec engineer's salary would be for just finding bugs." But hiring dedicated bug finders isn't really an option for smaller software companies that don't have the budget. "It's very rare that you have an entirely research-focused security person, you want them doing other things," Moussouris said. "These people might not be programmers. They might not be able to tell the developers how to prevent those bugs in the future. They might just be really good at finding them." There's also a cultural issue, she said, since not everyone in the field wants to work in a corporate environment with endless meetings and team sessions. A lot of people like finding security holes but relish their independence. Increasingly, companies are hiring skilled pentesters on a per-contract basis for specific jobs. This solves the NDA issue, since non-disclosure would be part of the contract, the researcher gets money without having to make it a full-time career, and management is usually happy because they don't have to take on the financial overhead of a new staff member. The other alternative is to use a commercial platform like HackerOne or Bugcrowd. For smaller companies, or those less focused on security, this provides a way to get bugs in, screen them, and pay the finder's fee with minimal fuss, Moussouris said. REG AD HackerOne CEO Kara Sprague explains one big strength of the platform approach is the breadth of talent out there. "Going to a proven provider is not a bad idea for a company whose core competency is not offensive security," she told us. "The global independent researcher community is a phenomenal source of talent," she said, explaining that self-motivated bug finders are often more effective than in-house red teams or pentesters. In practice, many companies take a hybrid approach, running their own bug bounty programs internally but also using the platforms. Moussouris also warned that some companies were rushing into bug bounty programs for the wrong reasons – particularly public relations. Last month, when Paradox.ai was caught using "123456" as an admin password that would allow an attacker to access the personal details of about 64 million McDonald's job applicants, it apologized and promised to set up a bug bounty program. "I call that bug bounty botox, when they just want to be pretty on the outside," Moussouris joked. Motivation for hunters: Fortune, fame, and fixing things One common misconception is that flaw finders are just in it for the money, but it's more complicated than that. It's true that money is a factor. In the last decade, the amount of money up for grabs for bugs has exploded. At ZDI's forthcoming Pwn2Own contest, a lucky hacker can earn $1 million for a zero-click remote code execution attack on WhatsApp. And despite its initial reluctance Microsoft has become a firm supporter of the bounty system, and paid out $17 million last year to independent security researchers, Tom Gallagher, head of the Microsoft Security Response Center (MSRC), told The Register. A few vulnerability hunters have become millionaires from these platforms, and others have made a lot of money selling to third-party businesses who harvest high-value flaws to either exploit for government-sanctioned spyware or to sell premium detection services. The tactics to earn big bucks aren't what you might think, Moussouris opined. "The first hacker to make a million dollars total on HackerOne was asked 'did you just find a bunch of criticals? He's like, no, I don't look for criticals at all, they're too hard and take too long. I go for automation to get more efficient low- and medium-severity bugs.' The mediums are the sweet spot, because they pay more." But it's a long tail situation – most people don't make a massive amount of money, and the majority of bug hunters don't use it as a main source of income, Escobar explained. Microsoft's Gallagher explained that fame is another very effective way to attract bug hunters. MSRC maintains a league of the most useful flaw finders and competition is fierce, even if it's just for a t-shirt, which he kindly modeled for The Register. Companies also court top vulnerability researchers with access to in-house engineers and exclusive forums that are designed to woo the best talent into investigating their code. "One of the things that we try to do through the bounty program is we build a relationship with the researchers," he told us. "We try to build a community around it. We have a program where we call the most valuable researchers, and so we'll work with them. There are some people that are interested in working full time, there are other people that have a full time job. It may not even be security, and so it really depends on the individual." The other, often overlooked, motivation is the desire to get things fixed. A few security researchers still submit bug reports, not especially for the money, but to make sure that applications and processes are safe. "There are some researchers who care more about the bug being fixed than care about the payout, and that's still true," Moussouris opined. "Some researchers are like, 'No, I just want you to fix this bug,' that's their motivation." These unicorns are few and far between, however, and any company relying on the goodwill of such strangers as a primary source of fixes is foolish, she suggested. AI slopping over? As with many jobs in the tech industry, there's the spectre of machine learning and AI doing tasks previously reserved for humans. So far, AI is a mixed blessing. Yes, it's finding more flaws, faster, but on the other hand, machine-generated flaws and the reporting on them are flooding out bug analysis. As industry veteran Mikko Hyppönen pointed out at this year's Black Hat security shindig, there's been a huge increase in volume of reports, often written by script kiddies with prompt skills. "They call it AI slop," Moussouris commented. "It creates a lot of noise for maintainers, especially in the open source world, who can't afford the triage services. That's going to hurt all of us in the ecosystem long term." The bounty platforms are on the front lines of this trend, and HackerOne's Sprague says two-thirds of the reports they are getting these days "end up being valid vulnerabilities." To filter out the spam, the platform will be using AI moderation to examine reports and determine if they are valid exploits. But she said that software slipup seekers are gearing up as well, investing in automated scanning kit that will take a lot of the fingerwork out of scanning code. "We do see many of the bug hunters that I meet with have already adopted some amount of automation to facilitate their hunting," she said. "There's even other researchers that have developed their own hack bots, or are contributing to commercially developed bots. So we're seeing the researcher community increasingly invest in these sources of automation to scale their capacity." Will AI eclipse the human hacker? This hack doubts it. LLMs work on past information, and the intuitive leaps needed to spot serious problems appear to be beyond it, for now. ®
go.theregister.comAug 24, 2025extracted