-
Notifications
You must be signed in to change notification settings - Fork 671
[New Rule] AWS Lambda Function Invoked from an Unusual Source ASN #6297
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
673004f
[New Rule] AWS Lambda Function Invoked from an Unusual Source ASN
bryans3c 02e3053
Update execution_lambda_function_invoked_from_unusual_source_asn.toml
bryans3c 9c654f8
Potential fix for pull request finding
bryans3c b61ffd7
Potential fix for pull request finding
bryans3c 57b468b
Apply suggestions from code review
bryans3c 9420789
Merge branch 'main' into rule/aws-lambda-invoked-unusual-asn
bryans3c File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
130 changes: 130 additions & 0 deletions
130
rules/integrations/aws/execution_lambda_function_invoked_from_unusual_source_asn.toml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,130 @@ | ||
| [metadata] | ||
| creation_date = "2026/06/18" | ||
| integration = ["aws"] | ||
| maturity = "production" | ||
| updated_date = "2026/06/18" | ||
|
|
||
| [rule] | ||
| author = ["Elastic"] | ||
| description = """ | ||
| Identifies an AWS Lambda function invoked directly by a principal from a source network (ASN) not seen for that | ||
| principal in the prior 10 days, excluding common cloud provider networks. Direct invocation from an unfamiliar external | ||
| network can indicate use of stolen execution-role or user credentials from attacker-controlled infrastructure to execute | ||
| functions or retrieve the data they return. This rule relies on AWS Lambda data event logging, which is not enabled by | ||
| default. | ||
| """ | ||
| false_positives = [ | ||
| """ | ||
| Operators and automation may legitimately invoke functions from new networks (new offices, VPNs, home IPs, or new | ||
| egress infrastructure). Verify the principal in `aws.cloudtrail.user_identity.arn`, the source network, and the | ||
| function, and exclude known operator networks or identities after validation. | ||
| """, | ||
| ] | ||
| from = "now-6m" | ||
| index = ["logs-aws.cloudtrail-*"] | ||
| interval = "5m" | ||
| language = "kuery" | ||
| license = "Elastic License v2" | ||
| name = "AWS Lambda Function Invoked from an Unusual Source ASN" | ||
| note = """## Triage and analysis | ||
|
|
||
| ### Investigating AWS Lambda Function Invoked from an Unusual Source ASN | ||
|
|
||
| Lambda execution-role credentials and user credentials are frequently abused after theft (for example via SSRF or RCE against a function, or leaked access keys). When such credentials are replayed from attacker infrastructure, the resulting direct `Invoke` calls originate from a network the legitimate principal has not used. This rule uses a new terms approach over the source ASN organization and the principal, excluding common cloud provider networks, to surface invocation from unfamiliar external networks. | ||
|
|
||
| ### Possible investigation steps | ||
|
|
||
| - Review `source.ip`, `source.as.organization.name`, and `source.geo` for the invoking network and determine whether it is expected for the principal in `aws.cloudtrail.user_identity.arn`. | ||
| - Inspect `aws.cloudtrail.request_parameters` for the `functionName` and `user_agent.original` for the client used. | ||
| - Determine whether the credential (`aws.cloudtrail.user_identity.access_key_id`) was recently seen used elsewhere or outside the Lambda runtime, which would corroborate credential theft. | ||
| - Correlate with other activity by the same principal from the same network, including data-plane access, IAM, or STS calls. | ||
|
|
||
| ### False positive analysis | ||
|
|
||
| - New legitimate networks (offices, VPNs, home IPs, new egress) will generate this alert. Confirm the principal and network are expected and exclude known operator networks or identities after validation. | ||
|
bryans3c marked this conversation as resolved.
|
||
| - If source ASN is legitimate and expected, add as an exclusion to reduce false-positives. | ||
|
|
||
| ### Response and remediation | ||
|
|
||
| - If credential abuse is confirmed, rotate or revoke the affected credentials and execution-role permissions, and review what the invoked function accessed or returned. | ||
| - Constrain `lambda:InvokeFunction` to expected identities and, where possible, restrict invocation to known networks using IAM conditions. | ||
|
|
||
| ### Additional information | ||
|
|
||
| - [Invoke API](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) | ||
| - [Logging Lambda data events with CloudTrail](https://docs.aws.amazon.com/lambda/latest/dg/logging-using-cloudtrail.html) | ||
| """ | ||
| references = [ | ||
| "https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html", | ||
| "https://docs.aws.amazon.com/lambda/latest/dg/logging-using-cloudtrail.html", | ||
| ] | ||
| risk_score = 47 | ||
| rule_id = "c8cc8192-f4f5-4ed3-8368-544ca738d506" | ||
| setup = """## Setup | ||
|
|
||
| This rule requires AWS Lambda data events to be logged in CloudTrail and ingested via the AWS integration | ||
| (`aws.cloudtrail` data stream). Lambda invocation (`Invoke`) is a data-plane event and is NOT logged by default; enable | ||
| data event logging for Lambda functions in the trail (optionally scoped to sensitive functions to manage volume). Source | ||
| ASN enrichment (`source.as.organization.name`) must be available on the ingested events. | ||
| """ | ||
| severity = "medium" | ||
| tags = [ | ||
| "Domain: Cloud", | ||
| "Data Source: AWS", | ||
| "Data Source: Amazon Web Services", | ||
| "Data Source: AWS Lambda", | ||
| "Use Case: Threat Detection", | ||
| "Tactic: Execution", | ||
| "Resources: Investigation Guide", | ||
| ] | ||
| timestamp_override = "event.ingested" | ||
| type = "new_terms" | ||
|
|
||
| query = ''' | ||
| data_stream.dataset: "aws.cloudtrail" | ||
| and event.provider: "lambda.amazonaws.com" | ||
| and event.action: Invoke* | ||
| and event.outcome: "success" | ||
| and not aws.cloudtrail.user_identity.invoked_by: * | ||
| and source.as.organization.name:(* and not (Amazon* or AMAZON* or Google* or GOOGLE* or Microsoft* or MICROSOFT*)) | ||
| ''' | ||
|
|
||
|
|
||
| [[rule.threat]] | ||
| framework = "MITRE ATT&CK" | ||
| [[rule.threat.technique]] | ||
| id = "T1648" | ||
| name = "Serverless Execution" | ||
| reference = "https://attack.mitre.org/techniques/T1648/" | ||
|
|
||
|
|
||
| [rule.threat.tactic] | ||
| id = "TA0002" | ||
| name = "Execution" | ||
| reference = "https://attack.mitre.org/tactics/TA0002/" | ||
|
|
||
| [rule.investigation_fields] | ||
| field_names = [ | ||
| "@timestamp", | ||
| "user.name", | ||
| "user_agent.original", | ||
| "source.ip", | ||
| "source.as.organization.name", | ||
| "source.geo.country_name", | ||
| "aws.cloudtrail.user_identity.arn", | ||
| "aws.cloudtrail.user_identity.type", | ||
| "aws.cloudtrail.user_identity.access_key_id", | ||
| "aws.cloudtrail.user_identity.session_context.session_issuer.arn", | ||
| "aws.cloudtrail.request_parameters", | ||
| "event.action", | ||
| "cloud.account.id", | ||
| ] | ||
|
|
||
| [rule.new_terms] | ||
| field = "new_terms_fields" | ||
| value = ["source.as.organization.name", "cloud.account.id", "user.name"] | ||
| [[rule.new_terms.history_window_start]] | ||
| field = "history_window_start" | ||
| value = "now-10d" | ||
|
|
||
|
|
||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.