PerspectiveGraph

io.github.luiacuaniello由 GitHub 帳號 luiacuaniello 發布v1.39.2更新於 Oct 29, 2026

Read-only attack-path tools: reachable routes to sensitive assets, and what a fix would cut.

概覽

AI 產生的概覽

以唯讀方式透過 MCP 存取 PerspectiveGraph,查看從網際網路通往敏感資產的攻擊路徑,以及修補會切斷哪些路徑。

可以做什麼
  • 查詢由掃描器與雲端狀態建構的攻擊路徑圖:通往敏感資產的可達路線,並依處理優先順序排序。
  • 檢視單一路徑的每一跳、機率與其區間,以及每個數字的來源。
  • 在切斷指定邊之後重新執行模擬,查看修補實際改變了什麼(simulate_fix)。
  • 讀取引擎自身的準確度與校準狀態,以及與已記錄結果的比對情形。
  • 八個工具全部為唯讀,並在協定層宣告為唯讀。
適用情境
適合已執行 Trivy、Semgrep、Cloud Custodian、Falco 等掃描器並掌握 AWS 與 Kubernetes 狀態的團隊,讓助理根據真實攻擊路徑推理,而不是憑空編造。特別適合判斷哪一項發現才真正開啟了通往重要資產的路徑。
執行需求
以本機程序執行(容器映像 ghcr.io/luiacuaniello/perspectivegraph),用 mcp 子命令啟動並指向一個 PerspectiveGraph API 端點,可為自架實例或公開示範。僅支援桌面環境。只有當 API 要求驗證時才需要 API_TOKEN bearer 權杖。
安裝前請注意
評分是模型依所給證據得出的結論,並非經過校準的頻率;專案自述尚無足夠的真實結果,因此不要把百分比當成實測風險對外呈現。API_TOKEN 屬於機密。此伺服器本身唯讀,但整體產品會擷取雲端與掃描器資料,請只連線到你信任的端點。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 PerspectiveGraph,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[圖片] [PerspectiveGraph]

Your scanners find issues. This finds the way in.

[CI] [Latest release] [License: Apache 2.0] [OpenSSF Scorecard] [Live demo status]

PerspectiveGraph joins what you already run - Trivy, Semgrep, Cloud Custodian, Falco, plus your AWS and Kubernetes state - into one graph of your real environment, and asks a single question of it: can someone get from the internet, through privilege that is too broad, to something worth stealing?

On a pull request it asks that question before the merge: the check goes red only when this change opens a route, and the fix comes back as its own pull request. Open source (Apache 2.0), runs on your infrastructure, collects no telemetry.

[PerspectiveGraph: from the day's exploitable routes to a generated fix]

Twelve seconds of make demo: what is exploitable now → the ranked routes → one route's kill chain and the fix it generates → whether the scores can be trusted. Sample scanner output and seeded verdicts, not a real environment.

A score here is what the model concludes from the evidence it was given, not a measured frequency: nothing has been calibrated against field data yet, and the engine says so itself rather than rounding up. What is measured, and what is not.

Check your own account in 30 seconds

No deployment, no Docker, nothing ingested. One static binary asks AWS's own policy evaluator which of your roles can reach administrator - applying the service control policies, permission boundaries and condition keys that a policy reader on its own does not see:

bash
# macOS (Apple silicon); swap darwin_arm64 for linux_amd64, linux_arm64 or darwin_amd64curl -sSL https://github.com/luiacuaniello/perspectivegraph/releases/latest/download/perspectivegraph_darwin_arm64.tar.gz | tar xz./perspectivegraph redteam -roles -region eu-west-1

It is read-only and free: each check is one iam:SimulatePrincipalPolicy dry run, which creates nothing and costs nothing, and the only permissions it needs are that and iam:ListRoles, both inside SecurityAudit. Windows builds are on the releases page; every binary is signed with cosign and carries SLSA provenance, and two commands verify both before you run anything.

Add -compare and it also runs the engine over the same account, exiting non-zero where the two disagree. That is how the engine's first real false positive was found, and how it stays fixed. If it disagrees on yours, report it: no report is more useful. From here, how to evaluate this walks to a verdict on your own estate in stages that each end in an answer.

See the whole engine in 90 seconds

bash
make demo

Pulls the published, cosign-signed images, feeds them sample Trivy / Semgrep / Custodian / Falco / Kubernetes / IAM / SSO output, and prints the top attack path with its generated fix. Dashboard on http://localhost:3000, make down to tear it down. It needs Docker, jq and curl, compiles nothing, and takes about 23 seconds from an empty image cache; make demo-build is the same demo built from your working tree.

On Kubernetes, the chart is an official package on Artifact Hub:

bash
helm install perspectivegraph oci://ghcr.io/luiacuaniello/charts/perspectivegraph \  --version 1.39.2 # x-release-please-version

On one machine - a VM with Docker and a DNS name - one command sets up TLS, generated credentials, an authenticated bus and daily backups, and starts it: production on one machine.

bash
make prod-init DOMAIN=perspectivegraph.example.com

The chart and the three images it runs (ghcr.io/luiacuaniello/perspectivegraph, -dashboard and -postgres) are signed with cosign keyless and carry an SPDX SBOM and SLSA provenance: verify them rather than taking the supply chain on trust.

The dashboard opens on the decision, not the inventory: what is being exploited now, the fewest changes that remove the most risk, and how far the numbers can be trusted. Routes are ranked by triage priority - what the route reaches, whether runtime confirmed it, how exposed the entry is - so a lower-scoring route can outrank a higher-scoring one.

[The day's decision surface]

[Attack path detail][Score accuracy]
Why the route is P1, one probability with its range, and every hop with what it lets the attacker do and where its probability came from.Whether the engine's own scores held up against recorded outcomes - and whether there are enough of them to say.

The screenshots are make demo with seeded verdicts: make seed-validation records synthetic outcomes on part of the routes, the way a BAS run tests part of an estate, which is why the calibration panel has something to show - and why it still says not enough outcomes yet: the handful it records is far short of the 30 a verdict needs. The counts in the pictures are those of the release they were taken on; the sample data has grown since, so yours differ by a route or two. A fresh install and the public demo report insufficient data instead, until real outcomes exist. The public demo runs on one free VM, so treat it as best-effort.

Why?

A scanner reports that a container carries a critical CVE. It cannot report that the container sits behind an internet-facing load balancer, runs with a role that reads the production database, and is therefore the one finding out of ten thousand worth fixing this week. That needs the other tools' output in the same graph, which is what this builds. A developer gets a check that goes red only when their change opens a real route; a security team gets a short ranked list of attack paths instead of a flat list of findings.

Block the pull request that opens the path

No deployment required. The runner reads your estate read-only, ingests this pull request's scan, and answers in-process with the same engine:

yaml
- uses: luiacuaniello/perspectivegraph@v1  with:    mode: local    aws-region: eu-west-1     # read-only; give the job an OIDC role with SecurityAudit    report: trivy.json

The check goes red when this change opens a route to a sensitive asset - or makes one likelier - not when it adds a critical CVE: a critical on a host nothing routes to does not fail the build, and a medium on a container that now reaches the production database does. Routes that were there before the change do not count, even when they run through what it touches: the scan is applied to a copy of the estate and compared with it, and nothing is written. It also has a third outcome, because a pipeline whose scan never arrived must not get the same green tick as one that is clean:

VerdictExitMeaning
clean0The engine analysed this change: it opens or worsens no critical path
blocked1It opens or worsens critical attack paths - the check names them
unknown2Nobody analysed it. The scan, the ingest or the SHA is wrong

A Terraform plan goes through the same gate before anything is deployed: source: terraform with the output of terraform show -json, judged on its own or against the live estate. A security group rule, a policy attachment or a bucket policy that opens a route fails the check in the pull request that writes it - see Terraform plans.

Outside GitHub Actions it is one command, and it installs as a Trivy plugin too:

bash
perspectivegraph gate -local -aws-region eu-west-1 -report trivy.json -slug owner/name -sha "$COMMIT_SHA"
trivy plugin install github.com/luiacuaniello/perspectivegraphtrivy image -f json myapp:pr-42 | trivy perspectivegraph gate -local -aws-region eu-west-1 -report -

[!WARNING] Fork pull requests get no secrets, so the gate fails closed as unknown on them. Do not work around it with pull_request_target: that runs your secrets - in local mode, cloud credentials - against the contributor's code.

On a public repository, a blocked check prints the route (real asset names, the CVE, the sensitive asset) into a public job log. Use soft-fail and post the detail somewhere private.

The manual covers the rest: pointing the action at a deployed engine, gating rendered manifests, a pre-collected estate, rolling the gate out, and every input in action.yml.

Let an agent query it

A language model cannot enumerate thousands of edges reliably or run Dijkstra, and asked for "the attack paths in my account" it will invent plausible ones. So the engine speaks MCP: the agent asks, and reasons over answers it could not have made up.

bash
perspectivegraph mcp --api http://localhost:8080   # or https://demo.a3thinker.it, no credential needed

Eight tools, every one read-only and declared so on the wire. The one worth the integration is simulate_fix: it re-runs the simulation with the given edges cut and reports what actually changes. The server is in the official MCP Registry and on Glama; the tools and the client configuration are in the manual.

[PerspectiveGraph MCP server on Glama]

Project status & maturity

[OpenSSF Best Practices] [Artifact Hub] [Go]

The engine and its public API are complete, documented and tested. The scores are not yet calibrated. Nobody has run this over a real estate, tested the paths it surfaced and fed the verdicts back: the machinery for that loop is built and tested, the loop is not closed. So read a score as what the model believes and how sure it says it is, not as a measured frequency. Use it to find and cut routes; don't put its percentage in front of a board. If you run it over yours, tell us how it went. Positioning spells out what is and isn't claimed.

What is measured today, as of v1.39.2. make bench-cloudgoat grades the engine in CI on four CloudGoat-shaped scenarios:

ScenarioExpectsResult
ec2_ssrfa pathfound it, invented none
iam_privesc_by_attachmenta path (leaked-credential origin)found it, invented none
ec2_private_subnet_no_pathno path (open SG, private subnet)produced none
iam_privesc_denied_by_guardrailno path (explicit Deny wins)produced none

Precision and recall are 1.00 on all four: four known shapes, two of them negative controls, so a regression gate rather than a measure of accuracy on your estate. On real AWS, make reachability-lab-aws checks exposure the same way for free, and make redteam-aws grades the engine's escalation claims against AWS's own policy evaluator. That grading has already caught one false positive, a permissions boundary the engine ignored; it is fixed, and make boundary-lab-aws fails whenever the engine and AWS disagree. make entrypoints-lab-aws puts bucket policies and function URLs to AWS the same way; its first run caught four errors, also fixed. make public-access-lab-aws does it, for free, for Block Public Access set on the whole account, and make terraform-lab-aws applies the Terraform plans the merge gate judged and asks the internet whether each one opened a way in. Each of these labs writes what it found into the build, and the dashboard's Accuracy page shows it under Checked against AWS: every question, AWS's answer, the engine's, and the version it was asked of.

  • Clouds. AWS is live and verified against a real account; reading several accounts in one pass is exercised on fixtures, not yet against real ones. Azure is fixtures only, and there is no connector for GCP or for OpenStack: the roadmap says what is planned for each.
  • Interface. The GraphQL schema is frozen and drift-guarded, so a breaking change comes with a major version, never in a patch: API stability.
  • Deployment. The backend is distroless and non-root on a read-only root filesystem, the images are pinned by digest, and under Helm every workload meets the restricted Pod Security Standard, asserted in CI. The compose defaults are open on purpose; PG_ENV=production refuses to start unless API and ingest are authenticated. A real rollout needs more (TLS, backups, TRUSTED_PROXY_CIDRS behind a proxy, a database you can fail over): on one machine make prod-init does the first three, and CI restores one of its backups on every change; the operations runbook lists the rest.
  • Support. The newest release only, with a clock on security fixes (Critical 7 days, High 30): SUPPORT.md.
  • Telemetry. None. Out of the box it opens no outbound connection; GitHub, the AI assistant and the KEV/EPSS feeds each stay off until you configure them.
  • Scope. The reachable attack-path question, in the developer workflow. It is not a scanner, a CNAPP or a compliance product, and replaces none of them.
  • How it is written. By a human working with Claude (Anthropic): the design decisions and what ships are the maintainer's, and much of the implementation and its tests came out of that collaboration. Check it rather than trust it: make test, make bench-cloudgoat, govulncheck ./..., and CONTRIBUTING.

Documentation

License

Apache License 2.0. Licensing is declared for every file, in the form REUSE defines, and checked in CI: REUSE.toml.

來源:README.md,提交 10115ab

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

36
  1. v1.39.2最新Oct 29, 2026
  2. v1.39.1Oct 24, 2026
  3. v1.39.0Oct 21, 2026
  4. v1.38.2Oct 19, 2026
  5. v1.38.1Oct 14, 2026
  6. v1.38.0Oct 12, 2026
  7. v1.37.0Oct 10, 2026
  8. v1.36.0Oct 9, 2026
  9. v1.35.1Oct 9, 2026
  10. v1.35.0Oct 8, 2026
  11. v1.34.0Oct 7, 2026
  12. v1.33.1Oct 7, 2026
  13. v1.33.0Oct 7, 2026
  14. v1.32.0Oct 5, 2026
  15. v1.31.0Oct 4, 2026
  16. v1.30.0Oct 3, 2026
  17. v1.29.1Oct 2, 2026
  18. v1.28.3Oct 2, 2026
  19. v1.28.1Oct 1, 2026
  20. v1.27.2Oct 1, 2026
  21. v1.27.1Sep 30, 2026
  22. v1.26.0Sep 30, 2026
  23. v1.25.1Sep 27, 2026
  24. v1.25.0Sep 27, 2026
  25. v1.24.0Sep 26, 2026
  26. v1.21.0Sep 25, 2026
  27. v1.20.0Sep 25, 2026
  28. v1.19.0Sep 24, 2026
  29. v1.18.1Sep 22, 2026
  30. v1.18.0Sep 22, 2026
  31. v1.17.0Sep 19, 2026
  32. v1.16.1Sep 17, 2026
  33. v1.16.0Sep 17, 2026
  34. v1.14.4Sep 17, 2026
  35. v1.14.3Sep 16, 2026
  36. v1.14.1Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分