dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
오픈소스 CPG 기반 인터프로시저 오염 분석·LLM 트리아지, Ghidra형 워크벤치, 완전 오프라인
Open-source CPG-based interprocedural taint analysis + LLM triage, with a Ghidra-style audit workbench. Runs fully offline.
보안Python · HTMLGitHub @KimJeju직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Air-gapped security assessment, from source code to the finished report
CPG-based taint analysis · LLM triage · audit deliverables generated for you — a desktop tool that never phones home
CPGuard = CPG (Code Property Graph) + Guard — it guards your code with a property graph, not a pattern list. That graph is why the logo is three connected nodes.README 전문 보기 ↗CPGuard = CPG (Code Property Graph) + Guard — it guards your code with a property graph, not a pattern list. That graph is why the logo is three connected nodes.
Pattern-matching scanners drown you in false positives. CPGuard goes deeper — tree-sitter parsing → language-neutral IR → CPG (AST · CFG · def-use · call) → interprocedural taint with function summaries → LLM triage — then hands the result to a three-pane review screen where a human confirms the verdict.
Two detection axes
Vulnerability review screen
Ctrl+P) · context menu · gutter markers.sanitize, then clear them in one action.Running an assessment
Scale: one analyst, hundreds of projects
/projects/) — every project's latest scan in one searchable, sortable, filterable table.Assess against the standard your client asks for
Deliverables you can actually hand over
LLM triage
Deliverables
UX & delivery
| Dashboard | Vulnerability explorer (charts · filters · pagination) |
|---|---|
| Status tiles · severity distribution · top rules | Severity donut · top rule/CWE bars · large-result explorer |
The review screen (code viewer + Source→Sink flow + inspector) is the hero image above.
Download the latest CPGuard-Setup-*.exe from Releases and run it.
It installs per-user (no admin rights) and installs the WebView2 runtime if missing.
To build the installer yourself:
powershell -ExecutionPolicy Bypass -File packaging/build.ps1
It also runs portable — copy the dist/CPGuard folder and run CPGuard.exe.
pip install .
cpguard --help
The engine, the web UI and every report format are pure Python and run on all three platforms.
Only the packaged installer and the native desktop window (WebView2) are Windows-specific.
Korean text in PDF reports needs a Korean font: Windows and macOS have one out of the box, on
Linux install fonts-nanum, or point CPGUARD_PDF_FONT at any TrueType font you prefer.
# CLI scan (SARIF + analysis sheet)
cpguard scan ./project --sarif out.sarif --xlsx out.xlsx
# Assess against one or more standards (mois | efs | owasp | cwe)
cpguard scan ./project --standard mois --standard efs --xlsx out.xlsx
# Re-verify with LLM triage
cpguard scan ./project --triage --provider gemini
# Web dashboard (browser)
cpguard serve
# Native desktop window
cpguard app
In the dashboard: upload zip(s) → progress screen (step checklist + runtime log) → review and mark verdicts → add an LLM key in ⚙️ Settings to enable AI analysis and triage.
Scan on every push and PR, upload SARIF to GitHub Code Scanning so new findings appear inline on the code and the PR. A severity gate can fail the build.
# .github/workflows/cpguard.yml
permissions:
contents: read
security-events: write
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: cpguard
uses: KimJeju/[email protected]
with:
path: '.'
fail-on: 'high' # fail the build on high or above (none = no gate)
- if: always()
uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: '${{ steps.cpguard.outputs.sarif }}' }
The CLI gates too: cpguard scan . --sarif out.sarif --fail-on high (exit code 1 at or above that severity).
This repository's .github/workflows/cpguard.yml is a working example.
An AI coding agent (Claude Code, Cursor) can drive CPGuard over MCP: scan, pull the source-to-sink evidence, explain a rule, and dynamically validate a finding — answering the question a static scanner never can, "is this actually exploitable?"
CPGuard does not fire HTTP. Because it knows the sink, it emits a probe plus an
oracle — what to send and, more importantly, what to observe that proves the sink
fired. The agent fires it with its own tools and hands back what it saw; CPGuard
matches that against the oracle and returns a verdict. It is oracle-match, not IAST —
no instrumentation, so it reports "the predicted signal appeared", not "I observed the
real execution path". NOT_REPRODUCED is kept distinct from FALSE_POSITIVE.
──────────────────────────────────────────────────────────────────
CPGuard MCP — proving a SAST finding at runtime
──────────────────────────────────────────────────────────────────
① scan_file → 1 critical · py.command-injection
② finding.evidence → source os.environ.get → … → sink os.system('echo ' + user)
③ probe.get → payload ";sleep 5 #" (posix) · oracle time_delay
④ (agent fires it) → real injection runs · response 5144ms
⑤ validation.submit→ CONFIRMED — delay 5144ms ≥ 5000ms
──────────────────────────────────────────────────────────────────
Nine tools: scan_file · scan_start / scan_status (async whole-repo audit) ·
finding.list · finding.evidence · explain · probe.get · validation.submit ·
verify (did your fix actually close the flow?). The core opens no socket; only the
agent's own web tools touch the network.
pip install "cpguard[mcp]"
claude mcp add cpguard -s user "<env>/bin/cpguard-mcp" # see docs/mcp-server-design.md
Design, boundaries, and the full tool contract: docs/mcp-server-design.md.
Runnable demo: examples/mcp_demo.py.
tree-sitter → language-neutral IR → CPG (AST · CFG · def-use · call) → interprocedural taint (function summaries)
↘ LLM triage → review screen / reports
pattern axis, every language (secrets · PII · config) ─────────↗
Stack: Python 3.11+ · tree-sitter (11 languages) · Django (SSR) · reportlab (PDF) · openpyxl (xlsx) · SARIF 2.1.0 · LLM SDKs (anthropic / openai / google-genai) · pytest.
Measured against labelled ground truth in eight languages — five corpora totalling 138,785 cases, of which 76,866 are scored (the rest are categories excluded below). Score = recall − false-positive rate (the official OWASP metric; random guessing = 0.000).
| Corpus | Language | Scored | Recall | Precision | Score |
|---|---|---|---|---|---|
| OWASP Benchmark v1.2 | Java | 1,572 | 95.8% | 88.7% | 0.826 |
| C# Vulnerability Test Suite | C# | 33,024 | 84.3% | 91.1% | 0.728 |
| OWASP Benchmark for Python | Python | 346 | 82.1% | 83.3% | 0.717 |
| BenchProctor (httplib / standalone) | C++ | 800 | ~79% | 100% | 0.79 |
| BenchProctor (gin / net_http) | Go | 2,000 | ~80% | ~85% | 0.66 |
| BenchProctor (standalone) | C | 500 | 52.0% | 100% | 0.520 |
| BenchProctor (express / koa) | JavaScript | 2,200 | ~66% | ~78% | 0.47 |
| BenchProctor (express_ts / nestjs) | TypeScript | 2,200 | ~62% | ~79% | 0.45 |
| BenchProctor (rails / sinatra) | Ruby | 2,400 | ~56% | ~81% | 0.43 |
| PHP Vulnerability test suite | PHP | 31,824 | 47.0% | 66.4% | 0.369 |
Read it plainly: Java, C++, Python, C# and Go are at working-tool quality; C, JS/TS and Ruby are usable; PHP is not there yet. Where the score is low it is usually recall, not noise (PHP recall is 47.0%).
Values read out of a database or a file count as user input by default — that is where second-order injection and stored XSS come from. Pass --trust-stored-data to turn it off. The default was chosen by measurement, not taste: across 15 suites, treating stored data as a source cost nothing anywhere and bought Go 50 extra true positives for 9 extra false ones.
Do not take the 100% precision on C/C++ at face value. Those corpora are small (400-500 cases each) and their safe variants are generated from exactly two guard idioms (check(x) ? x : default, and "replace with a default when the check fails"). Teaching the engine to read those two took the false positives to zero in one step — that measures how completely the generator's rules were matched, not how varied real C code is. The 52-80% recall is the more honest signal. Kotlin and Swift have no public labelled corpus at all, so they are covered by idiom tests instead (see below).
Config-only categories (weakrand, crypto, hash, securecookie, trustbound) are not data-flow problems and are excluded rather than counted as free wins. Categories that are data-flow problems but that CPGuard has no rule for (NoSQL injection, SSTI, prototype pollution, XXE …) are reported separately from those, so coverage is not quietly inflated.
The benchmarks drove real engine work. Java started at 0.137 and PHP at 0.001; every point since came from a defect the numbers exposed — taint dying inside try blocks, for-each variables losing the collection's taint, no path sensitivity at all, container mutations not propagating, comparison results carrying taint, constructor-to-field-to-method flows missing in every language, by-reference output parameters (fgets(buf, …), Decode(&v)) invisible to a return-value-only model, closures running against an empty environment so anything they captured looked clean, and — most recently — validation applied to a projection of the tainted value (if !allowed[url.Parse(x).Hostname()] { reject }) leaving the original tainted, which was 59% of all Go false positives. Each fix is a general analysis technique, not a tweak aimed at the test cases. The full before/after ledger is in bench/README.md.
Where labelled data does not exist (Kotlin, Swift, and any framework a corpus does not cover), CPGuard ships idiom tests instead: 130 minimal reproductions of shapes that are common in real code, run as part of the test suite. They catch a different class of defect than the benchmarks do — TypeScript parameters were carrying their type annotation into the parameter name, which silently removed every typed function from interprocedural analysis, and no benchmark score moved when it was fixed.
A second measurement on a real application (DVWA, PHP) is also published. Full methodology, per-category tables and limitations: bench/README.md.
Strategies for extreme scale (20–30 GB of source, 50k+ findings) — sink pre-filtering, incremental and summary caches, the finding DB table, aggregation with virtual scrolling, triage clustering — are in docs/large-scale.md.
pip install "cpguard[mcp]", cpguard-mcp)CPGuard is developed in the open by one person. If it is useful to you, you can support its continued development on Fairy @cp-guard.
Apache License 2.0. Free to use, modify and redistribute, commercially included, provided the notice and license are preserved. Includes an express patent grant.
Bundled third-party font: NanumGothic (c) NHN Corporation, under the SIL Open Font License 1.1. It ships with the package so Korean reports render on servers without Korean fonts installed.