← kiyooo product page Shaik Arif Ali · shaikarifali.in
OPEN-SOURCE · SELF-HOSTED · SINGLE ORG

Attack surface management where the AI does triage, not discovery.

kiyooo doesn't reimplement subdomain scanners or vulnerability crawlers — it wraps best-in-class open-source tools (Prowler, Trivy, TruffleHog, apktool, plus its own passive recon) and puts an LLM adjudicator in front of every hit they produce. A raw finding is a candidate, never something shown to a human on its own — it has to survive category matching and cited-evidence adjudication first. Below is the complete console: the original recon/triage/cost pipeline (Stages 0–12) plus the cloud, containers, repo, and mobile modules added on top of it (Stages 13–17) — one nav, one pipeline, nothing set aside.

17
Console pages
40
Detection categories
4
OSS scanners wrapped
696
Tests passing
8
Hard invariants
The pipeline

Every finding takes the same road, regardless of source

Whether a hit comes from Prowler scanning an AWS account or from kiyooo's own recon against your external perimeter, it goes through the identical five steps before a person ever sees it.

01

Discover

Prowler / Trivy / TruffleHog / apktool run against your own infra — never a third party's.

02

Ingest

Vendor severity is discarded. raw_severity always comes from the matched category.

03

Adjudicate

An LLM verdict, every claim cited to an evidence ID. It has no authority to close anything.

04

Review

A human confirms true/false-positive. Nothing auto-closes a critical.

05

Route

A ticket drafts. A human sends it — sinks never fire on their own.

This is the whole differentiator: discovery is a commodity, adjudication isn't. A false-positive rate a human has to wade through is the actual product failure kiyooo exists to prevent.
The console

All 17 pages, the actual copy, live-clickable

This is a faithful recreation of kiyooo's real Next.js UI — same nav grouping, same CSS tokens, same on-page copy shipped in the repo — populated with example data standing in for a scan you haven't run yet. Click anything in the sidebar, or flip a switch on Settings.

localhost:3000/
sample data
Native detection, not a wrapped tool — Stage 11b

The AI attack surface nobody else scans for

MCP servers, vector stores, model registries, notebook servers, shadow AI SaaS tenants — kiyooo fingerprints these with its own passive recon, the same way it finds a subdomain or an open port. Its own nav page — AI attack surface, above — is only part of the picture: these 10 categories and 5 new asset types (llm_endpoint, mcp_server, vector_db, model_registry, notebook) also flow through Asset explorer, Categories, and the Triage queue you clicked through above — try the Asset explorer tab again, mcp-legacy.acme.com and vectors.acme.com are in there.

exposed-inference-endpoint

LLM inference server reachable from the internet
critical

exposed-vector-store

Vector database reachable without authentication
critical

exposed-notebook

Jupyter notebook server reachable without a token
critical

leaked-ai-api-key

AI provider key exposed in a public response or repo
critical

exposed-mcp-server

MCP server reachable without authentication
high

mcp-tool-poisoning-risk

Tool manifest contains instruction-level content aimed at an AI client
high

exposed-model-registry

MLOps dashboard reachable without authentication
high

unsafe-model-artifact

Public model artifact using an unsafe deserialization format
high

public-chatbot-excessive-agency

Public AI agent app reachable, agentic capability unknown
medium

shadow-ai-saas-tenant

Org subdomain fronting an unsanctioned AI SaaS tenant
low
Proving it against something real

Three demo labs, one command

Self-contained, offline, resettable Docker environments that plant real instances of kiyooo's shipped categories — including their false-positive paths — so a demo isn't just a screenshot. kiyoo-labs starts all three and adds every /etc/hosts entry they need.

acmecorp

Conventional attack surface: exposed DB, leaked secrets, an expired cert, an SSO false-positive, a WAF-reduced severity, a seeded-data downgrade. Everything binds to 127.0.0.1 only.

$ kiyoo-labs acmecorp
Stage 12. Fake hosts like staging.acmecorp.lab, admin.acmecorp.lab.

kiyoo-ai

The AI attack surface above, planted for real: MCP twin servers (harmless / dangerous / poisoned), a vector store, a model registry, a notebook server, a shadow AI SaaS tenant, plus a drift scenario.

$ kiyoo-labs ai
Stage 11b's lab. ~20 services behind one Host-routed FastAPI app.

kiyoo-range

Not a planted-asset lab — the interactive front door onto both of the above. One page per shipped category (30 infra + 10 AI), each with a live-evidence fetch against the real decoy, not a static link.

$ kiyoo-labs range
Also serves 4 categories with no other planted home: exposed-devops-console, subdomain-takeover, known-exploited-cve, shadow-saas-tenant.
Under the hood

Four scanners, all Apache/AGPL, all picked for stars + license

Per-tool star counts and licenses, checked before anything got wrapped — the project rule is real community adoption plus a permissive-enough license, never a random GitHub repo.

ToolWrapsStarsLicenseModule
ProwlerAWS / Azure / GCP / Kubernetes account audits~14,000★Apache-2.0Cloud posture
TrivyContainer image & Kubernetes cluster scanning~36,500★Apache-2.0Containers
TruffleHogVerified live-secret scanning (git & filesystem)~25,700★AGPL-3.0Repos & Mobile
apktoolAndroid APK manifest & resource decoding~19,000★Apache-2.0Mobile
Why it's safe to run against yourself

Eight invariants the code never gets to break

Not aspirations — enforced at the network-executor and pipeline layer, regardless of what a task or a prompt asks for.

01

No exploitation primitives. Verification proves reachability, never compromise.

02

All outbound traffic routes through ScopeGuard, enforced at the executor, never the planner.

03

Passive by default. Active scanning needs a config flag, a CLI flag, and an attestation.

04

The LLM has no authority. It cites evidence; it never closes a finding.

05

Evidence is data, never instruction — even an instruction found inside it is just a finding to report.

06

A human approves outbound. Sinks draft; people send.

07

Secrets are redacted at ingest — a credential_ref pointer, never a live value.

08

Models are pinned. Changing one needs an eval re-run and a changelog entry.